Companion: YAML and hardware panel

This commit is contained in:
Raphael Coeffic
2022-03-21 11:52:19 +01:00
parent 70f71c8ec8
commit ebfb0b61f0
9 changed files with 98 additions and 59 deletions
@@ -111,31 +111,28 @@ const YamlLookupTable internalModuleLut = {
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
};
struct YamlTelemetryBaudrate {
unsigned int value;
YamlTelemetryBaudrate() = default;
YamlTelemetryBaudrate(const unsigned int * telemetryBaudrate)
{
if (Boards::getCapability(getCurrentFirmware()->getBoard(), Board::SportMaxBaudRate) < 400000) {
value = *telemetryBaudrate;
}
else {
value = (*telemetryBaudrate + telemetryBaudratesList.size() - 1) % telemetryBaudratesList.size();
}
YamlTelemetryBaudrate::YamlTelemetryBaudrate(
const unsigned int* moduleBaudrate)
{
if (Boards::getCapability(getCurrentFirmware()->getBoard(),
Board::SportMaxBaudRate) < 400000) {
value = *moduleBaudrate;
} else {
value = (*moduleBaudrate + moduleBaudratesList.size() - 1) %
moduleBaudratesList.size();
}
}
void toCpn(unsigned int * telemetryBaudrate, unsigned int variant)
{
if (Boards::getCapability((Board::Type)variant, Board::SportMaxBaudRate) < 400000) {
*telemetryBaudrate = value;
}
else {
*telemetryBaudrate = (value + 1) % telemetryBaudratesList.size();
}
void YamlTelemetryBaudrate::toCpn(unsigned int* moduleBaudrate,
unsigned int variant)
{
if (Boards::getCapability((Board::Type)variant, Board::SportMaxBaudRate) <
400000) {
*moduleBaudrate = value;
} else {
*moduleBaudrate = (value + 1) % moduleBaudratesList.size();
}
};
}
namespace YAML
{
@@ -179,8 +176,8 @@ Node convert<GeneralSettings>::encode(const GeneralSettings& rhs)
node["adjustRTC"] = (int)rhs.adjustRTC;
node["inactivityTimer"] = rhs.inactivityTimer;
YamlTelemetryBaudrate telemetryBaudrate(&rhs.telemetryBaudrate);
node["telemetryBaudrate"] = telemetryBaudrate.value;
YamlTelemetryBaudrate internalModuleBaudrate(&rhs.internalModuleBaudrate);
node["internalModuleBaudrate"] = internalModuleBaudrate.value;
node["internalModule"] = LookupValue(internalModuleLut, rhs.internalModule);
node["splashMode"] = rhs.splashMode; // TODO: B&W only
@@ -358,9 +355,13 @@ bool convert<GeneralSettings>::decode(const Node& node, GeneralSettings& rhs)
node["adjustRTC"] >> rhs.adjustRTC;
node["inactivityTimer"] >> rhs.inactivityTimer;
YamlTelemetryBaudrate telemetryBaudrate;
node["telemetryBaudrate"] >> telemetryBaudrate.value;
telemetryBaudrate.toCpn(&rhs.telemetryBaudrate, rhs.variant);
YamlTelemetryBaudrate internalModuleBaudrate;
if (node["telemetryBaudrate"]) {
node["telemetryBaudrate"] >> internalModuleBaudrate.value;
} else {
node["internalModuleBaudrate"] >> internalModuleBaudrate.value;
}
internalModuleBaudrate.toCpn(&rhs.internalModuleBaudrate, rhs.variant);
if (node["internalModule"]) {
node["internalModule"] >> internalModuleLut >> rhs.internalModule;
@@ -21,6 +21,14 @@
#include "yaml_ops.h"
#include "generalsettings.h"
struct YamlTelemetryBaudrate {
unsigned int value;
YamlTelemetryBaudrate() = default;
YamlTelemetryBaudrate(const unsigned int* moduleBaudrate);
void toCpn(unsigned int* moduleBaudrate, unsigned int variant);
};
namespace YAML {
template<>
@@ -30,5 +38,3 @@ namespace YAML {
static bool decode(const Node& node, GeneralSettings& rhs);
};
}
@@ -19,6 +19,7 @@
*/
#include "yaml_moduledata.h"
#include "yaml_generalsettings.h"
#include "moduledata.h"
#include "rawsource.h"
@@ -296,8 +297,16 @@ Node convert<ModuleData>::encode(const ModuleData& rhs)
case PULSES_GHOST: {
Node ghost;
ghost["raw12bits"] = (int)rhs.ghost.raw12bits;
YamlTelemetryBaudrate br(&rhs.ghost.telemetryBaudrate);
ghost["telemetryBaudrate"] = br.value;
mod["ghost"] = ghost;
} break;
case PULSES_CROSSFIRE: {
Node crsf;
YamlTelemetryBaudrate br(&rhs.crsf.telemetryBaudrate);
crsf["telemetryBaudrate"] = br.value;
mod["crsf"] = crsf;
} break;
// TODO: afhds3, flysky
default: {
Node ppm;
+8 -8
View File
@@ -426,9 +426,9 @@ QString GeneralSettings::serialPortModeToString(int port_nr) const
return serialModeToString(serialPort[port_nr]);
}
QString GeneralSettings::telemetryBaudrateToString() const
QString GeneralSettings::internalModuleBaudrateToString() const
{
return telemetryBaudrateToString(telemetryBaudrate);
return moduleBaudrateToString(internalModuleBaudrate);
}
// static
@@ -495,9 +495,9 @@ QString GeneralSettings::serialModeToString(int value)
}
// static
QString GeneralSettings::telemetryBaudrateToString(int value)
QString GeneralSettings::moduleBaudrateToString(int value)
{
return telemetryBaudratesList.value(value, CPN_STR_UNKNOWN_ITEM);
return moduleBaudratesList.value(value, CPN_STR_UNKNOWN_ITEM);
}
// static
@@ -576,13 +576,13 @@ AbstractStaticItemModel * GeneralSettings::serialModeItemModel(int port_nr)
}
// static
AbstractStaticItemModel * GeneralSettings::telemetryBaudrateItemModel()
AbstractStaticItemModel * GeneralSettings::internalModuleBaudrateItemModel()
{
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName(AIM_GS_TELEMETRYBAUDRATE);
mdl->setName(AIM_GS_INTMODULEBAUDRATE);
for (int i = 0; i < telemetryBaudratesList.size(); i++) {
mdl->appendToItemList(telemetryBaudrateToString(i), i);
for (int i = 0; i < moduleBaudratesList.size(); i++) {
mdl->appendToItemList(moduleBaudrateToString(i), i);
}
mdl->loadItemList();
+7 -6
View File
@@ -39,11 +39,12 @@ class AbstractStaticItemModel;
constexpr char AIM_GS_ANTENNAMODE[] {"gs.antennamode"};
constexpr char AIM_GS_BLUETOOTHMODE[] {"gs.bluetoothmode"};
constexpr char AIM_GS_SERIALMODE[] {"gs.serialmode%1"};
constexpr char AIM_GS_TELEMETRYBAUDRATE[] {"gs.telemetrybaudrate"};
constexpr char AIM_GS_INTMODULEBAUDRATE[] {"gs.intmodulebaudrate"};
constexpr char AIM_TRAINERMIX_MODE[] {"trainermix.mode"};
constexpr char AIM_TRAINERMIX_SRC[] {"trainermix.src"};
static const QStringList telemetryBaudratesList({ "115K", "400K", "921K", "1.87M", "3.75M", "5.25M" });
static const QStringList moduleBaudratesList({"115K", "400K", "921K", "1.87M",
"3.75M", "5.25M"});
enum UartModes {
UART_MODE_NONE,
@@ -193,7 +194,7 @@ class GeneralSettings {
bool adjustRTC;
bool optrexDisplay;
unsigned int inactivityTimer;
unsigned int telemetryBaudrate;
unsigned int internalModuleBaudrate;
bool minuteBeep;
bool preBeep;
bool flashBeep;
@@ -267,16 +268,16 @@ class GeneralSettings {
QString antennaModeToString() const;
QString bluetoothModeToString() const;
QString serialPortModeToString(int port_nr) const;
QString telemetryBaudrateToString() const;
QString internalModuleBaudrateToString() const;
static QString antennaModeToString(int value);
static QString bluetoothModeToString(int value);
static QString serialModeToString(int value);
static QString telemetryBaudrateToString(int value);
static QString moduleBaudrateToString(int value);
static FieldRange getPPM_MultiplierRange();
static FieldRange getTxCurrentCalibration();
static AbstractStaticItemModel * antennaModeItemModel();
static AbstractStaticItemModel * bluetoothModeItemModel();
static AbstractStaticItemModel * serialModeItemModel(int port_nr);
static AbstractStaticItemModel * telemetryBaudrateItemModel();
static AbstractStaticItemModel * internalModuleBaudrateItemModel();
};
+5
View File
@@ -229,8 +229,13 @@ class ModuleData {
struct GHOST {
bool raw12bits;
unsigned int telemetryBaudrate;
} ghost;
struct CRSF {
unsigned int telemetryBaudrate;
} crsf;
struct Access {
unsigned int receivers;
char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME+1];
@@ -3070,7 +3070,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
internalField.Append(new UnsignedField<8>(this, generalData.inactivityTimer));
internalField.Append(new UnsignedField<3>(this, generalData.telemetryBaudrate));
internalField.Append(new UnsignedField<3>(this, generalData.internalModuleBaudrate));
if (IS_FAMILY_HORUS_OR_T16(board))
internalField.Append(new SpareBitsField<3>(this));
else if (IS_TARANIS(board))
@@ -3369,8 +3369,11 @@ void OpenTxGeneralData::beforeExport()
chkSum = sum;
if (Boards::getCapability((Board::Type)generalData.variant, Board::SportMaxBaudRate) >= 400000)
generalData.telemetryBaudrate = (generalData.telemetryBaudrate + telemetryBaudratesList.size() - 1) % telemetryBaudratesList.size();
if (Boards::getCapability((Board::Type)generalData.variant,
Board::SportMaxBaudRate) >= 400000)
generalData.internalModuleBaudrate =
(generalData.internalModuleBaudrate + moduleBaudratesList.size() - 1) %
moduleBaudratesList.size();
}
void OpenTxGeneralData::afterImport()
@@ -3382,7 +3385,8 @@ void OpenTxGeneralData::afterImport()
}
}
if (Boards::getCapability((Board::Type)generalData.variant, Board::SportMaxBaudRate) >= 400000)
generalData.telemetryBaudrate = (generalData.telemetryBaudrate + 1) % telemetryBaudratesList.size();
if (Boards::getCapability((Board::Type)generalData.variant,
Board::SportMaxBaudRate) >= 400000)
generalData.internalModuleBaudrate =
(generalData.internalModuleBaudrate + 1) % moduleBaudratesList.size();
}
+22 -10
View File
@@ -96,7 +96,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
int btmodelid = editorItemModels->registerItemModel(GeneralSettings::bluetoothModeItemModel());
int auxmodelid = editorItemModels->registerItemModel(GeneralSettings::serialModeItemModel(GeneralSettings::SP_AUX1));
int vcpmodelid = editorItemModels->registerItemModel(GeneralSettings::serialModeItemModel(GeneralSettings::SP_VCP));
int baudmodelid = editorItemModels->registerItemModel(GeneralSettings::telemetryBaudrateItemModel());
int baudmodelid = editorItemModels->registerItemModel(GeneralSettings::internalModuleBaudrateItemModel());
id = editorItemModels->registerItemModel(ModuleData::internalModuleItemModel());
tabFilteredModels->registerItemModel(new FilteredItemModel(editorItemModels->getItemModel(id)), FIM_INTERNALMODULES);
@@ -182,16 +182,21 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
internalModule = new AutoComboBox(this);
internalModule->setModel(tabFilteredModels->getItemModel(FIM_INTERNALMODULES));
internalModule->setField(generalSettings.internalModule, this);
addParams(row, internalModule);
connect(internalModule, &AutoComboBox::currentDataChanged, this, &HardwarePanel::on_internalModuleChanged);
}
if (firmware->getCapability(HasTelemetryBaudrate)) {
addLabel(tr("Maximum Baud"), row, 0);
AutoComboBox *maxBaudRate = new AutoComboBox(this);
maxBaudRate->setModel(editorItemModels->getItemModel(baudmodelid));
maxBaudRate->setField(generalSettings.telemetryBaudrate, this);
addParams(row, maxBaudRate);
connect(internalModule, &AutoComboBox::currentDataChanged, this,
&HardwarePanel::on_internalModuleChanged);
internalModuleBaudRate = new AutoComboBox(this);
internalModuleBaudRate->setModel(editorItemModels->getItemModel(baudmodelid));
internalModuleBaudRate->setField(generalSettings.internalModuleBaudrate, this);
if (m_internalModule != MODULE_TYPE_GHOST && m_internalModule != MODULE_TYPE_CROSSFIRE) {
generalSettings.internalModuleBaudrate = 0;
internalModuleBaudRate->setVisible(false);
}
addParams(row, internalModule, internalModuleBaudRate);
row++;
}
// All values except 0 are mutually exclusive
@@ -275,6 +280,13 @@ void HardwarePanel::on_internalModuleChanged()
}
else {
m_internalModule = generalSettings.internalModule;
if (m_internalModule == MODULE_TYPE_GHOST || m_internalModule == MODULE_TYPE_CROSSFIRE) {
// TODO: set proper default baudrate
internalModuleBaudRate->setVisible(true);
} else {
generalSettings.internalModuleBaudrate = 0;
internalModuleBaudRate->setVisible(false);
}
emit internalModuleChanged();
}
}
+1
View File
@@ -48,6 +48,7 @@ class HardwarePanel : public GeneralPanel
QGridLayout *grid;
AutoComboBox *internalModule;
unsigned int m_internalModule = 0;
AutoComboBox *internalModuleBaudRate;
void addStick(int index, int & row);
void addPot(int index, int & row);