fix: Serial/telemetry max baud rate wasn't being read/written correctly (#1570)

This commit is contained in:
Neil Horne
2022-03-08 11:36:29 +10:00
committed by GitHub
parent 3efbd6f886
commit f764dfcc2e
6 changed files with 53 additions and 12 deletions
+7
View File
@@ -493,6 +493,13 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case HasInternalModuleSupport:
return (IS_STM32(board) && !IS_TARANIS_X9(board));
case SportMaxBaudRate:
if (IS_FAMILY_T16(board) || IS_FLYSKY_NV14(board) || IS_TARANIS_X7_ACCESS(board) ||
(IS_TARANIS(board) && !IS_TARANIS_XLITE(board) && !IS_TARANIS_X7(board) && !IS_TARANIS_X9LITE(board)))
return 400000; // 400K and higher
else
return 250000; // less than 400K
default:
return 0;
}
+2 -1
View File
@@ -148,7 +148,8 @@ namespace Board {
HasColorLcd,
NumFunctionSwitches,
HasSDCard,
HasInternalModuleSupport
HasInternalModuleSupport,
SportMaxBaudRate
};
struct SwitchInfo
@@ -94,6 +94,32 @@ 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();
}
}
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();
}
}
};
namespace YAML
{
@@ -135,7 +161,10 @@ Node convert<GeneralSettings>::encode(const GeneralSettings& rhs)
node["timezone"] = rhs.timezone;
node["adjustRTC"] = (int)rhs.adjustRTC;
node["inactivityTimer"] = rhs.inactivityTimer;
node["telemetryBaudrate"] = rhs.telemetryBaudrate; // TODO: conversion???
YamlTelemetryBaudrate telemetryBaudrate(&rhs.telemetryBaudrate);
node["telemetryBaudrate"] = telemetryBaudrate.value;
node["internalModule"] = LookupValue(internalModuleLut, rhs.internalModule);
node["splashMode"] = rhs.splashMode; // TODO: B&W only
node["lightAutoOff"] = rhs.backlightDelay;
@@ -293,7 +322,10 @@ bool convert<GeneralSettings>::decode(const Node& node, GeneralSettings& rhs)
node["timezone"] >> rhs.timezone;
node["adjustRTC"] >> rhs.adjustRTC;
node["inactivityTimer"] >> rhs.inactivityTimer;
node["telemetryBaudrate"] >> rhs.telemetryBaudrate; // TODO: conversion???
YamlTelemetryBaudrate telemetryBaudrate;
node["telemetryBaudrate"] >> telemetryBaudrate.value;
telemetryBaudrate.toCpn(&rhs.telemetryBaudrate, rhs.variant);
if (node["internalModule"]) {
node["internalModule"] >> internalModuleLut >> rhs.internalModule;
+2 -9
View File
@@ -488,14 +488,7 @@ QString GeneralSettings::auxSerialModeToString(int value)
// static
QString GeneralSettings::telemetryBaudrateToString(int value)
{
switch(value) {
case 0:
return "400000";
case 1:
return "115200";
default:
return CPN_STR_UNKNOWN_ITEM;
}
return telemetryBaudratesList.value(value, CPN_STR_UNKNOWN_ITEM);
}
// static
@@ -572,7 +565,7 @@ AbstractStaticItemModel * GeneralSettings::telemetryBaudrateItemModel()
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName(AIM_GS_TELEMETRYBAUDRATE);
for (int i = 0; i <= 1; i++) {
for (int i = 0; i < telemetryBaudratesList.size(); i++) {
mdl->appendToItemList(telemetryBaudrateToString(i), i);
}
@@ -43,6 +43,8 @@ constexpr char AIM_GS_TELEMETRYBAUDRATE[] {"gs.telemetrybaudrate"};
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" });
enum UartModes {
UART_MODE_NONE,
UART_MODE_TELEMETRY_MIRROR,
@@ -3317,6 +3317,9 @@ void OpenTxGeneralData::beforeExport()
}
chkSum = sum;
if (Boards::getCapability((Board::Type)generalData.variant, Board::SportMaxBaudRate) >= 400000)
generalData.telemetryBaudrate = (generalData.telemetryBaudrate + telemetryBaudratesList.size() - 1) % telemetryBaudratesList.size();
}
void OpenTxGeneralData::afterImport()
@@ -3327,5 +3330,8 @@ void OpenTxGeneralData::afterImport()
RadioTheme::init(themeName, generalData.themeData);
}
}
if (Boards::getCapability((Board::Type)generalData.variant, Board::SportMaxBaudRate) >= 400000)
generalData.telemetryBaudrate = (generalData.telemetryBaudrate + 1) % telemetryBaudratesList.size();
}