diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 3f498b804..2c85e2a88 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -743,3 +743,17 @@ AbstractStaticItemModel * Boards::switchTypeItemModel() mdl->loadItemList(); return mdl; } + +// static +StringTagMappingTable Boards::getSwitchesLookupTable(Board::Type board) +{ + StringTagMappingTable tbl; + + for (int i = 0; i < Boards::getCapability(board, Board::Switches); i++) { + SwitchInfo si = Boards::getSwitchInfo(board, i); + if (si.config != SWITCH_NOT_AVAILABLE) // safety check in case Switches does not align + tbl.insert(tbl.end(), si.name.toStdString()); + } + + return tbl; +} diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index c6662133e..5188cb655 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -201,6 +201,7 @@ class Boards static int getEEpromSize(Board::Type board); static int getFlashSize(Board::Type board); static Board::SwitchInfo getSwitchInfo(Board::Type board, int index); + static StringTagMappingTable getSwitchesLookupTable(Board::Type board); static int getCapability(Board::Type board, Board::Capability capability); static QString getAxisName(int index); static StringTagMappingTable getAnalogNamesLookupTable(Board::Type board); diff --git a/companion/src/firmwares/edgetx/yaml_rawswitch.cpp b/companion/src/firmwares/edgetx/yaml_rawswitch.cpp index b215f2787..b96083e78 100644 --- a/companion/src/firmwares/edgetx/yaml_rawswitch.cpp +++ b/companion/src/firmwares/edgetx/yaml_rawswitch.cpp @@ -19,9 +19,11 @@ */ #include "yaml_rawswitch.h" +#include "eeprominterface.h" -#define XPOTS_MULTIPOS_COUNT 6 +#define XPOTS_MULTIPOS_COUNT 6 // TODO: use Boards::getCapability(board, Board::MultiposPotsPositions) +// TODO: use lookup of trims in Boards ??? const YamlLookupTable trimSwitchLut = { { 0, "TrimRudLeft" }, { 1, "TrimRudRight" }, @@ -57,9 +59,7 @@ std::string YamlRawSwitchEncode(const RawSwitch& rhs) switch (rhs.type) { case SWITCH_TYPE_SWITCH: - sw_str += 'S'; - // TODO: use lookup of switches in Boards ??? - sw_str += 'A' + (sval - 1) / 3; + sw_str += getCurrentFirmware()->getSwitchesTag((sval - 1) / 3); sw_str += std::to_string((sval - 1) % 3); break; @@ -75,6 +75,7 @@ std::string YamlRawSwitchEncode(const RawSwitch& rhs) break; case SWITCH_TYPE_TRIM: + // TODO: use lookup of trims in Boards ??? sw_str += YAML::LookupValue(trimSwitchLut, sval); break; @@ -97,7 +98,7 @@ std::string YamlRawSwitchEncode(const RawSwitch& rhs) RawSwitch YamlRawSwitchDecode(const std::string& sw_str) { - RawSwitch rhs; + RawSwitch rhs; // constructor sets to SWITCH_TYPE_NONE const char* val = sw_str.data(); size_t val_len = sw_str.size(); @@ -108,7 +109,7 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str) val_len--; } - if (val_len >= 2 && val[0] == 'L' && (val[1] >= '0' && val[1] <= '9')) { + if (val_len >= 2 && val[0] == 'L' && (val[1] >= '0' && val[1] <= '9')) { // TODO: range check < CPN_MAX_LOGICAL_SWITCHES rhs = RawSwitch(SWITCH_TYPE_VIRTUAL, std::stoi(sw_str.substr(1, val_len - 1)) - 1); } else if (val_len > 3 && val[0] == '6' && val[1] == 'P' && @@ -117,27 +118,26 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str) rhs = RawSwitch(SWITCH_TYPE_MULTIPOS_POT, (val[2] - '0') * XPOTS_MULTIPOS_COUNT + (val[3] - '0')); } else if (val_len == 3 && val[0] == 'F' && val[1] == 'M' && - (val[2] >= '0' && val[2] <= '9')) { + (val[2] >= '0' && val[2] <= '9')) { // TODO: range check < CPN_MAX_FLIGHT_MODES rhs = RawSwitch(SWITCH_TYPE_FLIGHT_MODE, val[2] - '0'); } else if (val_len >= 2 && val[0] == 'T' && - (val[1] >= '0' && val[1] <= '9')) { + (val[1] >= '0' && val[1] <= '9')) { // TODO: range check < CPN_MAX_SENSORS rhs = RawSwitch(SWITCH_TYPE_SENSOR, std::stoi(sw_str.substr(1, val_len - 1)) - 1); - } else if (sw_str.substr(0, 3) == std::string("Trim")) { // "Trim" - + } else if (sw_str.substr(0, 3) == std::string("Trim")) { + // TODO: use lookup of trims in Boards ??? rhs.type = SWITCH_TYPE_TRIM; YAML::Node(sw_str) >> trimSwitchLut >> rhs.index; } else if (val_len >= 3 && val[0] == 'S' && (val[1] >= 'A' && val[1] <= 'Z') && (val[2] >= '0' && val[2] <= '2')) { - // TODO: use lookup of switches in Boards ??? - rhs = RawSwitch(SWITCH_TYPE_SWITCH, (val[1] - 'A') * 3 + val[2] - '0'); + 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'; + } } else { - // TODO: check if we have a match? - // or does RawSwitch default to NONE anyway? - // - YAML::Node(sw_str) >> rhs.type; - rhs.index = 0; + // no match found } if (neg) { diff --git a/companion/src/firmwares/eeprominterface.cpp b/companion/src/firmwares/eeprominterface.cpp index cfa5ab5d1..9e87097ac 100644 --- a/companion/src/firmwares/eeprominterface.cpp +++ b/companion/src/firmwares/eeprominterface.cpp @@ -204,3 +204,29 @@ std::string Firmware::getAnalogInputTag(unsigned int index) return std::string(); } + +int Firmware::getSwitchesIndex(const char * tag) +{ + const StringTagMappingTable& lut = switchesLookupTable; + + 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::getSwitchesTag(unsigned int index) +{ + const StringTagMappingTable& lut = switchesLookupTable; + 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 99a2a3953..cdd8370f6 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -291,7 +291,8 @@ class Firmware variantBase(0), base(base), eepromInterface(nullptr), - analogInputNamesLookupTable(Boards::getAnalogNamesLookupTable(board)) + analogInputNamesLookupTable(Boards::getAnalogNamesLookupTable(board)), + switchesLookupTable(Boards::getSwitchesLookupTable(board)) { } @@ -405,8 +406,15 @@ class Firmware return &analogInputNamesLookupTable; } + const StringTagMappingTable* getSwitchesLookupTable() + { + return &switchesLookupTable; + } + int getAnalogInputIndex(const char * tag); std::string getAnalogInputTag(unsigned int index); + int getSwitchesIndex(const char * tag); + std::string getSwitchesTag(unsigned int index); protected: QString id; @@ -416,6 +424,7 @@ class Firmware Firmware * base; EEPROMInterface * eepromInterface; const StringTagMappingTable analogInputNamesLookupTable; + const StringTagMappingTable switchesLookupTable; QList languages; //QList ttslanguages; OptionsList opts;