1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 16:25:16 +03:00
This commit is contained in:
bsongis 2014-09-15 15:47:46 +02:00
parent 6c5d53194a
commit 74252f787b
24 changed files with 340 additions and 183 deletions

View file

@ -839,7 +839,18 @@ struct FrSkyBarData {
};
struct FrSkyLineData {
unsigned int source[3];
unsigned int source[3];
};
struct TelemetryScriptData {
char filename[8+1];
};
enum TelemetryScreenEnum {
TELEMETRY_SCREEN_NONE,
TELEMETRY_SCREEN_NUMBERS,
TELEMETRY_SCREEN_BARS,
TELEMETRY_SCREEN_SCRIPT
};
class FrSkyScreenData {
@ -849,6 +860,7 @@ class FrSkyScreenData {
typedef union {
FrSkyBarData bars[4];
FrSkyLineData lines[4];
TelemetryScriptData script;
} FrSkyScreenBody;
unsigned int type;
@ -894,7 +906,7 @@ class FrSkyData {
bool altitudeDisplayed;
unsigned int currentSource;
unsigned int FrSkyGpsAlt;
FrSkyScreenData screens[3];
FrSkyScreenData screens[4];
FrSkyRSSIAlarm rssiAlarms[2];
unsigned int varioSource;
int varioMin;

View file

@ -2263,7 +2263,7 @@ class FrskyScreenField: public DataField {
bars.Append(new UnsignedField<8>(screen.body.bars[i].barMax));
}
int columns=(IS_TARANIS(board) ? 3:2);
int columns = (IS_TARANIS(board) ? 3 : 2);
for (int i=0; i<4; i++) {
for (int j=0; j<columns; j++) {
numbers.Append(new TelemetrySourceField<8>(screen.body.lines[i].source[j], board, version));
@ -2274,43 +2274,61 @@ class FrskyScreenField: public DataField {
numbers.Append(new SpareBitsField<8>());
}
}
none.Append(new SpareBitsField<12*8>());
if (IS_TARANIS(board) && version >= 217) {
script.Append(new CharField<8>(screen.body.script.filename));
script.Append(new SpareBitsField<32>());
}
}
virtual void ExportBits(QBitArray & output)
{
if (screen.type == 0)
if (screen.type == TELEMETRY_SCREEN_SCRIPT)
script.ExportBits(output);
else if (screen.type == TELEMETRY_SCREEN_NUMBERS)
numbers.ExportBits(output);
else
else if (screen.type == TELEMETRY_SCREEN_BARS)
bars.ExportBits(output);
else
none.ExportBits(output);
}
virtual void ImportBits(QBitArray & input)
{
// NOTA: screen.type should have been imported first!
if (screen.type == 0) {
if (screen.type == TELEMETRY_SCREEN_SCRIPT)
script.ImportBits(input);
else if (screen.type == TELEMETRY_SCREEN_NUMBERS)
numbers.ImportBits(input);
}
else {
else if (screen.type == TELEMETRY_SCREEN_BARS)
bars.ImportBits(input);
}
else
none.ImportBits(input);
}
virtual unsigned int size()
{
// NOTA: screen.type should have been imported first!
if (screen.type == 0)
if (screen.type == TELEMETRY_SCREEN_SCRIPT)
return script.size();
else if (screen.type == TELEMETRY_SCREEN_NUMBERS)
return numbers.size();
else
else if (screen.type == TELEMETRY_SCREEN_BARS)
return bars.size();
else
return none.size();
}
protected:
FrSkyScreenData & screen;
BoardEnum board;
unsigned int version;
StructField none;
StructField bars;
StructField numbers;
StructField script;
};
class RSSIConversionTable: public ConversionTable
@ -2418,13 +2436,22 @@ class FrskyField: public StructField {
Append(new ConversionField< SignedField<8> >(frsky.blades, -2));
Append(new ConversionField< UnsignedField<8> >(frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source"));
Append(new UnsignedField<1>(frsky.screens[0].type));
Append(new UnsignedField<1>(frsky.screens[1].type));
Append(new UnsignedField<1>(frsky.screens[2].type));
Append(new SpareBitsField<5>());
for (int i=0; i<3; i++) {
Append(new FrskyScreenField(frsky.screens[i], board, version));
if (version >= 217) {
for (int i=0; i<4; i++) {
Append(new UnsignedField<2>(frsky.screens[i].type));
}
for (int i=0; i<4; i++) {
Append(new FrskyScreenField(frsky.screens[i], board, version));
}
}
else {
Append(new UnsignedField<1>(frsky.screens[0].type));
Append(new UnsignedField<1>(frsky.screens[1].type));
Append(new UnsignedField<1>(frsky.screens[2].type));
Append(new SpareBitsField<5>());
for (int i=0; i<3; i++) {
Append(new FrskyScreenField(frsky.screens[i], board, version));
}
}
Append(new ConversionField< UnsignedField<8> >(frsky.varioSource, &telemetryVarioSourceConversionTable, "Vario Source"));
@ -2708,20 +2735,35 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
}
}
if (IS_TARANIS(board) && version >= 216) {
for (int i=0; i<7; i++) {
ScriptData & script = modelData.scriptData[i];
internalField.Append(new CharField<10>(script.filename));
internalField.Append(new ZCharField<10>(script.name));
for (int j=0; j<10; j++) {
internalField.Append(new SignedField<8>(script.inputs[j]));
if (IS_TARANIS(board)) {
if (version >= 217) {
for (int i=0; i<7; i++) {
ScriptData & script = modelData.scriptData[i];
internalField.Append(new CharField<8>(script.filename));
internalField.Append(new ZCharField<8>(script.name));
for (int j=0; j<8; j++) {
internalField.Append(new SignedField<8>(script.inputs[j]));
}
}
}
else if (version >= 216) {
for (int i=0; i<7; i++) {
ScriptData & script = modelData.scriptData[i];
internalField.Append(new CharField<10>(script.filename));
internalField.Append(new ZCharField<10>(script.name));
for (int j=0; j<10; j++) {
internalField.Append(new SignedField<8>(script.inputs[j]));
}
}
}
}
if (IS_TARANIS(board) && version >= 216) {
for (int i=0; i<32; i++) {
internalField.Append(new ZCharField<4>(modelData.inputNames[i]));
}
}
if (IS_ARM(board) && version >= 216) {
internalField.Append(new UnsignedField<8>(modelData.nPotsToWarn));
for (int i=0; i < GetCurrentFirmware()->getCapability(Pots); i++) {

View file

@ -653,7 +653,7 @@ int OpenTxFirmware::getCapability(const Capability capability)
case TelemetryBars:
return 1;
case TelemetryCustomScreens:
return IS_TARANIS(board) ? 3 : 2;
return IS_ARM(board) ? 4 : 2;
case TelemetryCustomScreensFieldsPerLine:
return IS_TARANIS(board) ? 3 : 2;
case NoTelemetryProtocol:

View file

@ -362,8 +362,8 @@ void TelemetryCustomScreen::update()
lock = true;
ui->screenType->setCurrentIndex(screen.type);
ui->screenNums->setVisible(screen.type == 0);
ui->screenBars->setVisible(screen.type != 0);
ui->screenNums->setVisible(screen.type == TELEMETRY_SCREEN_NUMBERS);
ui->screenBars->setVisible(screen.type == TELEMETRY_SCREEN_BARS);
for (int l=0; l<4; l++) {
for (int c=0; c<firmware->getCapability(TelemetryCustomScreensFieldsPerLine); c++) {
@ -375,14 +375,7 @@ void TelemetryCustomScreen::update()
populateTelemetrySourceCB(barsCB[l], screen.body.bars[l].source, false, model.frsky.usrProto);
}
if (screen.type == 0) {
for (int l=0; l<4; l++) {
for (int c=0; c<firmware->getCapability(TelemetryCustomScreensFieldsPerLine); c++) {
fieldsCB[l][c]->setCurrentIndex(screen.body.lines[l].source[c]);
}
}
}
else {
if (screen.type == TELEMETRY_SCREEN_BARS) {
for (int i=0; i<4; i++) {
updateBar(i);
}

View file

@ -51,7 +51,12 @@
</property>
<item>
<property name="text">
<string>Nums</string>
<string>None</string>
</property>
</item>
<item>
<property name="text">
<string>Numbers</string>
</property>
</item>
<item>
@ -59,6 +64,11 @@
<string>Bars</string>
</property>
</item>
<item>
<property name="text">
<string>Script</string>
</property>
</item>
</widget>
</item>
<item>

View file

@ -328,7 +328,7 @@ PACK(typedef struct {
uint8_t blades; // How many blades for RPMs, 0=2 blades, 1=3 blades
uint8_t currentSource;
uint8_t screensType;
FrSkyScreenData screens[MAX_FRSKY_SCREENS];
FrSkyScreenData screens[MAX_TELEMETRY_SCREENS];
uint8_t varioSource;
int8_t varioCenterMax;
int8_t varioCenterMin;
@ -337,6 +337,12 @@ PACK(typedef struct {
FrSkyRSSIAlarm rssiAlarms[2];
}) FrSkyData_v215;
PACK(typedef struct t_ScriptData {
char file[10];
char name[10];
int8_t inputs[10];
}) ScriptData_v216;
PACK(typedef struct {
ModelHeader header;
TimerData_v215 timers[2];
@ -420,7 +426,7 @@ PACK(typedef struct {
uint8_t trainerMode;
ModuleData moduleData[NUM_MODULES+1];
char curveNames[MAX_CURVES][6];
ScriptData scriptsData[MAX_SCRIPTS];
ScriptData_v216 scriptsData[MAX_SCRIPTS];
char inputNames[MAX_INPUTS][LEN_INPUT_NAME];
uint8_t nPotsToWarn;
int8_t potPosition[NUM_POTS];
@ -1104,6 +1110,9 @@ void ConvertModel_216_to_217(ModelData &model)
{
// Timer3 added
// 32bits Timers
// MixData reduction
// PPM center range
// Telemetry custom screens
assert(sizeof(ModelData_v216) <= sizeof(ModelData));
@ -1210,7 +1219,7 @@ void ConvertModel_216_to_217(ModelData &model)
memcpy(newModel.moduleData, oldModel.moduleData, sizeof(newModel.moduleData));
#if defined(PCBTARANIS)
newModel.trainerMode = oldModel.trainerMode;
memcpy(newModel.scriptsData, oldModel.scriptsData, sizeof(newModel.scriptsData));
// TODO memcpy(newModel.scriptsData, oldModel.scriptsData, sizeof(newModel.scriptsData));
memcpy(newModel.curveNames, oldModel.curveNames, sizeof(newModel.curveNames));
memcpy(newModel.inputNames, oldModel.inputNames, sizeof(newModel.inputNames));
#endif

View file

@ -1059,7 +1059,6 @@ void menuModelSetup(uint8_t event)
for (uint8_t i=0; i<LCD_LINES-1; i++) {
coord_t y = MENU_TITLE_HEIGHT + 1 + i*FH;
uint8_t k = i+s_pgOfs;
#if defined(CPUARM)
for (int j=0; j<=k; j++) {
@ -5617,6 +5616,11 @@ enum menuModelTelemetryItems {
ITEM_TELEMETRY_SCREEN_LINE10,
ITEM_TELEMETRY_SCREEN_LINE11,
ITEM_TELEMETRY_SCREEN_LINE12,
ITEM_TELEMETRY_SCREEN_LABEL4,
ITEM_TELEMETRY_SCREEN_LINE13,
ITEM_TELEMETRY_SCREEN_LINE14,
ITEM_TELEMETRY_SCREEN_LINE15,
ITEM_TELEMETRY_SCREEN_LINE16,
#endif
ITEM_TELEMETRY_MAX
};
@ -5636,7 +5640,7 @@ enum menuModelTelemetryItems {
#define TELEM_COL3 (28*FW)
#define TELEM_BARS_COLMIN (3*FW+56)
#define TELEM_BARS_COLMAX (20*FW-3)
#define TELEM_SCRTYPE_COL (10*FW)
#define TELEM_SCRTYPE_COL TELEM_COL2
#else
#define TELEM_COL1 INDENT_WIDTH
#if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_CZ)
@ -5646,18 +5650,22 @@ enum menuModelTelemetryItems {
#endif
#define TELEM_BARS_COLMIN (56-3*FW)
#define TELEM_BARS_COLMAX (14*FW-3)
#define TELEM_SCRTYPE_COL (10*FW)
#define TELEM_SCRTYPE_COL TELEM_COL2
#endif
#define IS_RANGE_DEFINED(k) (g_model.frsky.channels[k].ratio > 0)
#if defined(PCBTARANIS)
#define CHANNEL_ROWS LABEL(CHANNEL), 1, 0, 0, 0
#define CHANNEL_ROWS(x) LABEL(CHANNEL), IS_RANGE_DEFINED(x) ? (uint8_t)1 : (uint8_t)0, IS_RANGE_DEFINED(x) ? (uint8_t)0 : HIDDEN_ROW, IS_RANGE_DEFINED(x) ? (uint8_t)0 : HIDDEN_ROW, IS_RANGE_DEFINED(x) ? (uint8_t)0 : HIDDEN_ROW
#define RSSI_ROWS LABEL(RSSI), 0, 0
#else
#define CHANNEL_ROWS LABEL(CHANNEL), 1, 0, 2, 2
#define CHANNEL_ROWS(x) LABEL(CHANNEL), 1, 0, 2, 2
#define RSSI_ROWS LABEL(RSSI), 1, 1
#endif
#if defined(GAUGES)
#if defined(LUA)
#define SCREEN_TYPE_ROWS 1
#elif defined(CPUARM) || defined(GAUGES)
#define SCREEN_TYPE_ROWS 0
#else
#define SCREEN_TYPE_ROWS LABEL(SCREEN)
@ -5683,9 +5691,44 @@ enum menuModelTelemetryItems {
#define TELEMETRY_TYPE_ROWS
#endif
#if defined(CPUARM)
#if defined(LUA)
#define TELEMETRY_SCREEN_LINE(x) ((TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE || TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_SCRIPT) ? HIDDEN_ROW : (uint8_t)2)
#else
#define TELEMETRY_SCREEN_LINE(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (uint8_t)2)
#endif
#define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x)
#define TELEMETRY_CURRENT_EDIT_SCREEN(k) (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : (k < ITEM_TELEMETRY_SCREEN_LABEL4 ? 2 : 3)))
#define TELEMETRY_CURRENT_EDIT_CHANNEL(k) (k >= ITEM_TELEMETRY_A4_LABEL ? TELEM_ANA_A4 : (k >= ITEM_TELEMETRY_A3_LABEL ? TELEM_ANA_A3 : (k >= ITEM_TELEMETRY_A2_LABEL ? TELEM_ANA_A2 : TELEM_ANA_A1)))
#else
#define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, 2, 2, 2, 2
#define TELEMETRY_CURRENT_EDIT_CHANNEL(k) (k >= ITEM_TELEMETRY_A2_LABEL ? TELEM_ANA_A2 : TELEM_ANA_A1)
#endif
#if defined(LUA)
void onTelemetryScriptFileSelectionMenu(const char *result)
{
int8_t sub = m_posVert - 1;
uint8_t screenIndex = TELEMETRY_CURRENT_EDIT_SCREEN(sub);
if (result == STR_UPDATE_LIST) {
if (!listSdFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), NULL)) {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);
s_menu_flags = 0;
}
}
else {
// The user choosed a file in the list
memcpy(g_model.frsky.screens[screenIndex].script.file, result, sizeof(g_model.frsky.screens[screenIndex].script.file));
eeDirty(EE_MODEL);
LUA_LOAD_MODEL_SCRIPTS();
}
}
#endif
void menuModelTelemetry(uint8_t event)
{
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, TELEMETRY_TYPE_ROWS CHANNEL_ROWS, CHANNEL_ROWS, CASE_CPUARM(CHANNEL_ROWS) CASE_CPUARM(CHANNEL_ROWS) RSSI_ROWS, USRDATA_LINES 0, 0, IF_FAS_OFFSET(0) CASE_CPUARM(0) CASE_VARIO(LABEL(Vario)) CASE_VARIO(0) CASE_VARIO(VARIO_RANGE_ROWS) CASE_PCBTARANIS(LABEL(TopBar)) CASE_PCBTARANIS(0) SCREEN_TYPE_ROWS, 2, 2, 2, 2, SCREEN_TYPE_ROWS, 2, 2, 2, 2, CASE_CPUARM(SCREEN_TYPE_ROWS) CASE_CPUARM(2) CASE_CPUARM(2) CASE_CPUARM(2) CASE_CPUARM(2)});
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, TELEMETRY_TYPE_ROWS CHANNEL_ROWS(0), CHANNEL_ROWS(1), CASE_CPUARM(CHANNEL_ROWS(2)) CASE_CPUARM(CHANNEL_ROWS(3)) RSSI_ROWS, USRDATA_LINES 0, 0, IF_FAS_OFFSET(0) CASE_CPUARM(0) CASE_VARIO(LABEL(Vario)) CASE_VARIO(0) CASE_VARIO(VARIO_RANGE_ROWS) CASE_PCBTARANIS(LABEL(TopBar)) CASE_PCBTARANIS(0) TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), CASE_CPUARM(TELEMETRY_SCREEN_ROWS(2)) CASE_CPUARM(TELEMETRY_SCREEN_ROWS(3))});
uint8_t sub = m_posVert - 1;
@ -5713,22 +5756,11 @@ void menuModelTelemetry(uint8_t event)
uint8_t blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
uint8_t attr = (sub == k ? blink : 0);
#if defined(CPUARM)
uint8_t ch = TELEM_ANA_A1;
if (k >= ITEM_TELEMETRY_A4_LABEL)
ch = TELEM_ANA_A4;
else if (k >= ITEM_TELEMETRY_A3_LABEL)
ch = TELEM_ANA_A3;
else if (k >= ITEM_TELEMETRY_A2_LABEL)
ch = TELEM_ANA_A2;
#else
uint8_t ch = (k >= ITEM_TELEMETRY_A2_LABEL) ? TELEM_ANA_A2 : TELEM_ANA_A1;
#endif
uint8_t ch = TELEMETRY_CURRENT_EDIT_CHANNEL(k);
FrSkyChannelData & channel = g_model.frsky.channels[ch];
uint8_t dest = TELEM_A1-1+ch;
switch (k) {
#if defined(CPUARM)
case ITEM_TELEMETRY_PROTOCOL_TYPE:
g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\017FrSky S.PORT\0 FrSky D\0 FrSky D (cable)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, CASE_PCBTARANIS(g_eeGeneral.uart3Mode==UART_MODE_TELEMETRY ? PROTOCOL_FRSKY_D_SECONDARY : PROTOCOL_FRSKY_D) CASE_PCBSKY9X(PROTOCOL_FRSKY_D_SECONDARY) attr, event);
@ -5743,7 +5775,10 @@ void menuModelTelemetry(uint8_t event)
#endif
lcd_putsLeft(y, STR_ACHANNEL);
lcd_outdezAtt(2*FW, y, ch+1, 0);
putsTelemetryChannel(TELEM_COL2+6*FW, y, dest, frskyData.analog[ch].value, LEFT);
#if defined(CPUARM)
if (channel.ratio != 0)
#endif
putsTelemetryChannel(TELEM_COL2+6*FW, y, dest, frskyData.analog[ch].value, LEFT);
break;
case ITEM_TELEMETRY_A1_RANGE:
@ -5753,8 +5788,16 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_A4_RANGE:
#endif
lcd_putsLeft(y, STR_RANGE);
putsTelemetryChannel(TELEM_COL2, y, dest, 255-channel.offset, (m_posHorz<=0 ? attr : 0)|NO_UNIT|LEFT);
lcd_putsiAtt(lcdLastPos, y, STR_VTELEMUNIT, channel.type, m_posHorz!=0 ? attr : 0);
#if defined(CPUARM)
if (channel.ratio == 0) {
lcd_putsiAtt(TELEM_COL2, y, STR_VCSWFUNC, 0, attr);
}
else
#endif
{
putsTelemetryChannel(TELEM_COL2, y, dest, 255-channel.offset, (m_posHorz<=0 ? attr : 0)|NO_UNIT|LEFT);
lcd_putsiAtt(lcdLastPos, y, STR_VTELEMUNIT, channel.type, m_posHorz!=0 ? attr : 0);
}
if (attr && (s_editMode>0 || p1valdiff)) {
if (m_posHorz == 0) {
uint16_t ratio = checkIncDec(event, channel.ratio, 0, 256, EE_MODEL);
@ -5993,13 +6036,41 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_SCREEN_LABEL2:
#if defined(CPUARM)
case ITEM_TELEMETRY_SCREEN_LABEL3:
case ITEM_TELEMETRY_SCREEN_LABEL4:
{
uint8_t screenIndex = (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : 2));
uint8_t screenIndex = TELEMETRY_CURRENT_EDIT_SCREEN(k);
putsStrIdx(0*FW, y, STR_SCREEN, screenIndex+1);
#if defined(GAUGES)
bool screenType = IS_BARS_SCREEN(screenIndex);
if (screenType != (bool)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VSCREEN, screenType, 0, 1, attr, event))
g_model.frsky.screensType ^= (1 << screenIndex);
TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex);
TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (m_posHorz==0 ? attr : 0), event);
if (newScreenType != oldScreenType) {
g_model.frsky.screensType = (g_model.frsky.screensType & (~(0x03 << (2*screenIndex)))) | (newScreenType << (2*screenIndex));
memset(&g_model.frsky.screens[screenIndex], 0, sizeof(g_model.frsky.screens[screenIndex]));
}
#if defined(LUA)
if (newScreenType == TELEMETRY_SCREEN_TYPE_SCRIPT) {
TelemetryScriptData & scriptData = g_model.frsky.screens[screenIndex].script;
// TODO better function name for ---
// TODO function for these lines
if (ZEXIST(scriptData.file))
lcd_putsnAtt(TELEM_SCRTYPE_COL+7*FW, y, scriptData.file, sizeof(scriptData.file), (m_posHorz==1 ? attr : 0));
else
lcd_putsiAtt(TELEM_SCRTYPE_COL+7*FW, y, STR_VCSWFUNC, 0, (m_posHorz==1 ? attr : 0));
if (m_posHorz==1 && attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
s_editMode = 0;
if (listSdFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), g_model.frsky.screens[screenIndex].script.file)) {
menuHandler = onTelemetryScriptFileSelectionMenu;
}
else {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);
s_menu_flags = 0;
}
}
}
else if (attr) {
MOVE_CURSOR_FROM_HERE();
}
#endif
break;
}
@ -6009,7 +6080,7 @@ void menuModelTelemetry(uint8_t event)
putsStrIdx(0*FW, y, STR_SCREEN, screenIndex);
#if defined(GAUGES)
bool screenType = g_model.frsky.screensType & screenIndex;
if (screenType != (bool)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VSCREEN, screenType, 0, 1, attr, event))
if (screenType != (bool)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, screenType, 0, 1, attr, event))
g_model.frsky.screensType ^= screenIndex;
#endif
break;
@ -6030,8 +6101,11 @@ void menuModelTelemetry(uint8_t event)
case ITEM_TELEMETRY_SCREEN_LINE10:
case ITEM_TELEMETRY_SCREEN_LINE11:
case ITEM_TELEMETRY_SCREEN_LINE12:
case ITEM_TELEMETRY_SCREEN_LINE13:
case ITEM_TELEMETRY_SCREEN_LINE14:
case ITEM_TELEMETRY_SCREEN_LINE15:
case ITEM_TELEMETRY_SCREEN_LINE16:
#endif
{
uint8_t screenIndex, lineIndex;
if (k < ITEM_TELEMETRY_SCREEN_LABEL2) {
@ -6039,6 +6113,10 @@ void menuModelTelemetry(uint8_t event)
lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE1;
}
#if defined(CPUARM)
else if (k >= ITEM_TELEMETRY_SCREEN_LABEL4) {
screenIndex = 3;
lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE13;
}
else if (k >= ITEM_TELEMETRY_SCREEN_LABEL3) {
screenIndex = 2;
lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE9;

View file

@ -424,32 +424,30 @@ bool displayCustomTelemetryScreen(uint8_t index)
FrSkyScreenData & screen = g_model.frsky.screens[index];
#if defined(GAUGES)
if (g_model.frsky.screensType & (1<<(s_frsky_view-TELEMETRY_CUSTOM_SCREEN_1))) {
if (IS_BARS_SCREEN(s_frsky_view)) {
return displayGaugesTelemetryScreen(screen);
}
else
#endif
{
return displayNumbersTelemetryScreen(screen);
}
return displayNumbersTelemetryScreen(screen);
}
bool displayTelemetryScreen()
{
#if defined(LUA)
if (s_frsky_view < TELEMETRY_CUSTOM_SCREEN_1) {
return isTelemetryScriptAvailable(s_frsky_view);
if (TELEMETRY_SCREEN_TYPE(s_frsky_view) == TELEMETRY_SCREEN_TYPE_SCRIPT) {
return ZEXIST(g_model.frsky.screens[s_frsky_view].script.file);
}
#endif
lcdDrawTelemetryTopBar();
if (s_frsky_view < MAX_TELEMETRY_SCREENS) {
return displayCustomTelemetryScreen(s_frsky_view);
}
if (s_frsky_view == TELEMETRY_VOLTAGES_SCREEN) {
displayVoltagesScreen();
}
else if (s_frsky_view < TELEMETRY_CUSTOM_SCREEN_1+MAX_FRSKY_SCREENS) {
return displayCustomTelemetryScreen(s_frsky_view-TELEMETRY_CUSTOM_SCREEN_1);
}
#if defined(FRSKY_HUB)
else {
displayAfterFlightScreen();

View file

@ -1528,7 +1528,7 @@ int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs
#endif
if (luaState == INTERPRETER_PANIC) {
return SCRIPT_PANIC;
return SCRIPT_PANIC;
}
SET_LUA_INSTRUCTIONS_COUNT(MANUAL_SCRIPTS_MAX_INSTRUCTIONS);
@ -1635,54 +1635,34 @@ bool luaLoadFunctionScript(uint8_t index)
return true;
}
void getTelemetryScriptPath(char * path, uint8_t index)
{
strcpy(path, SCRIPTS_PATH "/");
char * curs = strcat_modelname(path+sizeof(SCRIPTS_PATH), g_eeGeneral.currModel);
if (index == TELEMETRY_VOLTAGES_SCREEN) {
strcpy(curs, "/telempw.lua");
}
else if (index == TELEMETRY_AFTER_FLIGHT_SCREEN) {
strcpy(curs, "/telemaf.lua");
}
else {
strcpy(curs, "/telemX.lua");
curs[6] = '1' + index;
}
}
bool luaLoadTelemetryScript(uint8_t index)
{
char path[256];
getTelemetryScriptPath(path, index);
if (isFileAvailable(path)) {
if (luaScriptsCount < MAX_SCRIPTS) {
ScriptInternalData & sid = scriptInternalData[luaScriptsCount++];
sid.reference = SCRIPT_TELEMETRY_FIRST+index;
sid.state = SCRIPT_NOFILE;
if (luaLoad(path, sid) == SCRIPT_PANIC) {
TelemetryScreenType screenType = TELEMETRY_SCREEN_TYPE(index);
if (screenType == TELEMETRY_SCREEN_TYPE_SCRIPT) {
TelemetryScriptData & script = g_model.frsky.screens[index].script;
if (ZEXIST(script.file)) {
if (luaScriptsCount < MAX_SCRIPTS) {
ScriptInternalData & sid = scriptInternalData[luaScriptsCount++];
sid.reference = SCRIPT_TELEMETRY_FIRST+index;
sid.state = SCRIPT_NOFILE;
char filename[sizeof(SCRIPTS_TELEM_PATH)+sizeof(script.file)+sizeof(SCRIPTS_EXT)] = SCRIPTS_TELEM_PATH "/";
strncpy(filename+sizeof(SCRIPTS_TELEM_PATH), script.file, sizeof(script.file));
filename[sizeof(SCRIPTS_TELEM_PATH)+sizeof(script.file)] = '\0';
strcat(filename+sizeof(SCRIPTS_TELEM_PATH), SCRIPTS_EXT);
if (luaLoad(filename, sid) == SCRIPT_PANIC) {
return false;
}
}
else {
POPUP_WARNING(STR_TOO_MANY_LUA_SCRIPTS);
return false;
}
}
else {
POPUP_WARNING(STR_TOO_MANY_LUA_SCRIPTS);
return false;
}
}
return true;
}
bool isTelemetryScriptAvailable(uint8_t index)
{
for (int i=0; i<luaScriptsCount; i++) {
ScriptInternalData & sid = scriptInternalData[i];
if (sid.reference == SCRIPT_TELEMETRY_FIRST+index) {
return true;
}
}
return false;
}
void luaLoadPermanentScripts()
{
luaScriptsCount = 0;
@ -1691,9 +1671,9 @@ void luaLoadPermanentScripts()
// Load model scripts
for (int i=0; i<MAX_SCRIPTS; i++) {
if (!luaLoadMixScript(i)) {
return;
}
if (!luaLoadMixScript(i)) {
return;
}
}
// Load custom function scripts
@ -1704,17 +1684,11 @@ void luaLoadPermanentScripts()
}
// Load custom telemetry scripts
for (int i=0; i<MAX_SCRIPTS; i++) {
for (int i=0; i<MAX_TELEMETRY_SCREENS; i++) {
if (!luaLoadTelemetryScript(i)) {
return;
}
}
if (!luaLoadTelemetryScript(TELEMETRY_VOLTAGES_SCREEN)) {
return;
}
if (!luaLoadTelemetryScript(TELEMETRY_AFTER_FLIGHT_SCREEN)) {
return;
}
}
char lua_warning_str[WARNING_LINE_LEN+1];
@ -1880,8 +1854,9 @@ void luaDoOneRunPermanentScript(uint8_t evt, int i)
lua_rawgeti(L, LUA_REGISTRYINDEX, sid.run);
}
else {
TelemetryScriptData & script = g_model.frsky.screens[sid.reference-SCRIPT_TELEMETRY_FIRST].script;
#if defined(SIMU) || defined(DEBUG)
filename = "[telem]";
filename = script.file;
#endif
if (g_menuStack[0]==menuTelemetryFrsky && sid.reference==SCRIPT_TELEMETRY_FIRST+s_frsky_view) {
lua_rawgeti(L, LUA_REGISTRYINDEX, sid.run);

View file

@ -342,11 +342,12 @@ PACK(typedef struct t_ModuleData {
#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppmFrameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount)
#define MAX_SCRIPT_INPUTS 10
#define MAX_SCRIPT_OUTPUTS 6
PACK(typedef struct t_ScriptData {
char file[10];
char name[10];
#define LEN_SCRIPT_FILENAME 8
#define MAX_SCRIPT_INPUTS 8
#define MAX_SCRIPT_OUTPUTS 6
PACK(typedef struct {
char file[LEN_SCRIPT_FILENAME];
char name[8];
int8_t inputs[MAX_SCRIPT_INPUTS];
}) ScriptData;
@ -1183,7 +1184,7 @@ enum VarioSource {
#define NUM_TELEMETRY TELEM_TIMER_MAX
#endif
PACK(typedef struct t_FrSkyBarData {
PACK(typedef struct {
uint8_t source;
uint8_t barMin; // minimum for bar display
uint8_t barMax; // ditto for max display (would usually = ratio)
@ -1194,13 +1195,24 @@ PACK(typedef struct t_FrSkyBarData {
#else
#define NUM_LINE_ITEMS 2
#endif
PACK(typedef struct t_FrSkyLineData {
PACK(typedef struct {
uint8_t sources[NUM_LINE_ITEMS];
}) FrSkyLineData;
typedef union t_FrSkyScreenData {
#if defined(PCBTARANIS)
#define MAX_TELEM_SCRIPT_INPUTS 4
PACK(typedef struct {
char file[LEN_SCRIPT_FILENAME];
int8_t inputs[MAX_TELEM_SCRIPT_INPUTS];
}) TelemetryScriptData;
#endif
typedef union {
FrSkyBarData bars[4];
FrSkyLineData lines[4];
#if defined(PCBTARANIS)
TelemetryScriptData script;
#endif
} FrSkyScreenData;
enum FrskyUsrProtocols {
@ -1235,17 +1247,30 @@ enum FrskyVoltsSource {
};
#if defined(CPUARM)
enum TelemetryScreenType {
TELEMETRY_SCREEN_TYPE_NONE,
TELEMETRY_SCREEN_TYPE_VALUES,
TELEMETRY_SCREEN_TYPE_GAUGES,
#if defined(PCBTARANIS) && defined(LUA)
TELEMETRY_SCREEN_TYPE_SCRIPT,
TELEMETRY_SCREEN_TYPE_MAX = TELEMETRY_SCREEN_TYPE_SCRIPT
#else
TELEMETRY_SCREEN_TYPE_MAX = TELEMETRY_SCREEN_TYPE_GAUGES
#endif
};
#define MAX_FRSKY_A_CHANNELS 4
#define MAX_FRSKY_SCREENS 3
PACK(typedef struct t_FrSkyData {
#define MAX_TELEMETRY_SCREENS 4
#define TELEMETRY_SCREEN_TYPE(screenIndex) TelemetryScreenType((g_model.frsky.screensType >> (2*(screenIndex))) & 0x03)
#define IS_BARS_SCREEN(screenIndex) (TELEMETRY_SCREEN_TYPE(screenIndex) == TELEMETRY_SCREEN_TYPE_GAUGES)
PACK(typedef struct {
FrSkyChannelData channels[MAX_FRSKY_A_CHANNELS];
uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon
uint8_t voltsSource:7;
uint8_t altitudeDisplayed:1;
int8_t blades; // How many blades for RPMs, 0=2 blades
uint8_t currentSource;
uint8_t screensType;
FrSkyScreenData screens[MAX_FRSKY_SCREENS];
uint8_t screensType; // 2bits per screen (None/Gauges/Numbers/Script)
FrSkyScreenData screens[MAX_TELEMETRY_SCREENS];
uint8_t varioSource;
int8_t varioCenterMax;
int8_t varioCenterMin;
@ -1260,7 +1285,8 @@ PACK(typedef struct t_FrSkyData {
#define MAX_BLADES 126 // 128 blades
#else
#define MAX_FRSKY_A_CHANNELS 2
#define MAX_FRSKY_SCREENS 2
#define MAX_TELEMETRY_SCREENS 2
#define IS_BARS_SCREEN(screenIndex) (g_model.frsky.screensType & (1<<(screenIndex)))
PACK(typedef struct t_FrSkyData {
FrSkyChannelData channels[MAX_FRSKY_A_CHANNELS];
uint8_t usrProto:2; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon
@ -1270,7 +1296,7 @@ PACK(typedef struct t_FrSkyData {
int8_t varioMin:4;
int8_t varioMax:4;
FrSkyRSSIAlarm rssiAlarms[2];
FrSkyScreenData screens[MAX_FRSKY_SCREENS];
FrSkyScreenData screens[MAX_TELEMETRY_SCREENS];
uint8_t varioSource:3;
int8_t varioCenterMin:5;
uint8_t currentSource:3;
@ -1822,7 +1848,7 @@ PACK(typedef struct {
MODELDATA_EXTRA
ARM_FIELD(uint8_t spare3[188]) // TODO dirty hack for eeprom conversions (we load the model inside the g_model structure)
ARM_FIELD(uint8_t spare3[230]) // TODO dirty hack for eeprom conversions (we load the model inside the g_model structure)
}) ModelData;
extern EEGeneral g_eeGeneral;

View file

@ -1519,7 +1519,6 @@ enum AUDIO_SOUNDS {
void luaExec(const char *filename);
int luaGetMemUsed();
#define luaGetCpuUsed(idx) scriptInternalData[idx].instructions
bool isTelemetryScriptAvailable(uint8_t index);
#define LUA_LOAD_MODEL_SCRIPTS() luaState |= INTERPRETER_RELOAD_PERMANENT_SCRIPTS
#define LUA_LOAD_MODEL_SCRIPT(idx) luaState |= INTERPRETER_RELOAD_PERMANENT_SCRIPTS
@ -1693,23 +1692,27 @@ extern const pm_uint8_t bchunit_ar[];
#define FRSKY_MULTIPLIER_MAX 3
#endif
#define IS_BARS_SCREEN(screenIndex) (g_model.frsky.screensType & (1<<(screenIndex)))
#if defined(PCBTARANIS)
enum FrskyViews {
TELEMETRY_CUSTOM_SCREEN_1,
TELEMETRY_CUSTOM_SCREEN_2,
TELEMETRY_CUSTOM_SCREEN_3,
TELEMETRY_CUSTOM_SCREEN_4,
TELEMETRY_VOLTAGES_SCREEN, // TODO NOT IF LUA
TELEMETRY_AFTER_FLIGHT_SCREEN, // TODO NOT IF LUA
FRSKY_VIEW_MAX = TELEMETRY_AFTER_FLIGHT_SCREEN
};
#else
enum FrskyViews {
CASE_LUA(TELEMETRY_LUA_SCREEN_1)
CASE_LUA(TELEMETRY_LUA_SCREEN_2)
CASE_LUA(TELEMETRY_LUA_SCREEN_3)
CASE_LUA(TELEMETRY_LUA_SCREEN_4)
CASE_LUA(TELEMETRY_LUA_SCREEN_5)
CASE_LUA(TELEMETRY_LUA_SCREEN_6)
CASE_LUA(TELEMETRY_LUA_SCREEN_7)
TELEMETRY_CUSTOM_SCREEN_1,
TELEMETRY_CUSTOM_SCREEN_2,
CASE_CPUARM(TELEMETRY_CUSTOM_SCREEN_3)
CASE_CPUARM(TELEMETRY_CUSTOM_SCREEN_4)
TELEMETRY_VOLTAGES_SCREEN,
TELEMETRY_AFTER_FLIGHT_SCREEN,
FRSKY_VIEW_MAX = TELEMETRY_AFTER_FLIGHT_SCREEN
};
#endif
extern uint8_t s_frsky_view;

View file

@ -54,6 +54,7 @@
#define TEMPLATES_PATH SCRIPTS_PATH "/TEMPLATES"
#define SCRIPTS_MIXES_PATH SCRIPTS_PATH "/MIXES"
#define SCRIPTS_FUNCS_PATH SCRIPTS_PATH "/FUNCTIONS"
#define SCRIPTS_TELEM_PATH SCRIPTS_PATH "/TELEM"
#define MODELS_EXT ".bin"
#define LOGS_EXT ".csv"

View file

@ -86,7 +86,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
ISTR(GPSFORMAT)
ISTR(AMPSRC)
ISTR(VARIOSRC)
ISTR(VSCREEN)
ISTR(VTELEMSCREENTYPE)
#endif
#if defined(TEMPLATES)
ISTR(VTEMPLATES)

View file

@ -137,7 +137,7 @@ extern const pm_char STR_OPEN9X[];
#define OFS_AMPSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT))
#define OFS_VARIOSRC (OFS_AMPSRC + sizeof(TR_AMPSRC))
#define OFS_VSCREEN (OFS_VARIOSRC + sizeof(TR_VARIOSRC))
#define OFS_VTEMPLATES (OFS_VSCREEN + sizeof(TR_VSCREEN))
#define OFS_VTEMPLATES (OFS_VSCREEN + sizeof(TR_VTELEMSCREENTYPE))
#else
#define OFS_VTEMPLATES (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS))
#endif
@ -234,7 +234,7 @@ extern const pm_char STR_OPEN9X[];
#define STR_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT)
#define STR_AMPSRC (STR_OPEN9X + OFS_AMPSRC)
#define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC)
#define STR_VSCREEN (STR_OPEN9X + OFS_VSCREEN)
#define STR_VTELEMSCREENTYPE (STR_OPEN9X + OFS_VSCREEN)
#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS)
#endif

View file

@ -404,8 +404,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\010"
#define TR_VSCREEN "Hodnota ""Ukazatel"
#define LEN_VTELEMSCREENTYPE "\010"
#define TR_VTELEMSCREENTYPE "Hodnota ""Ukazatel"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "DMS\0""NMEA"

View file

@ -402,8 +402,13 @@
#define TR_VARIOSRC "Alt\0""Alt+""Vspd""A1\0 ""A2\0 "
#endif
#define LEN_VSCREEN "\007"
#define TR_VSCREEN ":Werte\0"":Balken" //Telemetrie Werte oder Balken
#if defined(CPUARM)
#define LEN_VTELEMSCREENTYPE "\007"
#define TR_VTELEMSCREENTYPE "None\0 "":Werte\0"":Balken""Script\0"
#else
#define LEN_VTELEMSCREENTYPE "\006"
#define TR_VTELEMSCREENTYPE "Werte\0""Balken"
#endif
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "GMS\0""NMEA" //Koordinatenanzeige
@ -476,10 +481,10 @@
#define LEN_VTMRMODES "\003"
#define TR_VTMRMODES "AUS""ABS""GSs""GS%""GSt"
#define LEN_VTRAINERMODES "\007" // "\006"
#define LEN_VTRAINERMODES "\007"
#define TR_VTRAINERMODES "Lehrer\0""Schüler\0" // "Master""Slave\0"
#define LEN_VFAILSAFE "\013" // "\011"
#define LEN_VFAILSAFE "\013"
#define TR_VFAILSAFE "Halte Pos.\0""Angepasst\0 ""Kein Signal""Empfänger\0"
#if defined(MAVLINK)

View file

@ -402,8 +402,13 @@
#define TR_VARIOSRC "Alt\0""Alt+""VSpd""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
#if defined(CPUARM)
#define LEN_VTELEMSCREENTYPE "\006"
#define TR_VTELEMSCREENTYPE "None\0 ""Nums\0 ""Bars\0 ""Script"
#else
#define LEN_VTELEMSCREENTYPE "\004"
#define TR_VTELEMSCREENTYPE "Nums""Bars"
#endif
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "DMS\0""NMEA"
@ -587,7 +592,7 @@
#define TR_ALARM INDENT "Alarm"
#define TR_USRDATA TR("UsrData","User Data")
#define TR_BLADES INDENT "Blades"
#define TR_SCREEN "Screen "
#define TR_SCREEN "Screen\001"
#define TR_SOUND_LABEL "Sound"
#define TR_LENGTH INDENT "Length"
#define TR_BEEP_LENGTH INDENT "Beep Length"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
#define LEN_VTELEMSCREENTYPE "\004"
#define TR_VTELEMSCREENTYPE "Nums""Bars"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
#define LEN_VTELEMSCREENTYPE "\004"
#define TR_VTELEMSCREENTYPE "Nums""Bars"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN TR("\004", "\007")
#define TR_VSCREEN TR("Val.""Bars", "Valeurs""Barres\0")
#define LEN_VTELEMSCREENTYPE TR("\004", "\007")
#define TR_VTELEMSCREENTYPE TR("Val.""Bars", "Valeurs""Barres\0")
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "DMS\0""NMEA"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\006"
#define TR_VSCREEN "Valori""Barre "
#define LEN_VTELEMSCREENTYPE "\006"
#define TR_VTELEMSCREENTYPE "Valori""Barre "
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Wys\0""Wys+""VSpd""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Licz""Pask"
#define LEN_VTELEMSCREENTYPE "\004"
#define TR_VTELEMSCREENTYPE "Licz""Pask"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "DMS\0""NMEA"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
#define LEN_VTELEMSCREENTYPE "\004"
#define TR_VTELEMSCREENTYPE "Nums""Bars"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"

View file

@ -400,8 +400,8 @@
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#endif
#define LEN_VSCREEN "\007"
#define TR_VSCREEN "Siffror""Staplar"
#define LEN_VTELEMSCREENTYPE "\007"
#define TR_VTELEMSCREENTYPE "Siffror""Staplar"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"