//////////////////////////////////////////////////////////////////////////////
//
//	Copyright 2013 by Horizon Hobby, Inc.
//	All Rights Reserved Worldwide.
//
//	Released to Public Domain
//
//	This header file may be incorporated into non-Horizon
//	products.
//
//////////////////////////////////////////////////////////////////////////////
//
//	Author:		AK
//	Date:		2017-02-24
//	Mods:		Sync to Spektrum internal version by matching sequence of
//				structs, formatting, etc.  Also changed some structs from
//				having "id" to "identifier."  Also redefined "spare" in Rx MAH
//				to provide more bits for "chargeUsed" fields.
//
#ifndef TELEMETRY_H
#define	TELEMETRY_H

//////////////////////////////////////////////////////////////////////////////
//
//				TELEMETRY SENSOR I2C ADDRESSES & DEVICE TYPES
//
//////////////////////////////////////////////////////////////////////////////

#define	TELE_DEVICE_NODATA			(0x00)										// No data in packet, but telemetry is alive
#define	TELE_DEVICE_VOLTAGE			(0x01)										// High-Voltage sensor (INTERNAL)
#define	TELE_DEVICE_TEMPERATURE		(0x02)										// Temperature Sensor (INTERNAL)
#define	TELE_DEVICE_AMPS			(0x03)										// Amps (INTERNAL)
#define	TELE_DEVICE_RSV_04			(0x04)										// Reserved
#define	TELE_DEVICE_FLITECTRL		(0x05)										// Flight Controller Status Report
#define	TELE_DEVICE_RSV_06			(0x06)										// Reserved
#define	TELE_DEVICE_RSV_07			(0x07)										// Reserved
#define	TELE_DEVICE_RSV_08			(0x08)										// Reserved
//#define	DO_NOT_USE				(0x09)										// DO NOT USE!
#define	TELE_DEVICE_PBOX			(0x0A)										// PowerBox
#define	TELE_DEVICE_LAPTIMER		(0x0B)										// Lap Timer
#define	TELE_DEVICE_TEXTGEN			(0x0C)										// Text Generator
#define	TELE_DEVICE_VTX				(0x0D)										// Video Transmitter Feedback
#define	TELE_DEVICE_RSV_0E			(0x0E)										// Reserved
#define	TELE_DEVICE_RSV_0F			(0x0F)										// Reserved
#define	TELE_DEVICE_RSV_10			(0x10)										// Reserved
#define	TELE_DEVICE_AIRSPEED		(0x11)										// Air Speed (Eagle Tree Sensor)
#define	TELE_DEVICE_ALTITUDE		(0x12)										// Altitude (Eagle Tree Sensor)
#define	TELE_DEVICE_RSV_13			(0x13)										// Reserved
#define	TELE_DEVICE_GMETER			(0x14)										// G-Force (Eagle Tree Sensor)
#define	TELE_DEVICE_JETCAT			(0x15)										// Turbine interface (Eagle Tree)
#define	TELE_DEVICE_GPS_LOC			(0x16)										// GPS Location Data (Eagle Tree)
#define	TELE_DEVICE_GPS_STATS		(0x17)										// GPS Status (Eagle Tree)
#define	TELE_DEVICE_RX_MAH			(0x18)										// Receiver Pack Capacity (Dual)
#define	TELE_DEVICE_JETCAT_2		(0x19)										// Turbine interface, message 2 format (Eagle Tree)
#define	TELE_DEVICE_GYRO			(0x1A)										// 3-axis gyro
#define	TELE_DEVICE_ATTMAG			(0x1B)										// Attitude and Magnetic Compass
#define	TELE_DEVICE_TILT			(0x1C)										// Surface Tilt Sensor
#define	TELE_DEVICE_RSV_1D			(0x1D)										// Reserved
#define	TELE_DEVICE_AS6X_GAIN		(0x1E)										// Active AS6X Gains (new mode)
#define	TELE_DEVICE_AS3X_LEGACYGAIN	(0x1F)										// Active AS3X Gains for legacy mode
#define	TELE_DEVICE_ESC				(0x20)										// Electronic Speed Control
#define	TELE_DEVICE_RSV_21			(0x21)										// Reserved
#define	TELE_DEVICE_FUEL			(0x22)										// Fuel Flow Meter
#define	TELE_DEVICE_RSV_23			(0x23)										// Reserved
#define	TELE_DEVICE_ALPHA6			(0x24)										// Alpha6 Stabilizer
#define	TELE_DEVICE_RSV_25			(0x25)										// Reserved
#define	TELE_DEVICE_GPS_BINARY		(0x26)										// GPS, binary format
#define	TELE_DEVICE_RSV_27			(0x27)										// Reserved
#define	TELE_DEVICE_RSV_28			(0x28)										// Reserved
#define	TELE_DEVICE_RSV_29			(0x29)										// Reserved
#define	TELE_DEVICE_RSV_2A			(0x2A)										// Reserved
#define	TELE_DEVICE_RSV_2B			(0x2B)										// Reserved
#define	TELE_DEVICE_RSV_2C			(0x2C)										// Reserved
#define	TELE_DEVICE_RSV_2D			(0x2D)										// Reserved
#define	TELE_DEVICE_RSV_2E			(0x2E)										// Reserved
#define	TELE_DEVICE_RSV_2F			(0x2F)										// Reserved
//#define	DO_NOT_USE				(0x30)										// Internal ST sensor
//#define	DO_NOT_USE				(0x32)										// Internal ST sensor
#define	TELE_DEVICE_RSV_33			(0x33)										// Reserved
#define	TELE_DEVICE_FP_MAH			(0x34)										// Flight Battery Capacity (Dual)
#define	TELE_DEVICE_RSV_35			(0x35)										// Reserved
#define	TELE_DEVICE_DIGITAL_AIR		(0x36)										// Digital Inputs & Tank Pressure
#define	TELE_DEVICE_RSV_37			(0x37)										// Reserved
#define	TELE_DEVICE_STRAIN			(0x38)										// Thrust/Strain Gauge
#define	TELE_DEVICE_RSV_39			(0x39)										// Reserved
#define	TELE_DEVICE_LIPOMON			(0x3A)										// 6S Cell Monitor (LiPo taps)
#define	TELE_DEVICE_RSV_3B			(0x3B)										// Reserved
#define	TELE_DEVICE_RSV_3C			(0x3C)										// Reserved
#define	TELE_DEVICE_RSV_3D			(0x3D)										// Reserved
#define	TELE_DEVICE_RSV_3E			(0x3E)										// Reserved
#define	TELE_DEVICE_LIPOMON_14		(0x3F)										// 14S Cell Monitor (LiPo taps)
#define	TELE_DEVICE_VARIO_S			(0x40)										// Vario
#define	TELE_DEVICE_RSV_41			(0x41)										// Reserved
#define	TELE_DEVICE_SMARTBATT		(0x42)										// Spektrum SMART Battery (multiple structs)
#define	TELE_DEVICE_RSV_43			(0x43)										// Reserved
#define	TELE_DEVICE_RSV_44			(0x44)										// Reserved
#define	TELE_DEVICE_RSV_45			(0x45)										// Reserved
#define	TELE_DEVICE_RSV_46			(0x46)										// Reserved
#define	TELE_DEVICE_RSV_47			(0x47)										// Reserved
#define	TELE_DEVICE_RSV_48			(0x48)										// Reserved
#define	TELE_DEVICE_RSV_49			(0x49)										// Reserved
#define	TELE_DEVICE_RSV_4A			(0x4A)										// Reserved
#define	TELE_DEVICE_RSV_4B			(0x4B)										// Reserved
#define	TELE_DEVICE_RSV_4C			(0x4C)										// Reserved
#define	TELE_DEVICE_RSV_4D			(0x4D)										// Reserved
#define	TELE_DEVICE_RSV_4E			(0x4E)										// Reserved
#define	TELE_DEVICE_RSV_4F			(0x4F)										// Reserved
#define	TELE_DEVICE_USER_16SU		(0x50)										// User-Defined, STRU_TELE_USER_16SU
#define	TELE_DEVICE_RSV_51			(0x51)										// Reserved
#define	TELE_DEVICE_USER_16SU32U	(0x52)										// User-Defined, STRU_TELE_USER_16SU32U
#define	TELE_DEVICE_RSV_53			(0x53)										// Reserved
#define	TELE_DEVICE_USER_16SU32S	(0x54)										// User-Defined, STRU_TELE_USER_16SU32S
#define	TELE_DEVICE_RSV_55			(0x55)										// Reserved
#define	TELE_DEVICE_USER_16U32SU	(0x56)										// User-Defined, STRU_TELE_USER_16U32SU
#define	TELE_DEVICE_RSV_57			(0x57)										// Reserved
#define	TELE_DEVICE_RSV_58			(0x58)										// Reserved
#define	TELE_DEVICE_MULTICYLINDER	(0x59)										// Multi-cylinder temp sensor
#define	TELE_DEVICE_RSV_5A			(0x5A)										// Reserved
#define	TELE_DEVICE_RSV_5B			(0x5B)										// Reserved
#define	TELE_DEVICE_RSV_5C			(0x5C)										// Reserved
#define	TELE_DEVICE_RSV_5D			(0x5D)										// Reserved
#define	TELE_DEVICE_RSV_5E			(0x5E)										// Reserved
#define	TELE_DEVICE_RSV_5F			(0x5F)										// Reserved
#define	TELE_DEVICE_VSPEAK			(0x60)										// Reserved for V-Speak
#define	TELE_DEVICE_SMOKE_EL		(0x61)										// Reserved for Smoke-EL.de
#define	TELE_DEVICE_CROSSFIRE		(0x62)										// Reserved for Crossfire devices
#define	TELE_DEVICE_RSV_63			(0x63)										// Reserved
#define	TELE_DEVICE_RSV_64			(0x64)										// Reserved
#define	TELE_DEVICE_RSV_65			(0x65)										// Reserved
#define	TELE_DEVICE_EXTRF			(0x66)										// Reserved for Generic External RF sources
#define	TELE_DEVICE_RSV_67			(0x67)										// Reserved
#define	TELE_DEVICE_RSV_68			(0x68)										// Reserved
#define	TELE_DEVICE_RSV_69			(0x69)										// Reserved
#define	TELE_DEVICE_RSV_6A			(0x6A)										// Reserved
//#define	DO_NOT_USE				(0x6B)										// DO NOT USE!
#define	TELE_DEVICE_RSV_6C			(0x6C)										// Reserved
#define	TELE_DEVICE_RSV_6D			(0x6D)										// Reserved
#define	TELE_DEVICE_RSV_6E			(0x6E)										// Reserved
#define	TELE_DEVICE_RSV_6F			(0x6F)										// Reserved
#define	TELE_DEVICE_RSV_70			(0x70)										// Reserved
#define	TELE_XRF_LINKSTATUS			(0x71)										// External RF Link Status
#define	TELE_DEVICE_RSV_72			(0x72)										// Reserved
#define	TELE_DEVICE_RSV_73			(0x73)										// Reserved
#define	TELE_DEVICE_RSV_74			(0x74)										// Reserved
#define	TELE_DEVICE_RSV_75			(0x75)										// Reserved
#define	TELE_DEVICE_RSV_76			(0x76)										// Reserved
#define	TELE_DEVICE_RSV_77			(0x77)										// Reserved
#define	TELE_DEVICE_RSV_78			(0x78)										// Reserved
#define	TELE_DEVICE_RSV_79			(0x79)										// Reserved
#define	TELE_DEVICE_RSV_7A			(0x7A)										// Reserved
#define	TELE_DEVICE_ALT_ZERO		(0x7B)										// Pseudo-device setting Altitude "zero"
#define	TELE_DEVICE_RTC				(0x7C)										// Pseudo-device giving timestamp
#define	TELE_DEVICE_RPM				(0x7E)										// RPM sensor
#define	TELE_DEVICE_QOS				(0x7F)										// RxV + flight log data
#define	TELE_DEVICE_MAX				(0x7F)										// Last address available

#define	TELE_DEVICE_SHORTRANGE		(0x80)										// OR this bit to indicate data is from a short-range telemetry device (e.g. TM1100)

#define	TELE_DEVICE_MAX_PROGRAM		(0x70)										// Last programmable address when using sID

//////////////////////////////////////////////////////////////////////////////
//
//							TELEMETRY
//					DEVICE-SPECIFIC STRUCTURES
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
//		THIRD-PARTY 16-BIT DATA SIGNED/UNSIGNED
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8	identifier;															// Source device = 0x50
	UINT8	sID;																// Secondary ID
	INT16	sField1,															// Signed 16-bit data fields
			sField2,
			sField3;
	UINT16	uField1, 															// Unsigned 16-bit data fields
			uField2,
			uField3,
			uField4;
} STRU_TELE_USER_16SU;

//////////////////////////////////////////////////////////////////////////////
//
//		THIRD-PARTY 16-BIT SIGNED/UNSIGNED AND 32-BIT UNSIGNED
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8	identifier;															// Source device = 0x52
	UINT8	sID;																// Secondary ID
	INT16	sField1,															// Signed 16-bit data fields
			sField2;
	UINT16	uField1, 															// Unsigned 16-bit data fields
			uField2,
			uField3;
	UINT32	u32Field; 															// Unsigned 32-bit data field
} STRU_TELE_USER_16SU32U;

//////////////////////////////////////////////////////////////////////////////
//
//		THIRD-PARTY 16-BIT SIGNED/UNSIGNED AND 32-BIT SIGNED
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8	identifier;															// Source device = 0x54
	UINT8	sID;																// Secondary ID
	INT16	sField1,															// Signed 16-bit data fields
			sField2;
	UINT16	uField1, 															// Unsigned 16-bit data fields
			uField2,
			uField3;
	INT32	s32Field; 															// Signed 32-bit data field
} STRU_TELE_USER_16SU32S;

//////////////////////////////////////////////////////////////////////////////
//
//		THIRD-PARTY 16-BIT UNSIGNED AND 32-BIT SIGNED/UNSIGNED
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8	identifier;															// Source device = 0x56
	UINT8	sID;																// Secondary ID
	UINT16	uField1; 															// Unsigned 16-bit data field
	INT32	s32Field; 															// Signed 32-bit data field
	UINT32	u32Field1, 															// Unsigned 32-bit data fields
			u32Field2;
} STRU_TELE_USER_16U32SU;

//////////////////////////////////////////////////////////////////////////////
//
//							POWERBOX
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8	identifier;															// Source device = 0x0A
	UINT8	sID;																// Secondary ID
	UINT16	volt1;																// Volts, 0.01v
	UINT16	volt2;																// Volts, 0.01v
	UINT16	capacity1;															// mAh, 1mAh
	UINT16	capacity2;															// mAh, 1mAh
	UINT16	spare16_1;
	UINT16	spare16_2;
	UINT8	spare;
	UINT8	alarms;																// Alarm bitmask (see below)
} STRU_TELE_POWERBOX;

#define	TELE_PBOX_ALARM_VOLTAGE_1			(0x01)
#define	TELE_PBOX_ALARM_VOLTAGE_2			(0x02)
#define	TELE_PBOX_ALARM_CAPACITY_1			(0x04)
#define	TELE_PBOX_ALARM_CAPACITY_2			(0x08)
//#define	TELE_PBOX_ALARM_RPM					(0x10)
//#define	TELE_PBOX_ALARM_TEMPERATURE			(0x20)
#define	TELE_PBOX_ALARM_RESERVED_1			(0x40)
#define	TELE_PBOX_ALARM_RESERVED_2			(0x80)

//////////////////////////////////////////////////////////////////////////////
//
//							VOLTAGE
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x01
	UINT8		sID;															// Secondary ID
	UINT16		volts;															// 0.01V increments
} STRU_TELE_HV;

//////////////////////////////////////////////////////////////////////////////
//
//							TEMPERATURE
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x02
	UINT8		sID;															// Secondary ID
	INT16		temperature;													// Temperature in degrees Fahrenheit
} STRU_TELE_TEMP;

//////////////////////////////////////////////////////////////////////////////
//
//						RX CAPACITY METER
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x18
	UINT8		sID;															// Secondary ID
	INT16		current_A;														// Instantaneous current, 0.01A (0-328.7A)		7FFF-> no data
	UINT16		chargeUsed_A;													// Integrated mAh used, 0.1mAh (0-3276.6mAh)
	UINT16		volts_A;														// Volts, 0.01V increments (0-16.00V)
	INT16		current_B;														// Instantaneous current, 0.01A (0-328.7A)		7FFF-> no data/sensor B
	UINT16		chargeUsed_B;													// Integrated mAh used, 0.1mAh (0-3276.6mAh)
	UINT16		volts_B;														// Volts, 0.01V increments (0-16.00V)
	UINT8		alerts,															// Bit mapped alert conditions (see below)
				highCharge;														// High nybble is extra bits for chargeUsed_B, Low is for chargeUsed_A
} STRU_TELE_RX_MAH;

#define	RXMAH_PS_ALERT_NONE			(0)											// No alarms
#define	RXMAH_PS_ALERT_RF_INT		(1 << 0)									// A or internal Remote failure
#define	RXMAH_PS_ALERT_RF_ANT1		(1 << 1)									// B remote power fault
#define	RXMAH_PS_ALERT_RF_ANT2		(1 << 2)									// L remote power fault
#define	RXMAH_PS_ALERT_RF_ANT3		(1 << 3)									// R remote power fault
#define	RXMAH_PS_ALERT_OVERVOLT_A	(1 << 4) 									// Battery A is over voltage
#define	RXMAH_PS_ALERT_OVERVOLT_B	(1 << 5) 									// Battery A is over voltage
#define	RXMAH_PS_ALERT_RFU1			(1 << 6)
#define	RXMAH_PS_ALERT_RFU2			(1 << 7)

//////////////////////////////////////////////////////////////////////////////
//
//							HIGH-CURRENT
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x03
	UINT8		sID;															// Secondary ID
	INT16		current,														// Range: +/- 150A     Resolution: 300A / 2048 = 0.196791 A/count
				dummy;															// TBD
} STRU_TELE_IHIGH;

#define	IHIGH_RESOLUTION_FACTOR						((FP32)(0.196791))

//////////////////////////////////////////////////////////////////////////////
//
//							SIMPLE VARIO
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x40
	UINT8		sID;															// Secondary ID
	INT16		altitude;														// .1m increments
	INT16		delta_0250ms,													// change in altitude last 250ms, 0.1m/s increments
				delta_0500ms,													// change in altitude last 500ms, 0.1m/s increments
				delta_1000ms,													// change in altitude last 1.0 seconds, 0.1m/s increments
				delta_1500ms,													// change in altitude last 1.5 seconds, 0.1m/s increments
				delta_2000ms,													// change in altitude last 2.0 seconds, 0.1m/s increments
				delta_3000ms;													// change in altitude last 3.0 seconds, 0.1m/s increments
} STRU_TELE_VARIO_S;

//////////////////////////////////////////////////////////////////////////////
//
//							ALTIMETER
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;
	UINT8		sID;															// Secondary ID
	INT16		altitude;														// .1m increments
	INT16		maxAltitude;													// .1m increments
} STRU_TELE_ALT;																// Eagle Tree Sensor

//////////////////////////////////////////////////////////////////////////////
//
//							AIRSPEED
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;
	UINT8		sID;															// Secondary ID
	UINT16		airspeed;														// 1 km/h increments
	UINT16		maxAirspeed;													// 1 km/h increments
} STRU_TELE_SPEED;																// Eagle Tree Sensor

//////////////////////////////////////////////////////////////////////////////
//
//							LAP TIMER
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;
	UINT8		sID;															// Secondary ID
	UINT8		lapNumber;														// Lap last finished
	UINT8		gateNumber;														// Last gate passed
	UINT32		lastLapTime;													// Time of lap in 1ms increments (NOT duration)
	UINT32		gateTime;														// Duration between last 2 gates
	UINT8		unused[4];
} STRU_TELE_LAPTIMER;

//////////////////////////////////////////////////////////////////////////////
//
//							TEXT GENERATOR
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;
	UINT8		sID;															// Secondary ID
	UINT8		lineNumber;														// Line number to display (0 = title, 1-8 for general, 254 = Refresh backlight, 255 = Erase all text on screen)
	char		text[13];														// 0-terminated text when < 13 chars
} STRU_TELE_TEXTGEN;

//////////////////////////////////////////////////////////////////////////////
//
//							VIDEO TRANSMITTER (VTX)
//
//////////////////////////////////////////////////////////////////////////////
//
//	VTX spec subject to change. Refer to Spektrum VTX Interfacing document for latest info
//
typedef struct
{
	UINT8		identifier;
	UINT8		sID;															// Secondary ID
	UINT8		band;															// VTX Band (0 = Fatshark, 1 = Raceband, 2 = E, 3 = B, 4 = A, 5-7 = Reserved)
	UINT8		channel;														// VTX Channel (0-7)
	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.
	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)
	UINT16		powerDec;														// VTX Power as a decimal 1mw/unit
	UINT8		region;															// Region (0 = USA, 1 = EU, 0xFF = Not Provided)
	UINT8		unused[7];														// reserved
} STRU_TELE_VTX;

//////////////////////////////////////////////////////////////////////////////
//
//							ESC
//
//////////////////////////////////////////////////////////////////////////////
//
//	Uses big-endian byte order
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x20
	UINT8		sID;															// Secondary ID
	UINT16		RPM;															// Electrical RPM, 10RPM (0-655340 RPM)  0xFFFF --> "No data"
	UINT16		voltsInput;														// Volts, 0.01v (0-655.34V)       0xFFFF --> "No data"
	UINT16		tempFET;														// Temperature, 0.1C (0-6553.4C)  0xFFFF --> "No data"
	UINT16		currentMotor;													// Current, 10mA (0-655.34A)      0xFFFF --> "No data"
	UINT16		tempBEC;														// Temperature, 0.1C (0-6553.4C)  0xFFFF --> "No data"
	UINT8		currentBEC;														// BEC Current, 100mA (0-25.4A)   0xFF ----> "No data"
	UINT8		voltsBEC;														// BEC Volts, 0.05V (0-12.70V)    0xFF ----> "No data"
	UINT8		throttle;														// 0.5% (0-100%)                  0xFF ----> "No data"
	UINT8		powerOut;														// Power Output, 0.5% (0-127%)    0xFF ----> "No data"
} STRU_TELE_ESC;

//////////////////////////////////////////////////////////////////////////////
//
//		(Liquid) Fuel Flow/Capacity (Two Tanks/Engines)
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x22
	UINT8		sID;															// Secondary ID
	UINT16		fuelConsumed_A;													// Integrated fuel consumption, 0.1mL
	UINT16		flowRate_A;														// Instantaneous consumption, 0.01mL/min
	UINT16		temp_A;															// Temperature, 0.1C (0-655.34C)
	UINT16		fuelConsumed_B;													// Integrated fuel consumption, 0.1mL
	UINT16		flowRate_B;														// Instantaneous consumption, 0.01mL/min
	UINT16		temp_B;															// Temperature, 0.1C (0-655.34C)
	UINT16		spare;															// Not used
} STRU_TELE_FUEL;

//////////////////////////////////////////////////////////////////////////////
//
//		Battery Current/Capacity (Flight Pack Capacity)
//
//////////////////////////////////////////////////////////////////////////////
//
// AK 2013-11-19 make struct align with 0x03 device
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x34
	UINT8		sID;															// Secondary ID
	INT16		current_A;														// Instantaneous current, 0.1A (0-3276.6A)
	INT16		chargeUsed_A;													// Integrated mAh used, 1mAh (0-32.766Ah)
	UINT16		temp_A;															// Temperature, 0.1C (0-150C, 0x7FFF indicates not populated)
	INT16		current_B;														// Instantaneous current, 0.1A (0-3276.6A)
	INT16		chargeUsed_B;													// Integrated mAh used, 1mAh (0-32.766Ah)
	UINT16		temp_B;															// Temperature, 0.1C (0-150C, 0x7FFF indicates not populated)
	UINT16		spare;															// Not used
} STRU_TELE_FP_MAH;

//////////////////////////////////////////////////////////////////////////////
//
//		Digital Input Status (Retract Status) and Tank Pressure
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = TELE_DEVICE_DIGITAL_AIR
	UINT8		sID;															// Secondary ID
	UINT16		digital;														// Digital inputs (bit per input)
	UINT16		spare1;
	UINT16		pressure[4];													// Tank pressure, 0.1PSI (0-6553.4PSI), 0xFFFF = Not Installed
	UINT16		spare2;
} STRU_TELE_DIGITAL_AIR;

//////////////////////////////////////////////////////////////////////////////
//
//		Thrust/Strain Gauge
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x38
	UINT8		sID;															// Secondary ID
	UINT16		strain_A,														// Strain sensor A
				strain_B,														// Strain sensor B
				strain_C,														// Strain sensor D
				strain_D;														// Strain sensor C
} STRU_TELE_STRAIN;

//////////////////////////////////////////////////////////////////////////////
//
//						6S LiPo Cell Monitor
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x3A
	UINT8		sID;															// Secondary ID
	UINT16		cell[6];														// Voltage across cell 1, .01V steps
																				// 0x7FFF --> cell not present
	UINT16		temp;															// Temperature, 0.1C (0-655.34C)
} STRU_TELE_LIPOMON;

//////////////////////////////////////////////////////////////////////////////
//
//						14S LiPo Cell Monitor
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x3F
	UINT8		sID;															// Secondary ID
	UINT8		cell[14];														// Voltage across cell 1, .01V steps, excess of 2.56V
																				// (ie, 3.00V would report 300-256 = 44)
																				// 0xFF --> cell not present
} STRU_TELE_LIPOMON_14;

//////////////////////////////////////////////////////////////////////////////
//
//								Smart Battery
//
//////////////////////////////////////////////////////////////////////////////
//
//			Uses little-endian byte order for all multi-byte fields
//
typedef struct
{
	UINT8	identifier;															// Source device = 0x42
	UINT8	sID;																// Secondary ID
	UINT8	typeChannel;														// Upper nybble = Message type; Lower nybble = Battery number (0 or 1)
	UINT8	msgData[13];														// Message-specific data, determined by upper nybble of typeChannel (see defs below)
} STRU_SMARTBATT_HEADER;

#define	SMARTBATT_MSG_TYPE_MASK_BATTNUMBER		(0x0F)
#define	SMARTBATT_MSG_TYPE_MASK_MSGTYPE			(0xF0)

#define SMARTBATT_MSG_TYPE_REALTIME				(0x00)
#define SMARTBATT_MSG_TYPE_CELLS_1_6			(0x10)
#define SMARTBATT_MSG_TYPE_CELLS_7_12			(0x20)
#define SMARTBATT_MSG_TYPE_CELLS_13_18			(0x30)
#define SMARTBATT_MSG_TYPE_ID					(0x80)
#define SMARTBATT_MSG_TYPE_LIMITS				(0x90)

//...........................................................................
// Real-time battery data when current sense is available
typedef struct
{
	UINT8		identifier;														// Source device = 0x42
	UINT8		sID;															// Secondary ID
	UINT8		typeChannel;													// Msg type = SMARTBATT_MSG_TYPE_REALTIME | Battery number (0 or 1)
	INT8		temperature_C;													// Temperature in degrees C, 1 degree increments (-128 = unavailable)
	UINT32		dischargeCurrent_mA;											// Amount of current being drawn from battery, in mA steps (0xFFFFFFFF = unavailable)
	UINT16		batteryCapacityUsage_mAh;										// Approximate battery capacity usage, in mAh (0xFFFF = unavailable)
	UINT16		minCellVoltage_mV;												// Minimum cell voltage of pack, in mV
	UINT16		maxCellVoltage_mV;												// Maximum cell voltage of pack, in mV
	UINT8		rfu[2];
} STRU_SMARTBATT_REALTIME;

//...........................................................................
// Real-time cell voltage
typedef struct
{
	UINT8		identifier;														// Source device = 0x42
	UINT8		sID;															// Secondary ID
	UINT8		typeChannel;													// Msg type = SMARTBATT_MSG_TYPE_CELLS_X_Y | Battery number (0 or 1)
	INT8		temperature_C;													// Temperature in degrees C, 1 degree increments (-128 = unavailable)
	UINT16		cellVoltage_mV[6];												// Cell voltage of first 6 cells, in mV (0xFFFF = unavailable)
} STRU_SMARTBATT_CELLS;

//...........................................................................
// Smart Battery ID and general info
typedef struct
{
	UINT8		identifier;														// Source device = 0x42
	UINT8		sID;															// Secondary ID
	UINT8		typeChannel;													// Msg type = SMARTBATT_MSG_TYPE_ID | Battery number (0 or 1)
	UINT8		chemistry;														// 0:LiHv, 1:LiPo, 2:LiIon, 3:LiFe, 4:Pb, 5:Ni-MH/Cd
	UINT8		numOfCells;														// Number of cells in the battery
	UINT8		manufacturer;													// 0:BattGo
	UINT16		cycles;															// Number of charge/discharge cycles recorded (0 = unavailable)
	UINT8		uniqueID[8];													// Unique battery ID, manufacturer-specific
																				// 0: [0]   = lower (first) byte of "Customer ID"
																				//    [1-3] = lower 3 bytes of "Special Mark of Battery"
																				//    [4-7] = 4-byte "Manufacturing Date"
} STRU_SMARTBATT_ID;

//...........................................................................
// Smart Battery Limits
typedef struct
{
	UINT8		identifier;														// Source device = 0x42
	UINT8		sID;															// Secondary ID
	UINT8		typeChannel;													// Msg type = SMARTBATT_MSG_TYPE_LIMITS | Battery number (0 or 1)
	UINT8		rfu;
	UINT16		fullCapacity_mAh;												// Fully charged battery capacity, in mAh
	UINT16		dischargeCurrentRating;											// Rated discharge current, in 0.1C
	UINT16		overDischarge_mV;												// Limit below which battery is likely damaged, in mV
	UINT16		zeroCapacity_mV;												// Voltage at which LVC protection should activate, in mV
	UINT16		fullyCharged_mV;												// Voltage reading expected when fully charged, in mV
	INT8		minWorkingTemp;													// Minimum working temperature in degrees C, 1 degree steps
	INT8		maxWorkingTemp;													// Maximum working temperature in degrees C, 1 degree steps
} STRU_SMARTBATT_LIMITS;

//////////////////////////////////////////////////////////////////////////////
//
//							ACCELEROMETER
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x14
	UINT8		sID;															// Secondary ID
	INT16		GForceX;														// force is reported as .01G increments
	INT16		GForceY;														// 		Range = +/-4000 (+/- 40G) in Pro model
	INT16		GForceZ;														// 		Range = +/-800 (+/- 8G) in Standard model
	INT16		maxGForceX;														// abs(max G X-axis)   FORE/AFT
	INT16		maxGForceY;														// abs (max G Y-axis)  LEFT/RIGHT
	INT16		maxGForceZ;														// max G Z-axis        WING SPAR LOAD
	INT16		minGForceZ;														// min G Z-axis        WING SPAR LOAD
} STRU_TELE_G_METER;

//////////////////////////////////////////////////////////////////////////////
//
//						SURFACE TILT (ATTITUDE) SENSOR
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x1C TELE_DEVICE_TILT
	UINT8		sID;															// Secondary ID
	INT16		attQuatX;														// Quaternion representing attitude using RHR. X component in Q14.
	INT16		attQuatY;														// Y component in Q14.
	INT16		attQuatZ;														// Z component in Q14.
	INT16		attQuatW;														// W component in Q14.
	UINT16		spare[3];
} STRU_TELE_TILT;

//////////////////////////////////////////////////////////////////////////////
//
//								TURBINE
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x15
	UINT8		sID;															// Secondary ID
	UINT8		status;															// Table below
	UINT8		throttle;														// (BCD) xx Percent
	UINT16		packVoltage;													// (BCD) xx.yy
	UINT16		pumpVoltage;													// (BCD) xx.yy
	UINT32		RPM;															// (BCD)
	UINT16		EGT;															// (BCD) Temperature, Celsius
	UINT8		offCondition;													// Table below
	UINT8		spare;
} STRU_TELE_JETCAT;

enum JETCAT_ECU_TURBINE_STATE {							// ECU Status definitions
		JETCAT_ECU_STATE_OFF = 0x00,
		JETCAT_ECU_STATE_WAIT_for_RPM = 0x01, // (Stby/Start)
		JETCAT_ECU_STATE_Ignite = 0x02,
		JETCAT_ECU_STATE_Accelerate = 0x03,
		JETCAT_ECU_STATE_Stabilise = 0x04,
		JETCAT_ECU_STATE_Learn_HI = 0x05,
		JETCAT_ECU_STATE_Learn_LO = 0x06,
		JETCAT_ECU_STATE_UNDEFINED = 0x07,
		JETCAT_ECU_STATE_Slow_Down = 0x08,
		JETCAT_ECU_STATE_Manual = 0x09,
		JETCAT_ECU_STATE_AutoOff = 0x10,
		JETCAT_ECU_STATE_Run = 0x11, // (reg.)
		JETCAT_ECU_STATE_Accleleration_delay = 0x12,
		JETCAT_ECU_STATE_SpeedReg = 0x13, // (Speed Ctrl)
		JETCAT_ECU_STATE_Two_Shaft_Regulate = 0x14, // (only for secondary shaft)
		JETCAT_ECU_STATE_PreHeat1 = 0x15,
		JETCAT_ECU_STATE_PreHeat2 = 0x16,
		JETCAT_ECU_STATE_MainFStart = 0x17,
		JETCAT_ECU_STATE_NotUsed = 0x18,
		JETCAT_ECU_STATE_KeroFullOn = 0x19,
		// undefined states 0x1A-0x1F
		EVOJET_ECU_STATE_off = 0x20,
		EVOJET_ECU_STATE_ignt = 0x21,
		EVOJET_ECU_STATE_acce = 0x22,
		EVOJET_ECU_STATE_run = 0x23,
		EVOJET_ECU_STATE_cal = 0x24,
		EVOJET_ECU_STATE_cool = 0x25,
		EVOJET_ECU_STATE_fire = 0x26,
		EVOJET_ECU_STATE_glow = 0x27,
		EVOJET_ECU_STATE_heat = 0x28,
		EVOJET_ECU_STATE_idle = 0x29,
		EVOJET_ECU_STATE_lock = 0x2A,
		EVOJET_ECU_STATE_rel = 0x2B,
		EVOJET_ECU_STATE_spin = 0x2C,
		EVOJET_ECU_STATE_stop = 0x2D,
		// undefined states 0x2E-0x2F
		HORNET_ECU_STATE_OFF = 0x30,
		HORNET_ECU_STATE_SLOWDOWN = 0x31,
		HORNET_ECU_STATE_COOL_DOWN = 0x32,
		HORNET_ECU_STATE_AUTO = 0x33,
		HORNET_ECU_STATE_AUTO_HC = 0x34,
		HORNET_ECU_STATE_BURNER_ON = 0x35,
		HORNET_ECU_STATE_CAL_IDLE = 0x36,
		HORNET_ECU_STATE_CALIBRATE = 0x37,
		HORNET_ECU_STATE_DEV_DELAY = 0x38,
		HORNET_ECU_STATE_EMERGENCY = 0x39,
		HORNET_ECU_STATE_FUEL_HEAT = 0x3A,
		HORNET_ECU_STATE_FUEL_IGNITE = 0x3B,
		HORNET_ECU_STATE_GO_IDLE = 0x3C,
		HORNET_ECU_STATE_PROP_IGNITE = 0x3D,
		HORNET_ECU_STATE_RAMP_DELAY = 0x3E,
		HORNET_ECU_STATE_RAMP_UP = 0x3F,
		HORNET_ECU_STATE_STANDBY = 0x40,
		HORNET_ECU_STATE_STEADY = 0x41,
		HORNET_ECU_STATE_WAIT_ACC = 0x42,
		HORNET_ECU_STATE_ERROR = 0x43,
		// undefined states 0x44-0x4F
		XICOY_ECU_STATE_Temp_High = 0x50,
		XICOY_ECU_STATE_Trim_Low = 0x51,
		XICOY_ECU_STATE_Set_Idle = 0x52,
		XICOY_ECU_STATE_Ready = 0x53,
		XICOY_ECU_STATE_Ignition = 0x54,
		XICOY_ECU_STATE_Fuel_Ramp = 0x55,
		XICOY_ECU_STATE_Glow_Test = 0x56,
		XICOY_ECU_STATE_Running = 0x57,
		XICOY_ECU_STATE_Stop = 0x58,
		XICOY_ECU_STATE_Flameout = 0x59,
		XICOY_ECU_STATE_Speed_Low = 0x5A,
		XICOY_ECU_STATE_Cooling = 0x5B,
		XICOY_ECU_STATE_Igniter_Bad = 0x5C,
		XICOY_ECU_STATE_Starter_F = 0x5D,
		XICOY_ECU_STATE_Weak_Fuel = 0x5E,
		XICOY_ECU_STATE_Start_On = 0x5F,
		XICOY_ECU_STATE_Pre_Heat = 0x60,
		XICOY_ECU_STATE_Battery = 0x61,
		XICOY_ECU_STATE_Time_Out = 0x62,
		XICOY_ECU_STATE_Overload = 0x63,
		XICOY_ECU_STATE_Igniter_Fail = 0x64,
		XICOY_ECU_STATE_Burner_On = 0x65,
		XICOY_ECU_STATE_Starting = 0x66,
		XICOY_ECU_STATE_SwitchOver = 0x67,
		XICOY_ECU_STATE_Cal_Pump = 0x68,
		XICOY_ECU_STATE_Pump_Limit = 0x69,
		XICOY_ECU_STATE_No_Engine = 0x6A,
		XICOY_ECU_STATE_Pwr_Boost = 0x6B,
		XICOY_ECU_STATE_Run_Idle = 0x6C,
		XICOY_ECU_STATE_Run_Max = 0x6D,
		// undefined states 0x6e-0x73
		JETCENT_ECU_STATE_STOP = 0x74,
		JETCENT_ECU_STATE_GLOW_TEST = 0x75,
		JETCENT_ECU_STATE_STARTER_TEST = 0x76,
		JETCENT_ECU_STATE_PRIME_FUEL = 0x77,
		JETCENT_ECU_STATE_PRIME_BURNER = 0x78,
		JETCENT_ECU_STATE_MAN_COOL = 0x79,
		JETCENT_ECU_STATE_AUTO_COOL = 0x7A,
		JETCENT_ECU_STATE_IGN_HEAT = 0x7B,
		JETCENT_ECU_STATE_IGNITION = 0x7C,
		JETCENT_ECU_STATE_PREHEAT = 0x7D,
		JETCENT_ECU_STATE_SWITCHOVER = 0x7E,
		JETCENT_ECU_STATE_TO_IDLE = 0x7F,
		JETCENT_ECU_STATE_RUNNING = 0x80,
		JETCENT_ECU_STATE_STOP_ERROR = 0x81,
		// undefined states 0x82-0x8F
		SWIWIN_ECU_STATE_STOP = 0x90,
		SWIWIN_ECU_STATE_READY = 0x91,
		SWIWIN_ECU_STATE_IGNITION = 0x92,
		SWIWIN_ECU_STATE_PREHEAT = 0x93,
		SWIWIN_ECU_STATE_FUEL_RAMP = 0x94,
		SWIWIN_ECU_STATE_RUNNING = 0x95,
		SWIWIN_ECU_STATE_COOLING = 0x96,
		SWIWIN_ECU_STATE_RESTART_SWOVER = 0x97,
		SWIWIN_ECU_STATE_NOTUSED = 0x98,
		// undefined states 0x99-0x9F

		TURBINE_ECU_MAX_STATE = 0x9F
};

enum JETCAT_ECU_OFF_CONDITIONS {					// ECU off conditions. Valid only when the ECUStatus = JETCAT_ECU_STATE_OFF
		JETCAT_ECU_OFF_No_Off_Condition_defined = 0,
		JETCAT_ECU_OFF_Shut_down_via_RC,
		JETCAT_ECU_OFF_Overtemperature,
		JETCAT_ECU_OFF_Ignition_timeout,
		JETCAT_ECU_OFF_Acceleration_time_out,
		JETCAT_ECU_OFF_Acceleration_too_slow,
		JETCAT_ECU_OFF_Over_RPM,
		JETCAT_ECU_OFF_Low_Rpm_Off,
		JETCAT_ECU_OFF_Low_Battery,
		JETCAT_ECU_OFF_Auto_Off,
		JETCAT_ECU_OFF_Low_temperature_Off,
		JETCAT_ECU_OFF_Hi_Temp_Off,
		JETCAT_ECU_OFF_Glow_Plug_defective,
		JETCAT_ECU_OFF_Watch_Dog_Timer,
		JETCAT_ECU_OFF_Fail_Safe_Off,
		JETCAT_ECU_OFF_Manual_Off, // (via GSU)
		JETCAT_ECU_OFF_Power_fail, // (Battery fail)
		JETCAT_ECU_OFF_Temp_Sensor_fail, // (only during startup)
		JETCAT_ECU_OFF_Fuel_fail,
		JETCAT_ECU_OFF_Prop_fail,
		JETCAT_ECU_OFF_2nd_Engine_fail,
		JETCAT_ECU_OFF_2nd_Engine_Diff_Too_High,
		JETCAT_ECU_OFF_2nd_Engine_No_Comm,
		JETCAT_ECU_MAX_OFF_COND,
		// Jet Central
		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
		JETCENT_ECU_OFF_IGNITION_ERROR,
		JETCENT_ECU_OFF_PREHEAT_ERROR,
		JETCENT_ECU_OFF_SWITCHOVER_ERROR,
		JETCENT_ECU_OFF_STARTER_MOTOR_ERROR,
		JETCENT_ECU_OFF_TO_IDLE_ERROR,
		JETCENT_ECU_OFF_ACCELERATION_ERROR,
		JETCENT_ECU_OFF_IGNITER_BAD,
		JETCENT_ECU_OFF_MIN_PUMP_OK,
		JETCENT_ECU_OFF_MAX_PUMP_OK,
		JETCENT_ECU_OFF_LOW_RX_BATTERY,
		JETCENT_ECU_OFF_LOW_ECU_BATTERY,
		JETCENT_ECU_OFF_NO_RX,
		JETCENT_ECU_OFF_TRIM_DOWN,
		JETCENT_ECU_OFF_TRIM_UP,
		JETCENT_ECU_OFF_FAILSAFE,
		JETCENT_ECU_OFF_FULL,
		JETCENT_ECU_OFF_RX_SETUP_ERROR,
		JETCENT_ECU_OFF_TEMP_SENSOR_ERROR,
		JETCENT_ECU_OFF_COM_TURBINE_ERROR,
		JETCENT_ECU_OFF_MAX_TEMP,
		JETCENT_ECU_OFF_MAX_AMPS,
		JETCENT_ECU_OFF_LOW_RPM,
		JETCENT_ECU_OFF_ERROR_RPM_SENSOR,
		JETCENT_ECU_OFF_MAX_PUMP,
		JETCENT_ECU_MAX_OFF_COND
};

typedef struct
{
	UINT8		identifier;														// Source device = 0x19
	UINT8		sID;															// Secondary ID
	UINT16		FuelFlowRateMLMin;												// (BCD) mL per Minute
	UINT32		RestFuelVolumeInTankML;											// (BCD) mL remaining in tank
	UINT8		ECUbatteryPercent;												// (BCD) % battery pack capacity remaining
	// 7 bytes left
} STRU_TELE_JETCAT2;

//////////////////////////////////////////////////////////////////////////////
//
//								GPS
//						  Packed-BCD Type
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x16
	UINT8		sID;															// Secondary ID
	UINT16		altitudeLow;													// BCD, meters, format 3.1 (Low order of altitude)
	UINT32		latitude;														// BCD, format 4.4, Degrees * 100 + minutes, less than 100 degrees
	UINT32		longitude;														// BCD, format 4.4 , Degrees * 100 + minutes, flag indicates > 99 degrees
	UINT16		course;															// BCD, 3.1
	UINT8		HDOP;															// BCD, format 1.1
	UINT8		GPSflags;														// see definitions below
} STRU_TELE_GPS_LOC;

typedef struct
{
	UINT8		identifier;														// Source device = 0x17
	UINT8		sID;															// Secondary ID
	UINT16		speed;															// BCD, knots, format 3.1
	UINT32		UTC;															// BCD, format HH:MM:SS.S, format 6.1
	UINT8		numSats;														// BCD, 0-99
	UINT8		altitudeHigh;													// BCD, meters, format 2.0 (High order of altitude)
} STRU_TELE_GPS_STAT;

// GPS flags definitions:
#define	GPS_INFO_FLAGS_IS_NORTH_BIT					(0)
#define	GPS_INFO_FLAGS_IS_NORTH						(1 << GPS_INFO_FLAGS_IS_NORTH_BIT)
#define	GPS_INFO_FLAGS_IS_EAST_BIT					(1)
#define	GPS_INFO_FLAGS_IS_EAST						(1 << GPS_INFO_FLAGS_IS_EAST_BIT)
#define	GPS_INFO_FLAGS_LONGITUDE_GREATER_99_BIT		(2)
#define	GPS_INFO_FLAGS_LONGITUDE_GREATER_99			(1 << GPS_INFO_FLAGS_LONGITUDE_GREATER_99_BIT)
#define	GPS_INFO_FLAGS_GPS_FIX_VALID_BIT			(3)
#define	GPS_INFO_FLAGS_GPS_FIX_VALID				(1 << GPS_INFO_FLAGS_GPS_FIX_VALID_BIT)
#define	GPS_INFO_FLAGS_GPS_DATA_RECEIVED_BIT		(4)
#define	GPS_INFO_FLAGS_GPS_DATA_RECEIVED			(1 << GPS_INFO_FLAGS_GPS_DATA_RECEIVED_BIT)
#define	GPS_INFO_FLAGS_3D_FIX_BIT					(5)
#define	GPS_INFO_FLAGS_3D_FIX						(1 << GPS_INFO_FLAGS_3D_FIX_BIT)
#define GPS_INFO_FLAGS_NEGATIVE_ALT_BIT				(7)
#define GPS_INFO_FLAGS_NEGATIVE_ALT					(1 << GPS_INFO_FLAGS_NEGATIVE_ALT_BIT)

//////////////////////////////////////////////////////////////////////////////
//
//								GPS
//							Binary Type
//
//		NOTE:	Data resolution for all fields matches Crossfire EXCEPT speed.
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x26
	UINT8		sID;															// Secondary ID
	UINT16		altitude;														// m, 1000m offset
	INT32		latitude;														// degree / 10,000,000
	INT32		longitude;														// degree / 10,000,000
	UINT16		heading;														// degree / 10
	UINT8		groundSpeed;													// km/h
	UINT8		numSats;														// count
} STRU_TELE_GPS_BINARY;

//////////////////////////////////////////////////////////////////////////////
//
//					AS3X Legacy Gain Report
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = TELE_DEVICE_AS3X_LEGACYGAIN
	UINT8		sID;															// Secondary ID
	UINT8		gainRoll;														// Configured normal gains per axis
	UINT8		gainPitch;
	UINT8		gainYaw;
	UINT8		headRoll;														// Configured heading hold gains per axis
	UINT8		headPitch;
	UINT8		headYaw;
	UINT8		activeRoll;														// Active gains per axis (as affected by FM channel)
	UINT8		activePitch;
	UINT8		activeYaw;
	UINT8		flightMode;														// bit 7 1 --> FM present in bits 0,1 except 0xFF --> not present
	UINT8		unused[4];
} STRU_TELE_AS3X_LEGACY;

//////////////////////////////////////////////////////////////////////////////
//
//					AS6X Gain Report (AS3X Legacy + more fields)
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = TELE_DEVICE_AS6X_GAIN
	UINT8		sID;															// Secondary ID
	UINT8		gainRoll;														// Configured normal gains per axis
	UINT8		gainPitch;
	UINT8		gainYaw;
	UINT8		headRoll;														// Configured heading hold gains per axis
	UINT8		headPitch;
	UINT8		headYaw;
	UINT8		activeRoll;														// Active gains per axis (as affected by FM channel)
	UINT8		activePitch;
	UINT8		activeYaw;
	UINT8		flightMode;														// bit 7 1 --> FM present in bits 0,1 except 0xFF --> not present
	// new fields go here:
	UINT8		unused[4];
} STRU_TELE_AS6X_GAIN;

//////////////////////////////////////////////////////////////////////////////
//
//							GYRO
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x1A
	UINT8		sID;															// Secondary ID
	INT16		gyroX;															// Rotation rates of the body - Rate is about the X Axis which is defined out the nose of the vehicle.
	INT16		gyroY;															// Units are 0.1 deg/sec  - Rate is about the Y Axis which is define out the right wing of the vehicle.
	INT16		gyroZ;															// Rate is about the Z axis which is defined down from the vehicle.
	INT16		maxGyroX;														// Max rates (absolute value)
	INT16		maxGyroY;
	INT16		maxGyroZ;
} STRU_TELE_GYRO;

//////////////////////////////////////////////////////////////////////////////
//
//						Alpha6 Stabilizer
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x24
	UINT8		sID;															// Secondary ID
	UINT16		volts;															// 0.01V increments
	UINT8		state_FM;														// Flight Mode and System State (see below)
	UINT8		gainRoll,														// Roll Gain,  high bit --> Heading Hold
				gainPitch,														// Pitch Gain
				gainYaw;														// Yaw Gain
	INT16		attRoll,														// Roll Attitude, 0.1degree, RHR
				attPitch,														// Pitch Attitude
				attYaw;															// Yaw Attitude
	UINT16		spare;
} STRU_TELE_ALPHA6;

#define	GBOX_STATE_BOOT							(0x00)							// Alpha6 State - Boot
#define	GBOX_STATE_INIT							(0x01)							// Init
#define	GBOX_STATE_READY						(0x02)							// Ready
#define	GBOX_STATE_SENSORFAULT					(0x03)							// Sensor Fault
#define	GBOX_STATE_POWERFAULT					(0x04)							// Power Fault
#define	GBOX_STATE_MASK							(0x0F)

#define	GBOX_FMODE_FM0							(0x00)							// FM0 through FM4
#define	GBOX_FMODE_FM1							(0x10)
#define	GBOX_FMODE_FM2							(0x20)
#define	GBOX_FMODE_FM3							(0x30)
#define	GBOX_FMODE_FM4							(0x40)
#define	GBOX_FMODE_PANIC						(0x50)
#define	GBOX_FMODE_MASK							(0xF0)

//////////////////////////////////////////////////////////////////////////////
//
//						ATTITUDE & MAG COMPASS
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x1B
	UINT8		sID;															// Secondary ID
	INT16		attRoll;														// Attitude, 3 axes.  Roll is a rotation about the X Axis of the vehicle using the RHR.
	INT16		attPitch;														// Units are 0.1 deg - Pitch is a rotation about the Y Axis of the vehicle using the RHR.
	INT16		attYaw;															// Yaw is a rotation about the Z Axis of the vehicle using the RHR.
	INT16		magX;															// Magnetic Compass, 3 axes
	INT16		magY;															// Units are 0.1mG
	INT16		magZ;															//
	UINT16		heading;														// Heading, 0.1deg
} STRU_TELE_ATTMAG;

//////////////////////////////////////////////////////////////////////////////
//
//						Altitude "Zero" Message
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x7B
	UINT8		sID;															// Secondary ID
	UINT8		spare[2];
	UINT32		altOffset;														// Altitude "zero" log
} STRU_TELE_ALT_ZERO;

//////////////////////////////////////////////////////////////////////////////
//
//						Real-Time Clock
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x7C
	UINT8		sID;															// Secondary ID
	UINT8		spare[6];
	UINT64		UTC64;															// Linux 64-bit time_t for post-2038 date compatibility
} STRU_TELE_RTC;

//////////////////////////////////////////////////////////////////////////////
//
//						V-Speak (Placeholder)
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x61
	UINT8		sID;															// Secondary ID
	UINT8		spare[14];														// Format TBD by V-Speak
} STRU_TELE_V_SPEAK;

//////////////////////////////////////////////////////////////////////////////
//
//						www.Smoke-EL.de
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x61
	UINT8		sID;															// Secondary ID
	UINT16		batteryV;														// 0.01V, Range 0.00-70.00V
	UINT16		countdown;														// 0.01s, Range 0.00-30.00s
	INT16		GForce;															// 0.01g, Range = +/-8.00g
	UINT8		cutoff;															// 1 count, Range 0-9
	UINT8		connected;														// 0=not connected, 1=connected, x = TBD
	UINT16		spare[3];
} STRU_TELE_SMOKE_EL;

//////////////////////////////////////////////////////////////////////////////
//
//							MULTI-CYLINDER SENSOR
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = TELE_DEVICE_MULTICYLINDER
	UINT8		sID;															// Secondary ID
	UINT8		temperature[9];													// Temperature, 1C increments, Offset = 30C, 0xFF = NO DATA
				// 0x00 = 30C		(86F)
				// 0x01 = 31C ...	(88F)
				// 0xFE = 284C		(543F)
				// 0xFF = NO SENSOR ATTACHED.  Note that sensors must be installed cylinder 1-9 in sequence!
	UINT8		throttlePct;													// Throttle percent (0-100% typical, 0xFF = NO DATA)
	UINT16		RPM;															// 4 RPM increments, Offset = 400RPM, range 404-16776.
				// 0x000 = 0 RPM
				// 0x001 = 404 RPM
				// 0x002 = 408 RPM
				// 0xFFE = 16776 RPM
				// 0xFFF = NO SENSOR ATTACHED
				// NOTE:  HI NYBBLE RESERVED, set to 0xF to mark "NO DATA" for now
	UINT8		batteryV;														// Voltage, 0.1V increments, Offset = 3.5V, 0xFF = NO DATA
				// 0x00 = 3.5V
				// 0x01 = 3.6V
				// 0xFE = 28.9V
				// 0xFF = NO SENSOR ATTACHED
	UINT8		spare;															// 0xFF --> no data
} STRU_TELE_MULTI_TEMP;

//////////////////////////////////////////////////////////////////////////////
//
//						Transmitter Frame Data
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x7D
	UINT8		sID;															// Secondary ID
	UINT16		chanData[7];													// Channel Data array
} STRU_TELE_FRAMEDATA;

//////////////////////////////////////////////////////////////////////////////
//
//							AHRS Monitor
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = TELE_DEVICE_AHRS
	UINT8		sID;															// Secondary ID
	INT16		attRoll;														// Attitude, 3 axes.  Roll is a rotation about the X Axis of the vehicle using the RHR.
	INT16		attPitch;														// Units are 0.1 deg - Pitch is a rotation about the Y Axis of the vehicle using the RHR.
	INT16		attYaw;															// Roll is a rotation about the Z Axis of the vehicle using the RHR.
	INT16		altitude;														// .1m increments
	UINT8		waypoint;														// Waypoint number
	UINT8		spare8;
	UINT16		spare16[2];
} STRU_TELE_AHRS;																// AHRS data from rx

//////////////////////////////////////////////////////////////////////////////
//
//							FLIGHT MODE
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x05 TELE_DEVICE_FLITECTRL
	UINT8		sID;															// Secondary ID
	UINT8		fMode,															// Current flight mode (low nybble)
				spare8;
	UINT16		spare[6];														// Growth
	// Ideas -
	//		arming status in a bitmap
	//		time in state
} STRU_TELE_FLITECTRL;


//////////////////////////////////////////////////////////////////////////////
//
//							Crossfire QOS
//
//////////////////////////////////////////////////////////////////////////////
//
typedef struct
{
	UINT8		identifier;														// Source device = TELE_XRF_LINKSTATUS
	UINT8		sID;															// Secondary ID
	UINT8		ant1,					// dBm * -1
				ant2,
				quality;				// %
	INT8		SNR;					// dB
	UINT8		activeAnt,				// ant1=0, ant2=1
				RFmode,					// 4fps=0, 50fps, 150Hz
				upPower,				// 0mW=0, 10mW, 25mW, 100mW, 500mW, 1000mW, 2000mW
				downlink,				// dBm * -1
				qualityDown;			// %
	INT8		SNRdown;				// dB
} STRU_TELE_XF_QOS;

//////////////////////////////////////////////////////////////////////////////
//
//						RPM/Volts/Temperature
//
//////////////////////////////////////////////////////////////////////////////
//
//	Uses big-endian byte order
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x7E
	UINT8		sID;															// Secondary ID
	UINT16		microseconds;													// microseconds between pulse leading edges
	UINT16		volts;															// 0.01V increments (typically flight pack voltage)
	INT16		temperature;													// Temperature in degrees F.  0x7FFF = "No Data"
	INT8		dBm_A,															// Avg RSSI in dBm (<-1 = dBm, 0 = no data, >0 = % range) -- (legacy)antenna A in dBm
				dBm_B;															// Avg RSSI in % (<-1 = dBm, 0 = no data, >0 = % range)   -- (legacy)antenna B in dBm
																				// Note: Legacy use as antenna A/B dBm values is still supported. If only 1 antenna, set B = A.
																				//       The "no data" value is 0, but -1 (0xFF) is treated the same for backwards compatibility
	UINT16		spare[2];
} STRU_TELE_RPM;

//////////////////////////////////////////////////////////////////////////////
//
//							QoS DATA
//
//////////////////////////////////////////////////////////////////////////////
//
//	NOTE:  AR6410-series send:
//			id = 7F
//			sID = 0
//			A = 0
//			B = 0
//			L = 0
//			R = 0
//			F = fades
//			H = holds
//			rxV = 0xFFFF
//
typedef struct
{
	UINT8		identifier;														// Source device = 0x7F
	UINT8		sID;															// Secondary ID
	UINT16		A;																// Internal/base receiver fades. 0xFFFF = "No data"
	UINT16		B;																// Remote receiver fades. 0xFFFF = "No data"
	UINT16		L;																// Third receiver fades. 0xFFFF = "No data"
	UINT16		R;																// Fourth receiver fades. 0xFFFF = "No data"
	UINT16		F;																// Frame losses. 0xFFFF = "No data"
	UINT16		H;																// Holds. 0xFFFF = "No data"
	UINT16		rxVoltage;														// Volts, .01V increment. 0xFFFF = "No data"
} STRU_TELE_QOS;

//////////////////////////////////////////////////////////////////////////////
//
//					UNION OF ALL DEVICE MESSAGES
//
//////////////////////////////////////////////////////////////////////////////
//
typedef union
{
	UINT16					raw[8];
	STRU_TELE_QOS			qos;
	STRU_TELE_RPM			rpm;
	STRU_TELE_HV			hv;
	STRU_TELE_TEMP			temp;
	STRU_TELE_IHIGH			amps;
	STRU_TELE_ALT			alt;
	STRU_TELE_SPEED			speed;
	STRU_TELE_ESC			escSPM;
	STRU_TELE_VARIO_S		varioSimple;
	STRU_TELE_G_METER		accel;
	STRU_TELE_JETCAT		jetcat;
	STRU_TELE_JETCAT2		jetcat2;
	STRU_TELE_GPS_LOC		gpsloc;
	STRU_TELE_GPS_STAT		gpsstat;
	STRU_TELE_GPS_BINARY	gpsbin;
	STRU_TELE_AS3X_LEGACY	as3x;
	STRU_TELE_AS6X_GAIN		as6x;
	STRU_TELE_GYRO			gyro;
	STRU_TELE_ALPHA6		alpha6;
	STRU_TELE_ATTMAG		attMag;
	STRU_TELE_POWERBOX		powerBox;
	STRU_TELE_RX_MAH		rxMAH;
	STRU_TELE_FP_MAH		fpMAH;
	STRU_TELE_ESC			esc;
	STRU_TELE_FUEL			fuel;
	STRU_TELE_DIGITAL_AIR	digAir;
	STRU_TELE_STRAIN		strain;
	STRU_TELE_LIPOMON		lipomon;
	STRU_TELE_LIPOMON_14	lipomon14;
	STRU_SMARTBATT_HEADER	smartBatt_header;
	STRU_SMARTBATT_REALTIME	smartBatt_realtime;
	STRU_SMARTBATT_CELLS	smartBatt_cells;
	STRU_SMARTBATT_ID		smartBatt_ID;
	STRU_SMARTBATT_LIMITS	smartBatt_limits;
	STRU_TELE_USER_16SU		user_16SU;
	STRU_TELE_USER_16SU32U	user_16SU32U;
	STRU_TELE_USER_16SU32S	user_16SU32S;
	STRU_TELE_USER_16U32SU	user_16U32SU;
	STRU_TELE_TEXTGEN		textgen;
	STRU_TELE_VTX			vtx;
	STRU_TELE_V_SPEAK		vSpeak;
	STRU_TELE_SMOKE_EL		smoke_el;
	STRU_TELE_MULTI_TEMP	multiCylinder;
	STRU_TELE_FLITECTRL		fControl;
	STRU_TELE_TILT			tilt;
	STRU_TELE_XF_QOS		xfire;
} UN_TELEMETRY;																	// All telemetry messages

//////////////////////////////////////////////////////////////////
//
//					sID Field Functionality
//
//////////////////////////////////////////////////////////////////
//
//		if .sID == 0x00 then .identifier = device type (TELE_DEVICE_xxx) and address I2C bus
//		if .sID != 0x00 then .sID = device type and .identifer = address on I2C bus

#endif