Added YAML serialPort

TODO:
- restrict serial modes for VCP
- allow a function to be assigned only to one port
This commit is contained in:
Raphael Coeffic
2022-03-20 16:30:59 +01:00
parent bc75bed8c8
commit e37a8bff7d
9 changed files with 125 additions and 38 deletions
@@ -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<GeneralSettings>::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<GeneralSettings>::decode(const Node& node, GeneralSettings& rhs)
node["varioRange"] >> ifactor<int>(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<int>();
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;
@@ -160,6 +160,7 @@ enum Capability {
Sensors,
HasAuxSerialMode,
HasAux2SerialMode,
HasVCPSerialMode,
HasBluetooth,
HasAntennaChoice,
HasADCJitterFilter,
+16 -6
View File
@@ -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();
+15 -6
View File
@@ -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();
};
+14 -9
View File
@@ -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;
}
@@ -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<SLIDERS_CONFIG_SIZE(board,version); i++) {
@@ -3152,7 +3152,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
}
else {
internalField.Append(new UnsignedField<6>(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]));
@@ -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:
+15 -6
View File
@@ -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)) {
+3 -1
View File
@@ -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);