From ae7824eff8946eec8958f5a58683a2872d630b25 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 8 Apr 2021 15:40:23 +0200 Subject: [PATCH 01/18] ViewMain must be created first --- radio/src/opentx.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 8fcce8cc1..c19056b9b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1927,8 +1927,10 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim void opentxInit() { TRACE("opentxInit"); - -#if defined(GUI) && !defined(LIBOPENUI) +#if defined(LIBOPENUI) + // create ViewMain + ViewMain::instance(); +#elif defined(GUI) // TODO add a function for this (duplicated) menuHandlers[0] = menuMainView; #if MENUS_LOCK != 2/*no menus*/ From b3d4439f63a676311d80fe8bd657e6efe1f94eb1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 8 Apr 2021 15:41:05 +0200 Subject: [PATCH 02/18] fix calibration page --- radio/src/gui/colorlcd/radio_calibration.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/colorlcd/radio_calibration.cpp b/radio/src/gui/colorlcd/radio_calibration.cpp index 13158f1d6..527a040f2 100644 --- a/radio/src/gui/colorlcd/radio_calibration.cpp +++ b/radio/src/gui/colorlcd/radio_calibration.cpp @@ -276,8 +276,11 @@ void RadioCalibrationPage::nextStep() g_eeGeneral.chkSum = evalChkSum(); storageDirty(EE_GENERAL); menuCalibrationState = CALIB_FINISHED; + + // initial calibration completed + // -> exit if (initial) - text->getParent()->getParent()->deleteLater(); + deleteLater(); break; default: @@ -289,5 +292,5 @@ void RadioCalibrationPage::nextStep() void startCalibration() { - new RadioCalibrationPage(); + new RadioCalibrationPage(true); } From 2b6e5ef5d8b7c5f02a3a095916370c6f13459fb7 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 8 Apr 2021 15:42:24 +0200 Subject: [PATCH 03/18] re-added calibration at start --- radio/src/opentx.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index c19056b9b..8276260cd 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -23,7 +23,7 @@ #if defined(LIBOPENUI) // #include "shutdown_animation.h" -// #include "radio_calibration.h" +#include "radio_calibration.h" #include "view_main.h" #endif @@ -1632,8 +1632,7 @@ void opentxStart(const uint8_t startOptions = OPENTX_START_DEFAULT_ARGS) #if defined(GUI) if (calibration_needed) { #if defined(LIBOPENUI) - #warning "TODO add a startCalibration function" - // startCalibration(); + startCalibration(); #else chainMenu(menuFirstCalib); #endif From c39a06eac075e904395bc796d5523cec14745661 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 8 Apr 2021 18:51:26 +0200 Subject: [PATCH 04/18] place defaults after wiping storage --- radio/src/storage/sdcard_common.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 7be087043..641e68df4 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -43,9 +43,6 @@ void storageEraseAll(bool warn) static_cast(theme)->load(); #endif - generalDefault(); - modelDefault(1); - if (warn) { ALERT(STR_STORAGE_WARNING, STR_BAD_RADIO_DATA, AU_BAD_RADIODATA); } @@ -54,6 +51,10 @@ void storageEraseAll(bool warn) storageFormat(); storageDirty(EE_GENERAL|EE_MODEL); + + generalDefault(); + modelDefault(1); + storageCheck(true); } @@ -68,7 +69,7 @@ void storageCheck(bool immediately) { if (storageDirtyMsk & EE_GENERAL) { TRACE("eeprom write general"); - storageDirtyMsk -= EE_GENERAL; + storageDirtyMsk &= ~EE_GENERAL; const char * error = writeGeneralSettings(); if (error) { TRACE("writeGeneralSettings error=%s", error); @@ -77,7 +78,7 @@ void storageCheck(bool immediately) if (storageDirtyMsk & EE_MODEL) { TRACE("eeprom write model"); - storageDirtyMsk -= EE_MODEL; + storageDirtyMsk &= ~EE_MODEL; const char * error = writeModel(); if (error) { TRACE("writeModel error=%s", error); From af09424f4871a4b1deb7000de7f8e6ce4e4aea6b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 8 Apr 2021 18:51:50 +0200 Subject: [PATCH 05/18] layouts are searched by ID rather than by name --- radio/src/gui/colorlcd/layout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index a84c397ca..ec4746111 100644 --- a/radio/src/gui/colorlcd/layout.cpp +++ b/radio/src/gui/colorlcd/layout.cpp @@ -75,7 +75,7 @@ void loadDefaultLayout() auto& screenData = g_model.screenData[0]; if (screen == nullptr && defaultLayout != nullptr) { - strcpy(screenData.layoutName, defaultLayout->getName()); + strcpy(screenData.layoutName, defaultLayout->getId()); screen = defaultLayout->create(&screenData.layoutData); if (screen) { screen->attach(ViewMain::instance()); From f39a4eed95f4b2b7d235b3cd23c22ce2e5554253 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 8 Apr 2021 19:51:22 +0200 Subject: [PATCH 06/18] create mutexes before starting tasks --- radio/src/tasks.cpp | 7 +++---- radio/src/tasks.h | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index a051cc509..a1df13c73 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -293,6 +293,9 @@ void tasksStart() { RTOS_INIT(); + RTOS_CREATE_MUTEX(audioMutex); + RTOS_CREATE_MUTEX(mixerMutex); + #if defined(CLI) cliStart(); #endif @@ -303,9 +306,5 @@ void tasksStart() #if !defined(SIMU) RTOS_CREATE_TASK(audioTaskId, audioTask, "audio", audioStack, AUDIO_STACK_SIZE, AUDIO_TASK_PRIO); #endif - - RTOS_CREATE_MUTEX(audioMutex); - RTOS_CREATE_MUTEX(mixerMutex); - RTOS_START(); } diff --git a/radio/src/tasks.h b/radio/src/tasks.h index 856aaf038..6f761d843 100644 --- a/radio/src/tasks.h +++ b/radio/src/tasks.h @@ -48,7 +48,6 @@ extern RTOS_TASK_HANDLE audioTaskId; extern RTOS_DEFINE_STACK(audioStack, AUDIO_STACK_SIZE); extern RTOS_MUTEX_HANDLE mixerMutex; -extern RTOS_FLAG_HANDLE openTxInitCompleteFlag; void stackPaint(); void tasksStart(); From 5cf561ae160a8d27986942b6719b0563a6e0b9d7 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 08:08:43 +0200 Subject: [PATCH 07/18] try to get some structure into modelDefault() --- radio/src/opentx.cpp | 127 ++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 49 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 8276260cd..df3d3d0ee 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -366,13 +366,11 @@ uint16_t evalChkSum() void clearInputs() { - memset(g_model.expoData, 0, sizeof(g_model.expoData)); // clear all expos + memset(g_model.expoData, 0, sizeof(g_model.expoData)); } void defaultInputs() { - clearInputs(); - for (int i=0; idestCh = i; mix->weight = 100; mix->srcRaw = i+1; } + storageDirty(EE_MODEL); +} + +void defaultModelRegistrationID() +{ + memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); +} + +void defaultGVars() +{ +#if defined(FLIGHT_MODES) && defined(GVARS) + for (int fmIdx = 1; fmIdx < MAX_FLIGHT_MODES; fmIdx++) { + for (int gvarIdx = 0; gvarIdx < MAX_GVARS; gvarIdx++) { + g_model.flightModeData[fmIdx].gvars[gvarIdx] = GVAR_MAX + 1; + } + } +#endif +} + +// TODO: +// - this needs to go away and be banned out of the main +// - vendors should provide their own defaults in their own builds, +// - and disclose them by their own means (GPL compliance) +// +void vendorSpecificModelDefaults() +{ +#if defined(FRSKY_RELEASE) + g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; + g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); + #if defined(EEPROM) + g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); + modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; + #endif +#endif + + // TODO: we should probably have some default trainer mode + // per radio, depending on what is supported + // +#if defined(PCBXLITE) + g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; +#endif + +#if defined(RADIOMASTER_RTF_RELEASE) + // Those settings are for headless radio + g_model.trainerData.mode = TRAINER_MODE_SLAVE; + g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE; + g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); + g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8; + g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; +#endif +} + +void applyDefaultTemplate() +{ + defaultInputs(); + defaultMixers(); + defaultGVars(); + + defaultModelRegistrationID(); + +#if defined(COLORLCD) + //TODO: not sure yet we need it here + loadDefaultLayout(); + + // enable switch warnings + for (int i = 0; i < NUM_SWITCHES; i++) { + g_model.switchWarningState |= (1 << (3*i)); + } +#endif + + // TODO: what about switch warnings in non-color LCD radios? } #if defined(EEPROM) @@ -483,10 +555,8 @@ uint8_t findNextUnusedModelId(uint8_t index, uint8_t module) void modelDefault(uint8_t id) { memset(&g_model, 0, sizeof(g_model)); - applyDefaultTemplate(); - - memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); + strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id + 1, 2); #if defined(LUA) && defined(PCBTARANIS) // Horus uses menuModelWizard() for wizard if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { @@ -494,47 +564,6 @@ void modelDefault(uint8_t id) luaExec(WIZARD_NAME); } #endif - -#if defined(FRSKY_RELEASE) - g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; - g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); - #if defined(EEPROM) - g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); - modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; - #endif -#endif - -#if defined(PCBXLITE) - g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; -#endif - -#if defined(FLIGHT_MODES) && defined(GVARS) - for (int fmIdx = 1; fmIdx < MAX_FLIGHT_MODES; fmIdx++) { - for (int gvarIdx = 0; gvarIdx < MAX_GVARS; gvarIdx++) { - g_model.flightModeData[fmIdx].gvars[gvarIdx] = GVAR_MAX + 1; - } - } -#endif - - strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id + 1, 2); - -#if defined(COLORLCD) - loadDefaultLayout(); - - // enable switch warnings - for (int i = 0; i < NUM_SWITCHES; i++) { - g_model.switchWarningState |= (1 << (3*i)); - } -#endif - -#if defined(RADIOMASTER_RTF_RELEASE) - // Those settings are for headless radio - g_model.trainerData.mode = TRAINER_MODE_SLAVE; - g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE; - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8; - g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; -#endif } bool isInputRecursive(int index) From 3464d0d109c67548edf88c6b0c68ffe878fc1fdc Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 08:09:50 +0200 Subject: [PATCH 08/18] clearInputs() has been moved out of defaultInputs() But we should keep a consistent behaviour in the LUA API. --- radio/src/lua/api_model.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 90c19f4d9..20860a969 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -664,6 +664,7 @@ Set all inputs to defaults */ static int luaModelDefaultInputs(lua_State *L) { + clearInputs(); defaultInputs(); return 0; } From d7e2e57cdb6c1b05409be807de321ac4a7b4e49f Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 08:21:24 +0200 Subject: [PATCH 09/18] move eeprom related code into eeprom_common --- radio/src/opentx.cpp | 76 ----------------------------- radio/src/opentx.h | 5 -- radio/src/storage/eeprom_common.cpp | 75 ++++++++++++++++++++++++++++ radio/src/storage/eeprom_common.h | 3 ++ 4 files changed, 78 insertions(+), 81 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index df3d3d0ee..e21722ab4 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -475,82 +475,6 @@ void applyDefaultTemplate() // TODO: what about switch warnings in non-color LCD radios? } -#if defined(EEPROM) -void checkModelIdUnique(uint8_t index, uint8_t module) -{ - if (isModuleXJTD8(module)) - return; - - uint8_t modelId = g_model.header.modelId[module]; - uint8_t additionalOnes = 0; - char * name = reusableBuffer.moduleSetup.msg; - - memset(reusableBuffer.moduleSetup.msg, 0, sizeof(reusableBuffer.moduleSetup.msg)); - - if (modelId != 0) { - for (uint8_t i = 0; i < MAX_MODELS; i++) { - if (i != index) { - if (modelId == modelHeaders[i].modelId[module]) { - if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.moduleSetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") - if (reusableBuffer.moduleSetup.msg[0] != '\0') { - name = strAppend(name, ", "); - } - if (modelHeaders[i].name[0] == 0) { - name = strAppend(name, STR_MODEL); - name = strAppendUnsigned(name+strlen(name), i + 1, 2); - } - else { - name += zchar2str(name, modelHeaders[i].name, LEN_MODEL_NAME); - } - } - else { - additionalOnes++; - } - } - } - } - } - - if (additionalOnes) { - name = strAppend(name, " (+"); - name = strAppendUnsigned(name, additionalOnes); - strAppend(name, ")"); - } - - if (reusableBuffer.moduleSetup.msg[0]) { - POPUP_WARNING(STR_MODELIDUSED, reusableBuffer.moduleSetup.msg); - } -} - -uint8_t findNextUnusedModelId(uint8_t index, uint8_t module) -{ - uint8_t usedModelIds[(MAX_RXNUM + 7) / 8]; - memset(usedModelIds, 0, sizeof(usedModelIds)); - - for (uint8_t modelIndex = 0; modelIndex < MAX_MODELS; modelIndex++) { - if (modelIndex == index) - continue; - - uint8_t id = modelHeaders[modelIndex].modelId[module]; - if (id == 0) - continue; - - uint8_t mask = 1u << (id & 7u); - usedModelIds[id >> 3u] |= mask; - } - - for (uint8_t id = 1; id <= getMaxRxNum(module); id++) { - uint8_t mask = 1u << (id & 7u); - if (!(usedModelIds[id >> 3u] & mask)) { - // found free ID - return id; - } - } - - // failed finding something... - return 0; -} -#endif void modelDefault(uint8_t id) { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 9e25810c5..caccd0951 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -667,11 +667,6 @@ void setDefaultOwnerId(); void generalDefault(); void modelDefault(uint8_t id); -#if defined(EEPROM) -void checkModelIdUnique(uint8_t index, uint8_t module); -uint8_t findNextUnusedModelId(uint8_t index, uint8_t module); -#endif - uint32_t hash(const void * ptr, uint32_t size); #define calc100to256_16Bits(x) calc100to256(x) diff --git a/radio/src/storage/eeprom_common.cpp b/radio/src/storage/eeprom_common.cpp index 9c7ab478a..7ade6f98a 100644 --- a/radio/src/storage/eeprom_common.cpp +++ b/radio/src/storage/eeprom_common.cpp @@ -143,3 +143,78 @@ void storageEraseAll(bool warn) storageDirty(EE_GENERAL|EE_MODEL); storageCheck(true); } + +void checkModelIdUnique(uint8_t index, uint8_t module) +{ + if (isModuleXJTD8(module)) + return; + + uint8_t modelId = g_model.header.modelId[module]; + uint8_t additionalOnes = 0; + char * name = reusableBuffer.moduleSetup.msg; + + memset(reusableBuffer.moduleSetup.msg, 0, sizeof(reusableBuffer.moduleSetup.msg)); + + if (modelId != 0) { + for (uint8_t i = 0; i < MAX_MODELS; i++) { + if (i != index) { + if (modelId == modelHeaders[i].modelId[module]) { + if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.moduleSetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") + if (reusableBuffer.moduleSetup.msg[0] != '\0') { + name = strAppend(name, ", "); + } + if (modelHeaders[i].name[0] == 0) { + name = strAppend(name, STR_MODEL); + name = strAppendUnsigned(name+strlen(name), i + 1, 2); + } + else { + name += zchar2str(name, modelHeaders[i].name, LEN_MODEL_NAME); + } + } + else { + additionalOnes++; + } + } + } + } + } + + if (additionalOnes) { + name = strAppend(name, " (+"); + name = strAppendUnsigned(name, additionalOnes); + strAppend(name, ")"); + } + + if (reusableBuffer.moduleSetup.msg[0]) { + POPUP_WARNING(STR_MODELIDUSED, reusableBuffer.moduleSetup.msg); + } +} + +uint8_t findNextUnusedModelId(uint8_t index, uint8_t module) +{ + uint8_t usedModelIds[(MAX_RXNUM + 7) / 8]; + memset(usedModelIds, 0, sizeof(usedModelIds)); + + for (uint8_t modelIndex = 0; modelIndex < MAX_MODELS; modelIndex++) { + if (modelIndex == index) + continue; + + uint8_t id = modelHeaders[modelIndex].modelId[module]; + if (id == 0) + continue; + + uint8_t mask = 1u << (id & 7u); + usedModelIds[id >> 3u] |= mask; + } + + for (uint8_t id = 1; id <= getMaxRxNum(module); id++) { + uint8_t mask = 1u << (id & 7u); + if (!(usedModelIds[id >> 3u] & mask)) { + // found free ID + return id; + } + } + + // failed finding something... + return 0; +} diff --git a/radio/src/storage/eeprom_common.h b/radio/src/storage/eeprom_common.h index a4d33bc55..78171d3b9 100644 --- a/radio/src/storage/eeprom_common.h +++ b/radio/src/storage/eeprom_common.h @@ -39,6 +39,9 @@ void storageClearRadioSettings(); bool storageReadRadioSettings(bool allowFixes = true); void storageReadCurrentModel(); +void checkModelIdUnique(uint8_t index, uint8_t module); +uint8_t findNextUnusedModelId(uint8_t index, uint8_t module); + #if defined(EEPROM_RLC) #include "eeprom_rlc.h" #else From 7931937f06d4b14a92fecb05bee93d50710253b4 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 13:11:56 +0200 Subject: [PATCH 10/18] check if path is existing before saving model --- radio/src/storage/sdcard_raw.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index 710fcc44a..2bb2f924d 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -60,6 +60,8 @@ const char * writeModel() { char path[256]; getModelPath(path, g_eeGeneral.currModelFilename); + + sdCheckAndCreateDirectory(MODELS_PATH); return writeFile(path, (uint8_t *)&g_model, sizeof(g_model)); } From aa39255f644882f9420d1b76815e61b18c4f8b0b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 13:12:44 +0200 Subject: [PATCH 11/18] do not create an empty model cell with no model inside the category (displays garbage) --- radio/src/storage/modelslist.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 54762d76a..0b5c20b81 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -441,14 +441,12 @@ bool ModelsList::load() if (!currentModel) { if (model) { currentModel = model; - currentCategory = category; } else { - model = new ModelCell(line); category = new ModelsCategory("Models"); categories.push_back(category); - category->push_back(model); } + currentCategory = category; } loaded = true; From e87405e73271b2351b8c374b6d806b4ee3bdc17b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 13:13:48 +0200 Subject: [PATCH 12/18] empty / corrupted SD card start-up simplifications --- radio/src/storage/sdcard_common.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 641e68df4..7f6de2550 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -50,11 +50,7 @@ void storageEraseAll(bool warn) RAISE_ALERT(STR_STORAGE_WARNING, STR_STORAGE_FORMAT, NULL, AU_NONE); storageFormat(); - storageDirty(EE_GENERAL|EE_MODEL); - - generalDefault(); - modelDefault(1); - + storageDirty(EE_GENERAL); storageCheck(true); } @@ -110,18 +106,20 @@ const char * createModel() const char * loadModel(const char * filename, bool alarms) { uint8_t version; - preModelLoad(); const char * error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model), &version); if (error) { TRACE("loadModel error=%s", error); - } - - if (error) { - modelDefault(0) ; + + // just get some clean memory state in "g_model" + // so the mixer can run safely + memset(&g_model, 0, sizeof(g_model)); + applyDefaultTemplate(); + storageCheck(true); - alarms = false; + postModelLoad(false); + return error; } #if defined(STORAGE_CONVERSIONS) @@ -131,8 +129,7 @@ const char * loadModel(const char * filename, bool alarms) #endif postModelLoad(alarms); - - return error; + return nullptr; } void storageReadAll() @@ -151,8 +148,7 @@ void storageReadAll() } if (loadModel(g_eeGeneral.currModelFilename, false) != nullptr) { - sdCheckAndCreateDirectory(MODELS_PATH); - createModel(); + TRACE("No current model or SD card error"); } // Wipe models list in case From 9579e5d833a0762c02341251042d50fc52914ba4 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 13:14:18 +0200 Subject: [PATCH 13/18] allow creating an new model in an empty category --- radio/src/gui/colorlcd/model_select.cpp | 52 ++++++++++++++++++++++--- radio/src/gui/colorlcd/screen_setup.cpp | 6 ++- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 63ff7c993..5d49cc2d5 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -287,12 +287,7 @@ class ModelCategoryPageBody: public FormWindow { }); } menu->addLine(STR_CREATE_MODEL, [=]() { - storageCheck(true); - modelslist.setCurrentModel(modelslist.addModel(category, createModel())); -#if defined(LUA) - // chainMenu(menuModelWizard); -#endif - update(category->size() - 1); + this->createModelAction(); }); menu->addLine(STR_DUPLICATE_MODEL, [=]() { char duplicatedFilename[LEN_MODEL_FILENAME + 1]; @@ -342,11 +337,56 @@ class ModelCategoryPageBody: public FormWindow { } setInnerHeight(y); + + if (category->empty()) { + setFocus(); + } } +#if defined(HARDWARE_KEYS) + void onEvent(event_t event) override + { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + + Menu * menu = new Menu(this); + menu->addLine(STR_CREATE_MODEL, [=]() { + this->createModelAction(); + }); + //TODO: create category? + } + else { + FormWindow::onEvent(event); + } + } +#endif + + void setFocus(uint8_t flag = SET_FOCUS_DEFAULT, Window * from = nullptr) override + { + if (category->empty()) { + // use Window::setFocus() to avoid forwarding focus to nowhere + // this crashes currently in libopenui + Window::setFocus(flag,from); + } + else { + FormWindow::setFocus(flag,from); + } + } + + protected: ModelsCategory * category; ModelSelectFooter * footer; + + void createModelAction() + { + storageCheck(true); + modelslist.setCurrentModel(modelslist.addModel(category, createModel())); +#if defined(LUA) + // chainMenu(menuModelWizard); +#endif + update(category->size() - 1); + } + }; class ModelCategoryPage: public PageTab { diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index 9a586003a..b4ae8f5ce 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -257,8 +257,10 @@ class SetupWidgetsPage: public FormWindow #if defined(HARDWARE_TOUCH) Keyboard::hide(); #endif - // give it back to its old parent before it gets deleted - screen->attach(oldParent); + if (oldParent) { + // give it back to its old parent before it gets deleted + screen->attach(oldParent); + } FormWindow::deleteLater(detach, trash); } From 569b449861a133950fecfb1aef81d25afe01bca9 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 13:56:00 +0200 Subject: [PATCH 14/18] fix vendor specific model defaults --- radio/src/opentx.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index e21722ab4..f85d77480 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -426,7 +426,7 @@ void defaultGVars() // - vendors should provide their own defaults in their own builds, // - and disclose them by their own means (GPL compliance) // -void vendorSpecificModelDefaults() +void setVendorSpecificModelDefaults() { #if defined(FRSKY_RELEASE) g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; @@ -473,6 +473,8 @@ void applyDefaultTemplate() #endif // TODO: what about switch warnings in non-color LCD radios? + + setVendorSpecificModelDefaults(); } From ce0734c1480930f074993aaccbbbbef35f39f42c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 14:06:30 +0200 Subject: [PATCH 15/18] moved modelDefaults() and pal to model_init.cpp --- radio/src/CMakeLists.txt | 1 + radio/src/model_init.cpp | 144 +++++++++++++++++++++++++++++++++++++++ radio/src/opentx.cpp | 127 ---------------------------------- 3 files changed, 145 insertions(+), 127 deletions(-) create mode 100644 radio/src/model_init.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index b8c302f44..d36706293 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -419,6 +419,7 @@ set(SRC stamp.cpp timers.cpp trainer.cpp + model_init.cpp ) if(GUI) diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp new file mode 100644 index 000000000..af1e04366 --- /dev/null +++ b/radio/src/model_init.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +void clearInputs() +{ + memset(g_model.expoData, 0, sizeof(g_model.expoData)); +} + +void defaultInputs() +{ + for (int i=0; isrcRaw = MIXSRC_Rud - 1 + stick_index; + expo->curve.type = CURVE_REF_EXPO; + expo->chn = i; + expo->weight = 100; + expo->mode = 3; // TODO constant + for (int c = 0; c < 3; c++) { + g_model.inputNames[i][c] = STR_VSRCRAW[2 + 4 * stick_index + c]; + } +#if LEN_INPUT_NAME > 3 + g_model.inputNames[i][3] = '\0'; +#endif + } + storageDirty(EE_MODEL); +} + +void clearMixers() +{ + memset(g_model.mixData, 0, sizeof(g_model.mixData)); +} + +void defaultMixers() +{ + for (int i=0; idestCh = i; + mix->weight = 100; + mix->srcRaw = i+1; + } + storageDirty(EE_MODEL); +} + +void defaultModelRegistrationID() +{ + memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); +} + +void defaultGVars() +{ +#if defined(FLIGHT_MODES) && defined(GVARS) + for (int fmIdx = 1; fmIdx < MAX_FLIGHT_MODES; fmIdx++) { + for (int gvarIdx = 0; gvarIdx < MAX_GVARS; gvarIdx++) { + g_model.flightModeData[fmIdx].gvars[gvarIdx] = GVAR_MAX + 1; + } + } +#endif +} + +void setVendorSpecificModelDefaults() +{ +#if defined(FRSKY_RELEASE) + g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; + g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); + #if defined(EEPROM) + g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); + modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; + #endif +#endif + + // TODO: we should probably have some default trainer mode + // per radio, depending on what is supported + // +#if defined(PCBXLITE) + g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; +#endif + +#if defined(RADIOMASTER_RTF_RELEASE) + // Those settings are for headless radio + g_model.trainerData.mode = TRAINER_MODE_SLAVE; + g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE; + g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); + g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8; + g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; +#endif +} + +void applyDefaultTemplate() +{ + defaultInputs(); + defaultMixers(); + defaultGVars(); + + defaultModelRegistrationID(); + +#if defined(COLORLCD) + //TODO: not sure yet we need it here + loadDefaultLayout(); + + // enable switch warnings + for (int i = 0; i < NUM_SWITCHES; i++) { + g_model.switchWarningState |= (1 << (3*i)); + } +#endif + + // TODO: what about switch warnings in non-color LCD radios? + + setVendorSpecificModelDefaults(); +} + + +void modelDefault(uint8_t id) +{ + memset(&g_model, 0, sizeof(g_model)); + applyDefaultTemplate(); + strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id + 1, 2); + +#if defined(LUA) && defined(PCBTARANIS) // Horus uses menuModelWizard() for wizard + if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { + f_chdir(WIZARD_PATH); + luaExec(WIZARD_NAME); + } +#endif +} diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index f85d77480..4ad05a801 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -364,133 +364,6 @@ uint16_t evalChkSum() return sum; } -void clearInputs() -{ - memset(g_model.expoData, 0, sizeof(g_model.expoData)); -} - -void defaultInputs() -{ - for (int i=0; isrcRaw = MIXSRC_Rud - 1 + stick_index; - expo->curve.type = CURVE_REF_EXPO; - expo->chn = i; - expo->weight = 100; - expo->mode = 3; // TODO constant - for (int c = 0; c < 3; c++) { - g_model.inputNames[i][c] = STR_VSRCRAW[2 + 4 * stick_index + c]; - } -#if LEN_INPUT_NAME > 3 - g_model.inputNames[i][3] = '\0'; -#endif - } - storageDirty(EE_MODEL); -} - -void clearMixers() -{ - memset(g_model.mixData, 0, sizeof(g_model.mixData)); -} - -void defaultMixers() -{ - for (int i=0; idestCh = i; - mix->weight = 100; - mix->srcRaw = i+1; - } - storageDirty(EE_MODEL); -} - -void defaultModelRegistrationID() -{ - memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); -} - -void defaultGVars() -{ -#if defined(FLIGHT_MODES) && defined(GVARS) - for (int fmIdx = 1; fmIdx < MAX_FLIGHT_MODES; fmIdx++) { - for (int gvarIdx = 0; gvarIdx < MAX_GVARS; gvarIdx++) { - g_model.flightModeData[fmIdx].gvars[gvarIdx] = GVAR_MAX + 1; - } - } -#endif -} - -// TODO: -// - this needs to go away and be banned out of the main -// - vendors should provide their own defaults in their own builds, -// - and disclose them by their own means (GPL compliance) -// -void setVendorSpecificModelDefaults() -{ -#if defined(FRSKY_RELEASE) - g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; - g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); - #if defined(EEPROM) - g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); - modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; - #endif -#endif - - // TODO: we should probably have some default trainer mode - // per radio, depending on what is supported - // -#if defined(PCBXLITE) - g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; -#endif - -#if defined(RADIOMASTER_RTF_RELEASE) - // Those settings are for headless radio - g_model.trainerData.mode = TRAINER_MODE_SLAVE; - g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE; - g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY); - g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8; - g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES; -#endif -} - -void applyDefaultTemplate() -{ - defaultInputs(); - defaultMixers(); - defaultGVars(); - - defaultModelRegistrationID(); - -#if defined(COLORLCD) - //TODO: not sure yet we need it here - loadDefaultLayout(); - - // enable switch warnings - for (int i = 0; i < NUM_SWITCHES; i++) { - g_model.switchWarningState |= (1 << (3*i)); - } -#endif - - // TODO: what about switch warnings in non-color LCD radios? - - setVendorSpecificModelDefaults(); -} - - -void modelDefault(uint8_t id) -{ - memset(&g_model, 0, sizeof(g_model)); - applyDefaultTemplate(); - strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id + 1, 2); - -#if defined(LUA) && defined(PCBTARANIS) // Horus uses menuModelWizard() for wizard - if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { - f_chdir(WIZARD_PATH); - luaExec(WIZARD_NAME); - } -#endif -} bool isInputRecursive(int index) { From 2124158686a867f37f2244e13c23393c893d1dd3 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 9 Apr 2021 14:24:41 +0200 Subject: [PATCH 16/18] Cosmetics --- radio/src/gui/colorlcd/model_select.cpp | 25 +++++++++++-------------- radio/src/model_init.cpp | 6 +++--- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 5d49cc2d5..53017aef8 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -286,9 +286,7 @@ class ModelCategoryPageBody: public FormWindow { update(); // modelslist.getModelIndex(modelCell)); }); } - menu->addLine(STR_CREATE_MODEL, [=]() { - this->createModelAction(); - }); + menu->addLine(STR_CREATE_MODEL, getCreateModelAction()); menu->addLine(STR_DUPLICATE_MODEL, [=]() { char duplicatedFilename[LEN_MODEL_FILENAME + 1]; memcpy(duplicatedFilename, model->modelFilename, sizeof(duplicatedFilename)); @@ -347,11 +345,8 @@ class ModelCategoryPageBody: public FormWindow { void onEvent(event_t event) override { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - Menu * menu = new Menu(this); - menu->addLine(STR_CREATE_MODEL, [=]() { - this->createModelAction(); - }); + menu->addLine(STR_CREATE_MODEL, getCreateModelAction()); //TODO: create category? } else { @@ -365,10 +360,10 @@ class ModelCategoryPageBody: public FormWindow { if (category->empty()) { // use Window::setFocus() to avoid forwarding focus to nowhere // this crashes currently in libopenui - Window::setFocus(flag,from); + Window::setFocus(flag, from); } else { - FormWindow::setFocus(flag,from); + FormWindow::setFocus(flag, from); } } @@ -377,14 +372,16 @@ class ModelCategoryPageBody: public FormWindow { ModelsCategory * category; ModelSelectFooter * footer; - void createModelAction() + std::function getCreateModelAction() { - storageCheck(true); - modelslist.setCurrentModel(modelslist.addModel(category, createModel())); + return [=]() { + storageCheck(true); + modelslist.setCurrentModel(modelslist.addModel(category, createModel())); #if defined(LUA) - // chainMenu(menuModelWizard); + // chainMenu(menuModelWizard); #endif - update(category->size() - 1); + update(category->size() - 1); + }; } }; diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index af1e04366..68c585b50 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -45,12 +45,12 @@ void defaultInputs() storageDirty(EE_MODEL); } -void clearMixers() +void clearMixes() { memset(g_model.mixData, 0, sizeof(g_model.mixData)); } -void defaultMixers() +void defaultMixes() { for (int i=0; i Date: Fri, 9 Apr 2021 14:56:50 +0200 Subject: [PATCH 17/18] layoutName is now layoutId --- radio/src/datastructs.h | 4 ++-- radio/src/gui/colorlcd/layout.cpp | 4 ++-- radio/src/gui/colorlcd/screen_setup.cpp | 4 ++-- radio/src/storage/conversions/conversions_218_219.cpp | 2 +- radio/src/storage/conversions/datastructs_218.h | 2 +- radio/src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 2 +- radio/src/tests/conversions.cpp | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 0c29eb50a..ae07276b3 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -550,9 +550,9 @@ typedef uint8_t swarnenable_t; #elif defined(COLORLCD) #include "gui/colorlcd/layout.h" #include "gui/colorlcd/topbar.h" -#define LAYOUT_NAME_LEN 10 +#define LAYOUT_ID_LEN 10 PACK(struct CustomScreenData { - char layoutName[LAYOUT_NAME_LEN]; + char LayoutId[LAYOUT_ID_LEN]; Layout::PersistentData layoutData; }); #define CUSTOM_SCREENS_DATA \ diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index ec4746111..c5bd2f3f9 100644 --- a/radio/src/gui/colorlcd/layout.cpp +++ b/radio/src/gui/colorlcd/layout.cpp @@ -75,7 +75,7 @@ void loadDefaultLayout() auto& screenData = g_model.screenData[0]; if (screen == nullptr && defaultLayout != nullptr) { - strcpy(screenData.layoutName, defaultLayout->getId()); + strcpy(screenData.LayoutId, defaultLayout->getId()); screen = defaultLayout->create(&screenData.layoutData); if (screen) { screen->attach(ViewMain::instance()); @@ -88,7 +88,7 @@ void loadCustomScreens() for (unsigned int i = 0; i < MAX_CUSTOM_SCREENS; i++) { auto& screen = customScreens[i]; - screen = loadLayout(g_model.screenData[i].layoutName, + screen = loadLayout(g_model.screenData[i].LayoutId, &g_model.screenData[i].layoutData); if (screen) { diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index b4ae8f5ce..48c6e99a4 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -69,7 +69,7 @@ void ScreenAddPage::build(FormWindow * window) const LayoutFactory * factory = getRegisteredLayouts().front(); screen = factory->create(&screenData.layoutData); - strncpy(screenData.layoutName, factory->getId(), sizeof(screenData.layoutName)); + strncpy(screenData.LayoutId, factory->getId(), sizeof(screenData.LayoutId)); auto tab = new ScreenSetupPage(menu, screen, screenData); std::string title(STR_MAIN_VIEW_X); @@ -301,7 +301,7 @@ void ScreenSetupPage::build(FormWindow * window) layoutChoice = new LayoutChoice(window, layoutSlot, GET_VALUE(screen->getFactory()), [=](const LayoutFactory *factory) { delete screen; screen = factory->create(&screenData.layoutData); - strncpy(screenData.layoutName, factory->getId(), sizeof(CustomScreenData::layoutName)); + strncpy(screenData.LayoutId, factory->getId(), sizeof(CustomScreenData::LayoutId)); SET_DIRTY(); updateLayoutOptions(); }); diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 14854fe59..412ef97bd 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -323,7 +323,7 @@ void convertModelData_218_to_219(ModelData &model) for (int screen=0; screen Date: Fri, 9 Apr 2021 15:10:11 +0200 Subject: [PATCH 18/18] modelDefault() becomes setModelDefaults() --- radio/src/lua/api_model.cpp | 3 ++- radio/src/model_init.cpp | 23 ++++++++++++----------- radio/src/opentx.h | 7 ------- radio/src/storage/eeprom_common.cpp | 5 +++-- radio/src/storage/sdcard_common.cpp | 3 ++- radio/src/tests/gtests.h | 2 +- radio/src/tests/mixer.cpp | 16 ++++++++-------- radio/src/tests/switches.cpp | 4 ++-- 8 files changed, 30 insertions(+), 33 deletions(-) diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 20860a969..76800d842 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -23,6 +23,7 @@ #include "opentx.h" #include "lua_api.h" #include "timers.h" +#include "model_init.h" /*luadoc @function model.getInfo() @@ -665,7 +666,7 @@ Set all inputs to defaults static int luaModelDefaultInputs(lua_State *L) { clearInputs(); - defaultInputs(); + setDefaultInputs(); return 0; } diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index 68c585b50..1a4b8ce2e 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -25,7 +25,7 @@ void clearInputs() memset(g_model.expoData, 0, sizeof(g_model.expoData)); } -void defaultInputs() +void setDefaultInputs() { for (int i=0; i #include "opentx.h" #include "timers.h" +#include "model_init.h" void eeLoadModel(uint8_t index) { @@ -45,7 +46,7 @@ void eeLoadModel(uint8_t index) bool alarms = true; if (size < EEPROM_MIN_MODEL_SIZE) { // if not loaded a fair amount - modelDefault(index) ; + setModelDefaults(index); storageCheck(true); alarms = false; } @@ -131,7 +132,7 @@ void storageEraseAll(bool warn) TRACE("storageEraseAll"); generalDefault(); - modelDefault(0); + setModelDefault(0); if (warn) { ALERT(STR_STORAGE_WARNING, STR_BAD_RADIO_DATA, AU_BAD_RADIODATA); diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 7f6de2550..7abdfdded 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -23,6 +23,7 @@ #include "sdcard_common.h" #include "modelslist.h" #include "conversions/conversions.h" +#include "model_init.h" // defined either in sdcard_raw.cpp or sdcard_yaml.cpp void storageCreateModelsList(); @@ -92,7 +93,7 @@ const char * createModel() int index = findNextFileIndex(filename, LEN_MODEL_FILENAME, MODELS_PATH); if (index > 0) { - modelDefault(index); + setModelDefaults(index); memcpy(g_eeGeneral.currModelFilename, filename, sizeof(g_eeGeneral.currModelFilename)); storageDirty(EE_GENERAL); storageDirty(EE_MODEL); diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 55218bbc5..7a95d6688 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -104,7 +104,7 @@ class OpenTxTest : public testing::Test SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); RADIO_RESET(); } }; diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 080155d80..5bb972dc9 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -466,7 +466,7 @@ TEST(Curves, LinearIntpol) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); for (int8_t i=-2; i<=2; i++) { g_model.points[2+i] = 50*i; } @@ -672,7 +672,7 @@ TEST_F(TrimsTest, throttleTrimEle) { SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_eeGeneral.templateSetup = 17; applyDefaultTemplate(); g_model.thrTrim = 1; @@ -685,7 +685,7 @@ TEST_F(TrimsTest, throttleTrimEle) { SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_eeGeneral.templateSetup = 0; applyDefaultTemplate(); } @@ -696,7 +696,7 @@ TEST(Heli, BasicTest) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_model.swashR.collectiveSource = MIXSRC_Thr; g_model.swashR.elevatorSource = MIXSRC_Ele; g_model.swashR.aileronSource = MIXSRC_Ail; @@ -728,7 +728,7 @@ TEST(Heli, Mode2Test) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_eeGeneral.templateSetup = 2; applyDefaultTemplate(); g_model.swashR.collectiveSource = MIXSRC_Thr; @@ -764,7 +764,7 @@ TEST(Trainer, UnpluggedTest) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_FIRST_TRAINER; @@ -781,7 +781,7 @@ TEST_F(MixerTest, flightModeTransition) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; @@ -807,7 +807,7 @@ TEST_F(MixerTest, flightModeOverflow) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - modelDefault(0); + setModelDefaults(0); g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index 56be91390..fe7779847 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -77,7 +77,7 @@ TEST(getSwitch, nullSW) TEST(getSwitch, inputWithTrim) { MODEL_RESET(); - modelDefault(0); + setModelDefaults(0); MIXER_RESET(); // g_model.logicalSw[0] = { LS_FUNC_VPOS, MIXSRC_FIRST_INPUT, 0, 0 }; @@ -99,7 +99,7 @@ TEST(evalLogicalSwitches, playFile) { SYSTEM_RESET(); MODEL_RESET(); - modelDefault(0); + setModelDefaults(0); MIXER_RESET(); extern BitField<(MAX_LOGICAL_SWITCHES * 2/*on, off*/)> sdAvailableLogicalSwitchAudioFiles;