From cba4e07ce11d0168f18f5f774221d99da731ae53 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Tue, 7 Jun 2022 13:04:40 +1000 Subject: [PATCH] fix: Pot and slider warnings weren't being set properly on radio or syncing with Companion (#1981) - fix Companion yaml model read and write - B&W radios treat bit values the same as color to avoid unnecessary complication for Companion and radio conversions - B&W radios default is therefore off for all pots and sliders - B&W radios fix runtime warnings check - all radios fix to save last pot or slider position when checked and mode AUTO on change of model or power off - all radios do not display Pots Warning in model setup if no pots or sliders supported --- .../src/firmwares/edgetx/yaml_modeldata.cpp | 23 +++++++++---- companion/src/modeledit/setup.cpp | 10 +++--- companion/src/modeledit/setup.ui | 33 +++++++++---------- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 4 +-- radio/src/storage/storage_common.cpp | 2 +- radio/src/switches.cpp | 6 ++-- 7 files changed, 45 insertions(+), 35 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index 0419d0a4b..c99366b3f 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -140,6 +140,15 @@ struct YamlThrTrace { struct YamlPotsWarnEnabled { unsigned int value; + const int cnt = CPN_MAX_POTS + CPN_MAX_SLIDERS; // must not exceed 16 as radio stores in uint16_t + + #define MAXPOTWARNINGS (CPN_MAX_POTS + CPN_MAX_SLIDERS) + + #if MAXPOTWARNINGS > 16 + #error Not enough space for pot and slider warnings + #endif + + #undef MAXPOTWARNINGS YamlPotsWarnEnabled() = default; @@ -147,17 +156,17 @@ struct YamlPotsWarnEnabled { { value = 0; - for (int i = 0; i < 8; i++) { - value |= (*(potsWarnEnabled + i) << (7 - i)); + for (int i = 0; i < cnt; i++) { + value |= (*(potsWarnEnabled + i)) << i; } } void toCpn(bool * potsWarnEnabled) { - memset(potsWarnEnabled, 0, sizeof(bool) * (CPN_MAX_POTS + CPN_MAX_SLIDERS)); + memset(potsWarnEnabled, 0, sizeof(bool) * cnt); - for (int i = 1; i <= 8; i++) { - *(potsWarnEnabled + (i - 1)) = (bool)((value >> (8 - i)) & 1); + for (int i = 0; i < cnt; i++) { + *(potsWarnEnabled + i) = (bool)((value >> i) & 1); } } }; @@ -856,7 +865,7 @@ Node convert::encode(const ModelData& rhs) node["potsWarnMode"] = potsWarningModeLut << rhs.potsWarningMode; node["jitterFilter"] = jitterFilterLut << rhs.jitterFilter; - YamlPotsWarnEnabled potsWarnEnabled(&rhs.potsWarnEnabled[CPN_MAX_POTS + CPN_MAX_SLIDERS]); + YamlPotsWarnEnabled potsWarnEnabled(&rhs.potsWarnEnabled[0]); node["potsWarnEnabled"] = potsWarnEnabled.value; for (int i = 0; i < CPN_MAX_POTS + CPN_MAX_SLIDERS; i++) { @@ -1048,7 +1057,7 @@ bool convert::decode(const Node& node, ModelData& rhs) YamlPotsWarnEnabled potsWarnEnabled; node["potsWarnEnabled"] >> potsWarnEnabled.value; - potsWarnEnabled.toCpn(&rhs.potsWarnEnabled[CPN_MAX_POTS + CPN_MAX_SLIDERS]); + potsWarnEnabled.toCpn(&rhs.potsWarnEnabled[0]); node["potsWarnPosition"] >> rhs.potsWarnPosition; diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index c604fdebd..115446718 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -1467,8 +1467,10 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge // Pot warnings prevFocus = ui->potWarningMode; - if (IS_HORUS_OR_TARANIS(board)) { - for (int i = 0; i < getBoardCapability(board, Board::Pots) + getBoardCapability(board, Board::Sliders); i++) { + int count = getBoardCapability(board, Board::Pots) + getBoardCapability(board, Board::Sliders); + + if (IS_HORUS_OR_TARANIS(board) && count > 0) { + for (int i = 0; i < count; i++) { RawSource src(SOURCE_TYPE_STICK, CPN_MAX_STICKS + i); QCheckBox * cb = new QCheckBox(this); cb->setProperty("index", i); @@ -1775,7 +1777,7 @@ void SetupPanel::updatePotWarnings() for (int i = 0; i < potWarningCheckboxes.size(); i++) { QCheckBox *checkbox = potWarningCheckboxes[i]; int index = checkbox->property("index").toInt(); - checkbox->setChecked(!model->potsWarnEnabled[index]); + checkbox->setChecked(model->potsWarnEnabled[index]); checkbox->setDisabled(model->potsWarningMode == 0); } lock = false; @@ -1785,7 +1787,7 @@ void SetupPanel::potWarningToggled(bool checked) { if (!lock) { int index = sender()->property("index").toInt(); - model->potsWarnEnabled[index] = !checked; + model->potsWarnEnabled[index] = checked; updatePotWarnings(); emit modified(); } diff --git a/companion/src/modeledit/setup.ui b/companion/src/modeledit/setup.ui index f26dc9888..010ce6758 100644 --- a/companion/src/modeledit/setup.ui +++ b/companion/src/modeledit/setup.ui @@ -6,7 +6,7 @@ 0 0 - 1007 + 1024 435 @@ -192,7 +192,7 @@ - + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -378,7 +378,7 @@ - Pot Warnings + Pot/Slider Warnings @@ -548,19 +548,19 @@ - - - 0 - 0 - - - - -100 - - - 100 - - + + + 0 + 0 + + + + -100 + + + 100 + + @@ -617,7 +617,6 @@ - diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3efbc405a..d60020613 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -906,7 +906,7 @@ void menuModelSetup(event_t event) } else { LcdFlags flags = ((menuHorizontalPosition==i+1) && attr) ? BLINK : 0; - if ((!attr || menuHorizontalPosition >= 0) && !(g_model.potsWarnEnabled & (1 << i))) { + if ((!attr || menuHorizontalPosition >= 0) && (g_model.potsWarnEnabled & (1 << i))) { flags |= INVERS; } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index e4b54b703..34b7a6789 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -405,7 +405,7 @@ void menuModelSetup(event_t event) 0, // Global functions 0, // ADC Jitter filter - + REGISTRATION_ID_ROWS LABEL(InternalModule), @@ -822,7 +822,7 @@ void menuModelSetup(event_t event) } #endif LcdFlags flags = ((menuHorizontalPosition==i+1) && attr) ? BLINK : 0; - if ((!attr || menuHorizontalPosition >= 0) && !(g_model.potsWarnEnabled & (1 << i))) { + if ((!attr || menuHorizontalPosition >= 0) && (g_model.potsWarnEnabled & (1 << i))) { flags |= INVERS; } diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index d65acd069..f9cf075f3 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -243,7 +243,7 @@ void storageFlushCurrentModel() if (g_model.potsWarnMode == POTS_WARN_AUTO) { for (int i=0; i 1) { if (++numWarnings < 6) { lcdDrawTextAtIndex(x, y, STR_VSRCRAW, NUM_STICKS + 1 + i, INVERS); @@ -887,7 +887,7 @@ void logicalSwitchesTimerTick() } msg = luaSetStickySwitchBuffer.read(); } - + // Update logical switches for (uint8_t fm=0; fm