diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 0dba306cc..23ca5355c 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -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; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index fd407522d..160ecf495 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -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(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++) { diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 303fb3cb2..47fad81a9 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -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: diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 84780e552..43b97a30f 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -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; cgetCapability(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; cgetCapability(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); } diff --git a/companion/src/modeledit/telemetry_customscreen.ui b/companion/src/modeledit/telemetry_customscreen.ui index 8abc7de10..bbdfa34cf 100644 --- a/companion/src/modeledit/telemetry_customscreen.ui +++ b/companion/src/modeledit/telemetry_customscreen.ui @@ -51,7 +51,12 @@ - Nums + None + + + + + Numbers @@ -59,6 +64,11 @@ Bars + + + Script + + diff --git a/radio/src/eeprom_conversions.cpp b/radio/src/eeprom_conversions.cpp index 8a4a778a6..00adb9ade 100644 --- a/radio/src/eeprom_conversions.cpp +++ b/radio/src/eeprom_conversions.cpp @@ -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 diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index e35e3d4d3..e48254c8b 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -1059,7 +1059,6 @@ void menuModelSetup(uint8_t event) for (uint8_t i=0; i 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; diff --git a/radio/src/gui/view_telemetry.cpp b/radio/src/gui/view_telemetry.cpp index 12a4a8e44..5f541da7d 100644 --- a/radio/src/gui/view_telemetry.cpp +++ b/radio/src/gui/view_telemetry.cpp @@ -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(); diff --git a/radio/src/lua.cpp b/radio/src/lua.cpp index 4cba9cf98..29a8eb9d1 100644 --- a/radio/src/lua.cpp +++ b/radio/src/lua.cpp @@ -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> (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; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 5d462d914..27083e46c 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -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; diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 6522e6123..d9d9793bf 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -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" diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 298cdb09e..7a09e0818 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -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) diff --git a/radio/src/translations.h b/radio/src/translations.h index 923b456f4..ce06655e4 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -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 diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 44ea255bc..5602a6406 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -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" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index f38388933..ae9992e9d 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -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) diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 786e979eb..9e4649c13 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -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" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index ee996afdf..cd07180b7 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -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" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index ac79bc322..1e2171cff 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -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" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 554489eee..077eab273 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -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" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 599128cab..5b942c041 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -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" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index e8c4535e1..90f84a27c 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -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" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index fdfa2e267..06d540e51 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -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" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 2c2886af8..eeb7dacc9 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -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"