From 2635a4972b413421a4c96356dca33cf6167496c5 Mon Sep 17 00:00:00 2001 From: philmoz Date: Fri, 5 Jan 2024 20:16:26 +1100 Subject: [PATCH] feat: Use trim as a 3POS toggle switch source (#4465) --- companion/src/firmwares/edgetx/yaml_modeldata.cpp | 4 ++++ companion/src/helpers.h | 1 + companion/src/modeledit/flightmodes.cpp | 11 ++++++++++- companion/src/modelprinter.cpp | 2 ++ radio/src/gui/128x64/model_flightmodes.cpp | 8 +++++--- radio/src/gui/212x64/model_flightmodes.cpp | 6 ++++-- radio/src/gui/colorlcd/draw_functions.cpp | 5 +++-- radio/src/gui/colorlcd/model_flightmodes.cpp | 15 ++++++++++----- radio/src/gui/common/stdlcd/draw_functions.cpp | 5 +++-- radio/src/mixer.cpp | 7 +++++++ radio/src/myeeprom.h | 1 + radio/src/opentx.cpp | 4 ++-- 12 files changed, 52 insertions(+), 17 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index cc210f261..be3bc8f68 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -514,6 +514,8 @@ struct convert { node["value"] = rhs.value; if (rhs.mode < 0) { node["mode"] = (1 << 5) - 1; + } else if (rhs.mode == TRIM_MODE_3POS) { + node["mode"] = TRIM_MODE_3POS; } else { node["mode"] = 2 * rhs.ref + rhs.mode; } @@ -527,6 +529,8 @@ struct convert { node["mode"] >> trimMode; if (trimMode == (1 << 5) - 1) { rhs.mode = -1; + } else if (trimMode == TRIM_MODE_3POS) { + rhs.mode = TRIM_MODE_3POS; } else { rhs.mode = trimMode % 2; rhs.ref = trimMode / 2; diff --git a/companion/src/helpers.h b/companion/src/helpers.h index 6795918e3..be9ca4c91 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -51,6 +51,7 @@ extern const QColor colors[CPN_MAX_CURVES]; #define TRIM_OFFSET 2 #define TRIM_MODE_NONE 0x1F // 0b11111 +#define TRIM_MODE_3POS (2 * CPN_MAX_FLIGHT_MODES) bool displayT16ImportWarning(); diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index ea2eccbe1..2012a0330 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -110,6 +110,7 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI cb->setProperty("index", i); if (IS_HORUS_OR_TARANIS(board)) { cb->addItem(tr("Trim disabled"), -1); + cb->addItem(tr("3POS toggle switch"), TRIM_MODE_3POS); } for (int m = 0; m < fmCount; m++) { if (m == phaseIdx) { @@ -435,10 +436,14 @@ void FlightModePanel::trimUpdate(unsigned int trim) trimsUse[trim]->setCurrentIndex(0); trimsValue[trim]->setEnabled(false); trimsSlider[trim]->setEnabled(false); + } else if (phase.trimMode[chn] == TRIM_MODE_3POS) { + trimsUse[trim]->setCurrentIndex(1); + trimsValue[trim]->setEnabled(false); + trimsSlider[trim]->setEnabled(false); } else { if (IS_HORUS_OR_TARANIS(board)) - trimsUse[trim]->setCurrentIndex(1 + 2 * phase.trimRef[chn] + phase.trimMode[chn] - (phase.trimRef[chn] > phaseIdx ? 1 : 0)); + trimsUse[trim]->setCurrentIndex(2 + 2 * phase.trimRef[chn] + phase.trimMode[chn] - (phase.trimRef[chn] > phaseIdx ? 1 : 0)); else trimsUse[trim]->setCurrentIndex(phase.trimRef[chn]); if (phaseIdx == 0 || phase.trimRef[chn] == phaseIdx || (IS_HORUS_OR_TARANIS(board) && phase.trimMode[chn] != 0)) { @@ -615,6 +620,10 @@ void FlightModePanel::phaseTrimUse_currentIndexChanged(int index) phase.trimMode[chn] = -1; phase.trimRef[chn] = 0; phase.trim[chn] = 0; + } else if (data == TRIM_MODE_3POS) { + phase.trimMode[chn] = TRIM_MODE_3POS; + phase.trimRef[chn] = 0; + phase.trim[chn] = 0; } else { if (IS_HORUS_OR_TARANIS(board)) { diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index e524454aa..ebe6d52dd 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -287,6 +287,8 @@ QString ModelPrinter::printTrim(int flightModeIndex, int stickIndex) if (fm.trimMode[stickIndex] == -1) { return tr("OFF"); + } else if (fm.trimMode[stickIndex] == CPN_MAX_FLIGHT_MODES * 2) { + return tr("3POS"); } else { if (fm.trimRef[stickIndex] == flightModeIndex) { diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index d1bad4310..4fb1f0168 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -59,7 +59,9 @@ enum MenuModelFlightModeItems { bool isTrimModeAvailable(int mode) { - return (mode < 0 || (mode%2) == 0 || (mode/2) != s_currIdx); + if (mode < 0 || mode == TRIM_MODE_3POS) return true; + if (s_currIdx == 0) return mode == 0; + return (mode%2) == 0 || (mode/2) != s_currIdx; } void menuModelFlightModeOne(event_t event) @@ -127,7 +129,7 @@ void menuModelFlightModeOne(event_t event) drawTrimMode(MIXES_2ND_COLUMN + (t*2*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0); if (s_editMode > 0 && attr && menuHorizontalPosition == t) { trim_t & v = fm->trim[t]; - v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); + v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, 2*MAX_FLIGHT_MODES, EE_MODEL, isTrimModeAvailable); } } } @@ -143,7 +145,7 @@ void menuModelFlightModeOne(event_t event) if (s_editMode > 0 && attr && menuHorizontalPosition == t - 4) { trim_t& v = fm->trim[t]; v.mode = checkIncDec(event, v.mode == TRIM_MODE_NONE ? -1 : v.mode, - -1, k == 0 ? 0 : 2 * MAX_FLIGHT_MODES - 1, + -1, 2 * MAX_FLIGHT_MODES, EE_MODEL, isTrimModeAvailable); } } diff --git a/radio/src/gui/212x64/model_flightmodes.cpp b/radio/src/gui/212x64/model_flightmodes.cpp index 92daea503..acce5bd20 100644 --- a/radio/src/gui/212x64/model_flightmodes.cpp +++ b/radio/src/gui/212x64/model_flightmodes.cpp @@ -46,7 +46,9 @@ enum FlightModesItems { bool isTrimModeAvailable(int mode) { - return (mode < 0 || (mode%2) == 0 || (mode/2) != menuVerticalPosition); + if (mode < 0 || mode == TRIM_MODE_3POS) return true; + if (menuVerticalPosition == 0) return mode == 0; + return (mode%2) == 0 || (mode/2) != menuVerticalPosition; } void menuModelFlightModesAll(event_t event) @@ -123,7 +125,7 @@ void menuModelFlightModesAll(event_t event) drawTrimMode((4+LEN_FLIGHT_MODE_NAME)*FW+j*(5*FW/2), y, k, t, attr); if (active) { trim_t & v = p->trim[t]; - v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); + v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, 2*MAX_FLIGHT_MODES, EE_MODEL, isTrimModeAvailable); } break; } diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index b23610e86..26da6ec78 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -283,8 +283,9 @@ void drawTrimMode(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t phase, uint8_ if (mode == TRIM_MODE_NONE) { dc->drawText(x, y, "--", att); - } - else { + } else if (mode == TRIM_MODE_3POS) { + dc->drawText(x, y, "3P", att); + } else { char s[2]; s[0] = (mode % 2 == 0) ? ':' : '+'; s[1] = '0'+p; diff --git a/radio/src/gui/colorlcd/model_flightmodes.cpp b/radio/src/gui/colorlcd/model_flightmodes.cpp index f54b2c471..274047a47 100644 --- a/radio/src/gui/colorlcd/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model_flightmodes.cpp @@ -30,6 +30,8 @@ static std::string getFMTrimStr(uint8_t mode, bool spacer) mode &= 0x1F; if (mode == TRIM_MODE_NONE) return "-"; + if (mode == TRIM_MODE_3POS) + return "3P"; std::string str((mode & 1) ? "+" : "="); if (spacer) str += " "; mode >>= 1; @@ -135,18 +137,21 @@ class FlightModeEdit : public Page tr_btn->setWidth(LV_DPI_DEF / 2); tr_btn->setHeight(33); - tr_mode[t] = new Choice(trim, rect_t{}, 0, 2 * MAX_FLIGHT_MODES - 1, + tr_mode[t] = new Choice(trim, rect_t{}, 0, 2 * MAX_FLIGHT_MODES, GET_DEFAULT(tr->mode), [=](int val) { tr->mode = val; showControls(t, tr->mode); + SET_DIRTY(); }); tr_mode[t]->setTextHandler([=](uint8_t mode) { return getFMTrimStr(mode, true); }); tr_mode[t]->setAvailableHandler([=](int mode) { - return ((mode & 1) == 0) || ((mode >> 1) != index); + if (index > 0) + return ((mode & 1) == 0) || ((mode >> 1) != index) || (mode == TRIM_MODE_3POS); + return (mode == 0) || (mode == TRIM_MODE_3POS); }); - tr_value[t] = new NumberEdit(trim, rect_t{}, + tr_value[t] = new NumberEdit(trim, rect_t{0, 0, 70, 0}, g_model.extendedTrims ? -512 : -128, g_model.extendedTrims ? 512 : 128, GET_SET_DEFAULT(tr->value)); @@ -176,9 +181,9 @@ class FlightModeEdit : public Page void showControls(int trim, uint8_t mode) { bool checked = (mode != TRIM_MODE_NONE); - bool showValue = (index == 0) || ((mode & 1) || (mode >> 1 == index)); + bool showValue = (index == 0 && mode != TRIM_MODE_3POS) || ((mode & 1) || (mode >> 1 == index)); - if (checked && (index > 0)) { + if (checked) { lv_obj_clear_flag(tr_mode[trim]->getLvObj(), LV_OBJ_FLAG_HIDDEN); } else { lv_obj_add_flag(tr_mode[trim]->getLvObj(), LV_OBJ_FLAG_HIDDEN); diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index fb54cba27..913954eff 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -77,8 +77,9 @@ void drawTrimMode(coord_t x, coord_t y, uint8_t flightMode, uint8_t idx, LcdFlag if (mode == TRIM_MODE_NONE) { lcdDrawText(x, y, "--", att); - } - else { + } else if (mode == TRIM_MODE_3POS) { + lcdDrawText(x, y, "3P", att); + } else { if (mode % 2 == 0) lcdDrawChar(x, y, ':', att|FIXEDWIDTH); else diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 622c8f42f..1d57b0ad6 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -384,6 +384,13 @@ getvalue_t getValue(mixsrc_t i, bool* valid) else if (i <= MIXSRC_LAST_TRIM) { i -= MIXSRC_FIRST_TRIM; + if (getRawTrimValue(mixerCurrentFlightMode, i).mode == TRIM_MODE_3POS) { + // Trim set as 3POS toggle switch in FM + uint8_t tidx = inputMappingConvertMode(i) * 2; + if (trimDown(tidx)) return -RESX; + else if (trimDown(tidx + 1)) return RESX; + return 0; + } auto trim_value = getTrimValue(mixerCurrentFlightMode, i); return calc1000toRESX((int16_t)8 * trim_value); } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 793fedc7b..4d86c219b 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -266,6 +266,7 @@ enum SwashType { #define TRIMS_ARRAY_SIZE 8 #define TRIM_MODE_NONE 0x1F // 0b11111 +#define TRIM_MODE_3POS (2 * MAX_FLIGHT_MODES) #define IS_MANUAL_RESET_TIMER(idx) (g_model.timers[idx].persistent == 2) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 324ce862a..bf3d94f85 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -471,7 +471,7 @@ int getTrimValue(uint8_t phase, uint8_t idx) int result = 0; for (uint8_t i=0; itrim[idx]; - if (v.mode == TRIM_MODE_NONE) + if (v.mode == TRIM_MODE_NONE || v.mode == TRIM_MODE_3POS) return false; unsigned int p = v.mode >> 1; if (p == phase || phase == 0) {