└── Telemetry ├── Bi-Directional SRXL.pdf ├── Spektrum X-Bus Telemetry.pdf ├── Remote Receiver Interfacing.pdf └── spektrumTelemetrySensors.h /Telemetry/Bi-Directional SRXL.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpektrumRC/SpektrumDocumentation/HEAD/Telemetry/Bi-Directional SRXL.pdf -------------------------------------------------------------------------------- /Telemetry/Spektrum X-Bus Telemetry.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpektrumRC/SpektrumDocumentation/HEAD/Telemetry/Spektrum X-Bus Telemetry.pdf -------------------------------------------------------------------------------- /Telemetry/Remote Receiver Interfacing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpektrumRC/SpektrumDocumentation/HEAD/Telemetry/Remote Receiver Interfacing.pdf -------------------------------------------------------------------------------- /Telemetry/spektrumTelemetrySensors.h: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Copyright 2013 by Horizon Hobby, Inc. 4 | // All Rights Reserved Worldwide. 5 | // 6 | // Released to Public Domain 7 | // 8 | // This header file may be incorporated into non-Horizon 9 | // products. 10 | // 11 | ////////////////////////////////////////////////////////////////////////////// 12 | // 13 | // Author: AK 14 | // Date: 2017-02-24 15 | // Mods: Sync to Spektrum internal version by matching sequence of 16 | // structs, formatting, etc. Also changed some structs from 17 | // having "id" to "identifier." Also redefined "spare" in Rx MAH 18 | // to provide more bits for "chargeUsed" fields. 19 | // 20 | #ifndef TELEMETRY_H 21 | #define TELEMETRY_H 22 | 23 | ////////////////////////////////////////////////////////////////////////////// 24 | // 25 | // TELEMETRY SENSOR I2C ADDRESSES & DEVICE TYPES 26 | // 27 | ////////////////////////////////////////////////////////////////////////////// 28 | 29 | #define TELE_DEVICE_NODATA (0x00) // No data in packet, but telemetry is alive 30 | #define TELE_DEVICE_VOLTAGE (0x01) // High-Voltage sensor (INTERNAL) 31 | #define TELE_DEVICE_TEMPERATURE (0x02) // Temperature Sensor (INTERNAL) 32 | #define TELE_DEVICE_AMPS (0x03) // Amps (INTERNAL) 33 | #define TELE_DEVICE_RSV_04 (0x04) // Reserved 34 | #define TELE_DEVICE_FLITECTRL (0x05) // Flight Controller Status Report 35 | #define TELE_DEVICE_RSV_06 (0x06) // Reserved 36 | #define TELE_DEVICE_RSV_07 (0x07) // Reserved 37 | #define TELE_DEVICE_RSV_08 (0x08) // Reserved 38 | //#define DO_NOT_USE (0x09) // DO NOT USE! 39 | #define TELE_DEVICE_PBOX (0x0A) // PowerBox 40 | #define TELE_DEVICE_LAPTIMER (0x0B) // Lap Timer 41 | #define TELE_DEVICE_TEXTGEN (0x0C) // Text Generator 42 | #define TELE_DEVICE_VTX (0x0D) // Video Transmitter Feedback 43 | #define TELE_DEVICE_RSV_0E (0x0E) // Reserved 44 | #define TELE_DEVICE_RSV_0F (0x0F) // Reserved 45 | #define TELE_DEVICE_RSV_10 (0x10) // Reserved 46 | #define TELE_DEVICE_AIRSPEED (0x11) // Air Speed (Eagle Tree Sensor) 47 | #define TELE_DEVICE_ALTITUDE (0x12) // Altitude (Eagle Tree Sensor) 48 | #define TELE_DEVICE_RSV_13 (0x13) // Reserved 49 | #define TELE_DEVICE_GMETER (0x14) // G-Force (Eagle Tree Sensor) 50 | #define TELE_DEVICE_JETCAT (0x15) // Turbine interface (Eagle Tree) 51 | #define TELE_DEVICE_GPS_LOC (0x16) // GPS Location Data (Eagle Tree) 52 | #define TELE_DEVICE_GPS_STATS (0x17) // GPS Status (Eagle Tree) 53 | #define TELE_DEVICE_RX_MAH (0x18) // Receiver Pack Capacity (Dual) 54 | #define TELE_DEVICE_JETCAT_2 (0x19) // Turbine interface, message 2 format (Eagle Tree) 55 | #define TELE_DEVICE_GYRO (0x1A) // 3-axis gyro 56 | #define TELE_DEVICE_ATTMAG (0x1B) // Attitude and Magnetic Compass 57 | #define TELE_DEVICE_TILT (0x1C) // Surface Tilt Sensor 58 | #define TELE_DEVICE_RSV_1D (0x1D) // Reserved 59 | #define TELE_DEVICE_AS6X_GAIN (0x1E) // Active AS6X Gains (new mode) 60 | #define TELE_DEVICE_AS3X_LEGACYGAIN (0x1F) // Active AS3X Gains for legacy mode 61 | #define TELE_DEVICE_ESC (0x20) // Electronic Speed Control 62 | #define TELE_DEVICE_RSV_21 (0x21) // Reserved 63 | #define TELE_DEVICE_FUEL (0x22) // Fuel Flow Meter 64 | #define TELE_DEVICE_RSV_23 (0x23) // Reserved 65 | #define TELE_DEVICE_ALPHA6 (0x24) // Alpha6 Stabilizer 66 | #define TELE_DEVICE_RSV_25 (0x25) // Reserved 67 | #define TELE_DEVICE_GPS_BINARY (0x26) // GPS, binary format 68 | #define TELE_DEVICE_REMOTE_ID (0x27) // Remote ID (SkyID) (Sky_RID) 69 | #define TELE_DEVICE_RSV_28 (0x28) // Reserved 70 | #define TELE_DEVICE_RSV_29 (0x29) // Reserved 71 | #define TELE_DEVICE_RSV_2A (0x2A) // Reserved 72 | #define TELE_DEVICE_RSV_2B (0x2B) // Reserved 73 | #define TELE_DEVICE_RSV_2C (0x2C) // Reserved 74 | #define TELE_DEVICE_RSV_2D (0x2D) // Reserved 75 | #define TELE_DEVICE_RSV_2E (0x2E) // Reserved 76 | #define TELE_DEVICE_RSV_2F (0x2F) // Reserved 77 | //#define DO_NOT_USE (0x30) // Internal ST sensor 78 | //#define DO_NOT_USE (0x32) // Internal ST sensor 79 | #define TELE_DEVICE_RSV_33 (0x33) // Reserved 80 | #define TELE_DEVICE_FP_MAH (0x34) // Flight Battery Capacity (Dual) 81 | #define TELE_DEVICE_RSV_35 (0x35) // Reserved 82 | #define TELE_DEVICE_DIGITAL_AIR (0x36) // Digital Inputs & Tank Pressure 83 | #define TELE_DEVICE_RSV_37 (0x37) // Reserved 84 | #define TELE_DEVICE_STRAIN (0x38) // Thrust/Strain Gauge 85 | #define TELE_DEVICE_RSV_39 (0x39) // Reserved 86 | #define TELE_DEVICE_LIPOMON (0x3A) // 6S Cell Monitor (LiPo taps) 87 | #define TELE_DEVICE_RSV_3B (0x3B) // Reserved 88 | #define TELE_DEVICE_RSV_3C (0x3C) // Reserved 89 | #define TELE_DEVICE_RSV_3D (0x3D) // Reserved 90 | #define TELE_DEVICE_RSV_3E (0x3E) // Reserved 91 | #define TELE_DEVICE_LIPOMON_14 (0x3F) // 14S Cell Monitor (LiPo taps) 92 | #define TELE_DEVICE_VARIO_S (0x40) // Vario 93 | #define TELE_DEVICE_RSV_41 (0x41) // Reserved 94 | #define TELE_DEVICE_SMARTBATT (0x42) // Spektrum SMART Battery 95 | #define TELE_DEVICE_RSV_43 (0x43) // Reserved 96 | #define TELE_DEVICE_RSV_44 (0x44) // Reserved 97 | #define TELE_DEVICE_RSV_45 (0x45) // Reserved 98 | #define TELE_DEVICE_RSV_46 (0x46) // Reserved 99 | #define TELE_DEVICE_RSV_47 (0x47) // Reserved 100 | #define TELE_DEVICE_RSV_48 (0x48) // Reserved 101 | #define TELE_DEVICE_RSV_49 (0x49) // Reserved 102 | #define TELE_DEVICE_RSV_4A (0x4A) // Reserved 103 | #define TELE_DEVICE_RSV_4B (0x4B) // Reserved 104 | #define TELE_DEVICE_RSV_4C (0x4C) // Reserved 105 | #define TELE_DEVICE_RSV_4D (0x4D) // Reserved 106 | #define TELE_DEVICE_RSV_4E (0x4E) // Reserved 107 | #define TELE_DEVICE_RSV_4F (0x4F) // Reserved 108 | #define TELE_DEVICE_USER_16SU (0x50) // User-Defined, STRU_TELE_USER_16SU 109 | #define TELE_DEVICE_RSV_51 (0x51) // Reserved 110 | #define TELE_DEVICE_USER_16SU32U (0x52) // User-Defined, STRU_TELE_USER_16SU32U 111 | #define TELE_DEVICE_RSV_53 (0x53) // Reserved 112 | #define TELE_DEVICE_USER_16SU32S (0x54) // User-Defined, STRU_TELE_USER_16SU32S 113 | #define TELE_DEVICE_RSV_55 (0x55) // Reserved 114 | #define TELE_DEVICE_USER_16U32SU (0x56) // User-Defined, STRU_TELE_USER_16U32SU 115 | #define TELE_DEVICE_RSV_57 (0x57) // Reserved 116 | #define TELE_DEVICE_RSV_58 (0x58) // Reserved 117 | #define TELE_DEVICE_MULTICYLINDER (0x59) // Multi-cylinder temp sensor 118 | #define TELE_DEVICE_MULTIENGINE (0x5A) // Multi-engine temp and RPM 119 | #define TELE_DEVICE_RSV_5B (0x5B) // Reserved 120 | #define TELE_DEVICE_RSV_5C (0x5C) // Reserved 121 | #define TELE_DEVICE_RSV_5D (0x5D) // Reserved 122 | #define TELE_DEVICE_RSV_5E (0x5E) // Reserved 123 | #define TELE_DEVICE_RSV_5F (0x5F) // Reserved 124 | #define TELE_DEVICE_VSPEAK (0x60) // Reserved for V-Speak 125 | #define TELE_DEVICE_SMOKE_EL (0x61) // Reserved for Smoke-EL.de 126 | #define TELE_DEVICE_CROSSFIRE (0x62) // Reserved for Crossfire devices 127 | #define TELE_DEVICE_RSV_63 (0x63) // Reserved 128 | #define TELE_DEVICE_RSV_64 (0x64) // Reserved 129 | #define TELE_DEVICE_RSV_65 (0x65) // Reserved 130 | #define TELE_DEVICE_EXTRF (0x66) // Reserved for Generic External RF sources 131 | #define TELE_DEVICE_RSV_67 (0x67) // Reserved 132 | #define TELE_DEVICE_RSV_68 (0x68) // Reserved 133 | #define TELE_DEVICE_RSV_69 (0x69) // Reserved 134 | #define TELE_DEVICE_RSV_6A (0x6A) // Reserved 135 | //#define DO_NOT_USE (0x6B) // DO NOT USE! 136 | #define TELE_DEVICE_RSV_6C (0x6C) // Reserved 137 | #define TELE_DEVICE_RSV_6D (0x6D) // Reserved 138 | #define TELE_DEVICE_RSV_6E (0x6E) // Reserved 139 | #define TELE_DEVICE_RSV_6F (0x6F) // Reserved 140 | #define TELE_DEVICE_RSV_70 (0x70) // Reserved 141 | #define TELE_XRF_LINKSTATUS (0x71) // External RF Link Status 142 | #define TELE_DEVICE_RSV_72 (0x72) // Reserved 143 | #define TELE_DEVICE_RSV_73 (0x73) // Reserved 144 | #define TELE_DEVICE_RSV_74 (0x74) // Reserved 145 | #define TELE_DEVICE_RSV_75 (0x75) // Reserved 146 | #define TELE_DEVICE_RSV_76 (0x76) // Reserved 147 | #define TELE_DEVICE_RSV_77 (0x77) // Reserved 148 | #define TELE_DEVICE_RSV_78 (0x78) // Reserved 149 | #define TELE_DEVICE_RSV_79 (0x79) // Reserved 150 | #define TELE_DEVICE_RSV_7A (0x7A) // Reserved 151 | #define TELE_DEVICE_ALT_ZERO (0x7B) // Pseudo-device setting Altitude "zero" 152 | #define TELE_DEVICE_RTC (0x7C) // Pseudo-device giving timestamp 153 | #define TELE_DEVICE_RPM (0x7E) // RPM sensor 154 | #define TELE_DEVICE_QOS (0x7F) // RxV + flight log data 155 | #define TELE_DEVICE_MAX (0x7F) // Last address available 156 | 157 | #define TELE_DEVICE_SHORTRANGE (0x80) // OR this bit to indicate data is from a short-range telemetry device (e.g. TM1100) 158 | 159 | #define TELE_DEVICE_MAX_PROGRAM (0x70) // Last programmable address when using sID 160 | 161 | ////////////////////////////////////////////////////////////////////////////// 162 | // 163 | // TELEMETRY 164 | // DEVICE-SPECIFIC STRUCTURES 165 | // 166 | ////////////////////////////////////////////////////////////////////////////// 167 | ////////////////////////////////////////////////////////////////////////////// 168 | // 169 | // THIRD-PARTY 16-BIT DATA SIGNED/UNSIGNED 170 | // 171 | ////////////////////////////////////////////////////////////////////////////// 172 | // 173 | typedef struct 174 | { 175 | UINT8 identifier; // Source device = 0x50 176 | UINT8 sID; // Secondary ID 177 | INT16 sField1, // Signed 16-bit data fields 178 | sField2, 179 | sField3; 180 | UINT16 uField1, // Unsigned 16-bit data fields 181 | uField2, 182 | uField3, 183 | uField4; 184 | } STRU_TELE_USER_16SU; 185 | 186 | ////////////////////////////////////////////////////////////////////////////// 187 | // 188 | // THIRD-PARTY 16-BIT SIGNED/UNSIGNED AND 32-BIT UNSIGNED 189 | // 190 | ////////////////////////////////////////////////////////////////////////////// 191 | // 192 | typedef struct 193 | { 194 | UINT8 identifier; // Source device = 0x52 195 | UINT8 sID; // Secondary ID 196 | INT16 sField1, // Signed 16-bit data fields 197 | sField2; 198 | UINT16 uField1, // Unsigned 16-bit data fields 199 | uField2, 200 | uField3; 201 | UINT32 u32Field; // Unsigned 32-bit data field 202 | } STRU_TELE_USER_16SU32U; 203 | 204 | ////////////////////////////////////////////////////////////////////////////// 205 | // 206 | // THIRD-PARTY 16-BIT SIGNED/UNSIGNED AND 32-BIT SIGNED 207 | // 208 | ////////////////////////////////////////////////////////////////////////////// 209 | // 210 | typedef struct 211 | { 212 | UINT8 identifier; // Source device = 0x54 213 | UINT8 sID; // Secondary ID 214 | INT16 sField1, // Signed 16-bit data fields 215 | sField2; 216 | UINT16 uField1, // Unsigned 16-bit data fields 217 | uField2, 218 | uField3; 219 | INT32 s32Field; // Signed 32-bit data field 220 | } STRU_TELE_USER_16SU32S; 221 | 222 | ////////////////////////////////////////////////////////////////////////////// 223 | // 224 | // THIRD-PARTY 16-BIT UNSIGNED AND 32-BIT SIGNED/UNSIGNED 225 | // 226 | ////////////////////////////////////////////////////////////////////////////// 227 | // 228 | typedef struct 229 | { 230 | UINT8 identifier; // Source device = 0x56 231 | UINT8 sID; // Secondary ID 232 | UINT16 uField1; // Unsigned 16-bit data field 233 | INT32 s32Field; // Signed 32-bit data field 234 | UINT32 u32Field1, // Unsigned 32-bit data fields 235 | u32Field2; 236 | } STRU_TELE_USER_16U32SU; 237 | 238 | ////////////////////////////////////////////////////////////////////////////// 239 | // 240 | // POWERBOX 241 | // 242 | ////////////////////////////////////////////////////////////////////////////// 243 | // 244 | typedef struct 245 | { 246 | UINT8 identifier; // Source device = 0x0A 247 | UINT8 sID; // Secondary ID 248 | UINT16 volt1; // Volts, 0.01v 249 | UINT16 volt2; // Volts, 0.01v 250 | UINT16 capacity1; // mAh, 1mAh 251 | UINT16 capacity2; // mAh, 1mAh 252 | UINT16 spare16_1; 253 | UINT16 spare16_2; 254 | UINT8 spare; 255 | UINT8 alarms; // Alarm bitmask (see below) 256 | } STRU_TELE_POWERBOX; 257 | 258 | #define TELE_PBOX_ALARM_VOLTAGE_1 (0x01) 259 | #define TELE_PBOX_ALARM_VOLTAGE_2 (0x02) 260 | #define TELE_PBOX_ALARM_CAPACITY_1 (0x04) 261 | #define TELE_PBOX_ALARM_CAPACITY_2 (0x08) 262 | //#define TELE_PBOX_ALARM_RPM (0x10) 263 | //#define TELE_PBOX_ALARM_TEMPERATURE (0x20) 264 | #define TELE_PBOX_ALARM_RESERVED_1 (0x40) 265 | #define TELE_PBOX_ALARM_RESERVED_2 (0x80) 266 | 267 | ////////////////////////////////////////////////////////////////////////////// 268 | // 269 | // VOLTAGE 270 | // 271 | ////////////////////////////////////////////////////////////////////////////// 272 | // 273 | typedef struct 274 | { 275 | UINT8 identifier; // Source device = 0x01 276 | UINT8 sID; // Secondary ID 277 | UINT16 volts; // 0.01V increments 278 | } STRU_TELE_HV; 279 | 280 | ////////////////////////////////////////////////////////////////////////////// 281 | // 282 | // TEMPERATURE 283 | // 284 | ////////////////////////////////////////////////////////////////////////////// 285 | // 286 | typedef struct 287 | { 288 | UINT8 identifier; // Source device = 0x02 289 | UINT8 sID; // Secondary ID 290 | INT16 temperature; // Temperature in degrees Fahrenheit 291 | } STRU_TELE_TEMP; 292 | 293 | ////////////////////////////////////////////////////////////////////////////// 294 | // 295 | // RX CAPACITY METER 296 | // 297 | ////////////////////////////////////////////////////////////////////////////// 298 | // 299 | typedef struct 300 | { 301 | UINT8 identifier; // Source device = 0x18 302 | UINT8 sID; // Secondary ID 303 | INT16 current_A; // Instantaneous current, 0.01A (0-328.7A) 7FFF-> no data 304 | UINT16 chargeUsed_A; // Integrated mAh used, 0.1mAh (0-3276.6mAh) 305 | UINT16 volts_A; // Volts, 0.01V increments (0-16.00V) 306 | INT16 current_B; // Instantaneous current, 0.01A (0-328.7A) 7FFF-> no data/sensor B 307 | UINT16 chargeUsed_B; // Integrated mAh used, 0.1mAh (0-3276.6mAh) 308 | UINT16 volts_B; // Volts, 0.01V increments (0-16.00V) 309 | UINT8 alerts, // Bit mapped alert conditions (see below) 310 | highCharge; // High nybble is extra bits for chargeUsed_B, Low is for chargeUsed_A 311 | } STRU_TELE_RX_MAH; 312 | 313 | #define RXMAH_PS_ALERT_NONE (0) // No alarms 314 | #define RXMAH_PS_ALERT_RF_INT (1 << 0) // A or internal Remote failure 315 | #define RXMAH_PS_ALERT_RF_ANT1 (1 << 1) // B remote power fault 316 | #define RXMAH_PS_ALERT_RF_ANT2 (1 << 2) // L remote power fault 317 | #define RXMAH_PS_ALERT_RF_ANT3 (1 << 3) // R remote power fault 318 | #define RXMAH_PS_ALERT_OVERVOLT_A (1 << 4) // Battery A is over voltage 319 | #define RXMAH_PS_ALERT_OVERVOLT_B (1 << 5) // Battery A is over voltage 320 | #define RXMAH_PS_ALERT_RFU1 (1 << 6) 321 | #define RXMAH_PS_ALERT_RFU2 (1 << 7) 322 | 323 | ////////////////////////////////////////////////////////////////////////////// 324 | // 325 | // HIGH-CURRENT 326 | // 327 | ////////////////////////////////////////////////////////////////////////////// 328 | // 329 | typedef struct 330 | { 331 | UINT8 identifier; // Source device = 0x03 332 | UINT8 sID; // Secondary ID 333 | INT16 current, // Range: +/- 150A Resolution: 300A / 2048 = 0.196791 A/count 334 | dummy; // TBD 335 | } STRU_TELE_IHIGH; 336 | 337 | #define IHIGH_RESOLUTION_FACTOR ((FP32)(0.196791)) 338 | 339 | ////////////////////////////////////////////////////////////////////////////// 340 | // 341 | // SIMPLE VARIO 342 | // 343 | ////////////////////////////////////////////////////////////////////////////// 344 | // 345 | typedef struct 346 | { 347 | UINT8 identifier; // Source device = 0x40 348 | UINT8 sID; // Secondary ID 349 | INT16 altitude; // .1m increments 350 | INT16 delta_0250ms, // change in altitude last 250ms, 0.1m/s increments 351 | delta_0500ms, // change in altitude last 500ms, 0.1m/s increments 352 | delta_1000ms, // change in altitude last 1.0 seconds, 0.1m/s increments 353 | delta_1500ms, // change in altitude last 1.5 seconds, 0.1m/s increments 354 | delta_2000ms, // change in altitude last 2.0 seconds, 0.1m/s increments 355 | delta_3000ms; // change in altitude last 3.0 seconds, 0.1m/s increments 356 | } STRU_TELE_VARIO_S; 357 | 358 | ////////////////////////////////////////////////////////////////////////////// 359 | // 360 | // ALTIMETER 361 | // 362 | ////////////////////////////////////////////////////////////////////////////// 363 | // 364 | typedef struct 365 | { 366 | UINT8 identifier; 367 | UINT8 sID; // Secondary ID 368 | INT16 altitude; // .1m increments 369 | INT16 maxAltitude; // .1m increments 370 | } STRU_TELE_ALT; // Eagle Tree Sensor 371 | 372 | ////////////////////////////////////////////////////////////////////////////// 373 | // 374 | // AIRSPEED 375 | // 376 | ////////////////////////////////////////////////////////////////////////////// 377 | // 378 | typedef struct 379 | { 380 | UINT8 identifier; 381 | UINT8 sID; // Secondary ID 382 | UINT16 airspeed; // 1 km/h increments 383 | UINT16 maxAirspeed; // 1 km/h increments 384 | } STRU_TELE_SPEED; // Eagle Tree Sensor 385 | 386 | ////////////////////////////////////////////////////////////////////////////// 387 | // 388 | // LAP TIMER 389 | // 390 | ////////////////////////////////////////////////////////////////////////////// 391 | // 392 | typedef struct 393 | { 394 | UINT8 identifier; 395 | UINT8 sID; // Secondary ID 396 | UINT8 lapNumber; // Lap last finished 397 | UINT8 gateNumber; // Last gate passed 398 | UINT32 lastLapTime; // Time of lap in 1ms increments (NOT duration) 399 | UINT32 gateTime; // Duration between last 2 gates 400 | UINT8 unused[4]; 401 | } STRU_TELE_LAPTIMER; 402 | 403 | ////////////////////////////////////////////////////////////////////////////// 404 | // 405 | // TEXT GENERATOR 406 | // 407 | ////////////////////////////////////////////////////////////////////////////// 408 | // 409 | typedef struct 410 | { 411 | UINT8 identifier; 412 | UINT8 sID; // Secondary ID 413 | UINT8 lineNumber; // Line number to display (0 = title, 1-8 for general, 254 = Refresh backlight, 255 = Erase all text on screen) 414 | char text[13]; // 0-terminated text when < 13 chars 415 | } STRU_TELE_TEXTGEN; 416 | 417 | ////////////////////////////////////////////////////////////////////////////// 418 | // 419 | // VIDEO TRANSMITTER (VTX) 420 | // 421 | ////////////////////////////////////////////////////////////////////////////// 422 | // 423 | // VTX spec subject to change. Refer to Spektrum VTX Interfacing document for latest info 424 | // 425 | typedef struct 426 | { 427 | UINT8 identifier; 428 | UINT8 sID; // Secondary ID 429 | UINT8 band; // VTX Band (0 = Fatshark, 1 = Raceband, 2 = E, 3 = B, 4 = A, 5-7 = Reserved) 430 | UINT8 channel; // VTX Channel (0-7) 431 | UINT8 pit; // Pit/Race mode (0 = Race, 1 = Pit). Race = (normal operating) mode. Pit = (reduced power) mode. When PIT is set, it overrides all other power settings. 432 | UINT8 power; // VTX Power (0 = Off, 1 = 1mw to 14mW, 2 = 15mW to 25mW, 3 = 26mW to 99mW, 4 = 100mW to 299mW, 5 = 300mW to 600mW, 6 = 601mW+, 7 = manual control) 433 | UINT16 powerDec; // VTX Power as a decimal 1mw/unit 434 | UINT8 region; // Region (0 = USA, 1 = EU, 0xFF = Not Provided) 435 | UINT8 unused[7]; // reserved 436 | } STRU_TELE_VTX; 437 | 438 | ////////////////////////////////////////////////////////////////////////////// 439 | // 440 | // ESC 441 | // 442 | ////////////////////////////////////////////////////////////////////////////// 443 | // 444 | // Uses big-endian byte order 445 | // 446 | typedef struct 447 | { 448 | UINT8 identifier; // Source device = 0x20 449 | UINT8 sID; // Secondary ID 450 | UINT16 RPM; // Electrical RPM, 10RPM (0-655340 RPM) 0xFFFF --> "No data" 451 | UINT16 voltsInput; // Volts, 0.01v (0-655.34V) 0xFFFF --> "No data" 452 | UINT16 tempFET; // Temperature, 0.1C (0-6553.4C) 0xFFFF --> "No data" 453 | UINT16 currentMotor; // Current, 10mA (0-655.34A) 0xFFFF --> "No data" 454 | UINT16 tempBEC; // Temperature, 0.1C (0-6553.4C) 0xFFFF --> "No data" 455 | UINT8 currentBEC; // BEC Current, 100mA (0-25.4A) 0xFF ----> "No data" 456 | UINT8 voltsBEC; // BEC Volts, 0.05V (0-12.70V) 0xFF ----> "No data" 457 | UINT8 throttle; // 0.5% (0-100%) 0xFF ----> "No data" 458 | UINT8 powerOut; // Power Output, 0.5% (0-127%) 0xFF ----> "No data" 459 | } STRU_TELE_ESC; 460 | 461 | ////////////////////////////////////////////////////////////////////////////// 462 | // 463 | // (Liquid) Fuel Flow/Capacity (Two Tanks/Engines) 464 | // 465 | ////////////////////////////////////////////////////////////////////////////// 466 | // 467 | typedef struct 468 | { 469 | UINT8 identifier; // Source device = 0x22 470 | UINT8 sID; // Secondary ID 471 | UINT16 fuelConsumed_A; // Integrated fuel consumption, 0.1mL 472 | UINT16 flowRate_A; // Instantaneous consumption, 0.01mL/min 473 | UINT16 temp_A; // Temperature, 0.1C (0-655.34C) 474 | UINT16 fuelConsumed_B; // Integrated fuel consumption, 0.1mL 475 | UINT16 flowRate_B; // Instantaneous consumption, 0.01mL/min 476 | UINT16 temp_B; // Temperature, 0.1C (0-655.34C) 477 | UINT16 spare; // Not used 478 | } STRU_TELE_FUEL; 479 | 480 | ////////////////////////////////////////////////////////////////////////////// 481 | // 482 | // Battery Current/Capacity (Flight Pack Capacity) 483 | // 484 | ////////////////////////////////////////////////////////////////////////////// 485 | // 486 | // AK 2013-11-19 make struct align with 0x03 device 487 | // 488 | typedef struct 489 | { 490 | UINT8 identifier; // Source device = 0x34 491 | UINT8 sID; // Secondary ID 492 | INT16 current_A; // Instantaneous current, 0.1A (0-3276.6A) 493 | INT16 chargeUsed_A; // Integrated mAh used, 1mAh (0-32.766Ah) 494 | UINT16 temp_A; // Temperature, 0.1C (0-150C, 0x7FFF indicates not populated) 495 | INT16 current_B; // Instantaneous current, 0.1A (0-3276.6A) 496 | INT16 chargeUsed_B; // Integrated mAh used, 1mAh (0-32.766Ah) 497 | UINT16 temp_B; // Temperature, 0.1C (0-150C, 0x7FFF indicates not populated) 498 | UINT16 spare; // Not used 499 | } STRU_TELE_FP_MAH; 500 | 501 | ////////////////////////////////////////////////////////////////////////////// 502 | // 503 | // Digital Input Status (Retract Status) and Tank Pressure 504 | // 505 | ////////////////////////////////////////////////////////////////////////////// 506 | // 507 | typedef struct 508 | { 509 | UINT8 identifier; // Source device = TELE_DEVICE_DIGITAL_AIR 510 | UINT8 sID; // Secondary ID 511 | UINT16 digital; // Digital inputs (bit per input) 512 | UINT16 spare1; 513 | UINT16 pressure[4]; // Tank pressure, 0.1PSI (0-6553.4PSI), 0xFFFF = Not Installed 514 | UINT16 spare2; 515 | } STRU_TELE_DIGITAL_AIR; 516 | 517 | ////////////////////////////////////////////////////////////////////////////// 518 | // 519 | // Thrust/Strain Gauge 520 | // 521 | ////////////////////////////////////////////////////////////////////////////// 522 | // 523 | typedef struct 524 | { 525 | UINT8 identifier; // Source device = 0x38 526 | UINT8 sID; // Secondary ID 527 | UINT16 strain_A, // Strain sensor A 528 | strain_B, // Strain sensor B 529 | strain_C, // Strain sensor D 530 | strain_D; // Strain sensor C 531 | } STRU_TELE_STRAIN; 532 | 533 | ////////////////////////////////////////////////////////////////////////////// 534 | // 535 | // 6S LiPo Cell Monitor 536 | // 537 | ////////////////////////////////////////////////////////////////////////////// 538 | // 539 | typedef struct 540 | { 541 | UINT8 identifier; // Source device = 0x3A 542 | UINT8 sID; // Secondary ID 543 | UINT16 cell[6]; // Voltage across cell 1, .01V steps 544 | // 0x7FFF --> cell not present 545 | UINT16 temp; // Temperature, 0.1C (0-655.34C) 546 | } STRU_TELE_LIPOMON; 547 | 548 | ////////////////////////////////////////////////////////////////////////////// 549 | // 550 | // 14S LiPo Cell Monitor 551 | // 552 | ////////////////////////////////////////////////////////////////////////////// 553 | // 554 | typedef struct 555 | { 556 | UINT8 identifier; // Source device = 0x3F 557 | UINT8 sID; // Secondary ID 558 | UINT8 cell[14]; // Voltage across cell 1, .01V steps, excess of 2.56V 559 | // (ie, 3.00V would report 300-256 = 44) 560 | // 0xFF --> cell not present 561 | } STRU_TELE_LIPOMON_14; 562 | 563 | ////////////////////////////////////////////////////////////////////////////// 564 | // 565 | // ACCELEROMETER 566 | // 567 | ////////////////////////////////////////////////////////////////////////////// 568 | // 569 | // Uses big-endian byte order 570 | // 571 | typedef struct 572 | { 573 | UINT8 identifier; // Source device = 0x14 574 | UINT8 sID; // Secondary ID 575 | INT16 GForceX; // force is reported as .01G increments 576 | INT16 GForceY; // Range = +/-4000 (+/- 40G) in Pro model 577 | INT16 GForceZ; // Range = +/-800 (+/- 8G) in Standard model 578 | INT16 maxGForceX; // abs(max G X-axis) FORE/AFT 579 | INT16 maxGForceY; // abs (max G Y-axis) LEFT/RIGHT 580 | INT16 maxGForceZ; // max G Z-axis WING SPAR LOAD 581 | INT16 minGForceZ; // min G Z-axis WING SPAR LOAD 582 | } STRU_TELE_G_METER; 583 | 584 | ////////////////////////////////////////////////////////////////////////////// 585 | // 586 | // SURFACE TILT (ATTITUDE) SENSOR 587 | // 588 | ////////////////////////////////////////////////////////////////////////////// 589 | // 590 | typedef struct 591 | { 592 | UINT8 identifier; // Source device = 0x1C TELE_DEVICE_TILT 593 | UINT8 sID; // Secondary ID 594 | INT16 attQuatX; // Quaternion representing attitude using RHR. X component in Q14. 595 | INT16 attQuatY; // Y component in Q14. 596 | INT16 attQuatZ; // Z component in Q14. 597 | INT16 attQuatW; // W component in Q14. 598 | UINT16 spare[3]; 599 | } STRU_TELE_TILT; 600 | 601 | ////////////////////////////////////////////////////////////////////////////// 602 | // 603 | // TURBINE 604 | // 605 | ////////////////////////////////////////////////////////////////////////////// 606 | // 607 | typedef struct 608 | { 609 | UINT8 identifier; // Source device = 0x15 610 | UINT8 sID; // Secondary ID 611 | UINT8 status; // Table below 612 | UINT8 throttle; // (BCD) xx Percent 613 | UINT16 packVoltage; // (BCD) xx.yy 614 | UINT16 pumpVoltage; // (BCD) xx.yy 615 | UINT32 RPM; // (BCD) 616 | UINT16 EGT; // (BCD) Temperature, Celsius 617 | UINT8 offCondition; // Table below 618 | UINT8 spare; 619 | } STRU_TELE_JETCAT; 620 | 621 | enum JETCAT_ECU_TURBINE_STATE { // ECU Status definitions 622 | JETCAT_ECU_STATE_OFF = 0x00, 623 | JETCAT_ECU_STATE_WAIT_for_RPM = 0x01, // (Stby/Start) 624 | JETCAT_ECU_STATE_Ignite = 0x02, 625 | JETCAT_ECU_STATE_Accelerate = 0x03, 626 | JETCAT_ECU_STATE_Stabilise = 0x04, 627 | JETCAT_ECU_STATE_Learn_HI = 0x05, 628 | JETCAT_ECU_STATE_Learn_LO = 0x06, 629 | JETCAT_ECU_STATE_UNDEFINED = 0x07, 630 | JETCAT_ECU_STATE_Slow_Down = 0x08, 631 | JETCAT_ECU_STATE_Manual = 0x09, 632 | JETCAT_ECU_STATE_AutoOff = 0x0A, 633 | JETCAT_ECU_STATE_Run = 0x0B, // (reg.) 634 | JETCAT_ECU_STATE_Accleleration_delay = 0x0C, 635 | JETCAT_ECU_STATE_SpeedReg = 0x0D, // (Speed Ctrl) 636 | JETCAT_ECU_STATE_Two_Shaft_Regulate = 0x0E, // (only for secondary shaft) 637 | JETCAT_ECU_STATE_PreHeat1 = 0x0F, 638 | JETCAT_ECU_STATE_PreHeat2 = 0x10, 639 | JETCAT_ECU_STATE_MainFStart = 0x11, 640 | JETCAT_ECU_STATE_NotUsed = 0x12, 641 | JETCAT_ECU_STATE_KeroFullOn = 0x13, 642 | // undefined states 0x14-0x1F 643 | EVOJET_ECU_STATE_off = 0x20, 644 | EVOJET_ECU_STATE_ignt = 0x21, 645 | EVOJET_ECU_STATE_acce = 0x22, 646 | EVOJET_ECU_STATE_run = 0x23, 647 | EVOJET_ECU_STATE_cal = 0x24, 648 | EVOJET_ECU_STATE_cool = 0x25, 649 | EVOJET_ECU_STATE_fire = 0x26, 650 | EVOJET_ECU_STATE_glow = 0x27, 651 | EVOJET_ECU_STATE_heat = 0x28, 652 | EVOJET_ECU_STATE_idle = 0x29, 653 | EVOJET_ECU_STATE_lock = 0x2A, 654 | EVOJET_ECU_STATE_rel = 0x2B, 655 | EVOJET_ECU_STATE_spin = 0x2C, 656 | EVOJET_ECU_STATE_stop = 0x2D, 657 | // undefined states 0x2E-0x2F 658 | HORNET_ECU_STATE_OFF = 0x30, 659 | HORNET_ECU_STATE_SLOWDOWN = 0x31, 660 | HORNET_ECU_STATE_COOL_DOWN = 0x32, 661 | HORNET_ECU_STATE_AUTO = 0x33, 662 | HORNET_ECU_STATE_AUTO_HC = 0x34, 663 | HORNET_ECU_STATE_BURNER_ON = 0x35, 664 | HORNET_ECU_STATE_CAL_IDLE = 0x36, 665 | HORNET_ECU_STATE_CALIBRATE = 0x37, 666 | HORNET_ECU_STATE_DEV_DELAY = 0x38, 667 | HORNET_ECU_STATE_EMERGENCY = 0x39, 668 | HORNET_ECU_STATE_FUEL_HEAT = 0x3A, 669 | HORNET_ECU_STATE_FUEL_IGNITE = 0x3B, 670 | HORNET_ECU_STATE_GO_IDLE = 0x3C, 671 | HORNET_ECU_STATE_PROP_IGNITE = 0x3D, 672 | HORNET_ECU_STATE_RAMP_DELAY = 0x3E, 673 | HORNET_ECU_STATE_RAMP_UP = 0x3F, 674 | HORNET_ECU_STATE_STANDBY = 0x40, 675 | HORNET_ECU_STATE_STEADY = 0x41, 676 | HORNET_ECU_STATE_WAIT_ACC = 0x42, 677 | HORNET_ECU_STATE_ERROR = 0x43, 678 | // undefined states 0x44-0x4F 679 | XICOY_ECU_STATE_Temp_High = 0x50, 680 | XICOY_ECU_STATE_Trim_Low = 0x51, 681 | XICOY_ECU_STATE_Set_Idle = 0x52, 682 | XICOY_ECU_STATE_Ready = 0x53, 683 | XICOY_ECU_STATE_Ignition = 0x54, 684 | XICOY_ECU_STATE_Fuel_Ramp = 0x55, 685 | XICOY_ECU_STATE_Glow_Test = 0x56, 686 | XICOY_ECU_STATE_Running = 0x57, 687 | XICOY_ECU_STATE_Stop = 0x58, 688 | XICOY_ECU_STATE_Flameout = 0x59, 689 | XICOY_ECU_STATE_Speed_Low = 0x5A, 690 | XICOY_ECU_STATE_Cooling = 0x5B, 691 | XICOY_ECU_STATE_Igniter_Bad = 0x5C, 692 | XICOY_ECU_STATE_Starter_F = 0x5D, 693 | XICOY_ECU_STATE_Weak_Fuel = 0x5E, 694 | XICOY_ECU_STATE_Start_On = 0x5F, 695 | XICOY_ECU_STATE_Pre_Heat = 0x60, 696 | XICOY_ECU_STATE_Battery = 0x61, 697 | XICOY_ECU_STATE_Time_Out = 0x62, 698 | XICOY_ECU_STATE_Overload = 0x63, 699 | XICOY_ECU_STATE_Igniter_Fail = 0x64, 700 | XICOY_ECU_STATE_Burner_On = 0x65, 701 | XICOY_ECU_STATE_Starting = 0x66, 702 | XICOY_ECU_STATE_SwitchOver = 0x67, 703 | XICOY_ECU_STATE_Cal_Pump = 0x68, 704 | XICOY_ECU_STATE_Pump_Limit = 0x69, 705 | XICOY_ECU_STATE_No_Engine = 0x6A, 706 | XICOY_ECU_STATE_Pwr_Boost = 0x6B, 707 | XICOY_ECU_STATE_Run_Idle = 0x6C, 708 | XICOY_ECU_STATE_Run_Max = 0x6D, 709 | // undefined states 0x6e-0x73 710 | JETCENT_ECU_STATE_STOP = 0x74, 711 | JETCENT_ECU_STATE_GLOW_TEST = 0x75, 712 | JETCENT_ECU_STATE_STARTER_TEST = 0x76, 713 | JETCENT_ECU_STATE_PRIME_FUEL = 0x77, 714 | JETCENT_ECU_STATE_PRIME_BURNER = 0x78, 715 | JETCENT_ECU_STATE_MAN_COOL = 0x79, 716 | JETCENT_ECU_STATE_AUTO_COOL = 0x7A, 717 | JETCENT_ECU_STATE_IGN_HEAT = 0x7B, 718 | JETCENT_ECU_STATE_IGNITION = 0x7C, 719 | JETCENT_ECU_STATE_PREHEAT = 0x7D, 720 | JETCENT_ECU_STATE_SWITCHOVER = 0x7E, 721 | JETCENT_ECU_STATE_TO_IDLE = 0x7F, 722 | JETCENT_ECU_STATE_RUNNING = 0x80, 723 | JETCENT_ECU_STATE_STOP_ERROR = 0x81, 724 | // undefined states 0x82-0x8F 725 | SWIWIN_ECU_STATE_STOP = 0x90, 726 | SWIWIN_ECU_STATE_READY = 0x91, 727 | SWIWIN_ECU_STATE_IGNITION = 0x92, 728 | SWIWIN_ECU_STATE_PREHEAT = 0x93, 729 | SWIWIN_ECU_STATE_FUEL_RAMP = 0x94, 730 | SWIWIN_ECU_STATE_RUNNING = 0x95, 731 | SWIWIN_ECU_STATE_COOLING = 0x96, 732 | SWIWIN_ECU_STATE_RESTART_SWOVER = 0x97, 733 | SWIWIN_ECU_STATE_NOTUSED = 0x98, 734 | // undefined states 0x99-0x9F 735 | 736 | TURBINE_ECU_MAX_STATE = 0x9F 737 | }; 738 | 739 | enum JETCAT_ECU_OFF_CONDITIONS { // ECU off conditions. Valid only when the ECUStatus = JETCAT_ECU_STATE_OFF 740 | JETCAT_ECU_OFF_No_Off_Condition_defined = 0, 741 | JETCAT_ECU_OFF_Shut_down_via_RC, 742 | JETCAT_ECU_OFF_Overtemperature, 743 | JETCAT_ECU_OFF_Ignition_timeout, 744 | JETCAT_ECU_OFF_Acceleration_time_out, 745 | JETCAT_ECU_OFF_Acceleration_too_slow, 746 | JETCAT_ECU_OFF_Over_RPM, 747 | JETCAT_ECU_OFF_Low_Rpm_Off, 748 | JETCAT_ECU_OFF_Low_Battery, 749 | JETCAT_ECU_OFF_Auto_Off, 750 | JETCAT_ECU_OFF_Low_temperature_Off, 751 | JETCAT_ECU_OFF_Hi_Temp_Off, 752 | JETCAT_ECU_OFF_Glow_Plug_defective, 753 | JETCAT_ECU_OFF_Watch_Dog_Timer, 754 | JETCAT_ECU_OFF_Fail_Safe_Off, 755 | JETCAT_ECU_OFF_Manual_Off, // (via GSU) 756 | JETCAT_ECU_OFF_Power_fail, // (Battery fail) 757 | JETCAT_ECU_OFF_Temp_Sensor_fail, // (only during startup) 758 | JETCAT_ECU_OFF_Fuel_fail, 759 | JETCAT_ECU_OFF_Prop_fail, 760 | JETCAT_ECU_OFF_2nd_Engine_fail, 761 | JETCAT_ECU_OFF_2nd_Engine_Diff_Too_High, 762 | JETCAT_ECU_OFF_2nd_Engine_No_Comm, 763 | JETCAT_ECU_MAX_OFF_COND, 764 | // Jet Central 765 | JETCENT_ECU_OFF_No_Off_Condition_defined = 24, // ECU off conditions. Valid only when the ECUStatus = JETCENT_ECU_STATE_STOP or JETCENT_ECU_STATE_STOP_ERROR or JETCENT_ECU_STATE_RUNNING 766 | JETCENT_ECU_OFF_IGNITION_ERROR, 767 | JETCENT_ECU_OFF_PREHEAT_ERROR, 768 | JETCENT_ECU_OFF_SWITCHOVER_ERROR, 769 | JETCENT_ECU_OFF_STARTER_MOTOR_ERROR, 770 | JETCENT_ECU_OFF_TO_IDLE_ERROR, 771 | JETCENT_ECU_OFF_ACCELERATION_ERROR, 772 | JETCENT_ECU_OFF_IGNITER_BAD, 773 | JETCENT_ECU_OFF_MIN_PUMP_OK, 774 | JETCENT_ECU_OFF_MAX_PUMP_OK, 775 | JETCENT_ECU_OFF_LOW_RX_BATTERY, 776 | JETCENT_ECU_OFF_LOW_ECU_BATTERY, 777 | JETCENT_ECU_OFF_NO_RX, 778 | JETCENT_ECU_OFF_TRIM_DOWN, 779 | JETCENT_ECU_OFF_TRIM_UP, 780 | JETCENT_ECU_OFF_FAILSAFE, 781 | JETCENT_ECU_OFF_FULL, 782 | JETCENT_ECU_OFF_RX_SETUP_ERROR, 783 | JETCENT_ECU_OFF_TEMP_SENSOR_ERROR, 784 | JETCENT_ECU_OFF_COM_TURBINE_ERROR, 785 | JETCENT_ECU_OFF_MAX_TEMP, 786 | JETCENT_ECU_OFF_MAX_AMPS, 787 | JETCENT_ECU_OFF_LOW_RPM, 788 | JETCENT_ECU_OFF_ERROR_RPM_SENSOR, 789 | JETCENT_ECU_OFF_MAX_PUMP, 790 | JETCENT_ECU_MAX_OFF_COND 791 | }; 792 | 793 | typedef struct 794 | { 795 | UINT8 identifier; // Source device = 0x19 796 | UINT8 sID; // Secondary ID 797 | UINT16 FuelFlowRateMLMin; // (BCD) mL per Minute 798 | UINT32 RestFuelVolumeInTankML; // (BCD) mL remaining in tank 799 | UINT8 ECUbatteryPercent; // (BCD) % battery pack capacity remaining 800 | // 7 bytes left 801 | } STRU_TELE_JETCAT2; 802 | 803 | ////////////////////////////////////////////////////////////////////////////// 804 | // 805 | // GPS 806 | // Packed-BCD Type 807 | // 808 | ////////////////////////////////////////////////////////////////////////////// 809 | // 810 | typedef struct 811 | { 812 | UINT8 identifier; // Source device = 0x16 813 | UINT8 sID; // Secondary ID 814 | UINT16 altitudeLow; // BCD, meters, format 3.1 (Low order of altitude) 815 | UINT32 latitude; // BCD, format 4.4, Degrees * 100 + minutes, less than 100 degrees 816 | UINT32 longitude; // BCD, format 4.4 , Degrees * 100 + minutes, flag indicates > 99 degrees 817 | UINT16 course; // BCD, 3.1 818 | UINT8 HDOP; // BCD, format 1.1 819 | UINT8 GPSflags; // see definitions below 820 | } STRU_TELE_GPS_LOC; 821 | 822 | typedef struct 823 | { 824 | UINT8 identifier; // Source device = 0x17 825 | UINT8 sID; // Secondary ID 826 | UINT16 speed; // BCD, knots, format 3.1 827 | UINT32 UTC; // BCD, format HH:MM:SS.S, format 6.1 828 | UINT8 numSats; // BCD, 0-99 829 | UINT8 altitudeHigh; // BCD, meters, format 2.0 (High order of altitude) 830 | UINT8 unused[6]; 831 | } STRU_TELE_GPS_STAT; 832 | 833 | // GPS flags definitions: 834 | #define GPS_INFO_FLAGS_IS_NORTH_BIT (0) 835 | #define GPS_INFO_FLAGS_IS_NORTH (1 << GPS_INFO_FLAGS_IS_NORTH_BIT) 836 | #define GPS_INFO_FLAGS_IS_EAST_BIT (1) 837 | #define GPS_INFO_FLAGS_IS_EAST (1 << GPS_INFO_FLAGS_IS_EAST_BIT) 838 | #define GPS_INFO_FLAGS_LONGITUDE_GREATER_99_BIT (2) 839 | #define GPS_INFO_FLAGS_LONGITUDE_GREATER_99 (1 << GPS_INFO_FLAGS_LONGITUDE_GREATER_99_BIT) 840 | #define GPS_INFO_FLAGS_GPS_FIX_VALID_BIT (3) 841 | #define GPS_INFO_FLAGS_GPS_FIX_VALID (1 << GPS_INFO_FLAGS_GPS_FIX_VALID_BIT) 842 | #define GPS_INFO_FLAGS_GPS_DATA_RECEIVED_BIT (4) 843 | #define GPS_INFO_FLAGS_GPS_DATA_RECEIVED (1 << GPS_INFO_FLAGS_GPS_DATA_RECEIVED_BIT) 844 | #define GPS_INFO_FLAGS_3D_FIX_BIT (5) 845 | #define GPS_INFO_FLAGS_3D_FIX (1 << GPS_INFO_FLAGS_3D_FIX_BIT) 846 | #define GPS_INFO_FLAGS_NEGATIVE_ALT_BIT (7) 847 | #define GPS_INFO_FLAGS_NEGATIVE_ALT (1 << GPS_INFO_FLAGS_NEGATIVE_ALT_BIT) 848 | 849 | ////////////////////////////////////////////////////////////////////////////// 850 | // 851 | // GPS 852 | // Binary Type 853 | // 854 | // NOTE: Data resolution for all fields matches Crossfire EXCEPT speed. 855 | // 856 | ////////////////////////////////////////////////////////////////////////////// 857 | // 858 | typedef struct 859 | { 860 | UINT8 identifier; // Source device = 0x26 861 | UINT8 sID; // Secondary ID 862 | UINT16 altitude; // m, 1000m offset 863 | INT32 latitude; // degree / 10,000,000 864 | INT32 longitude; // degree / 10,000,000 865 | UINT16 heading; // degree / 10 866 | UINT8 groundSpeed; // km/h 867 | UINT8 numSats; // count 868 | } STRU_TELE_GPS_BINARY; 869 | 870 | ////////////////////////////////////////////////////////////////////////////// 871 | // 872 | // AS3X Legacy Gain Report 873 | // 874 | ////////////////////////////////////////////////////////////////////////////// 875 | // 876 | typedef struct 877 | { 878 | UINT8 identifier; // Source device = TELE_DEVICE_AS3X_LEGACYGAIN 879 | UINT8 sID; // Secondary ID 880 | UINT8 gainRoll; // Configured normal gains per axis 881 | UINT8 gainPitch; 882 | UINT8 gainYaw; 883 | UINT8 headRoll; // Configured heading hold gains per axis 884 | UINT8 headPitch; 885 | UINT8 headYaw; 886 | UINT8 activeRoll; // Active gains per axis (as affected by FM channel) 887 | UINT8 activePitch; 888 | UINT8 activeYaw; 889 | UINT8 flightMode; // bit 7 1 --> FM present in bits 0,1 except 0xFF --> not present 890 | UINT8 unused[4]; 891 | } STRU_TELE_AS3X_LEGACY; 892 | 893 | ////////////////////////////////////////////////////////////////////////////// 894 | // 895 | // AS6X Gain Report (AS3X Legacy + more fields) 896 | // 897 | ////////////////////////////////////////////////////////////////////////////// 898 | // 899 | typedef struct 900 | { 901 | UINT8 identifier; // Source device = TELE_DEVICE_AS6X_GAIN 902 | UINT8 sID; // Secondary ID 903 | UINT8 gainRoll; // Configured normal gains per axis 904 | UINT8 gainPitch; 905 | UINT8 gainYaw; 906 | UINT8 headRoll; // Configured heading hold gains per axis 907 | UINT8 headPitch; 908 | UINT8 headYaw; 909 | UINT8 activeRoll; // Active gains per axis (as affected by FM channel) 910 | UINT8 activePitch; 911 | UINT8 activeYaw; 912 | UINT8 flightMode; // bit 7 1 --> FM present in bits 0,1 except 0xFF --> not present 913 | // new fields go here: 914 | UINT8 unused[4]; 915 | } STRU_TELE_AS6X_GAIN; 916 | 917 | ////////////////////////////////////////////////////////////////////////////// 918 | // 919 | // GYRO 920 | // 921 | ////////////////////////////////////////////////////////////////////////////// 922 | // 923 | // Uses big-endian byte order 924 | // 925 | typedef struct 926 | { 927 | UINT8 identifier; // Source device = 0x1A 928 | UINT8 sID; // Secondary ID 929 | INT16 gyroX; // Rotation rates of the body - Rate is about the X Axis which is defined out the nose of the vehicle. 930 | INT16 gyroY; // Units are 0.1 deg/sec - Rate is about the Y Axis which is define out the right wing of the vehicle. 931 | INT16 gyroZ; // Rate is about the Z axis which is defined down from the vehicle. 932 | INT16 maxGyroX; // Max rates (absolute value) 933 | INT16 maxGyroY; 934 | INT16 maxGyroZ; 935 | } STRU_TELE_GYRO; 936 | 937 | ////////////////////////////////////////////////////////////////////////////// 938 | // 939 | // Alpha6 Stabilizer 940 | // 941 | ////////////////////////////////////////////////////////////////////////////// 942 | // 943 | typedef struct 944 | { 945 | UINT8 identifier; // Source device = 0x24 946 | UINT8 sID; // Secondary ID 947 | UINT16 volts; // 0.01V increments 948 | UINT8 state_FM; // Flight Mode and System State (see below) 949 | UINT8 gainRoll, // Roll Gain, high bit --> Heading Hold 950 | gainPitch, // Pitch Gain 951 | gainYaw; // Yaw Gain 952 | INT16 attRoll, // Roll Attitude, 0.1degree, RHR 953 | attPitch, // Pitch Attitude 954 | attYaw; // Yaw Attitude 955 | UINT16 spare; 956 | } STRU_TELE_ALPHA6; 957 | 958 | #define GBOX_STATE_BOOT (0x00) // Alpha6 State - Boot 959 | #define GBOX_STATE_INIT (0x01) // Init 960 | #define GBOX_STATE_READY (0x02) // Ready 961 | #define GBOX_STATE_SENSORFAULT (0x03) // Sensor Fault 962 | #define GBOX_STATE_POWERFAULT (0x04) // Power Fault 963 | #define GBOX_STATE_MASK (0x0F) 964 | 965 | #define GBOX_FMODE_FM0 (0x00) // FM0 through FM4 966 | #define GBOX_FMODE_FM1 (0x10) 967 | #define GBOX_FMODE_FM2 (0x20) 968 | #define GBOX_FMODE_FM3 (0x30) 969 | #define GBOX_FMODE_FM4 (0x40) 970 | #define GBOX_FMODE_PANIC (0x50) 971 | #define GBOX_FMODE_MASK (0xF0) 972 | 973 | ////////////////////////////////////////////////////////////////////////////// 974 | // 975 | // ATTITUDE & MAG COMPASS 976 | // 977 | ////////////////////////////////////////////////////////////////////////////// 978 | // 979 | typedef struct 980 | { 981 | UINT8 identifier; // Source device = 0x1B 982 | UINT8 sID; // Secondary ID 983 | INT16 attRoll; // Attitude, 3 axes. Roll is a rotation about the X Axis of the vehicle using the RHR. 984 | INT16 attPitch; // Units are 0.1 deg - Pitch is a rotation about the Y Axis of the vehicle using the RHR. 985 | INT16 attYaw; // Yaw is a rotation about the Z Axis of the vehicle using the RHR. 986 | INT16 magX; // Magnetic Compass, 3 axes 987 | INT16 magY; // Units are 0.1mG 988 | INT16 magZ; // 989 | UINT16 heading; // Heading, 0.1deg 990 | } STRU_TELE_ATTMAG; 991 | 992 | ////////////////////////////////////////////////////////////////////////////// 993 | // 994 | // Altitude "Zero" Message 995 | // 996 | ////////////////////////////////////////////////////////////////////////////// 997 | // 998 | typedef struct 999 | { 1000 | UINT8 identifier; // Source device = 0x7B 1001 | UINT8 sID; // Secondary ID 1002 | UINT8 spare[2]; 1003 | UINT32 altOffset; // Altitude "zero" log 1004 | } STRU_TELE_ALT_ZERO; 1005 | 1006 | ////////////////////////////////////////////////////////////////////////////// 1007 | // 1008 | // Real-Time Clock 1009 | // 1010 | ////////////////////////////////////////////////////////////////////////////// 1011 | // 1012 | typedef struct 1013 | { 1014 | UINT8 identifier; // Source device = 0x7C 1015 | UINT8 sID; // Secondary ID 1016 | UINT8 spare[6]; 1017 | UINT64 UTC64; // Linux 64-bit time_t for post-2038 date compatibility 1018 | } STRU_TELE_RTC; 1019 | 1020 | ////////////////////////////////////////////////////////////////////////////// 1021 | // 1022 | // V-Speak (Placeholder) 1023 | // 1024 | ////////////////////////////////////////////////////////////////////////////// 1025 | // 1026 | typedef struct 1027 | { 1028 | UINT8 identifier; // Source device = 0x61 1029 | UINT8 sID; // Secondary ID 1030 | UINT8 spare[14]; // Format TBD by V-Speak 1031 | } STRU_TELE_V_SPEAK; 1032 | 1033 | ////////////////////////////////////////////////////////////////////////////// 1034 | // 1035 | // www.Smoke-EL.de 1036 | // 1037 | ////////////////////////////////////////////////////////////////////////////// 1038 | // 1039 | typedef struct 1040 | { 1041 | UINT8 identifier; // Source device = 0x61 1042 | UINT8 sID; // Secondary ID 1043 | UINT16 batteryV; // 0.01V, Range 0.00-70.00V 1044 | UINT16 countdown; // 0.01s, Range 0.00-30.00s 1045 | INT16 GForce; // 0.01g, Range = +/-8.00g 1046 | UINT8 cutoff; // 1 count, Range 0-9 1047 | UINT8 connected; // 0=not connected, 1=connected, x = TBD 1048 | UINT16 spare[3]; 1049 | } STRU_TELE_SMOKE_EL; 1050 | 1051 | ////////////////////////////////////////////////////////////////////////////// 1052 | // 1053 | // MULTI-CYLINDER SENSOR 1054 | // 1055 | ////////////////////////////////////////////////////////////////////////////// 1056 | // 1057 | typedef struct 1058 | { 1059 | UINT8 identifier; // Source device = TELE_DEVICE_MULTICYLINDER 1060 | UINT8 sID; // Secondary ID 1061 | UINT8 temperature[9]; // Temperature, 1C increments, Offset = 30C, 0xFF = NO DATA 1062 | // 0x00 = 30C (86F) 1063 | // 0x01 = 31C ... (88F) 1064 | // 0xFE = 284C (543F) 1065 | // 0xFF = NO SENSOR ATTACHED. Note that sensors must be installed cylinder 1-9 in sequence! 1066 | UINT8 throttlePct; // Throttle percent (0-100% typical, 0xFF = NO DATA) 1067 | UINT16 RPM; // 4 RPM increments, Offset = 400RPM, range 404-16776. 1068 | // 0x000 = 0 RPM 1069 | // 0x001 = 404 RPM 1070 | // 0x002 = 408 RPM 1071 | // 0xFFE = 16776 RPM 1072 | // 0xFFF = NO SENSOR ATTACHED 1073 | // NOTE: HI NYBBLE RESERVED, set to 0xF to mark "NO DATA" for now 1074 | UINT8 batteryV; // Voltage, 0.1V increments, Offset = 3.5V, 0xFF = NO DATA 1075 | // 0x00 = 3.5V 1076 | // 0x01 = 3.6V 1077 | // 0xFE = 28.9V 1078 | // 0xFF = NO SENSOR ATTACHED 1079 | UINT8 spare; // 0xFF --> no data 1080 | } STRU_TELE_MULTI_TEMP; 1081 | 1082 | ////////////////////////////////////////////////////////////////////////////// 1083 | // 1084 | // Transmitter Frame Data 1085 | // 1086 | ////////////////////////////////////////////////////////////////////////////// 1087 | // 1088 | typedef struct 1089 | { 1090 | UINT8 identifier; // Source device = 0x7D 1091 | UINT8 sID; // Secondary ID 1092 | UINT16 chanData[7]; // Channel Data array 1093 | } STRU_TELE_FRAMEDATA; 1094 | 1095 | ////////////////////////////////////////////////////////////////////////////// 1096 | // 1097 | // AHRS Monitor 1098 | // 1099 | ////////////////////////////////////////////////////////////////////////////// 1100 | // 1101 | typedef struct 1102 | { 1103 | UINT8 identifier; // Source device = TELE_DEVICE_AHRS 1104 | UINT8 sID; // Secondary ID 1105 | INT16 attRoll; // Attitude, 3 axes. Roll is a rotation about the X Axis of the vehicle using the RHR. 1106 | INT16 attPitch; // Units are 0.1 deg - Pitch is a rotation about the Y Axis of the vehicle using the RHR. 1107 | INT16 attYaw; // Roll is a rotation about the Z Axis of the vehicle using the RHR. 1108 | INT16 altitude; // .1m increments 1109 | UINT8 waypoint; // Waypoint number 1110 | UINT8 spare8; 1111 | UINT16 spare16[2]; 1112 | } STRU_TELE_AHRS; // AHRS data from rx 1113 | 1114 | ////////////////////////////////////////////////////////////////////////////// 1115 | // 1116 | // FLIGHT MODE 1117 | // 1118 | ////////////////////////////////////////////////////////////////////////////// 1119 | // 1120 | typedef struct 1121 | { 1122 | UINT8 identifier; // Source device = 0x05 TELE_DEVICE_FLITECTRL 1123 | UINT8 sID; // Secondary ID 1124 | UINT8 fMode, // Current flight mode (low nybble) 1125 | spare8; 1126 | UINT16 spare[6]; // Growth 1127 | // Ideas - 1128 | // arming status in a bitmap 1129 | // time in state 1130 | } STRU_TELE_FLITECTRL; 1131 | 1132 | 1133 | ////////////////////////////////////////////////////////////////////////////// 1134 | // 1135 | // Crossfire QOS 1136 | // 1137 | ////////////////////////////////////////////////////////////////////////////// 1138 | // 1139 | typedef struct 1140 | { 1141 | UINT8 identifier; // Source device = TELE_XRF_LINKSTATUS 1142 | UINT8 sID; // Secondary ID 1143 | UINT8 ant1, // dBm * -1 1144 | ant2, 1145 | quality; // % 1146 | INT8 SNR; // dB 1147 | UINT8 activeAnt, // ant1=0, ant2=1 1148 | RFmode, // 4fps=0, 50fps, 150Hz 1149 | upPower, // 0mW=0, 10mW, 25mW, 100mW, 500mW, 1000mW, 2000mW 1150 | downlink, // dBm * -1 1151 | qualityDown; // % 1152 | INT8 SNRdown; // dB 1153 | } STRU_TELE_XF_QOS; 1154 | 1155 | ////////////////////////////////////////////////////////////////////////////// 1156 | // 1157 | // RPM/Volts/Temperature 1158 | // 1159 | ////////////////////////////////////////////////////////////////////////////// 1160 | // 1161 | // Uses big-endian byte order 1162 | // 1163 | typedef struct 1164 | { 1165 | UINT8 identifier; // Source device = 0x7E 1166 | UINT8 sID; // Secondary ID 1167 | UINT16 microseconds; // microseconds between pulse leading edges 1168 | UINT16 volts; // 0.01V increments (typically flight pack voltage) 1169 | INT16 temperature; // Temperature in degrees F. 0x7FFF = "No Data" 1170 | INT8 dBm_A, // Avg RSSI in dBm (<-1 = dBm, 0 = no data, >0 = % range) -- (legacy)antenna A in dBm 1171 | dBm_B; // Avg RSSI in % (<-1 = dBm, 0 = no data, >0 = % range) -- (legacy)antenna B in dBm 1172 | // Note: Legacy use as antenna A/B dBm values is still supported. If only 1 antenna, set B = A. 1173 | // The "no data" value is 0, but -1 (0xFF) is treated the same for backwards compatibility 1174 | UINT16 spare[2]; 1175 | UINT16 fastbootUptime; // bit 15 = fastboot flag. Bits 0-14= uptime in seconds. 0x0000 --> no data 1176 | } STRU_TELE_RPM; 1177 | 1178 | ////////////////////////////////////////////////////////////////////////////// 1179 | // 1180 | // QoS DATA 1181 | // 1182 | ////////////////////////////////////////////////////////////////////////////// 1183 | // 1184 | // NOTE: AR6410-series send: 1185 | // id = 7F 1186 | // sID = 0 1187 | // A = 0 1188 | // B = 0 1189 | // L = 0 1190 | // R = 0 1191 | // F = fades 1192 | // H = holds 1193 | // rxV = 0xFFFF 1194 | // 1195 | typedef struct 1196 | { 1197 | UINT8 identifier; // Source device = 0x7F 1198 | UINT8 sID; // Secondary ID 1199 | UINT16 A; // Internal/base receiver fades. 0xFFFF = "No data". Note that FFFF in SRXL2 will cause telemetry sender to overwrite. 1200 | UINT16 B; // Remote receiver fades. 0xFFFE or 0xFFFF = "No data". 1201 | UINT16 L; // Third receiver fades. 0xFFFE or 0xFFFF = "No data" 1202 | UINT16 R; // Fourth receiver fades. 0xFFFE or 0xFFFF = "No data" 1203 | UINT16 F; // Frame losses. 0xFFFF = "No data" 1204 | UINT16 H; // Holds. 0xFFFF = "No data" 1205 | UINT16 rxVoltage; // Volts, .01V increment. 0xFFFF = "No data" 1206 | } STRU_TELE_QOS; 1207 | 1208 | ////////////////////////////////////////////////////////////////////////////// 1209 | // 1210 | // UNION OF ALL DEVICE MESSAGES 1211 | // 1212 | ////////////////////////////////////////////////////////////////////////////// 1213 | // 1214 | typedef union 1215 | { 1216 | UINT16 raw[8]; 1217 | STRU_TELE_QOS qos; 1218 | STRU_TELE_RPM rpm; 1219 | STRU_TELE_HV hv; 1220 | STRU_TELE_TEMP temp; 1221 | STRU_TELE_IHIGH amps; 1222 | STRU_TELE_ALT alt; 1223 | STRU_TELE_SPEED speed; 1224 | STRU_TELE_ESC escSPM; 1225 | STRU_TELE_VARIO_S varioSimple; 1226 | STRU_TELE_G_METER accel; 1227 | STRU_TELE_JETCAT jetcat; 1228 | STRU_TELE_JETCAT2 jetcat2; 1229 | STRU_TELE_GPS_LOC gpsloc; 1230 | STRU_TELE_GPS_STAT gpsstat; 1231 | STRU_TELE_GPS_BINARY gpsbin; 1232 | STRU_TELE_AS3X_LEGACY as3x; 1233 | STRU_TELE_AS6X_GAIN as6x; 1234 | STRU_TELE_GYRO gyro; 1235 | STRU_TELE_ALPHA6 alpha6; 1236 | STRU_TELE_ATTMAG attMag; 1237 | STRU_TELE_POWERBOX powerBox; 1238 | STRU_TELE_RX_MAH rxMAH; 1239 | STRU_TELE_FP_MAH fpMAH; 1240 | STRU_TELE_ESC esc; 1241 | STRU_TELE_FUEL fuel; 1242 | STRU_TELE_DIGITAL_AIR digAir; 1243 | STRU_TELE_STRAIN strain; 1244 | STRU_TELE_LIPOMON lipomon; 1245 | STRU_TELE_LIPOMON_14 lipomon14; 1246 | STRU_TELE_USER_16SU user_16SU; 1247 | STRU_TELE_USER_16SU32U user_16SU32U; 1248 | STRU_TELE_USER_16SU32S user_16SU32S; 1249 | STRU_TELE_USER_16U32SU user_16U32SU; 1250 | STRU_TELE_TEXTGEN textgen; 1251 | STRU_TELE_VTX vtx; 1252 | STRU_TELE_V_SPEAK vSpeak; 1253 | STRU_TELE_SMOKE_EL smoke_el; 1254 | STRU_TELE_MULTI_TEMP multiCylinder; 1255 | STRU_TELE_FLITECTRL fControl; 1256 | STRU_TELE_TILT tilt; 1257 | STRU_TELE_XF_QOS xfire; 1258 | } UN_TELEMETRY; // All telemetry messages 1259 | 1260 | ////////////////////////////////////////////////////////////////// 1261 | // 1262 | // sID Field Functionality 1263 | // 1264 | ////////////////////////////////////////////////////////////////// 1265 | // 1266 | // if .sID == 0x00 then .identifier = device type (TELE_DEVICE_xxx) and address I2C bus 1267 | // if .sID != 0x00 then .sID = device type and .identifer = address on I2C bus 1268 | 1269 | #endif 1270 | --------------------------------------------------------------------------------