From e37a8bff7d0d6bf0fb32933d4f42d40c289cc3e7 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 17 Mar 2022 16:15:23 +0100 Subject: [PATCH] Added YAML serialPort TODO: - restrict serial modes for VCP - allow a function to be assigned only to one port --- .../firmwares/edgetx/yaml_generalsettings.cpp | 59 +++++++++++++++++-- companion/src/firmwares/eeprominterface.h | 1 + companion/src/firmwares/generalsettings.cpp | 22 +++++-- companion/src/firmwares/generalsettings.h | 21 +++++-- companion/src/firmwares/modeldata.cpp | 23 +++++--- .../src/firmwares/opentx/opentxeeprom.cpp | 6 +- .../src/firmwares/opentx/opentxinterface.cpp | 6 +- companion/src/generaledit/hardware.cpp | 21 +++++-- companion/src/modeledit/telemetry.cpp | 4 +- 9 files changed, 125 insertions(+), 38 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_generalsettings.cpp b/companion/src/firmwares/edgetx/yaml_generalsettings.cpp index 1d8624ac9..e63478760 100644 --- a/companion/src/firmwares/edgetx/yaml_generalsettings.cpp +++ b/companion/src/firmwares/edgetx/yaml_generalsettings.cpp @@ -59,7 +59,7 @@ const YamlLookupTable bluetoothModeLut = { { GeneralSettings::BLUETOOTH_MODE_TRAINER, "TRAINER" }, }; -const YamlLookupTable uartModeLut = { +const YamlLookupTable oldUartModeLut = { { GeneralSettings::AUX_SERIAL_OFF, "MODE_NONE" }, { GeneralSettings::AUX_SERIAL_TELE_MIRROR, "MODE_TELEMETRY_MIRROR" }, { GeneralSettings::AUX_SERIAL_TELE_IN, "MODE_TELEMETRY" }, @@ -67,6 +67,23 @@ const YamlLookupTable uartModeLut = { { GeneralSettings::AUX_SERIAL_LUA, "MODE_LUA" }, }; +const YamlLookupTable serialPortLut = { + { GeneralSettings::SP_AUX1, "AUX1" }, + { GeneralSettings::SP_AUX2, "AUX2" }, + { GeneralSettings::SP_VCP, "VCP" }, +}; + +const YamlLookupTable uartModeLut = { + { GeneralSettings::AUX_SERIAL_OFF, "NONE" }, + { GeneralSettings::AUX_SERIAL_TELE_MIRROR, "TELEMETRY_MIRROR" }, + { GeneralSettings::AUX_SERIAL_TELE_IN, "TELEMETRY" }, + { GeneralSettings::AUX_SERIAL_SBUS_TRAINER, "SBUS_TRAINER" }, + { GeneralSettings::AUX_SERIAL_LUA, "LUA" }, + { GeneralSettings::AUX_SERIAL_CLI, "CLI" }, + { GeneralSettings::AUX_SERIAL_GPS, "GPS" }, + { GeneralSettings::AUX_SERIAL_DEBUG, "DEBUG" }, +}; + const YamlLookupTable antennaModeLut = { { GeneralSettings::ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, { GeneralSettings::ANTENNA_MODE_ASK, "MODE_ASK" }, @@ -195,8 +212,17 @@ Node convert::encode(const GeneralSettings& rhs) node["varioRange"] = rhs.varioRange * 15; node["varioRepeat"] = rhs.varioRepeat; node["backgroundVolume"] = rhs.backgroundVolume + 2; - node["auxSerialMode"] = uartModeLut << rhs.auxSerialMode; - node["aux2SerialMode"] = uartModeLut << rhs.aux2SerialMode; + + Node serialPort; + for (int i = 0; i < GeneralSettings::SP_COUNT; i++) { + if (rhs.serialPort[i] != UART_MODE_NONE) { + Node mode = uartModeLut << rhs.serialPort[i]; + serialPort[LookupValue(serialPortLut, i)]["mode"] = mode; + } + } + if (serialPort && serialPort.IsMap()) + node["serialPort"] = serialPort; + node["antennaMode"] = antennaModeLut << rhs.antennaMode; node["backlightColor"] = rhs.backlightColor; node["pwrOnSpeed"] = rhs.pwrOnSpeed; @@ -372,8 +398,31 @@ bool convert::decode(const Node& node, GeneralSettings& rhs) node["varioRange"] >> ifactor(rhs.varioRange, 15); node["varioRepeat"] >> rhs.varioRepeat; node["backgroundVolume"] >> ioffset_int(rhs.backgroundVolume, 2); - node["auxSerialMode"] >> uartModeLut >> rhs.auxSerialMode; - node["aux2SerialMode"] >> uartModeLut >> rhs.aux2SerialMode; + + if (node["auxSerialMode"]) { + node["auxSerialMode"] >> oldUartModeLut >> + rhs.serialPort[GeneralSettings::SP_AUX1]; + } + + if (node["aux2SerialMode"]) { + node["aux2SerialMode"] >> oldUartModeLut >> + rhs.serialPort[GeneralSettings::SP_AUX2]; + } + + if (node["serialPort"]) { + Node serialPort = node["serialPort"]; + if (serialPort.IsMap()) { + for (const auto& port : serialPort) { + YAML::Node port_nr = port.first >> serialPortLut; + if (port_nr) { + int p = port_nr.as(); + if (p >= 0 && p < GeneralSettings::SP_COUNT && port.second.IsMap()) + port.second["mode"] >> uartModeLut >> rhs.serialPort[p]; + } + } + } + } + node["antennaMode"] >> antennaModeLut >> rhs.antennaMode; node["backlightColor"] >> rhs.backlightColor; node["pwrOnSpeed"] >> rhs.pwrOnSpeed; diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index 77a9ce783..a5e01ff9d 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -160,6 +160,7 @@ enum Capability { Sensors, HasAuxSerialMode, HasAux2SerialMode, + HasVCPSerialMode, HasBluetooth, HasAntennaChoice, HasADCJitterFilter, diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 2bc022355..36551a4cc 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -418,9 +418,12 @@ QString GeneralSettings::bluetoothModeToString() const return bluetoothModeToString(bluetoothMode); } -QString GeneralSettings::auxSerialModeToString() const +QString GeneralSettings::serialPortModeToString(int port_nr) const { - return auxSerialModeToString(auxSerialMode); + if (port_nr < 0 || port_nr >= SP_COUNT) + return QString(); + + return serialModeToString(serialPort[port_nr]); } QString GeneralSettings::telemetryBaudrateToString() const @@ -467,7 +470,7 @@ QString GeneralSettings::bluetoothModeToString(int value) } // static -QString GeneralSettings::auxSerialModeToString(int value) +QString GeneralSettings::serialModeToString(int value) { switch(value) { case AUX_SERIAL_OFF: @@ -480,6 +483,12 @@ QString GeneralSettings::auxSerialModeToString(int value) return tr("SBUS Trainer"); case AUX_SERIAL_LUA: return tr("LUA"); + case AUX_SERIAL_CLI: + return tr("CLI"); + case AUX_SERIAL_GPS: + return tr("GPS"); + case AUX_SERIAL_DEBUG: + return tr("Debug"); default: return CPN_STR_UNKNOWN_ITEM; } @@ -546,13 +555,14 @@ AbstractStaticItemModel * GeneralSettings::bluetoothModeItemModel() } // static -AbstractStaticItemModel * GeneralSettings::auxSerialModeItemModel() +AbstractStaticItemModel * GeneralSettings::serialModeItemModel(int port_nr) { AbstractStaticItemModel * mdl = new AbstractStaticItemModel(); - mdl->setName(AIM_GS_AUXSERIALMODE); + mdl->setName(QString(AIM_GS_SERIALMODE).arg(port_nr)); for (int i = 0; i < AUX_SERIAL_COUNT; i++) { - mdl->appendToItemList(auxSerialModeToString(i), i); + // TODO: check if supported on 'port_nr' + mdl->appendToItemList(serialModeToString(i), i); } mdl->loadItemList(); diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index 1729adbeb..6df039207 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -38,7 +38,7 @@ class AbstractStaticItemModel; // identiying names of static abstract item models constexpr char AIM_GS_ANTENNAMODE[] {"gs.antennamode"}; constexpr char AIM_GS_BLUETOOTHMODE[] {"gs.bluetoothmode"}; -constexpr char AIM_GS_AUXSERIALMODE[] {"gs.auxserialmode"}; +constexpr char AIM_GS_SERIALMODE[] {"gs.serialmode%1"}; constexpr char AIM_GS_TELEMETRYBAUDRATE[] {"gs.telemetrybaudrate"}; constexpr char AIM_TRAINERMIX_MODE[] {"trainermix.mode"}; constexpr char AIM_TRAINERMIX_SRC[] {"trainermix.src"}; @@ -135,12 +135,22 @@ class GeneralSettings { AUX_SERIAL_TELE_IN, AUX_SERIAL_SBUS_TRAINER, AUX_SERIAL_LUA, + AUX_SERIAL_CLI, + AUX_SERIAL_GPS, + AUX_SERIAL_DEBUG, AUX_SERIAL_COUNT }; enum TelemetryBaudrate { }; + enum SerialPort { + SP_AUX1, + SP_AUX2, + SP_VCP, + SP_COUNT, + }; + GeneralSettings() { clear(); } void clear(); void init(); @@ -228,8 +238,7 @@ class GeneralSettings { int backgroundVolume; unsigned int mavbaud; unsigned int switchUnlockStates; - unsigned int auxSerialMode; - unsigned int aux2SerialMode; + unsigned int serialPort[SP_COUNT]; int antennaMode; unsigned int backlightColor; CustomFunctionData customFn[CPN_MAX_SPECIAL_FUNCTIONS]; @@ -257,17 +266,17 @@ class GeneralSettings { bool isSliderAvailable(int index) const; QString antennaModeToString() const; QString bluetoothModeToString() const; - QString auxSerialModeToString() const; + QString serialPortModeToString(int port_nr) const; QString telemetryBaudrateToString() const; static QString antennaModeToString(int value); static QString bluetoothModeToString(int value); - static QString auxSerialModeToString(int value); + static QString serialModeToString(int value); static QString telemetryBaudrateToString(int value); static FieldRange getPPM_MultiplierRange(); static FieldRange getTxCurrentCalibration(); static AbstractStaticItemModel * antennaModeItemModel(); static AbstractStaticItemModel * bluetoothModeItemModel(); - static AbstractStaticItemModel * auxSerialModeItemModel(); + static AbstractStaticItemModel * serialModeItemModel(int port_nr); static AbstractStaticItemModel * telemetryBaudrateItemModel(); }; diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index 70ca16810..131fba697 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -1624,18 +1624,23 @@ bool ModelData::isTrainerModeAvailable(const GeneralSettings & generalSettings, if (!IS_FLYSKY_NV14(board) && value == TRAINER_MODE_OFF) ret = false; - else if (!IS_TARANIS(board) || IS_ACCESS_RADIO(board, Firmware::getCurrentVariant()->getId())) { - if (value >= TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE && value <= TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) - ret = false; - } - else if (generalSettings.auxSerialMode != UART_MODE_SBUS_TRAINER && value == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) + else if (!IS_TARANIS(board) || + IS_ACCESS_RADIO(board, Firmware::getCurrentVariant()->getId())) { + if (value >= TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE && + value <= TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) ret = false; + } else if (generalSettings.serialPort[GeneralSettings::SP_AUX1] != + UART_MODE_SBUS_TRAINER && + value == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) + ret = false; - if (generalSettings.bluetoothMode != GeneralSettings::BLUETOOTH_MODE_TRAINER && value >= TRAINER_MODE_MASTER_BLUETOOTH && value <= TRAINER_MODE_SLAVE_BLUETOOTH) - ret = false; + if (generalSettings.bluetoothMode != + GeneralSettings::BLUETOOTH_MODE_TRAINER && + value >= TRAINER_MODE_MASTER_BLUETOOTH && + value <= TRAINER_MODE_SLAVE_BLUETOOTH) + ret = false; - if (!IS_RADIOMASTER_TX16S(board) && value == TRAINER_MODE_MULTI) - ret = false; + if (!IS_RADIOMASTER_TX16S(board) && value == TRAINER_MODE_MULTI) ret = false; return ret; } diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index a9f7f2a37..9723f9346 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -3141,9 +3141,9 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (IS_STM32(board)) { if (version >= 218) { - internalField.Append(new UnsignedField<4>(this, generalData.auxSerialMode)); + internalField.Append(new UnsignedField<4>(this, generalData.serialPort[GeneralSettings::SP_AUX1])); if (IS_FAMILY_HORUS_OR_T16(board) && version >= 219) { - internalField.Append(new UnsignedField<4>(this, generalData.aux2SerialMode)); + internalField.Append(new UnsignedField<4>(this, generalData.serialPort[GeneralSettings::SP_AUX2])); } else { for (uint8_t i=0; i(this, generalData.auxSerialMode)); + internalField.Append(new UnsignedField<6>(this, generalData.serialPort[GeneralSettings::SP_AUX1])); if (IS_TARANIS_X9E(board)) { internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[2])); internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[3])); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 97ea8ddbc..51bdfc694 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -744,9 +744,11 @@ int OpenTxFirmware::getCapability(::Capability capability) else return 40; case HasAuxSerialMode: - return (IS_FAMILY_HORUS_OR_T16(board) && !IS_TARANIS_SMALL(board)) ? true : false; + return IS_FAMILY_HORUS_OR_T16(board) || (IS_TARANIS_X9(board) && !IS_TARANIS_X9DP_2019(board)); case HasAux2SerialMode: - return (IS_FAMILY_HORUS_OR_T16(board) && !IS_TARANIS_SMALL(board) && !IS_FLYSKY_NV14(board)) ? true : false; + return IS_FAMILY_T16(board); + case HasVCPSerialMode: + return IS_FAMILY_HORUS_OR_T16(board) || IS_RADIOMASTER_ZORRO(board) || IS_JUMPER_TPRO(board); case HasBluetooth: return (IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_TARANIS_X9DP_2019(board) || IS_FLYSKY_NV14(board)) ? true : false; case HasAntennaChoice: diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index 3df762509..d7bc3a12d 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -50,7 +50,8 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings int antmodelid = editorItemModels->registerItemModel(GeneralSettings::antennaModeItemModel()); int btmodelid = editorItemModels->registerItemModel(GeneralSettings::bluetoothModeItemModel()); - int auxmodelid = editorItemModels->registerItemModel(GeneralSettings::auxSerialModeItemModel()); + int auxmodelid = editorItemModels->registerItemModel(GeneralSettings::serialModeItemModel(GeneralSettings::SP_AUX1)); + int vcpmodelid = editorItemModels->registerItemModel(GeneralSettings::serialModeItemModel(GeneralSettings::SP_VCP)); int baudmodelid = editorItemModels->registerItemModel(GeneralSettings::telemetryBaudrateItemModel()); id = editorItemModels->registerItemModel(ModuleData::internalModuleItemModel()); @@ -156,7 +157,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings addLabel(tr("%1").arg(lbl), row, 0); AutoComboBox *serialPortMode = new AutoComboBox(this); serialPortMode->setModel(editorItemModels->getItemModel(auxmodelid)); - serialPortMode->setField(generalSettings.auxSerialMode); + serialPortMode->setField(generalSettings.serialPort[GeneralSettings::SP_AUX1]); addParams(row, serialPortMode); } @@ -165,10 +166,18 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings if (IS_RADIOMASTER_TX16S(board)) lbl.append(" (TTL)"); addLabel(tr("%1").arg(lbl), row, 0); - AutoComboBox *serialPort2Mode = new AutoComboBox(this); - serialPort2Mode->setModel(editorItemModels->getItemModel(auxmodelid)); - serialPort2Mode->setField(generalSettings.aux2SerialMode); - addParams(row, serialPort2Mode); + AutoComboBox *serialPortMode = new AutoComboBox(this); + serialPortMode->setModel(editorItemModels->getItemModel(auxmodelid)); + serialPortMode->setField(generalSettings.serialPort[GeneralSettings::SP_AUX2]); + addParams(row, serialPortMode); + } + + if (firmware->getCapability(HasVCPSerialMode)) { + addLabel(tr("Serial Port VCP"), row, 0); + AutoComboBox *serialPortMode = new AutoComboBox(this); + serialPortMode->setModel(editorItemModels->getItemModel(vcpmodelid)); + serialPortMode->setField(generalSettings.serialPort[GeneralSettings::SP_VCP]); + addParams(row, serialPortMode); } if (firmware->getCapability(HasADCJitterFilter)) { diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 4aeff932f..70e0e1f42 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -509,7 +509,9 @@ void TelemetryPanel::setup() ui->telemetryProtocol->addItem(tr("FrSky S.PORT"), 0); ui->telemetryProtocol->addItem(tr("FrSky D"), 1); if (IS_9XRPRO(firmware->getBoard()) || - (IS_TARANIS(firmware->getBoard()) && generalSettings.auxSerialMode == 2)) { + (IS_TARANIS(firmware->getBoard()) && + generalSettings.serialPort[GeneralSettings::SP_AUX1] == + GeneralSettings::AUX_SERIAL_TELE_IN)) { ui->telemetryProtocol->addItem(tr("FrSky D (cable)"), 2); } ui->telemetryProtocol->setCurrentIndex(model->telemetryProtocol);