1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 16:25:16 +03:00

More spares to allow A3/A4/RSSI_Tx/Rx_Batt in Telemetry (ARM boards)

This commit is contained in:
Bertrand Songis 2014-02-24 18:22:39 +01:00
parent 8b90b62333
commit c823ca69ce
12 changed files with 219 additions and 83 deletions

View file

@ -211,17 +211,27 @@ QString RotaryEncoderString(int index)
QString RawSource::toString()
{
static const QString trims[] = { QObject::tr("TrmR"), QObject::tr("TrmE"), QObject::tr("TrmT"), QObject::tr("TrmA")};
static const QString trims[] = {
QObject::tr("TrmR"), QObject::tr("TrmE"), QObject::tr("TrmT"), QObject::tr("TrmA")
};
static const QString telemetry[] = { QObject::tr("Batt"), QObject::tr("Timer1"), QObject::tr("Timer2"),
(IS_TARANIS(GetEepromInterface()->getBoard()) ? QObject::tr("SWR") : QObject::tr("Tx")), (IS_TARANIS(GetEepromInterface()->getBoard()) ? QObject::tr("RSSI") : QObject::tr("Rx")), QObject::tr("A1"), QObject::tr("A2"), QObject::tr("Alt"), QObject::tr("Rpm"), QObject::tr("Fuel"), QObject::tr("T1"),
QObject::tr("T2"), QObject::tr("Speed"), QObject::tr("Dist"), QObject::tr("GPS Alt"), QObject::tr("Cell"), QObject::tr("Cels"), QObject::tr("Vfas"), QObject::tr("Curr"),
QObject::tr("Cnsp"), QObject::tr("Powr"), QObject::tr("AccX"), QObject::tr("AccY"), QObject::tr("AccZ"), QObject::tr("HDG "), QObject::tr("VSpd"), QObject::tr("ASpd"), QObject::tr("dTE"),
QObject::tr("A1-"), QObject::tr("A2-"), QObject::tr("Alt-"), QObject::tr("Alt+"), QObject::tr("Rpm+"), QObject::tr("T1+"), QObject::tr("T2+"), QObject::tr("Spd+"), QObject::tr("Dst+"), QObject::tr("Cel-"), QObject::tr("Vfs-"), QObject::tr("Cur+"), QObject::tr("Pwr+"),
static const QString telemetry[] = {
QObject::tr("Batt"), QObject::tr("Timer1"), QObject::tr("Timer2"),
QObject::tr("SWR"), QObject::tr("RSSI Tx"), QObject::tr("RSSI Rx"), QObject::tr("Rx Batt"),
QObject::tr("A1"), QObject::tr("A2"), QObject::tr("A3"), QObject::tr("A4"),
QObject::tr("Alt"), QObject::tr("Rpm"), QObject::tr("Fuel"), QObject::tr("T1"), QObject::tr("T2"),
QObject::tr("Speed"), QObject::tr("Dist"), QObject::tr("GPS Alt"),
QObject::tr("Cell"), QObject::tr("Cels"), QObject::tr("Vfas"), QObject::tr("Curr"), QObject::tr("Cnsp"), QObject::tr("Powr"),
QObject::tr("AccX"), QObject::tr("AccY"), QObject::tr("AccZ"),
QObject::tr("HDG "), QObject::tr("VSpd"), QObject::tr("ASpd"), QObject::tr("dTE"),
QObject::tr("A1-"), QObject::tr("A2-"), QObject::tr("A3-"), QObject::tr("A4-"),
QObject::tr("Alt-"), QObject::tr("Alt+"), QObject::tr("Rpm+"), QObject::tr("T1+"), QObject::tr("T2+"), QObject::tr("Spd+"), QObject::tr("Dst+"),
QObject::tr("Cel-"), QObject::tr("Vfs-"), QObject::tr("Cur+"), QObject::tr("Pwr+"),
QObject::tr("ACC"), QObject::tr("Time"),
};
static const QString virtualSwitches[] = { QObject::tr("LS1"), QObject::tr("LS2"), QObject::tr("LS3"), QObject::tr("LS4"), QObject::tr("LS5"), QObject::tr("LS6"), QObject::tr("LS7"), QObject::tr("LS8"), QObject::tr("LS9"), QObject::tr("LSA"),
static const QString virtualSwitches[] = {
QObject::tr("LS1"), QObject::tr("LS2"), QObject::tr("LS3"), QObject::tr("LS4"), QObject::tr("LS5"), QObject::tr("LS6"), QObject::tr("LS7"), QObject::tr("LS8"), QObject::tr("LS9"), QObject::tr("LSA"),
QObject::tr("LSB"), QObject::tr("LSC"), QObject::tr("LSD"), QObject::tr("LSE"), QObject::tr("LSF"), QObject::tr("LSG"), QObject::tr("LSH"), QObject::tr("LSI"), QObject::tr("LSJ"), QObject::tr("LSK"),
QObject::tr("LSL"), QObject::tr("LSM"), QObject::tr("LSN"), QObject::tr("LSO"), QObject::tr("LSP"), QObject::tr("LSQ"), QObject::tr("LSR"), QObject::tr("LSS"), QObject::tr("LST"), QObject::tr("LSU"),
QObject::tr("LSV"), QObject::tr("LSW")

View file

@ -175,10 +175,14 @@ enum TelemetrySource {
TELEMETRY_SOURCE_TX_BATT,
TELEMETRY_SOURCE_TIMER1,
TELEMETRY_SOURCE_TIMER2,
TELEMETRY_SOURCE_SWR,
TELEMETRY_SOURCE_RSSI_TX,
TELEMETRY_SOURCE_RSSI_RX,
TELEMETRY_SOURCE_RX_BATT,
TELEMETRY_SOURCE_A1,
TELEMETRY_SOURCE_A2,
TELEMETRY_SOURCE_A3,
TELEMETRY_SOURCE_A4,
TELEMETRY_SOURCE_ALT,
TELEMETRY_SOURCE_RPM,
TELEMETRY_SOURCE_FUEL,
@ -202,6 +206,8 @@ enum TelemetrySource {
TELEMETRY_SOURCE_DTE,
TELEMETRY_SOURCE_A1_MIN,
TELEMETRY_SOURCE_A2_MIN,
TELEMETRY_SOURCE_A3_MIN,
TELEMETRY_SOURCE_A4_MIN,
TELEMETRY_SOURCE_ALT_MIN,
TELEMETRY_SOURCE_ALT_MAX,
TELEMETRY_SOURCE_RPM_MAX,
@ -217,6 +223,7 @@ enum TelemetrySource {
TELEMETRY_SOURCES_STATUS_COUNT = TELEMETRY_SOURCE_GPS_TIME+1,
TELEMETRY_SOURCES_DISPLAY_COUNT = TELEMETRY_SOURCE_POWER_MAX+1,
TELEMETRY_SOURCES_COUNT = TELEMETRY_SOURCE_DTE+1,
TELEMETRY_SOURCE_RESERVE = -1
};
#define TM_HASTELEMETRY 0x01

View file

@ -321,55 +321,101 @@ class SwitchField: public ConversionField< SignedField<N> > {
int _switch;
};
class TelemetrySourcesConversionTable: public ConversionTable {
public:
TelemetrySourcesConversionTable(BoardEnum board, unsigned int version)
{
int val = 0;
if (IS_AFTER_RELEASE_21_MARCH_2013(board, version)) {
addConversion(0, val++);
}
addConversion(TELEMETRY_SOURCE_TX_BATT, val++);
addConversion(TELEMETRY_SOURCE_TIMER1, val++);
addConversion(TELEMETRY_SOURCE_TIMER2, val++);
if (IS_ARM(board) && version >= 216)
addConversion(TELEMETRY_SOURCE_SWR, val++);
addConversion(TELEMETRY_SOURCE_RSSI_TX, val++);
addConversion(TELEMETRY_SOURCE_RSSI_RX, val++);
if (IS_ARM(board) && version >= 216)
addConversion(TELEMETRY_SOURCE_RX_BATT, val++);
addConversion(TELEMETRY_SOURCE_A1, val++);
addConversion(TELEMETRY_SOURCE_A2, val++);
if (IS_ARM(board) && version >= 216)
addConversion(TELEMETRY_SOURCE_A3, val++);
if (IS_ARM(board) && version >= 216)
addConversion(TELEMETRY_SOURCE_A4, val++);
addConversion(TELEMETRY_SOURCE_ALT, val++);
addConversion(TELEMETRY_SOURCE_RPM, val++);
addConversion(TELEMETRY_SOURCE_FUEL, val++);
addConversion(TELEMETRY_SOURCE_T1, val++);
addConversion(TELEMETRY_SOURCE_T2, val++);
addConversion(TELEMETRY_SOURCE_SPEED, val++);
addConversion(TELEMETRY_SOURCE_DIST, val++);
addConversion(TELEMETRY_SOURCE_GPS_ALT, val++);
addConversion(TELEMETRY_SOURCE_CELL, val++);
addConversion(TELEMETRY_SOURCE_CELLS_SUM, val++);
addConversion(TELEMETRY_SOURCE_VFAS, val++);
addConversion(TELEMETRY_SOURCE_CURRENT, val++);
addConversion(TELEMETRY_SOURCE_CONSUMPTION, val++);
addConversion(TELEMETRY_SOURCE_POWER, val++);
addConversion(TELEMETRY_SOURCE_ACCX, val++);
addConversion(TELEMETRY_SOURCE_ACCY, val++);
addConversion(TELEMETRY_SOURCE_ACCZ, val++);
addConversion(TELEMETRY_SOURCE_HDG, val++);
addConversion(TELEMETRY_SOURCE_VERTICAL_SPEED, val++);
if (version >= 216) {
addConversion(TELEMETRY_SOURCE_ASPD, val++);
addConversion(TELEMETRY_SOURCE_DTE, val++);
}
if (IS_ARM(board) && version >= 216) {
for (int i=0; i<5; i++)
addConversion(TELEMETRY_SOURCE_RESERVE, val++);
}
addConversion(TELEMETRY_SOURCE_A1_MIN, val++);
addConversion(TELEMETRY_SOURCE_A2_MIN, val++);
if (IS_ARM(board) && version >= 216) {
addConversion(TELEMETRY_SOURCE_A3_MIN, val++);
addConversion(TELEMETRY_SOURCE_A4_MIN, val++);
}
addConversion(TELEMETRY_SOURCE_ALT_MIN, val++);
addConversion(TELEMETRY_SOURCE_ALT_MAX, val++);
addConversion(TELEMETRY_SOURCE_RPM_MAX, val++);
addConversion(TELEMETRY_SOURCE_T1_MAX, val++);
addConversion(TELEMETRY_SOURCE_T2_MAX, val++);
addConversion(TELEMETRY_SOURCE_SPEED_MAX, val++);
addConversion(TELEMETRY_SOURCE_DIST_MAX, val++);
addConversion(TELEMETRY_SOURCE_CELL_MIN, val++);
addConversion(TELEMETRY_SOURCE_VFAS_MIN, val++);
addConversion(TELEMETRY_SOURCE_POWER_MAX, val++);
if (IS_ARM(board) && version >= 216) {
for (int i=0; i<5; i++)
addConversion(TELEMETRY_SOURCE_RESERVE, val++);
}
addConversion(TELEMETRY_SOURCE_ACC, val++);
addConversion(TELEMETRY_SOURCE_GPS_TIME, val++);
}
};
template <int N>
class TelemetrySourceField: public TransformedField {
class TelemetrySourceField: public ConversionField< UnsignedField<N> > {
public:
TelemetrySourceField(unsigned int & source, BoardEnum board, unsigned int version):
TransformedField(internalField),
internalField(_source),
ConversionField< UnsignedField<N> >(source, &conversionTable, "Telemetry source"),
conversionTable(board, version),
source(source),
board(board),
version(version),
_source(0)
version(version)
{
}
virtual void beforeExport()
{
_source = source;
if (source > 0 && !IS_AFTER_RELEASE_21_MARCH_2013(board, version))
_source--;
if (IS_ARM(board) && version >= 216) {
if (source > 1+TELEMETRY_SOURCE_DTE)
_source += 5;
if (source > 1+TELEMETRY_SOURCE_POWER_MAX)
_source += 5;
}
}
virtual void afterImport()
{
source = _source;
if (source > 0 && !IS_AFTER_RELEASE_21_MARCH_2013(board, version))
source++;
if (IS_ARM(board) && version >= 216) {
if (source > 1+TELEMETRY_SOURCE_DTE)
source -= 5;
if (source > 1+TELEMETRY_SOURCE_POWER_MAX)
source -= 5;
}
}
protected:
UnsignedField<N> internalField;
TelemetrySourcesConversionTable conversionTable;
unsigned int & source;
BoardEnum board;
unsigned int version;
unsigned int _source;
};
template <int N>

View file

@ -235,6 +235,33 @@ void ConvertGeneralSettings_215_to_216(EEGeneral &settings)
settings.chkSum = evalChkSum();
}
int ConvertTelemetrySource_215_to_216(int source)
{
// TELEM_RSSI_TX added
if (source >= TELEM_RSSI_TX)
source += 1;
// RxBatt added
if (source >= TELEM_RX_VOLTAGE)
source += 1;
// A3 and A4 added
if (source >= TELEM_A3)
source += 2;
// ASpd and dTE added + 5 reserve
if (source >= TELEM_ASPD)
source += 7;
// A3 and A4 MIN added
if (source >= TELEM_MIN_A3)
source += 2;
// Cel- and Vfas- added
if (source >= TELEM_MIN_CELL)
source += 2;
// 5 reserve added
if (source >= TELEM_RESERVE6)
source += 5;
return source;
}
#if defined(PCBTARANIS)
int ConvertSource_215_to_216(int source, bool insertZero=false)
{
@ -246,12 +273,9 @@ int ConvertSource_215_to_216(int source, bool insertZero=false)
// 4 GVARS added
if (source > MIXSRC_GVAR1+4)
source += 4;
// ASpd and dTE added
if (source >= MIXSRC_FIRST_TELEM-1+TELEM_ASPD)
source += 2;
// Cel- and Vfas- added
if (source >= MIXSRC_FIRST_TELEM-1+TELEM_MIN_CELL)
source += 2;
// Telemetry conversions
if (source >= MIXSRC_FIRST_TELEM)
source = MIXSRC_FIRST_TELEM + ConvertTelemetrySource_215_to_216(source-MIXSRC_FIRST_TELEM+1) - 1;
return source;
}
@ -273,12 +297,10 @@ int ConvertSource_215_to_216(int source, bool insertZero=false)
// 4 GVARS added
if (source > MIXSRC_GVAR1+4)
source += 4;
// ASpd and dTE added
if (source >= MIXSRC_FIRST_TELEM-1+TELEM_ASPD)
source += 2;
// Cel- and Vfas- added
if (source >= MIXSRC_FIRST_TELEM-1+TELEM_MIN_CELL)
source += 2;
// Telemetry conversions
if (source >= MIXSRC_FIRST_TELEM)
source = MIXSRC_FIRST_TELEM + ConvertTelemetrySource_215_to_216(source-MIXSRC_FIRST_TELEM+1) - 1;
return source;
}
@ -636,6 +658,24 @@ void ConvertModel_215_to_216(ModelData &model)
}
memcpy(&g_model.frsky, &oldModel.frsky, sizeof(oldModel.frsky));
for (int i=0; i<3; i++) {
if (g_model.frsky.screensType & (1<<i)) {
// gauges
for (int j=0; j<4; j++) {
uint8_t & source = g_model.frsky.screens[i].bars[j].source;
source = ConvertTelemetrySource_215_to_216(source);
}
}
else {
// numbers
for (int j=0; j<4; j++) {
for (int k=0; k<NUM_LINE_ITEMS; k++) {
uint8_t & source = g_model.frsky.screens[i].lines[j].sources[k];
source = ConvertTelemetrySource_215_to_216(source);
}
}
}
}
#if defined(PCBTARANIS)
g_model.externalModule = oldModel.externalModule;

View file

@ -1236,6 +1236,14 @@ bool isSourceAvailable(int source)
bool isTelemetrySourceAvailable(int source)
{
if (source == TELEM_RX_VOLTAGE || source == TELEM_A3 || source == TELEM_A4 || source == TELEM_MIN_A3 || source == TELEM_MIN_A4)
return false;
#if defined(PCBTARANIS)
if (source == TELEM_RSSI_TX)
return false;
#endif
if (source >= TELEM_RESERVE1 && source <= TELEM_RESERVE5)
return false;

View file

@ -1269,6 +1269,9 @@ void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val,
putsTelemetryValue(x, y, val, UNIT_RAW, att|PREC2);
break;
#if defined(CPUARM)
case TELEM_SWR-1:
#endif
case TELEM_RSSI_TX-1:
case TELEM_RSSI_RX-1:
putsTelemetryValue(x, y, val, UNIT_RAW, att);

View file

@ -937,10 +937,20 @@ enum TelemetrySource {
TELEM_TX_VOLTAGE,
TELEM_TM1,
TELEM_TM2,
#if defined(CPUARM)
TELEM_SWR,
#endif
TELEM_RSSI_TX,
TELEM_RSSI_RX,
#if defined(CPUARM)
TELEM_RX_VOLTAGE,
#endif
TELEM_A1,
TELEM_A2,
#if defined(CPUARM)
TELEM_A3,
TELEM_A4,
#endif
TELEM_ALT,
TELEM_RPM,
TELEM_FUEL,
@ -971,6 +981,10 @@ enum TelemetrySource {
#endif
TELEM_MIN_A1,
TELEM_MIN_A2,
#if defined(CPUARM)
TELEM_MIN_A3,
TELEM_MIN_A4,
#endif
TELEM_MIN_ALT,
TELEM_MAX_ALT,
TELEM_MAX_RPM,
@ -999,12 +1013,7 @@ enum TelemetrySource {
TELEM_DISPLAY_MAX = TELEM_TM2, // because used also in PlayValue
#endif
TELEM_STATUS_MAX = TELEM_GPS_TIME,
#if defined(FRSKY_SPORT)
TELEM_SWR = TELEM_RSSI_TX,
TELEM_FIRST_STREAMED_VALUE = TELEM_RSSI_RX,
#else
TELEM_FIRST_STREAMED_VALUE = TELEM_RSSI_TX,
#endif
};
enum VarioSource {

View file

@ -1269,6 +1269,9 @@ getvalue_t getValue(uint8_t i)
else if (i==MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE) return g_vbat100mV;
else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_TM2) return timersStates[i-MIXSRC_FIRST_TELEM+1-TELEM_TM1].val;
#if defined(FRSKY)
#if defined(CPUARM)
else if (i==MIXSRC_FIRST_TELEM-1+TELEM_SWR) return frskyData.swr.value;
#endif
else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_A2) return frskyData.analog[i-MIXSRC_FIRST_TELEM+1-TELEM_A1].value;
@ -1981,6 +1984,9 @@ ls_telemetry_value_t minTelemValue(uint8_t channel)
{
switch (channel) {
case TELEM_FUEL:
#if defined(CPUARM)
case TELEM_SWR:
#endif
case TELEM_RSSI_TX:
case TELEM_RSSI_RX:
return 0;
@ -2000,6 +2006,9 @@ ls_telemetry_value_t maxTelemValue(uint8_t channel)
{
switch (channel) {
case TELEM_FUEL:
#if defined(CPUARM)
case TELEM_SWR:
#endif
case TELEM_RSSI_TX:
case TELEM_RSSI_RX:
return 100;
@ -3171,13 +3180,13 @@ PLAY_FUNCTION(playValue, uint8_t idx)
case MIXSRC_FIRST_TELEM+TELEM_TM2-1:
PLAY_DURATION(val);
break;
#if defined(FRSKY)
case MIXSRC_FIRST_TELEM+TELEM_RSSI_TX-1:
#if defined(PCBTARANIS)
// On Taranis RSSI_TX is used for SWR
#if defined(CPUARM)
case MIXSRC_FIRST_TELEM+TELEM_SWR-1:
PLAY_NUMBER(val, 0, 0);
break;
#endif
#if defined(FRSKY)
case MIXSRC_FIRST_TELEM+TELEM_RSSI_TX-1:
case MIXSRC_FIRST_TELEM+TELEM_RSSI_RX-1:
PLAY_NUMBER(val, 1+UNIT_DBM, 0);
break;

View file

@ -187,6 +187,9 @@ PACK(struct FrskySerialData {
struct FrskyData {
FrskyValueWithMinMax analog[2];
FrskyValueWithMin rssi[2];
#if defined(CPUARM)
FrskyValueWithMinMax swr;
#endif
FrskySerialData hub;
};

View file

@ -323,7 +323,7 @@ void processSportPacket(uint8_t *packet)
frskyData.rssi[0].set(SPORT_DATA_U8(packet));
}
if (appId == SWR_ID) {
frskyData.rssi[1].set(SPORT_DATA_U8(packet));
frskyData.swr.set(SPORT_DATA_U8(packet));
}
else if (appId == ADC1_ID || appId == ADC2_ID) {
// A1/A2 of DxR receivers
@ -666,7 +666,7 @@ void telemetryWakeup()
alarmsCheckTime = get_tmr10ms() + 100; /* next check in 1second */
if (alarmsCheckStep == 0) {
if ((IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) && frskyData.rssi[1].value > 0x33) {
if ((IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) && frskyData.swr.value > 0x33) {
AUDIO_SWR_RED();
s_global_warning = STR_ANTENNAPROBLEM;
alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */
@ -759,7 +759,7 @@ void resetTelemetry()
frskyData.analog[0].set(120);
frskyData.analog[1].set(240);
frskyData.rssi[0].value = 75;
frskyData.rssi[1].value = 30;
frskyData.swr.value = 30;
frskyData.hub.fuelLevel = 75;
frskyData.hub.rpm = 12000;
frskyData.hub.vfas = 100;

View file

@ -150,6 +150,7 @@ PACK(struct FrskySerialData {
struct FrskyData {
FrskyValueWithMinMax analog[2];
FrskyValueWithMinMax rssi[2];
FrskyValueWithMinMax swr;
FrskySerialData hub;
};

View file

@ -257,21 +257,21 @@
#define LEN_VTELEMCHNS "\004"
#if defined(PCBTARANIS)
#define TR_RSSI_0 "SWR\0"
#define TR_RSSI_1 "RSSI"
#else
#define TR_RSSI_0 "Tx\0 "
#define TR_RSSI_1 "Rx\0 "
#endif
#if defined(CPUARM)
#define TR_TELEM_RESERVE "[--]"
#define TR_SWR "SWR\0"
#define TR_RX_BATT "RxBt"
#define TR_A3_A4 "A3\0 ""A4\0 "
#define TR_A3_A4_MIN "A3-\0""A4-\0"
#else
#define TR_TELEM_RESERVE
#define TR_SWR
#define TR_RX_BATT
#define TR_A3_A4
#define TR_A3_A4_MIN
#endif
#define TR_VTELEMCHNS "---\0""Batt""Tmr1""Tmr2" TR_RSSI_0 TR_RSSI_1 "A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\0" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cel-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Time"
#define TR_VTELEMCHNS "---\0""Batt""Tmr1""Tmr2" TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\0" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "A1-\0""A2-\0" TR_A3_A4_MIN "Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cel-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Time"
#if defined(CPUARM)
#define LEN_VUNITSSYSTEM TR("\006", "\010")