diff --git a/radio/src/gui/colorlcd/mpm_settings.cpp b/radio/src/gui/colorlcd/mpm_settings.cpp index 46ca45bcf..eec232768 100644 --- a/radio/src/gui/colorlcd/mpm_settings.cpp +++ b/radio/src/gui/colorlcd/mpm_settings.cpp @@ -20,10 +20,11 @@ */ #include "mpm_settings.h" -#include "opentx.h" -#include "multi_rfprotos.h" +#include "choice.h" #include "io/multi_protolist.h" +#include "multi_rfprotos.h" +#include "opentx.h" #define SET_DIRTY() storageDirty(EE_MODEL) @@ -148,9 +149,31 @@ void MPMProtoOption::update(const MultiRfProtocols::RfProto* rfProto, ModuleData } } +struct MPMSubtypeChoice : public Choice { + MPMSubtypeChoice(Window* parent, std::function get, + std::function set) : + Choice(parent, rect_t{}, 0, 0, get, set) + { + } + + std::string getLabelText() override + { + if (_getValue) { + int val = _getValue(); + val -= vmin; + if (val >= 0 && val < (int)values.size()) { + return values[val]; + } else { + return std::to_string(val); + } + } + return std::string(); + } +}; + struct MPMSubtype : public FormWindow::Line { - Choice* choice; + MPMSubtypeChoice* choice; MPMSubtype(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx); void update(const MultiRfProtocols::RfProto* rfProto, uint8_t moduleIdx); @@ -187,8 +210,9 @@ static void subtype_event_cb(lv_event_t* e) if (obj) lv_event_send(obj, LV_EVENT_VALUE_CHANGED, nullptr); } -MPMSubtype::MPMSubtype(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx) : - FormWindow::Line(form, layout) +MPMSubtype::MPMSubtype(FormWindow* form, FlexGridLayout* layout, + uint8_t moduleIdx) : + FormWindow::Line(form, layout) { this->moduleIdx = moduleIdx; this->DSM2lastSubType = g_model.moduleData[this->moduleIdx].subType; @@ -198,17 +222,18 @@ MPMSubtype::MPMSubtype(FormWindow* form, FlexGridLayout *layout, uint8_t moduleI new StaticText(this, rect_t{}, STR_RF_PROTOCOL, 0, COLOR_THEME_PRIMARY1); auto md = &g_model.moduleData[moduleIdx]; - choice = new Choice( - this, rect_t{}, 0, 0, [=]() { return md->subType; }, + choice = new MPMSubtypeChoice( + this, [=]() { return md->subType; }, [=](int16_t newValue) { md->subType = newValue; - if(!DSM2autoUpdated) // reset MPM options only if user triggered + if (!DSM2autoUpdated) // reset MPM options only if user triggered resetMultiProtocolsOptions(moduleIdx); - DSM2autoUpdated = false; + DSM2autoUpdated = false; SET_DIRTY(); }); - lv_obj_add_event_cb(choice->getLvObj(), subtype_event_cb, LV_EVENT_VALUE_CHANGED, lvobj); + lv_obj_add_event_cb(choice->getLvObj(), subtype_event_cb, + LV_EVENT_VALUE_CHANGED, lvobj); } void MPMSubtype::update(const MultiRfProtocols::RfProto* rfProto, uint8_t moduleIdx) diff --git a/radio/src/io/multi_protolist.cpp b/radio/src/io/multi_protolist.cpp index d8aefc95c..ca494a5f0 100644 --- a/radio/src/io/multi_protolist.cpp +++ b/radio/src/io/multi_protolist.cpp @@ -183,7 +183,7 @@ std::string MultiRfProtocols::getProtoLabel(unsigned int proto) const return protoList[idx].label; } } - return std::string(); + return std::to_string(proto); } std::string MultiRfProtocols::getLastProtoLabel() const diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 251e618d5..433904097 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -1994,19 +1994,8 @@ static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, // convert to ETX format and write to vars if (type > 0) { type -= 1; // change to internal 0 based representation - - if(type > MODULE_SUBTYPE_MULTI_LAST) { - TRACE("Multi protocol: %d exceeds supported protocols. Module set to: OFF", type); - md->type = MODULE_TYPE_NONE; - } else { - if(subtype > getMultiProtocolDefinition(type)->maxSubtype) { - TRACE("Multi protocol sub-type %d exceeds number of supported sub-types. Module set to: OFF", subtype); - md->type = MODULE_TYPE_NONE; - } else { - md->multi.rfProtocol = type; - md->subType = subtype; - } - } + md->multi.rfProtocol = type; + md->subType = subtype; } #endif } else if (md->type == MODULE_TYPE_DSM2) {