[Companion][Firmware] Make Option struct a member; Add/use typedefs for options group and list; Use accessor functions for languages and options; Re-arrange fw options a little for better layout in UI; Remove dead code, cosmetics.

This commit is contained in:
Max Paperno
2018-09-19 06:47:36 -04:00
parent 13b156402f
commit b4d992f490
4 changed files with 130 additions and 146 deletions
+8 -8
View File
@@ -467,12 +467,12 @@ void AppPreferencesDialog::onFirmwareOptionChanged(bool state)
return;
// This de-selects any mutually exlusive options (that is, members of the same QList<Option> list).
const QList<QList<Option> > & fwOpts = getBaseFirmware()->opts;
for (const QList<Option> & opts : fwOpts) {
for (const Option & opt : opts) {
const Firmware::OptionsList & fwOpts = getBaseFirmware()->optionGroups();
for (const Firmware::OptionsGroup & optGrp : fwOpts) {
for (const Firmware::Option & opt : optGrp) {
if (cb->text() == opt.name) {
QCheckBox *ocb = nullptr;
foreach(const Option & other, opts)
foreach(const Firmware::Option & other, optGrp)
if (other.name != opt.name && (ocb = optionsCheckBoxes.value(other.name, nullptr)))
ocb->setChecked(false);
return;
@@ -498,7 +498,7 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
updateLock = true;
ui->langCombo->clear();
for (const char *lang : baseFw->languages) {
for (const char *lang : baseFw->languageList()) {
ui->langCombo->addItem(lang);
if (currLang == lang) {
ui->langCombo->setCurrentIndex(ui->langCombo->count() - 1);
@@ -521,8 +521,8 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
int index = 0;
QWidget * prevFocus = ui->langCombo;
for (const QList<Option> &opts : qAsConst(baseFw->opts)) {
for (const Option &opt : opts) {
for (const Firmware::OptionsGroup &optGrp : baseFw->optionGroups()) {
for (const Firmware::Option &opt : optGrp) {
QCheckBox * cb = new QCheckBox(ui->profileTab);
cb->setText(opt.name);
cb->setToolTip(opt.tooltip);
@@ -530,7 +530,7 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
ui->optionsLayout->addWidget(cb, index / 4, index % 4);
QWidget::setTabOrder(prevFocus, cb);
// connect to duplicates check handler if this option is part of a group
if (opts.size() > 1)
if (optGrp.size() > 1)
connect(cb, &QCheckBox::toggled, this, &AppPreferencesDialog::onFirmwareOptionChanged);
optionsCheckBoxes.insert(opt.name, cb);
prevFocus = cb;
+16 -22
View File
@@ -142,25 +142,13 @@ Firmware * Firmware::getFirmwareForId(const QString & id)
return defaultVariant;
}
void Firmware::addOption(const char *option, QString tooltip, uint32_t variant)
{
Option options[] = { { option, tooltip, variant }, { NULL } };
addOptions(options);
}
void Firmware::addOption(const Option & option)
{
Option options[] = { option, { NULL } };
addOptions(options);
}
unsigned int Firmware::getVariantNumber()
{
unsigned int result = 0;
const Firmware * base = getFirmwareBase();
QStringList options = id.mid(base->getId().length()+1).split("-", QString::SkipEmptyParts);
foreach(QString option, options) {
foreach(QList<Option> group, base->opts) {
foreach(OptionsGroup group, base->opts) {
foreach(Option opt, group) {
if (opt.name == option) {
result += opt.variant;
@@ -171,21 +159,27 @@ unsigned int Firmware::getVariantNumber()
return result;
}
void Firmware::addLanguage(const char *lang)
void Firmware::addLanguage(const char * lang)
{
languages.push_back(lang);
}
void Firmware::addTTSLanguage(const char *lang)
//void Firmware::addTTSLanguage(const char * lang)
//{
// ttslanguages.push_back(lang);
//}
void Firmware::addOption(const char * option, const QString & tooltip, unsigned variant)
{
ttslanguages.push_back(lang);
addOption(Option(option, tooltip, variant));
}
void Firmware::addOptions(Option options[])
void Firmware::addOption(const Option & option)
{
QList<Option> opts;
for (int i=0; options[i].name; i++) {
opts.push_back(options[i]);
}
this->opts.push_back(opts);
addOptionsGroup({option});
}
void Firmware::addOptionsGroup(const OptionsGroup & options)
{
this->opts.append(options);
}
+37 -39
View File
@@ -244,40 +244,37 @@ enum EepromLoadErrors {
NUM_ERRORS
};
struct Option {
const char * name;
QString tooltip;
uint32_t variant;
};
class Firmware
{
Q_DECLARE_TR_FUNCTIONS(Firmware)
public:
Firmware(const QString & id, const QString & name, Board::Type board):
id(id),
name(name),
board(board),
variantBase(0),
base(NULL),
eepromInterface(NULL)
{
}
struct Option {
const char * name = nullptr;
QString tooltip;
unsigned variant = 0;
Firmware(Firmware * base, const QString & id, const QString & name, Board::Type board):
explicit Option(const char * name, const QString & description, unsigned variant = 0) :
name(name), tooltip(description), variant(variant) { }
};
typedef QList<Option> OptionsGroup;
typedef QList<OptionsGroup> OptionsList;
explicit Firmware(const QString & id, const QString & name, Board::Type board) :
Firmware(nullptr, id, name, board)
{ }
explicit Firmware(Firmware * base, const QString & id, const QString & name, Board::Type board) :
id(id),
name(name),
board(board),
variantBase(0),
base(base),
eepromInterface(NULL)
{
}
eepromInterface(nullptr)
{ }
virtual ~Firmware()
{
}
virtual ~Firmware() { }
inline const Firmware * getFirmwareBase() const
{
@@ -288,15 +285,15 @@ class Firmware
unsigned int getVariantNumber();
virtual void addLanguage(const char *lang);
virtual void addLanguage(const char * lang);
virtual void addTTSLanguage(const char *lang);
//virtual void addTTSLanguage(const char * lang);
virtual void addOption(const char *option, QString tooltip="", uint32_t variant=0);
virtual void addOption(const char * option, const QString & tooltip = QString(), unsigned variant = 0);
virtual void addOption(const Option &option);
virtual void addOption(const Option & option);
virtual void addOptions(Option options[]);
virtual void addOptionsGroup(const OptionsGroup & options);
virtual QString getStampUrl() = 0;
@@ -329,6 +326,16 @@ class Firmware
return id;
}
QList<const char *> languageList() const
{
return languages;
}
OptionsList optionGroups() const
{
return opts;
}
virtual int getCapability(Capability) = 0;
virtual QString getAnalogInputName(unsigned int index) = 0;
@@ -370,12 +377,6 @@ class Firmware
currentVariant = value;
}
public:
QList<const char *> languages;
QList<const char *> ttslanguages;
QList< QList<Option> > opts;
protected:
QString id;
QString name;
@@ -383,14 +384,13 @@ class Firmware
unsigned int variantBase;
Firmware * base;
EEPROMInterface * eepromInterface;
QList<const char *> languages;
//QList<const char *> ttslanguages;
OptionsList opts;
static QVector<Firmware *> registeredFirmwares;
static Firmware * defaultVariant;
static Firmware * currentVariant;
private:
Firmware();
};
inline Firmware * getCurrentFirmware()
@@ -422,7 +422,5 @@ inline int calcRESXto100(int x)
extern QList<EEPROMInterface *> eepromInterfaces;
bool loadFile(RadioData & radioData, const QString & filename);
#endif // _EEPROMINTERFACE_H_
@@ -41,12 +41,7 @@
using namespace Board;
template<typename T, size_t N>
inline
size_t SizeOfArray(T(&)[N])
{
return N;
}
QList<OpenTxEepromInterface *> opentxEEpromInterfaces;
OpenTxEepromInterface::OpenTxEepromInterface(OpenTxFirmware * firmware):
EEPROMInterface(firmware->getBoard()),
@@ -1065,71 +1060,9 @@ QString OpenTxFirmware::getStampUrl()
return getFirmwareBaseUrl() % QStringLiteral("stamp-opentx.txt");
}
void addOpenTxCommonOptions(OpenTxFirmware * firmware)
{
firmware->addOption("ppmus", Firmware::tr("Channel values displayed in us"));
firmware->addOption("nooverridech", Firmware::tr("No OverrideCH functions available"));
Option fai_options[] = {{"faichoice", Firmware::tr("Possibility to enable FAI MODE (no telemetry) at field")},
{"faimode", Firmware::tr("FAI MODE (no telemetry) always enabled")},
{NULL}};
firmware->addOptions(fai_options);
}
void addOpenTxRfOptions(OpenTxFirmware * firmware, bool mm, bool eu, bool flex)
{
Option opt_eu = {"eu", Firmware::tr("Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015")};
Option opt_fl = {"flexr9m", Firmware::tr("Enable non certified firmwares")};
Option opt_mm = {"multimodule", Firmware::tr("Support for the DIY-Multiprotocol-TX-Module")};
if (mm)
firmware->addOption(opt_mm);
if (eu && flex) {
Option options[] = { opt_eu, opt_fl, { NULL } };
firmware->addOptions(options);
}
else if (eu) {
firmware->addOption(opt_eu);
}
}
void addOpenTxFontOptions(OpenTxFirmware * firmware)
{
firmware->addOption("sqt5font", Firmware::tr("Use alternative SQT5 font"));
}
void addOpenTxArm9xOptions(OpenTxFirmware * firmware)
{
firmware->addOption("heli", Firmware::tr("Enable HELI menu and cyclic mix support"));
firmware->addOption("gvars", Firmware::tr("Global variables"), GVARS_VARIANT);
firmware->addOption("potscroll", Firmware::tr("Pots use in menus navigation"));
firmware->addOption("autosource", Firmware::tr("In model setup menus automatically set source by moving the control"));
firmware->addOption("autoswitch", Firmware::tr("In model setup menus automatically set switch by moving the control"));
firmware->addOption("nographics", Firmware::tr("No graphical check boxes and sliders"));
firmware->addOption("battgraph", Firmware::tr("Battery graph"));
firmware->addOption("nobold", Firmware::tr("Don't use bold font for highlighting active items"));
//firmware->addOption("bluetooth", Firmware::tr("Bluetooth interface"));
addOpenTxRfOptions(firmware, true, true, false);
addOpenTxFontOptions(firmware);
addOpenTxCommonOptions(firmware);
}
void addOpenTxFrskyOptions(OpenTxFirmware * firmware)
{
addOpenTxCommonOptions(firmware);
firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support"));
firmware->addOption("nogvars", Firmware::tr("Disable Global variables"));
firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
firmware->addOption("luac", Firmware::tr("Enable Lua compiler"));
addOpenTxRfOptions(firmware, true, true, true);
}
void addOpenTxTaranisOptions(OpenTxFirmware * firmware)
{
firmware->addOption("internalppm", Firmware::tr("Support for PPM internal module hack"));
addOpenTxFrskyOptions(firmware);
addOpenTxFontOptions(firmware);
}
QList<OpenTxEepromInterface *> opentxEEpromInterfaces;
// Firmware registrations
// NOTE: "recognized" build options are defined in /radio/util/fwoptions.py
void registerOpenTxFirmware(OpenTxFirmware * firmware, bool deprecated = false)
{
@@ -1141,6 +1074,69 @@ void registerOpenTxFirmware(OpenTxFirmware * firmware, bool deprecated = false)
Firmware::addRegisteredFirmware(firmware);
}
void addOpenTxCommonOptions(OpenTxFirmware * firmware)
{
static const Firmware::OptionsGroup fai_options = {
Firmware::Option("faichoice", Firmware::tr("Possibility to enable FAI MODE (no telemetry) at field")),
Firmware::Option("faimode", Firmware::tr("FAI MODE (no telemetry) always enabled"))
};
firmware->addOption("ppmus", Firmware::tr("Channel values displayed in us"));
firmware->addOptionsGroup(fai_options);
firmware->addOption("nooverridech", Firmware::tr("No OverrideCH functions available"));
}
void addOpenTxRfOptions(OpenTxFirmware * firmware, bool flex = true)
{
static const Firmware::Option opt_eu("eu", Firmware::tr("Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015"));
static const Firmware::Option opt_fl("flexr9m", Firmware::tr("Enable non certified firmwares"));
firmware->addOption("multimodule", Firmware::tr("Support for the DIY-Multiprotocol-TX-Module"));
if (flex)
firmware->addOptionsGroup({opt_eu, opt_fl});
else
firmware->addOption(opt_eu);
}
void addOpenTxFontOptions(OpenTxFirmware * firmware)
{
firmware->addOption("sqt5font", Firmware::tr("Use alternative SQT5 font"));
}
void addOpenTxFrskyOptions(OpenTxFirmware * firmware)
{
addOpenTxCommonOptions(firmware);
firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support"));
firmware->addOption("nogvars", Firmware::tr("Disable Global variables"));
firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
firmware->addOption("luac", Firmware::tr("Enable Lua compiler"));
addOpenTxRfOptions(firmware);
}
void addOpenTxTaranisOptions(OpenTxFirmware * firmware, bool intppm = true)
{
addOpenTxFrskyOptions(firmware);
if (intppm)
firmware->addOption("internalppm", Firmware::tr("Support for PPM internal module hack"));
addOpenTxFontOptions(firmware);
}
void addOpenTxArm9xOptions(OpenTxFirmware * firmware, bool dblkeys = true)
{
addOpenTxCommonOptions(firmware);
firmware->addOption("heli", Firmware::tr("Enable HELI menu and cyclic mix support"));
firmware->addOption("gvars", Firmware::tr("Global variables"), GVARS_VARIANT);
firmware->addOption("potscroll", Firmware::tr("Pots use in menus navigation"));
firmware->addOption("autosource", Firmware::tr("In model setup menus automatically set source by moving the control"));
firmware->addOption("autoswitch", Firmware::tr("In model setup menus automatically set switch by moving the control"));
firmware->addOption("nographics", Firmware::tr("No graphical check boxes and sliders"));
firmware->addOption("battgraph", Firmware::tr("Battery graph"));
firmware->addOption("nobold", Firmware::tr("Don't use bold font for highlighting active items"));
//firmware->addOption("bluetooth", Firmware::tr("Bluetooth interface"));
if (dblkeys)
firmware->addOption("dblkeys", Firmware::tr("Enable resetting values by pressing up and down at the same time"));
addOpenTxFontOptions(firmware);
addOpenTxRfOptions(firmware, false);
}
void registerOpenTxFirmwares()
{
OpenTxFirmware * firmware;
@@ -1166,15 +1162,13 @@ void registerOpenTxFirmwares()
/* FrSky X7 board */
firmware = new OpenTxFirmware("opentx-x7", Firmware::tr("FrSky Taranis X7 / X7S"), BOARD_TARANIS_X7);
addOpenTxFrskyOptions(firmware);
addOpenTxFontOptions(firmware);
addOpenTxTaranisOptions(firmware, false);
registerOpenTxFirmware(firmware);
/* FrSky X-Lite board */
firmware = new OpenTxFirmware("opentx-xlite", Firmware::tr("FrSky Taranis X-Lite"), BOARD_TARANIS_XLITE);
// firmware->addOption("stdr9m", Firmware::tr("Use JR-sized R9M module"));
addOpenTxFrskyOptions(firmware);
addOpenTxFontOptions(firmware);
addOpenTxTaranisOptions(firmware, false);
registerOpenTxFirmware(firmware);
/* FrSky X10 board */
@@ -1190,13 +1184,12 @@ void registerOpenTxFirmwares()
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
addOpenTxArm9xOptions(firmware);
addOpenTxArm9xOptions(firmware, false);
registerOpenTxFirmware(firmware);
/* ar9x board */
firmware = new OpenTxFirmware("opentx-ar9x", Firmware::tr("9X with AR9X board"), BOARD_AR9X);
addOpenTxArm9xOptions(firmware);
firmware->addOption("dblkeys", Firmware::tr("Enable resetting values by pressing up and down at the same time"));
//firmware->addOption("rtc", Firmware::tr("Optional RTC added"));
//firmware->addOption("volume", Firmware::tr("i2c volume control added"));
registerOpenTxFirmware(firmware);
@@ -1204,7 +1197,6 @@ void registerOpenTxFirmwares()
/* Sky9x board */
firmware = new OpenTxFirmware("opentx-sky9x", Firmware::tr("9X with Sky9x board"), BOARD_SKY9X);
addOpenTxArm9xOptions(firmware);
firmware->addOption("dblkeys", Firmware::tr("Enable resetting values by pressing up and down at the same time"));
registerOpenTxFirmware(firmware);
// These are kept only for import purposes, marked as deprecated to hide from UI.