diff --git a/companion/src/firmwares/edgetx/yaml_rawswitch.cpp b/companion/src/firmwares/edgetx/yaml_rawswitch.cpp index 61c3ca463..f4d07d777 100644 --- a/companion/src/firmwares/edgetx/yaml_rawswitch.cpp +++ b/companion/src/firmwares/edgetx/yaml_rawswitch.cpp @@ -21,15 +21,6 @@ #include "yaml_rawswitch.h" #include "eeprominterface.h" -const YamlLookupTable switchTypeLut = { - { SWITCH_TYPE_NONE, "NONE" }, - { SWITCH_TYPE_ON, "ON" }, - { SWITCH_TYPE_ONE, "ONE" }, - { SWITCH_TYPE_TELEMETRY, "TELEMETRY_STREAMING" }, - { SWITCH_TYPE_ACT, "RADIO_ACTIVITY" }, - { SWITCH_TYPE_OFF, "OFF" }, -}; - std::string YamlRawSwitchEncode(const RawSwitch& rhs) { std::string sw_str; @@ -73,7 +64,7 @@ std::string YamlRawSwitchEncode(const RawSwitch& rhs) break; default: - sw_str += YAML::LookupValue(switchTypeLut, rhs.type); + sw_str += getCurrentFirmware()->getRawSwitchTypesTag(sval); break; } return sw_str; @@ -95,6 +86,7 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str) int multiposcnt = Boards::getCapability(getCurrentBoard(), Board::MultiposPotsPositions); if (val_len >= 2 && val[0] == 'L' && (val[1] >= '0' && val[1] <= '9')) { + if (std::stoi(sw_str.substr(1, val_len - 1)) < CPN_MAX_LOGICAL_SWITCHES) { rhs = RawSwitch(SWITCH_TYPE_VIRTUAL, std::stoi(sw_str.substr(1, val_len - 1)) - 1); @@ -103,21 +95,25 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str) } else if (val_len > 3 && val[0] == '6' && val[1] == 'P' && (val[2] >= '0' && val[2] <= '9') && (val[3] >= '0' && val[3] < (multiposcnt + '0'))) { + rhs = RawSwitch(SWITCH_TYPE_MULTIPOS_POT, (val[2] - '0') * multiposcnt + (val[3] - '0')); } else if (val_len == 3 && val[0] == 'F' && val[1] == 'M' && (val[2] >= '0' && val[2] <= '9')) { + rhs = RawSwitch(SWITCH_TYPE_FLIGHT_MODE, val[2] - '0'); } else if (val_len >= 2 && val[0] == 'T' && (val[1] >= '0' && val[1] <= '9')) { + if (std::stoi(sw_str.substr(1, val_len - 1)) < CPN_MAX_SENSORS) { rhs = RawSwitch(SWITCH_TYPE_SENSOR, std::stoi(sw_str.substr(1, val_len - 1)) - 1); } } else if (sw_str.substr(0, 4) == std::string("Trim")) { + int tsw_idx = getCurrentFirmware()->getTrimSwitchesIndex(sw_str.c_str()); if (tsw_idx >= 0) { rhs.type = SWITCH_TYPE_TRIM; @@ -127,15 +123,23 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str) } else if (val_len >= 3 && val[0] == 'S' && (val[1] >= 'A' && val[1] <= 'Z') && (val[2] >= '0' && val[2] <= '2')) { + int sw_idx = getCurrentFirmware()->getSwitchesIndex(sw_str.substr(0, 2).c_str()); if (sw_idx >= 0) { rhs.type = SWITCH_TYPE_SWITCH; rhs.index = sw_idx * 3 + val[2] - '0'; } + // TODO: SWITCH_TYPE_TIMER_MODE + //} else if (sw_str.substr(0, ?) == std::string("????")) { + } else { - YAML::Node(sw_str) >> rhs.type; - rhs.index = 0; + // types which do not use index + int sw_type = getCurrentFirmware()->getRawSwitchTypesIndex(sw_str.c_str()); + if (sw_type >= 0) { + rhs.type = (RawSwitchType)sw_type; + rhs.index = 0; + } } if (neg) { @@ -146,8 +150,6 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str) namespace YAML { -ENUM_CONVERTER(RawSwitchType, switchTypeLut); - Node convert::encode(const RawSwitch& rhs) { return Node(YamlRawSwitchEncode(rhs)); diff --git a/companion/src/firmwares/eeprominterface.cpp b/companion/src/firmwares/eeprominterface.cpp index 4fcef3f1d..e7f36875b 100644 --- a/companion/src/firmwares/eeprominterface.cpp +++ b/companion/src/firmwares/eeprominterface.cpp @@ -256,3 +256,29 @@ std::string Firmware::getTrimSwitchesTag(unsigned int index) return std::string(); } + +int Firmware::getRawSwitchTypesIndex(const char * tag) +{ + const StringTagMappingTable& lut = rawSwitchTypesLookupTable; + + auto it = + find_if(lut.begin(), lut.end(), [=](const StringTagMapping& elmt) { + if (elmt.tag == tag) return true; + return false; + }); + + if (it != lut.end()) { + return it - lut.begin(); + } + + return -1; +} + +std::string Firmware::getRawSwitchTypesTag(unsigned int index) +{ + const StringTagMappingTable& lut = rawSwitchTypesLookupTable; + if (index < lut.size()) + return lut[index].tag; + + return std::string(); +} diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index b2bdf4c61..2632224d9 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -293,7 +293,8 @@ class Firmware eepromInterface(nullptr), analogInputNamesLookupTable(Boards::getAnalogNamesLookupTable(board)), switchesLookupTable(Boards::getSwitchesLookupTable(board)), - trimSwitchesLookupTable(Boards::getTrimSwitchesLookupTable(board)) + trimSwitchesLookupTable(Boards::getTrimSwitchesLookupTable(board)), + rawSwitchTypesLookupTable(RawSwitch::getRawSwitchTypesLookupTable()) { } @@ -417,12 +418,19 @@ class Firmware return &trimSwitchesLookupTable; } + const StringTagMappingTable* getRawSwitchTypesLookupTable() + { + return &rawSwitchTypesLookupTable; + } + int getAnalogInputIndex(const char * tag); std::string getAnalogInputTag(unsigned int index); int getSwitchesIndex(const char * tag); std::string getSwitchesTag(unsigned int index); int getTrimSwitchesIndex(const char * tag); std::string getTrimSwitchesTag(unsigned int index); + int getRawSwitchTypesIndex(const char * tag); + std::string getRawSwitchTypesTag(unsigned int index); protected: QString id; @@ -434,6 +442,7 @@ class Firmware const StringTagMappingTable analogInputNamesLookupTable; const StringTagMappingTable switchesLookupTable; const StringTagMappingTable trimSwitchesLookupTable; + const StringTagMappingTable rawSwitchTypesLookupTable; QList languages; //QList ttslanguages; OptionsList opts; diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 45d13b1fc..5ed4d1c68 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -241,3 +241,28 @@ QStringList RawSwitch::getSwitchList(Boards board) const } return ret; } + +// static +StringTagMappingTable RawSwitch::getRawSwitchTypesLookupTable() +{ + StringTagMappingTable tbl; + + tbl.insert(tbl.end(), { + {std::to_string(SWITCH_TYPE_NONE), "NONE"}, + {std::to_string(SWITCH_TYPE_SWITCH), "Sxn"}, + {std::to_string(SWITCH_TYPE_VIRTUAL), "Ln"}, + {std::to_string(SWITCH_TYPE_MULTIPOS_POT), "6Pn"}, + {std::to_string(SWITCH_TYPE_TRIM), "Trim"}, + {std::to_string(SWITCH_TYPE_ROTARY_ENCODER), "RE"}, + {std::to_string(SWITCH_TYPE_ON), "ON"}, + {std::to_string(SWITCH_TYPE_OFF), "OFF"}, + {std::to_string(SWITCH_TYPE_ONE), "ONE"}, + {std::to_string(SWITCH_TYPE_FLIGHT_MODE), "FMn"}, + {std::to_string(SWITCH_TYPE_TIMER_MODE), "Timer"}, + {std::to_string(SWITCH_TYPE_TELEMETRY), "TELEMETRY_STREAMING"}, + {std::to_string(SWITCH_TYPE_SENSOR), "Tnn"}, + {std::to_string(SWITCH_TYPE_ACT), "RADIO_ACTIVITY"}, + }); + + return tbl; +} diff --git a/companion/src/firmwares/rawswitch.h b/companion/src/firmwares/rawswitch.h index 762ff83ff..d108cf1d6 100644 --- a/companion/src/firmwares/rawswitch.h +++ b/companion/src/firmwares/rawswitch.h @@ -22,6 +22,7 @@ #include "boards.h" #include "constants.h" +#include "datahelpers.h" #include @@ -89,6 +90,7 @@ class RawSwitch { bool isSet() const { return type != SWITCH_TYPE_NONE || index != 0; } void clear() { type = SWITCH_TYPE_NONE; index = 0; } QStringList getSwitchList(Boards board) const; + static StringTagMappingTable getRawSwitchTypesLookupTable(); bool operator== ( const RawSwitch& other) const { return (this->type == other.type) && (this->index == other.index);