From f32e9625c26dc6ce07d0fdfa32756e1bcf21ef8e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 10 May 2019 00:08:46 +0200 Subject: [PATCH] X3 EEPROM / simulator support added --- companion/src/firmwares/boards.cpp | 4 +- companion/src/firmwares/boards.h | 5 +- .../src/firmwares/customfunctiondata.cpp | 4 +- companion/src/firmwares/eeprominterface.cpp | 4 +- companion/src/firmwares/modeldata.cpp | 2 +- .../src/firmwares/opentx/opentxeeprom.cpp | 111 ++++++++++++------ .../src/firmwares/opentx/opentxinterface.cpp | 5 + companion/src/firmwares/sensordata.h | 2 +- companion/src/modeledit/telemetry.cpp | 6 +- companion/src/modelprinter.cpp | 2 +- companion/src/multimodelprinter.cpp | 2 +- radio/src/targets/simu/opentxsimulator.cpp | 2 + 12 files changed, 99 insertions(+), 50 deletions(-) diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 614a14b6a..a5cdf9f55 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -231,7 +231,9 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability) return 4; case Pots: - if (IS_TARANIS_SMALL(board)) + if (IS_TARANIS_X3(board)) + return 1; + else if (IS_TARANIS_SMALL(board)) return 2; else if (IS_TARANIS_X9E(board)) return 4; diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 14319f38c..0c4846611 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -196,9 +196,8 @@ class Boards #define IS_TARANIS_X9D(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP) #define IS_TARANIS_PLUS(board) (board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E) #define IS_TARANIS_X9E(board) (board==Board::BOARD_TARANIS_X9E) -#define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X3(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_XLITES(board)) -#define IS_TARANIS_SMALL(board) (board==Board::BOARD_TARANIS_X7 || board==Board::BOARD_TARANIS_XLITE || board==Board::BOARD_TARANIS_XLITES || board==Board::BOARD_TARANIS_X3) -#define IS_TARANIS_NOT_X9E(board) (IS_TARANIS(board) && !IS_TARANIS_X9E(board)) +#define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X3(board) || IS_TARANIS_XLITE(board)) +#define IS_TARANIS_SMALL(board) (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X3(board)) #define IS_HORUS_X12S(board) (board==Board::BOARD_X12S) #define IS_HORUS_X10(board) (board==Board::BOARD_X10) #define IS_HORUS(board) (IS_HORUS_X12S(board) || IS_HORUS_X10(board)) diff --git a/companion/src/firmwares/customfunctiondata.cpp b/companion/src/firmwares/customfunctiondata.cpp index 882d115cd..02d2f9061 100644 --- a/companion/src/firmwares/customfunctiondata.cpp +++ b/companion/src/firmwares/customfunctiondata.cpp @@ -132,11 +132,11 @@ void CustomFunctionData::populateResetParams(const ModelData * model, QComboBox b->setCurrentIndex(value); } if (model && IS_ARM(board)) { - for (int i=0; isensorData[i].isAvailable()) { RawSource item = RawSource(SOURCE_TYPE_TELEMETRY, 3*i); b->addItem(item.toString(model), val+i); - if ((int)value == val+i) { + if (value == val+i) { b->setCurrentIndex(b->count()-1); } } diff --git a/companion/src/firmwares/eeprominterface.cpp b/companion/src/firmwares/eeprominterface.cpp index c00f0bdaf..c1aee1b7b 100644 --- a/companion/src/firmwares/eeprominterface.cpp +++ b/companion/src/firmwares/eeprominterface.cpp @@ -126,8 +126,8 @@ void EEPROMInterface::showEepromWarnings(QWidget *parent, const QString &title, // static QVector Firmware::registeredFirmwares; -Firmware * Firmware::defaultVariant = NULL; -Firmware * Firmware::currentVariant = NULL; +Firmware * Firmware::defaultVariant = nullptr; +Firmware * Firmware::currentVariant = nullptr; // static Firmware * Firmware::getFirmwareForId(const QString & id) diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index 5f1bf7358..fc53b5be8 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -229,7 +229,7 @@ void ModelData::clear() swashRingData.clear(); frsky.clear(); rssiAlarms.clear(); - for (int i=0; i= 218 ? 64 : 32) #define MAX_CUSTOM_FUNCTIONS(board, version) 64 -#define MAX_CURVES(board, version) (HAS_LARGE_LCD(board) ? 32 : 16) +#define MAX_CURVES(board, version) ((version >= 219 || HAS_LARGE_LCD(board)) ? 32 : 16) #define MAX_GVARS(board, version) 9 #define MAX_SCRIPTS(board) (IS_HORUS(board) ? 9 : 7) -#define MAX_TELEMETRY_SENSORS(board, version) (32) +#define MAX_TELEMETRY_SENSORS(board, version) (version <= 218 ? 32 : ((IS_HORUS(board) || IS_TARANIS_X9(board)) ? 60 : 40)) #define NUM_PPM_INPUTS(board, version) 16 #define ROTENC_COUNT(board, version) ((IS_STM32(board) && version >= 218) ? 0 : 1) #define MAX_AUX_TRIMS(board) (IS_HORUS(board) ? 2 : 0) @@ -84,7 +83,7 @@ class SwitchesConversionTable: public ConversionTable { } if (IS_HORUS_OR_TARANIS(board)) { - for (int i=1; i<=MAX_POTS(board, version)*6; i++) { + for (int i=1; i<=Boards::getCapability(board, Board::Pots)*6; i++) { addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i), val++); } @@ -118,7 +117,7 @@ class SwitchesConversionTable: public ConversionTable { if (version >= 218) { addConversion(RawSwitch(SWITCH_TYPE_TELEMETRY, -1), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_TELEMETRY, 1), val++); - for (int i=1; i<=CPN_MAX_SENSORS; i++) { + for (unsigned i=1; i<=CPN_MAX_SENSORS; i++) { addConversion(RawSwitch(SWITCH_TYPE_SENSOR, -i), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_SENSOR, i), val++); } @@ -206,7 +205,7 @@ class SourcesConversionTable: public ConversionTable { } } - for (int i=0; i(this, mix.speedDown)); if (IS_HORUS(board)) internalField.Append(new ZCharField<6>(this, mix.name)); - else if (HAS_LARGE_LCD(board)) + else if (HAS_LARGE_LCD(board) && version <= 218) internalField.Append(new ZCharField<8>(this, mix.name)); else internalField.Append(new ZCharField<6>(this, mix.name)); @@ -851,7 +850,7 @@ class InputField: public TransformedField { internalField.Append(new SpareBitsField<1>(this)); if (IS_HORUS(board)) internalField.Append(new ZCharField<6>(this, expo.name)); - else if (HAS_LARGE_LCD(board)) + else if (HAS_LARGE_LCD(board) && version <= 218) internalField.Append(new ZCharField<8>(this, expo.name)); else internalField.Append(new ZCharField<6>(this, expo.name)); @@ -1869,18 +1868,20 @@ class FrskyField: public StructField { telemetryVoltsSourceConversionTable(board, version), telemetryCurrentSourceConversionTable(board, version) { - rssiConversionTable[0] = RSSIConversionTable(0); - rssiConversionTable[1] = RSSIConversionTable(1); + if (version <= 218) { + rssiConversionTable[0] = RSSIConversionTable(0); + rssiConversionTable[1] = RSSIConversionTable(1); - if (!IS_HORUS(board)) { - Append(new UnsignedField<8>(this, frsky.voltsSource, "Volts Source")); - Append(new UnsignedField<8>(this, frsky.altitudeSource, "Altitude Source")); + if (!IS_HORUS(board)) { + Append(new UnsignedField<8>(this, frsky.voltsSource, "Volts Source")); + Append(new UnsignedField<8>(this, frsky.altitudeSource, "Altitude Source")); - for (int i = 0; i < 4; i++) { - Append(new UnsignedField<2>(this, frsky.screens[i].type)); - } - for (int i = 0; i < 4; i++) { - Append(new FrskyScreenField(this, frsky.screens[i], board, version, variant)); + for (int i = 0; i < 4; i++) { + Append(new UnsignedField<2>(this, frsky.screens[i].type)); + } + for (int i = 0; i < 4; i++) { + Append(new FrskyScreenField(this, frsky.screens[i], board, version, variant)); + } } } @@ -1890,11 +1891,13 @@ class FrskyField: public StructField { Append(new SignedField<8>(this, frsky.varioCenterMin)); Append(new SignedField<8>(this, frsky.varioMin)); Append(new SignedField<8>(this, frsky.varioMax)); - Append(new BoolField<1>(this, rssiAlarms.disabled)); - Append(new SpareBitsField<1>(this)); - Append(new ConversionField >(this, rssiAlarms.warning, -45)); - Append(new SpareBitsField<2>(this)); - Append(new ConversionField >(this, rssiAlarms.critical, -42)); + if (version <= 218) { + Append(new BoolField<1>(this, rssiAlarms.disabled)); + Append(new SpareBitsField<1>(this)); + Append(new ConversionField >(this, rssiAlarms.warning, -45)); + Append(new SpareBitsField<2>(this)); + Append(new ConversionField >(this, rssiAlarms.critical, -42)); + } } protected: @@ -2033,7 +2036,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig { sprintf(name, "Model %s", modelData.name); - qCDebug(eepromImport) << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant); + qDebug() << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant); if (IS_HORUS(board)) internalField.Append(new ZCharField<15>(this, modelData.name, "Model name")); @@ -2143,9 +2146,23 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig } } + // TODO rename to VARIO internalField.Append(new FrskyField(this, modelData.frsky, modelData.rssiAlarms, board, version, variant)); - if (IS_STM32(board)) { + if (version >= 219) { + // TODO RSSI SOURCE + internalField.Append(new SpareBitsField<8>(this)); + + if (IS_TARANIS_X9(board)) { + // TODO TOPBAR + internalField.Append(new SpareBitsField<16>(this)); + } + + // TODO RSSI ALARMS + internalField.Append(new SpareBitsField<16>(this)); + } + + if (IS_STM32(board) && version <= 218) { internalField.Append(new SpareBitsField<3>(this)); internalField.Append(new UnsignedField<3>(this, modelData.trainerMode)); internalField.Append(new UnsignedField<2>(this, modelData.potsWarningMode)); @@ -2155,7 +2172,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig internalField.Append(new UnsignedField<2>(this, modelData.potsWarningMode)); } - int modulesCount = 3; + int modulesCount = (version <= 218 ? 3 : 2); for (int module=0; module >(this, modelData.moduleData[module].protocol, &protocolsConversionTable, "Protocol", DataField::tr("OpenTX doesn't accept this radio protocol"))); internalField.Append(new SignedField<4>(this, subprotocols[module])); @@ -2164,13 +2181,37 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig internalField.Append(new UnsignedField<4>(this, modelData.moduleData[module].failsafeMode)); internalField.Append(new UnsignedField<3>(this, modelData.moduleData[module].subType)); internalField.Append(new BoolField<1>(this, modelData.moduleData[module].invertedSerial)); - for (int i=0; i<32; i++) { - internalField.Append(new SignedField<16>(this, modelData.moduleData[module].failsafeChannels[i])); + if (version <= 218) { + for (int i=0; i<32; i++) { + internalField.Append(new SignedField<16>(this, modelData.moduleData[module].failsafeChannels[i])); + } } internalField.Append(new ConversionField< SignedField<6> >(this, modelData.moduleData[module].ppm.delay, exportPpmDelay, importPpmDelay)); internalField.Append(new BoolField<1>(this, modelData.moduleData[module].ppm.pulsePol)); internalField.Append(new BoolField<1>(this, modelData.moduleData[module].ppm.outputType)); internalField.Append(new SignedField<8>(this, modelData.moduleData[module].ppm.frameLength)); + if (version >= 219) { + // TODO ACCESS + internalField.Append(new SpareBitsField<(1 + 3 * 8 - 2) * 8>(this)); + } + } + + if (version >= 219) { + for (int i = 0; i < 32; i++) { + internalField.Append(new SignedField<16>(this, modelData.moduleData[0].failsafeChannels[i])); + } + } + + if (version >= 219) { + // Trainer PPM settings + internalField.Append(new SpareBitsField<3>(this)); // TODO mode + internalField.Append(new SpareBitsField<5>(this)); + internalField.Append(new UnsignedField<8>(this, modelData.moduleData[2].channelsStart)); + internalField.Append(new ConversionField >(this, modelData.moduleData[2].channelsCount, -8)); + internalField.Append(new SignedField<8>(this, modelData.moduleData[2].ppm.frameLength)); + internalField.Append(new ConversionField >(this, modelData.moduleData[2].ppm.delay, exportPpmDelay, importPpmDelay)); + internalField.Append(new BoolField<1>(this, modelData.moduleData[2].ppm.pulsePol)); + internalField.Append(new SpareBitsField<1>(this)); } if (IS_TARANIS(board) && version < 218) { @@ -2210,13 +2251,13 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig } for (int i=0; i<8; i++) { - if (i < MAX_POTS(board, version)+MAX_SLIDERS(board)) + if (i < Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board)) internalField.Append(new BoolField<1>(this, modelData.potsWarningEnabled[i])); else internalField.Append(new SpareBitsField<1>(this)); } - for (int i=0; i < MAX_POTS(board, version)+MAX_SLIDERS(board); i++) { + for (int i=0; i < Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board); i++) { internalField.Append(new SignedField<8>(this, modelData.potPosition[i])); } @@ -2346,7 +2387,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type generalData(generalData), board(board), version(version), - inputsCount(CPN_MAX_STICKS+MAX_POTS(board, version)+MAX_SLIDERS(board)+MAX_MOUSE_ANALOGS(board)) + inputsCount(CPN_MAX_STICKS + Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board) + MAX_MOUSE_ANALOGS(board)) { qCDebug(eepromImport) << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant); @@ -2513,7 +2554,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } } for (int i=0; i<4; i++) { - if (i < MAX_POTS(board, version)) + if (i < Boards::getCapability(board, Board::Pots)) internalField.Append(new UnsignedField<2>(this, generalData.potConfig[i])); else internalField.Append(new SpareBitsField<2>(this)); @@ -2551,7 +2592,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type for (int i=0; i(this, generalData.stickName[i], "Stick name")); } - for (int i=0; i(this, generalData.potName[i], "Pot name")); } for (int i=0; i(this, generalData.stickName[i], "Stick name")); } - for (int i=0; i(this, generalData.potName[i], "Pot name")); } for (int i=0; i bool saveToByteArray(const T & dest, QByteArray & data) { + qDebug() << "ICI SAVE"; Board::Type board = getCurrentBoard(); foreach(OpenTxEepromInterface * eepromInterface, opentxEEpromInterfaces) { if (eepromInterface->getBoard() == board) { diff --git a/companion/src/firmwares/sensordata.h b/companion/src/firmwares/sensordata.h index 731609e9f..15b398fb8 100644 --- a/companion/src/firmwares/sensordata.h +++ b/companion/src/firmwares/sensordata.h @@ -23,7 +23,7 @@ #include -#define CPN_MAX_SENSORS 32 +constexpr unsigned CPN_MAX_SENSORS = 60; class SensorData { Q_DECLARE_TR_FUNCTIONS(SensorData) diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index a71fdc367..a06db920d 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -746,7 +746,7 @@ void populateTelemetrySourcesComboBox(AutoComboBox * cb, const ModelData * model } } cb->addItem("---", 0); - for (int i=1; i<=CPN_MAX_SENSORS; ++i) { + for (unsigned i=1; i<=CPN_MAX_SENSORS; ++i) { if (model->sensorData[i-1].isAvailable()) cb->addItem(model->sensorData[i-1].label, i); } @@ -834,7 +834,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin ui->varioCenterSilent->setField(model.frsky.varioCenterSilent, this); ui->A1GB->hide(); ui->A2GB->hide(); - for (int i=0; isensorsLayout->addWidget(panel); sensorPanels[i] = panel; @@ -899,7 +899,7 @@ void TelemetryPanel::update() } if (IS_ARM(firmware->getBoard())) { - for (int i=0; iupdate(); } } diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 1b3cddee9..385451905 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -1063,7 +1063,7 @@ QString ModelPrinter::printTelemetrySource(int val) { QStringList strings = QStringList() << tr("None"); - for (int i=1; i<=CPN_MAX_SENSORS; ++i) { + for (unsigned i=1; i<=CPN_MAX_SENSORS; ++i) { strings << QString("%1").arg(model.sensorData[i-1].label); } diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index 94038e17f..a9417df07 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -859,7 +859,7 @@ QString MultiModelPrinter::printSensors() int count = 0; columns.appendSectionTableStart(); columns.appendRowHeader(QStringList() << tr("Name") << tr("Type") << tr("Parameters")); - for (int i=0; isensorData[i].isAvailable()) { diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index e3b1e27c0..5e3d42ec7 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -614,6 +614,8 @@ class OpenTxSimulatorFactory: public SimulatorFactory return Board::BOARD_X10; #elif defined(PCBX7) return Board::BOARD_TARANIS_X7; +#elif defined(PCBX3) + return Board::BOARD_TARANIS_X3; #elif defined(PCBTARANIS) return Board::BOARD_TARANIS_X9D; #else