Skip to content

Commit

Permalink
feat(cpn): Radio types can reference any libsim and/or firmware downl…
Browse files Browse the repository at this point in the history
…oad id (#3432)

* Radio profiles reference any libsim and/or firmware download id

* Revert files filter for now
  • Loading branch information
Neil Horne authored May 7, 2023
1 parent 7a083fe commit f800447
Show file tree
Hide file tree
Showing 16 changed files with 185 additions and 95 deletions.
13 changes: 10 additions & 3 deletions companion/src/firmwares/eeprominterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,17 +286,19 @@ class Firmware
typedef QList<OptionsGroup> OptionsList;


explicit Firmware(const QString & id, const QString & name, Board::Type board) :
Firmware(nullptr, id, name, board)
explicit Firmware(const QString & id, const QString & name, Board::Type board, const QString & downloadId = QString(), const QString & simulatorId = QString()) :
Firmware(nullptr, id, name, board, downloadId, simulatorId)
{ }

explicit Firmware(Firmware * base, const QString & id, const QString & name, Board::Type board) :
explicit Firmware(Firmware * base, const QString & id, const QString & name, Board::Type board, const QString & downloadId = QString(), const QString & simulatorId = QString()) :
id(id),
name(name),
board(board),
variantBase(0),
base(base),
eepromInterface(nullptr),
downloadId(downloadId),
simulatorId(simulatorId),
analogInputNamesLookupTable(Boards::getAnalogNamesLookupTable(board)),
switchesLookupTable(Boards::getSwitchesLookupTable(board)),
trimSwitchesLookupTable(Boards::getTrimSwitchesLookupTable(board)),
Expand Down Expand Up @@ -432,13 +434,18 @@ class Firmware
STRINGTAGMAPPINGFUNCS(rawSourceSpecialTypesLookupTable, RawSourceSpecialTypes);
STRINGTAGMAPPINGFUNCS(rawSourceCyclicLookupTable, RawSourceCyclic);

const QString getDownloadId() { return getFirmwareBase()->downloadId.isEmpty() ? getFlavour() : getFirmwareBase()->downloadId; }
const QString getSimulatorId() { return getFirmwareBase()->simulatorId.isEmpty() ? getId() : getFirmwareBase()->simulatorId; }

protected:
QString id;
QString name;
Board::Type board;
unsigned int variantBase;
Firmware * base;
EEPROMInterface * eepromInterface;
QString downloadId;
QString simulatorId;

// used by YAML encode and decode
const StringTagMappingTable analogInputNamesLookupTable;
Expand Down
12 changes: 6 additions & 6 deletions companion/src/firmwares/opentx/opentxinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -784,14 +784,14 @@ int OpenTxFirmware::getCapability(::Capability capability)
IS_TARANIS_X7(board) || IS_JUMPER_TPRO(board) ||
IS_TARANIS_X9LITE(board) || IS_RADIOMASTER_TX12(board) ||
IS_RADIOMASTER_TX12_MK2(board) || IS_RADIOMASTER_ZORRO(board) ||
IS_RADIOMASTER_BOXER(board) || IS_RADIOMASTER_TX16S(board) ||
IS_RADIOMASTER_BOXER(board) || IS_RADIOMASTER_TX16S(board) ||
IS_JUMPER_T18(board));
case HasSoftwareSerialPower:
return IS_RADIOMASTER_TX16S(board);
case HasIntModuleMulti:
return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board) || IS_JUMPER_T18(board) ||
IS_RADIOMASTER_TX12(board) || IS_JUMPER_TLITE(board) || IS_BETAFPV_LR3PRO(board) ||
(IS_RADIOMASTER_ZORRO(board) && !id.contains("internalelrs")) ||
(IS_RADIOMASTER_ZORRO(board) && !id.contains("internalelrs")) ||
IS_RADIOMASTER_BOXER(board);
case HasIntModuleCRSF:
return id.contains("internalcrsf");
Expand Down Expand Up @@ -1199,14 +1199,14 @@ void registerOpenTxFirmwares()
OpenTxFirmware * firmware;

/* FrSky Taranis X9D+ board */
firmware = new OpenTxFirmware(FIRMWAREID("x9d+"), Firmware::tr("FrSky Taranis X9D+"), BOARD_TARANIS_X9DP);
firmware = new OpenTxFirmware(FIRMWAREID("x9d+"), Firmware::tr("FrSky Taranis X9D+"), BOARD_TARANIS_X9DP, "x9dp");
firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)"));
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3);

/* FrSky Taranis X9D+ 2019 board */
firmware = new OpenTxFirmware(FIRMWAREID("x9d+2019"), Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019);
firmware = new OpenTxFirmware(FIRMWAREID("x9d+2019"), Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019, "x9dp2019");
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
Expand Down Expand Up @@ -1246,7 +1246,7 @@ void registerOpenTxFirmwares()
addOpenTxRfOptions(firmware, EU + FLEX);

/* FrSky X7 Access board */
firmware = new OpenTxFirmware(FIRMWAREID("x7access"), Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS);
firmware = new OpenTxFirmware(FIRMWAREID("x7access"), Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS, "x7-access");
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
Expand All @@ -1272,7 +1272,7 @@ void registerOpenTxFirmwares()
addOpenTxRfOptions(firmware, EU + FLEX);

/* FrSky X10 Express board */
firmware = new OpenTxFirmware(FIRMWAREID("x10express"), Firmware::tr("FrSky Horus X10 Express / X10S Express"), BOARD_X10_EXPRESS);
firmware = new OpenTxFirmware(FIRMWAREID("x10express"), Firmware::tr("FrSky Horus X10 Express / X10S Express"), BOARD_X10_EXPRESS, "x10-access");
addOpenTxFrskyOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
Expand Down
6 changes: 3 additions & 3 deletions companion/src/firmwares/opentx/opentxinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,13 @@ class OpenTxFirmware: public Firmware

public:
OpenTxFirmware(const QString & id, OpenTxFirmware * parent):
Firmware(parent, id, parent->getName(), parent->getBoard())
Firmware(parent, id, parent->getName(), parent->getBoard(), parent->getDownloadId(), parent->getSimulatorId())
{
setEEpromInterface(parent->getEEpromInterface());
}

OpenTxFirmware(const QString & id, const QString & name, const Board::Type board):
Firmware(id, name, board)
OpenTxFirmware(const QString & id, const QString & name, const Board::Type board, const QString & downloadId = QString(), const QString & simulatorId = QString()):
Firmware(id, name, board, downloadId, simulatorId)
{
// Note: these align with the radio NOT computer locales - TODO harmonise with ISO and one list!!!
addLanguage("en");
Expand Down
6 changes: 3 additions & 3 deletions companion/src/helpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,8 @@ bool isSimulatorRunning() { return simulatorRunning; }

void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
{
QString fwId = SimulatorLoader::findSimulatorByFirmwareName(getCurrentFirmware()->getId());
if (fwId.isEmpty()) {
QString simulatorId = SimulatorLoader::findSimulatorByName(getCurrentFirmware()->getSimulatorId());
if (simulatorId.isEmpty()) {
QMessageBox::warning(NULL,
CPN_STR_TTL_WARNING,
QCoreApplication::translate("Companion", "Simulator for this firmware is not yet available"));
Expand All @@ -348,7 +348,7 @@ void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
simuData->setCurrentModel(modelIdx);
}

SimulatorMainWindow * dialog = new SimulatorMainWindow(parent, fwId, flags);
SimulatorMainWindow * dialog = new SimulatorMainWindow(parent, simulatorId, flags);
dialog->setWindowModality(Qt::ApplicationModal);
dialog->setAttribute(Qt::WA_DeleteOnClose);

Expand Down
11 changes: 8 additions & 3 deletions companion/src/simulation/simulator.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#define SIMULATOR_FLAGS_NOTX 0x01 // simulating a single model from Companion
#define SIMULATOR_FLAGS_STANDALONE 0x02 // started from stanalone simulator

#define SIMULATOR_OPTIONS_VERSION 2
#define SIMULATOR_OPTIONS_VERSION 3

namespace Simulator
{
Expand Down Expand Up @@ -129,13 +129,16 @@ struct SimulatorOptions
QByteArray windowState; // SimulatorMainWindow dock/toolbar/options UI state
QByteArray dbgConsoleState; // DebugOutput UI state
QByteArray radioOutputsState; // RadioOutputsWidget UI state
// added in v3
QString simulatorId;

quint16 loadedVersion() const { return m_version; } //! loaded structure definition version (0 if none/error)

friend QDataStream & operator << (QDataStream &out, const SimulatorOptions & o)
{
out << quint16(SIMULATOR_OPTIONS_VERSION) << o.startupDataType << o.firmwareId << o.dataFile << o.dataFolder
<< o.sdPath << o.windowGeometry << o.controlsState << o.lcdColor << o.windowState << o.dbgConsoleState << o.radioOutputsState;
<< o.sdPath << o.windowGeometry << o.controlsState << o.lcdColor << o.windowState << o.dbgConsoleState << o.radioOutputsState
<< o.simulatorId;
return out;
}

Expand All @@ -147,6 +150,8 @@ struct SimulatorOptions
>> o.sdPath >> o.windowGeometry >> o.controlsState >> o.lcdColor;
if (o.m_version >= 2)
in >> o.windowState >> o.dbgConsoleState >> o.radioOutputsState;
if (o.m_version >= 3)
in >> o.simulatorId;
}
else {
qWarning() << "Error loading SimulatorOptions, saved version not valid:" << o.m_version << "Expected <=" << SIMULATOR_OPTIONS_VERSION;
Expand Down Expand Up @@ -176,7 +181,7 @@ struct SimulatorOptions
friend QDebug operator << (QDebug d, const SimulatorOptions & o)
{
QDebugStateSaver saver(d);
d.nospace() << "SimulatorOptions: firmwareId=" << o.firmwareId << "; dataFile=" << o.dataFile << "; dataFolder=" << o.dataFolder
d.nospace() << "SimulatorOptions: firmwareId=" << o.firmwareId << "; simulatorId=" << o.simulatorId << "; dataFile=" << o.dataFile << "; dataFolder=" << o.dataFolder
<< "; sdPath=" << o.sdPath << "; startupDataType=" << o.startupDataType;
return d;
}
Expand Down
6 changes: 3 additions & 3 deletions companion/src/simulation/simulatorinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ void SimulatorLoader::unregisterSimulators()
delete lib;
}

QString SimulatorLoader::findSimulatorByFirmwareName(const QString & name)
QString SimulatorLoader::findSimulatorByName(const QString & name)
{
int pos;
QString ret;
Expand All @@ -133,7 +133,7 @@ QString SimulatorLoader::findSimulatorByFirmwareName(const QString & name)
SimulatorInterface * SimulatorLoader::loadSimulator(const QString & name)
{
SimulatorInterface * si = NULL;
QString libname = findSimulatorByFirmwareName(name);
QString libname = findSimulatorByName(name);

if (libname.isEmpty()) {
qWarning() << "Simulator" << name << "not found.";
Expand Down Expand Up @@ -166,7 +166,7 @@ bool SimulatorLoader::unloadSimulator(const QString & name)
{
bool ret = false;
#if SIMULATOR_INTERFACE_LOADER_DYNAMIC
QString simuName = findSimulatorByFirmwareName(name);
QString simuName = findSimulatorByName(name);
if (simuName.isEmpty())
return ret;

Expand Down
2 changes: 1 addition & 1 deletion companion/src/simulation/simulatorinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ class SimulatorLoader
static void registerSimulators();
static void unregisterSimulators();
static QStringList getAvailableSimulators();
static QString findSimulatorByFirmwareName(const QString & name);
static QString findSimulatorByName(const QString & name);
static SimulatorInterface * loadSimulator(const QString & name);
static bool unloadSimulator(const QString & name);

Expand Down
6 changes: 3 additions & 3 deletions companion/src/simulation/simulatormainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ extern AppData g; // ensure what "g" means

const quint16 SimulatorMainWindow::m_savedUiStateVersion = 2;

SimulatorMainWindow::SimulatorMainWindow(QWidget *parent, const QString & firmwareId, quint8 flags, Qt::WindowFlags wflags) :
SimulatorMainWindow::SimulatorMainWindow(QWidget *parent, const QString & simulatorId, quint8 flags, Qt::WindowFlags wflags) :
QMainWindow(parent, wflags),
ui(new Ui::SimulatorMainWindow),
m_simulatorWidget(NULL),
Expand All @@ -52,7 +52,7 @@ SimulatorMainWindow::SimulatorMainWindow(QWidget *parent, const QString & firmwa
m_telemetryDockWidget(NULL),
m_trainerDockWidget(NULL),
m_outputsDockWidget(NULL),
m_simulatorId(firmwareId),
m_simulatorId(simulatorId),
m_exitStatusCode(0),
m_radioProfileId(g.sessionId()),
m_radioSizeConstraint(Qt::Horizontal | Qt::Vertical),
Expand All @@ -61,7 +61,7 @@ SimulatorMainWindow::SimulatorMainWindow(QWidget *parent, const QString & firmwa
m_showMenubar(true)
{
if (m_simulatorId.isEmpty()) {
m_simulatorId = SimulatorLoader::findSimulatorByFirmwareName(getCurrentFirmware()->getId());
m_simulatorId = SimulatorLoader::findSimulatorByName(getCurrentFirmware()->getSimulatorId());
}
m_simulator = SimulatorLoader::loadSimulator(m_simulatorId);
if (!m_simulator) {
Expand Down
2 changes: 1 addition & 1 deletion companion/src/simulation/simulatormainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class SimulatorMainWindow : public QMainWindow
Q_OBJECT

public:
explicit SimulatorMainWindow(QWidget * parent, const QString & firmwareId = "", quint8 flags=0, Qt::WindowFlags wflags = Qt::WindowFlags());
explicit SimulatorMainWindow(QWidget * parent, const QString & simulatorId = "", quint8 flags=0, Qt::WindowFlags wflags = Qt::WindowFlags());
~SimulatorMainWindow();

int getExitStatus(QString * msg = Q_NULLPTR);
Expand Down
Loading

0 comments on commit f800447

Please sign in to comment.