From 70cfbbd646862fa1bf43b182417f1b672095050d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 10 Feb 2017 17:17:52 +0100 Subject: [PATCH] Bsongis/issue 4400 (#4425) * Cosmetics before fixing #4400 * Cosmetics before fixing #4400 * Now one more conversion issue (SF => SH sources conversion from X9D to X7) I don't know what is exactly the conversion issue as I don't have the original EEPROM, but I used this one for my tests, so I fix it * Now we display correctly the corrupted mixers list so that copy/paste will work correctly (it was not consistent) + some cosmetics * Test removed too quickly * One global removed ;) --- companion/src/eepromimportexport.h | 147 +- companion/src/eeprominterface.cpp | 2 - companion/src/eeprominterface.h | 2 - .../src/firmwares/opentx/opentxeeprom.cpp | 1542 +++++++++-------- companion/src/firmwares/opentx/opentxeeprom.h | 27 +- .../src/firmwares/opentx/opentxinterface.cpp | 80 +- .../src/firmwares/opentx/opentxinterface.h | 8 +- companion/src/flasheepromdialog.cpp | 3 +- companion/src/mainwindow.cpp | 6 +- companion/src/mdichild.cpp | 3 +- companion/src/modeledit/CMakeLists.txt | 4 +- companion/src/modeledit/inputs.cpp | 2 +- companion/src/modeledit/inputs.h | 4 +- .../{mixerslist.cpp => mixerslistwidget.cpp} | 16 +- .../{mixerslist.h => mixerslistwidget.h} | 10 +- companion/src/modeledit/mixes.cpp | 89 +- companion/src/modeledit/mixes.h | 5 +- companion/src/radiodata.cpp | 19 + companion/src/storage/bineeprom.cpp | 1 + companion/src/storage/firmwareinterface.cpp | 6 +- companion/src/storage/firmwareinterface.h | 2 +- companion/src/storage/storage.cpp | 3 +- 22 files changed, 1020 insertions(+), 961 deletions(-) rename companion/src/modeledit/{mixerslist.cpp => mixerslistwidget.cpp} (89%) rename companion/src/modeledit/{mixerslist.h => mixerslistwidget.h} (91%) diff --git a/companion/src/eepromimportexport.h b/companion/src/eepromimportexport.h index fd9e9f99d..56e2f711a 100644 --- a/companion/src/eepromimportexport.h +++ b/companion/src/eepromimportexport.h @@ -26,15 +26,24 @@ class DataField { public: - DataField(const char *name=""): + DataField(DataField * parent, const char * name=""): + parent(parent), name(name) { } - virtual const char *getName() { return name; } - virtual ~DataField() { } + + virtual ~DataField() + { + } + + virtual const char * getName() + { + return name; + } + + virtual unsigned int size() = 0; virtual void ExportBits(QBitArray & output) = 0; virtual void ImportBits(const QBitArray & input) = 0; - virtual unsigned int size() = 0; QBitArray bytesToBits(QByteArray bytes) { @@ -99,13 +108,24 @@ class DataField { } protected: - const char *name; + virtual void setError(const QString & error) + { + if (parent) { + parent->setError(error); + } + else { + qWarning() << qPrintable(error); + } + } + + DataField * parent; + const char * name; }; class ProxyField: public DataField { public: - ProxyField(): - DataField("Proxy") + explicit ProxyField(DataField * parent): + DataField(parent, "Proxy") { } @@ -116,24 +136,24 @@ class ProxyField: public DataField { template class BaseUnsignedField: public DataField { public: - explicit BaseUnsignedField(container & field): - DataField("Unsigned"), + BaseUnsignedField(DataField * parent, container & field): + DataField(parent, "Unsigned"), field(field), min(0), max(std::numeric_limits::max()) { } - BaseUnsignedField(container & field, const char * name): - DataField(name), + BaseUnsignedField(DataField * parent, container & field, const char * name): + DataField(parent, name), field(field), min(0), max(std::numeric_limits::max()) { } - BaseUnsignedField(container & field, container min, container max, const char * name="Unsigned"): - DataField(name), + BaseUnsignedField(DataField * parent, container & field, container min, container max, const char * name="Unsigned"): + DataField(parent, name), field(field), min(min), max(max) @@ -182,18 +202,18 @@ template class UnsignedField : public BaseUnsignedField { public: - explicit UnsignedField(unsigned int & field): - BaseUnsignedField(field) + UnsignedField(DataField * parent, unsigned int & field): + BaseUnsignedField(parent, field) { } - UnsignedField(unsigned int & field, const char *name): - BaseUnsignedField(field, name) + UnsignedField(DataField * parent, unsigned int & field, const char *name): + BaseUnsignedField(parent, field, name) { } - UnsignedField(unsigned int & field, unsigned int min, unsigned int max, const char *name="Unsigned"): - BaseUnsignedField(field, min, max, name) + UnsignedField(DataField * parent, unsigned int & field, unsigned int min, unsigned int max, const char *name="Unsigned"): + BaseUnsignedField(parent, field, min, max, name) { } }; @@ -201,8 +221,8 @@ class UnsignedField : public BaseUnsignedField template class BoolField: public DataField { public: - explicit BoolField(bool & field): - DataField("Bool"), + explicit BoolField(DataField * parent, bool & field): + DataField(parent, "Bool"), field(field) { } @@ -236,24 +256,24 @@ class BoolField: public DataField { template class SignedField: public DataField { public: - SignedField(int & field): - DataField("Signed"), + SignedField(DataField * parent, int & field): + DataField(parent, "Signed"), field(field), min(INT_MIN), max(INT_MAX) { } - SignedField(int & field, const char *name): - DataField(name), + SignedField(DataField * parent, int & field, const char *name): + DataField(parent, name), field(field), min(INT_MIN), max(INT_MAX) { } - SignedField(int & field, int min, int max, const char *name="Signed"): - DataField(name), + SignedField(DataField * parent, int & field, int min, int max, const char *name="Signed"): + DataField(parent, name), field(field), min(min), max(max) @@ -305,8 +325,8 @@ class SignedField: public DataField { template class SpareBitsField: public UnsignedField { public: - SpareBitsField(): - UnsignedField(spare, 0, 0, "Spare"), + SpareBitsField(DataField * parent): + UnsignedField(parent, spare, 0, 0, "Spare"), spare(0) { } @@ -317,8 +337,8 @@ class SpareBitsField: public UnsignedField { template class CharField: public DataField { public: - CharField(char * field, bool truncate=true, const char * name="Char"): - DataField(name), + CharField(DataField * parent, char * field, bool truncate=true, const char * name="Char"): + DataField(parent, name), field(field), truncate(truncate) { @@ -368,8 +388,8 @@ char idx2char(int8_t idx); template class ZCharField: public DataField { public: - ZCharField(char * field, const char * name = "ZChar"): - DataField(name), + ZCharField(DataField * parent, char * field, const char * name = "ZChar"): + DataField(parent, name), field(field) { } @@ -421,18 +441,18 @@ class ZCharField: public DataField { class StructField: public DataField { public: - StructField(const char * name="Struct"): - DataField(name) + StructField(DataField * parent, const char * name="Struct"): + DataField(parent, name) { } ~StructField() { - foreach(DataField *field, fields) { + foreach(DataField * field, fields) { delete field; } } - inline void Append(DataField *field) { + inline void Append(DataField * field) { //eepromImportDebug() << QString("StructField(%1) appending field: %2").arg(name).arg(field->getName()); fields.append(field); } @@ -488,8 +508,8 @@ class StructField: public DataField { class TransformedField: public DataField { public: - TransformedField(DataField & field): - DataField(), + TransformedField(DataField * parent, DataField & field): + DataField(parent), field(field) { } @@ -512,7 +532,7 @@ class TransformedField: public DataField { } - virtual const char *getName() + virtual const char * getName() { return field.getName(); } @@ -607,9 +627,9 @@ class ConversionTable { template class ConversionField: public TransformedField { public: - ConversionField(int & field, ConversionTable *table, const char *name, const QString & error = ""): - TransformedField(internalField), - internalField(_field, name), + ConversionField(DataField * parent, int & field, ConversionTable *table, const char *name, const QString & error = ""): + TransformedField(parent, internalField), + internalField(this, _field, name), field(field), _field(0), table(table), @@ -623,9 +643,9 @@ class ConversionField: public TransformedField { { } - ConversionField(unsigned int & field, ConversionTable *table, const char *name, const QString & error = ""): - TransformedField(internalField), - internalField((unsigned int &)_field, name), + ConversionField(DataField * parent, unsigned int & field, ConversionTable *table, const char *name, const QString & error = ""): + TransformedField(parent, internalField), + internalField(this, (unsigned int &)_field, name), field((int &)field), _field(0), table(table), @@ -639,9 +659,9 @@ class ConversionField: public TransformedField { { } - ConversionField(int & field, int (*exportFunc)(int), int (*importFunc)(int)): - TransformedField(internalField), - internalField(_field), + ConversionField(DataField * parent, int & field, int (*exportFunc)(int), int (*importFunc)(int)): + TransformedField(parent, internalField), + internalField(this, _field), field(field), _field(0), table(NULL), @@ -655,9 +675,9 @@ class ConversionField: public TransformedField { { } - ConversionField(int & field, int shift, int scale=0, int min=INT_MIN, int max=INT_MAX, const char *name = "Signed shifted"): - TransformedField(internalField), - internalField(_field, name), + ConversionField(DataField * parent, int & field, int shift, int scale=0, int min=INT_MIN, int max=INT_MAX, const char *name = "Signed shifted"): + TransformedField(parent, internalField), + internalField(this, _field, name), field(field), _field(0), table(NULL), @@ -671,9 +691,9 @@ class ConversionField: public TransformedField { { } - ConversionField(unsigned int & field, int shift, int scale=0): - TransformedField(internalField), - internalField((unsigned int &)_field), + ConversionField(DataField * parent, unsigned int & field, int shift, int scale=0): + TransformedField(parent, internalField), + internalField(this, (unsigned int &)_field), field((int &)field), _field(0), table(NULL), @@ -696,16 +716,19 @@ class ConversionField: public TransformedField { } if (table) { - if (table->exportValue(_field, _field)) - return; - if (!error.isEmpty()) - EEPROMWarnings.push_back(error); + if (!table->exportValue(_field, _field)) { + setError(error.isEmpty() ? QObject::tr("Conversion error on field %1").arg(name) : error); + } + return; } if (shift) { - if (_field < min) _field = min + shift; - else if (_field > max) _field = max + shift; - else _field += shift; + if (_field < min) + _field = min + shift; + else if (_field > max) + _field = max + shift; + else + _field += shift; } if (exportFunc) { diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index 3923938a1..5efec398c 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -35,8 +35,6 @@ #include #include -std::list EEPROMWarnings; - const uint8_t chout_ar[] = { // First number is 0..23 -> template setup, Second is relevant channel out 1,2,3,4 , 1,2,4,3 , 1,3,2,4 , 1,3,4,2 , 1,4,2,3 , 1,4,3,2, 2,1,3,4 , 2,1,4,3 , 2,3,1,4 , 2,3,4,1 , 2,4,1,3 , 2,4,3,1, diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index ea677dd1a..3279e187d 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -180,8 +180,6 @@ class EEPROMInterface }; -extern std::list EEPROMWarnings; - /* EEPROM string conversion functions */ void setEEPROMString(char *dst, const char *src, int size); void getEEPROMString(char *dst, const char *src, int size); diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index c5fdaa85b..6a48aa968 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -416,9 +416,9 @@ void OpenTxEepromCleanup(void) template class SwitchField: public ConversionField< SignedField > { public: - SwitchField(RawSwitch & sw, Board::Type board, unsigned int version, unsigned long flags=0): - ConversionField< SignedField >(_switch, SwitchesConversionTable::getInstance(board, version, flags), QObject::tr("Switch").toLatin1(), - QObject::tr("Switch ").toLatin1()+ sw.toString(board) + QObject::tr(" cannot be exported on this board!").toLatin1()), + SwitchField(DataField * parent, RawSwitch & sw, Board::Type board, unsigned int version, unsigned long flags=0): + ConversionField< SignedField >(parent, _switch, SwitchesConversionTable::getInstance(board, version, flags), QObject::tr("Switch").toLatin1(), + QObject::tr("Switch ").toLatin1() + sw.toString(board) + QObject::tr(" cannot be exported on this board!").toLatin1()), sw(sw), _switch(0), board(board) @@ -541,8 +541,8 @@ class TelemetrySourcesConversionTable: public ConversionTable { template class TelemetrySourceField: public ConversionField< UnsignedField > { public: - TelemetrySourceField(RawSource & source, Board::Type board, unsigned int version): - ConversionField< UnsignedField >(_source, &conversionTable, "Telemetry source"), + TelemetrySourceField(DataField * parent, RawSource & source, Board::Type board, unsigned int version): + ConversionField< UnsignedField >(parent, _source, &conversionTable, "Telemetry source"), conversionTable(board, version), source(source), board(board), @@ -579,8 +579,8 @@ class TelemetrySourceField: public ConversionField< UnsignedField > { template class SourceField: public ConversionField< UnsignedField > { public: - SourceField(RawSource & source, Board::Type board, unsigned int version, unsigned int variant, unsigned long flags=0): - ConversionField< UnsignedField >(_source, SourcesConversionTable::getInstance(board, version, variant, flags), + SourceField(DataField * parent, RawSource & source, Board::Type board, unsigned int version, unsigned int variant, unsigned long flags=0): + ConversionField< UnsignedField >(parent, _source, SourcesConversionTable::getInstance(board, version, variant, flags), "Source", QObject::tr("Source %1 cannot be exported on this board!").arg(source.toString())), source(source), _source(0) @@ -733,14 +733,15 @@ void importGvarParam(int & gvar, const int _gvar, int version) class CurveReferenceField: public TransformedField { public: - CurveReferenceField(CurveReference & curve, Board::Type board, unsigned int version): - TransformedField(internalField), + CurveReferenceField(DataField * parent, CurveReference & curve, Board::Type board, unsigned int version): + TransformedField(parent, internalField), + internalField(this), curve(curve), _curve_type(0), _curve_value(0) { - internalField.Append(new UnsignedField<8>(_curve_type)); - internalField.Append(new SignedField<8>(_curve_value)); + internalField.Append(new UnsignedField<8>(this, _curve_type)); + internalField.Append(new SignedField<8>(this, _curve_value)); } virtual void beforeExport() @@ -779,35 +780,36 @@ static int importHeliInversionWeight(int source) { class HeliField: public StructField { public: - HeliField(SwashRingData & heli, Board::Type board, unsigned int version, unsigned int variant) + HeliField(DataField * parent, SwashRingData & heli, Board::Type board, unsigned int version, unsigned int variant): + StructField(parent, "Heli") { if ((IS_ARM(board) && version >= 218) || (IS_STM32(board) && version >= 217)) { - Append(new UnsignedField<8>(heli.type)); - Append(new UnsignedField<8>(heli.value)); - Append(new SourceField<8>(heli.collectiveSource, board, version, variant)); - Append(new SourceField<8>(heli.aileronSource, board, version, variant)); - Append(new SourceField<8>(heli.elevatorSource, board, version, variant)); - Append(new SignedField<8>(heli.collectiveWeight)); - Append(new SignedField<8>(heli.aileronWeight)); - Append(new SignedField<8>(heli.elevatorWeight)); + Append(new UnsignedField<8>(this, heli.type)); + Append(new UnsignedField<8>(this, heli.value)); + Append(new SourceField<8>(this, heli.collectiveSource, board, version, variant)); + Append(new SourceField<8>(this, heli.aileronSource, board, version, variant)); + Append(new SourceField<8>(this, heli.elevatorSource, board, version, variant)); + Append(new SignedField<8>(this, heli.collectiveWeight)); + Append(new SignedField<8>(this, heli.aileronWeight)); + Append(new SignedField<8>(this, heli.elevatorWeight)); } else { - Append(new ConversionField< SignedField<1> >(heli.elevatorWeight, exportHeliInversionWeight, importHeliInversionWeight)); - Append(new ConversionField< SignedField<1> >(heli.aileronWeight, exportHeliInversionWeight, importHeliInversionWeight)); - Append(new ConversionField< SignedField<1> >(heli.collectiveWeight, exportHeliInversionWeight, importHeliInversionWeight)); - Append(new UnsignedField<5>(heli.type)); - Append(new SourceField<8>(heli.collectiveSource, board, version, variant)); + Append(new ConversionField< SignedField<1> >(this, heli.elevatorWeight, exportHeliInversionWeight, importHeliInversionWeight)); + Append(new ConversionField< SignedField<1> >(this, heli.aileronWeight, exportHeliInversionWeight, importHeliInversionWeight)); + Append(new ConversionField< SignedField<1> >(this, heli.collectiveWeight, exportHeliInversionWeight, importHeliInversionWeight)); + Append(new UnsignedField<5>(this, heli.type)); + Append(new SourceField<8>(this, heli.collectiveSource, board, version, variant)); //, FLAG_NOSWITCHES)); Fix shift in collective - Append(new UnsignedField<8>(heli.value)); + Append(new UnsignedField<8>(this, heli.value)); } } }; class FlightModeField: public TransformedField { public: - FlightModeField(FlightModeData & phase, int index, Board::Type board, unsigned int version): - TransformedField(internalField), - internalField("FlightMode"), + FlightModeField(DataField * parent, FlightModeData & phase, int index, Board::Type board, unsigned int version): + TransformedField(parent, internalField), + internalField(this, "FlightMode"), phase(phase), index(index), board(board), @@ -817,58 +819,58 @@ class FlightModeField: public TransformedField { if (board == BOARD_STOCK || (board==BOARD_M128 && version>=215)) { // On stock we use 10bits per trim for (int i=0; i(trimBase[i])); + internalField.Append(new SignedField<8>(this, trimBase[i])); for (int i=0; i(trimExt[i])); + internalField.Append(new SignedField<2>(this, trimExt[i])); } else if (IS_ARM(board) && version >= 218) { for (int i=0; i(phase.trim[i])); - internalField.Append(new UnsignedField<5>(trimMode[i])); + internalField.Append(new SignedField<11>(this, phase.trim[i])); + internalField.Append(new UnsignedField<5>(this, trimMode[i])); } } else if (IS_TARANIS(board) && version >= 216) { for (int i=0; i(phase.trim[i])); - internalField.Append(new UnsignedField<5>(trimMode[i])); + internalField.Append(new SignedField<11>(this, phase.trim[i])); + internalField.Append(new UnsignedField<5>(this, trimMode[i])); } } else { for (int i=0; i(trimBase[i])); + internalField.Append(new SignedField<16>(this, trimBase[i])); } } if (IS_ARM(board) && version >= 218) { if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<10>(phase.name, "Flight mode name")); + internalField.Append(new ZCharField<10>(this, phase.name, "Flight mode name")); else - internalField.Append(new ZCharField<6>(phase.name, "Flight mode name")); - internalField.Append(new SwitchField<9>(phase.swtch, board, version)); - internalField.Append(new SpareBitsField<7>()); + internalField.Append(new ZCharField<6>(this, phase.name, "Flight mode name")); + internalField.Append(new SwitchField<9>(this, phase.swtch, board, version)); + internalField.Append(new SpareBitsField<7>(this)); } else { - internalField.Append(new SwitchField<8>(phase.swtch, board, version)); + internalField.Append(new SwitchField<8>(this, phase.swtch, board, version)); if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<10>(phase.name)); + internalField.Append(new ZCharField<10>(this, phase.name)); else - internalField.Append(new ZCharField<6>(phase.name)); + internalField.Append(new ZCharField<6>(this, phase.name)); } if (IS_ARM(board) && version >= 214) { - internalField.Append(new UnsignedField<8>(phase.fadeIn)); - internalField.Append(new UnsignedField<8>(phase.fadeOut)); + internalField.Append(new UnsignedField<8>(this, phase.fadeIn)); + internalField.Append(new UnsignedField<8>(this, phase.fadeOut)); } else { - internalField.Append(new UnsignedField<4>(phase.fadeIn)); - internalField.Append(new UnsignedField<4>(phase.fadeOut)); + internalField.Append(new UnsignedField<4>(this, phase.fadeIn)); + internalField.Append(new UnsignedField<4>(this, phase.fadeOut)); } for (int i=0; i(phase.rotaryEncoders[i])); + internalField.Append(new SignedField<16>(this, phase.rotaryEncoders[i])); } if (board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) { for (int i=0; i(phase.gvars[i])); + internalField.Append(new SignedField<16>(this, phase.gvars[i])); } } } @@ -957,191 +959,191 @@ class FlightModeField: public TransformedField { class MixField: public TransformedField { public: - MixField(MixData & mix, Board::Type board, unsigned int version, ModelData * model): - TransformedField(internalField), - internalField("Mix"), + MixField(DataField * parent, MixData & mix, Board::Type board, unsigned int version, ModelData * model): + TransformedField(parent, internalField), + internalField(this, "Mix"), mix(mix), board(board), version(version), model(model) { if (IS_ARM(board) && version >= 218) { - internalField.Append(new SignedField<11>(_weight)); - internalField.Append(new UnsignedField<5>(_destCh)); - internalField.Append(new SourceField<10>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new UnsignedField<1>((unsigned int &)mix.carryTrim)); - internalField.Append(new UnsignedField<2>(mix.mixWarn)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new SpareBitsField<1>()); - internalField.Append(new SignedField<14>(_offset)); - internalField.Append(new SwitchField<9>(mix.swtch, board, version)); - internalField.Append(new UnsignedField<9>(mix.flightModes)); - internalField.Append(new CurveReferenceField(mix.curve, board, version)); - internalField.Append(new UnsignedField<8>(mix.delayUp)); - internalField.Append(new UnsignedField<8>(mix.delayDown)); - internalField.Append(new UnsignedField<8>(mix.speedUp)); - internalField.Append(new UnsignedField<8>(mix.speedDown)); + internalField.Append(new SignedField<11>(this, _weight)); + internalField.Append(new UnsignedField<5>(this, _destCh)); + internalField.Append(new SourceField<10>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new UnsignedField<1>(this, (unsigned int &)mix.carryTrim)); + internalField.Append(new UnsignedField<2>(this, mix.mixWarn)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new SignedField<14>(this, _offset)); + internalField.Append(new SwitchField<9>(this, mix.swtch, board, version)); + internalField.Append(new UnsignedField<9>(this, mix.flightModes)); + internalField.Append(new CurveReferenceField(this, mix.curve, board, version)); + internalField.Append(new UnsignedField<8>(this, mix.delayUp)); + internalField.Append(new UnsignedField<8>(this, mix.delayDown)); + internalField.Append(new UnsignedField<8>(this, mix.speedUp)); + internalField.Append(new UnsignedField<8>(this, mix.speedDown)); if (IS_HORUS(board)) - internalField.Append(new ZCharField<6>(mix.name)); + internalField.Append(new ZCharField<6>(this, mix.name)); else if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<8>(mix.name)); + internalField.Append(new ZCharField<8>(this, mix.name)); else - internalField.Append(new ZCharField<6>(mix.name)); + internalField.Append(new ZCharField<6>(this, mix.name)); } else if (IS_TARANIS(board) && version >= 217) { - internalField.Append(new UnsignedField<8>(_destCh)); - internalField.Append(new UnsignedField<9>(mix.flightModes)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new UnsignedField<1>((unsigned int &)mix.carryTrim)); - internalField.Append(new UnsignedField<4>(mix.mixWarn)); - internalField.Append(new SignedField<16>(_weight)); - internalField.Append(new SourceField<10>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new SignedField<14>(_offset)); - internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new CurveReferenceField(mix.curve, board, version)); - internalField.Append(new UnsignedField<8>(mix.delayUp)); - internalField.Append(new UnsignedField<8>(mix.delayDown)); - internalField.Append(new UnsignedField<8>(mix.speedUp)); - internalField.Append(new UnsignedField<8>(mix.speedDown)); - internalField.Append(new ZCharField<8>(mix.name)); + internalField.Append(new UnsignedField<8>(this, _destCh)); + internalField.Append(new UnsignedField<9>(this, mix.flightModes)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new UnsignedField<1>(this, (unsigned int &)mix.carryTrim)); + internalField.Append(new UnsignedField<4>(this, mix.mixWarn)); + internalField.Append(new SignedField<16>(this, _weight)); + internalField.Append(new SourceField<10>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new SignedField<14>(this, _offset)); + internalField.Append(new SwitchField<8>(this, mix.swtch, board, version)); + internalField.Append(new CurveReferenceField(this, mix.curve, board, version)); + internalField.Append(new UnsignedField<8>(this, mix.delayUp)); + internalField.Append(new UnsignedField<8>(this, mix.delayDown)); + internalField.Append(new UnsignedField<8>(this, mix.speedUp)); + internalField.Append(new UnsignedField<8>(this, mix.speedDown)); + internalField.Append(new ZCharField<8>(this, mix.name)); } else if (IS_ARM(board) && version >= 217) { - internalField.Append(new UnsignedField<5>(_destCh)); - internalField.Append(new UnsignedField<3>(mix.mixWarn)); - internalField.Append(new UnsignedField<9>(mix.flightModes)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new BoolField<1>(mix.noExpo)); - internalField.Append(new SignedField<3>(mix.carryTrim)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new SignedField<16>(_weight)); - internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new SignedField<8>(_curveParam)); - internalField.Append(new UnsignedField<8>(mix.delayUp)); - internalField.Append(new UnsignedField<8>(mix.delayDown)); - internalField.Append(new UnsignedField<8>(mix.speedUp)); - internalField.Append(new UnsignedField<8>(mix.speedDown)); - internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new SignedField<16>(_offset)); - internalField.Append(new ZCharField<6>(mix.name)); + internalField.Append(new UnsignedField<5>(this, _destCh)); + internalField.Append(new UnsignedField<3>(this, mix.mixWarn)); + internalField.Append(new UnsignedField<9>(this, mix.flightModes)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new BoolField<1>(this, mix.noExpo)); + internalField.Append(new SignedField<3>(this, mix.carryTrim)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new SignedField<16>(this, _weight)); + internalField.Append(new SwitchField<8>(this, mix.swtch, board, version)); + internalField.Append(new SignedField<8>(this, _curveParam)); + internalField.Append(new UnsignedField<8>(this, mix.delayUp)); + internalField.Append(new UnsignedField<8>(this, mix.delayDown)); + internalField.Append(new UnsignedField<8>(this, mix.speedUp)); + internalField.Append(new UnsignedField<8>(this, mix.speedDown)); + internalField.Append(new SourceField<8>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new SignedField<16>(this, _offset)); + internalField.Append(new ZCharField<6>(this, mix.name)); } else if (IS_TARANIS(board) && version == 216) { - internalField.Append(new UnsignedField<8>(_destCh)); - internalField.Append(new UnsignedField<16>(mix.flightModes)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new UnsignedField<1>((unsigned int &)mix.carryTrim)); - internalField.Append(new SpareBitsField<5>()); - internalField.Append(new SignedField<16>(_weight)); - internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new CurveReferenceField(mix.curve, board, version)); - internalField.Append(new UnsignedField<4>(mix.mixWarn)); - internalField.Append(new SpareBitsField<4>()); - internalField.Append(new UnsignedField<8>(mix.delayUp)); - internalField.Append(new UnsignedField<8>(mix.delayDown)); - internalField.Append(new UnsignedField<8>(mix.speedUp)); - internalField.Append(new UnsignedField<8>(mix.speedDown)); - internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new SignedField<16>(_offset)); - internalField.Append(new ZCharField<8>(mix.name)); - internalField.Append(new SpareBitsField<8>()); + internalField.Append(new UnsignedField<8>(this, _destCh)); + internalField.Append(new UnsignedField<16>(this, mix.flightModes)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new UnsignedField<1>(this, (unsigned int &)mix.carryTrim)); + internalField.Append(new SpareBitsField<5>(this)); + internalField.Append(new SignedField<16>(this, _weight)); + internalField.Append(new SwitchField<8>(this, mix.swtch, board, version)); + internalField.Append(new CurveReferenceField(this, mix.curve, board, version)); + internalField.Append(new UnsignedField<4>(this, mix.mixWarn)); + internalField.Append(new SpareBitsField<4>(this)); + internalField.Append(new UnsignedField<8>(this, mix.delayUp)); + internalField.Append(new UnsignedField<8>(this, mix.delayDown)); + internalField.Append(new UnsignedField<8>(this, mix.speedUp)); + internalField.Append(new UnsignedField<8>(this, mix.speedDown)); + internalField.Append(new SourceField<8>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new SignedField<16>(this, _offset)); + internalField.Append(new ZCharField<8>(this, mix.name)); + internalField.Append(new SpareBitsField<8>(this)); } else if (IS_ARM(board) && version == 216) { - internalField.Append(new UnsignedField<5>(_destCh)); - internalField.Append(new UnsignedField<3>(mix.mixWarn)); - internalField.Append(new UnsignedField<16>(mix.flightModes)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new BoolField<1>(mix.noExpo)); - internalField.Append(new SignedField<3>(mix.carryTrim)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new SpareBitsField<1>()); - internalField.Append(new SignedField<16>(_weight)); - internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new SignedField<8>(_curveParam)); - internalField.Append(new UnsignedField<8>(mix.delayUp)); - internalField.Append(new UnsignedField<8>(mix.delayDown)); - internalField.Append(new UnsignedField<8>(mix.speedUp)); - internalField.Append(new UnsignedField<8>(mix.speedDown)); - internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new SignedField<16>(_offset)); - internalField.Append(new ZCharField<6>(mix.name)); + internalField.Append(new UnsignedField<5>(this, _destCh)); + internalField.Append(new UnsignedField<3>(this, mix.mixWarn)); + internalField.Append(new UnsignedField<16>(this, mix.flightModes)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new BoolField<1>(this, mix.noExpo)); + internalField.Append(new SignedField<3>(this, mix.carryTrim)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new SignedField<16>(this, _weight)); + internalField.Append(new SwitchField<8>(this, mix.swtch, board, version)); + internalField.Append(new SignedField<8>(this, _curveParam)); + internalField.Append(new UnsignedField<8>(this, mix.delayUp)); + internalField.Append(new UnsignedField<8>(this, mix.delayDown)); + internalField.Append(new UnsignedField<8>(this, mix.speedUp)); + internalField.Append(new UnsignedField<8>(this, mix.speedDown)); + internalField.Append(new SourceField<8>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new SignedField<16>(this, _offset)); + internalField.Append(new ZCharField<6>(this, mix.name)); } else if (IS_ARM(board)) { - internalField.Append(new UnsignedField<8>(_destCh)); - internalField.Append(new UnsignedField<16>(mix.flightModes)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new BoolField<1>(mix.noExpo)); - internalField.Append(new SignedField<3>(mix.carryTrim)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); + internalField.Append(new UnsignedField<8>(this, _destCh)); + internalField.Append(new UnsignedField<16>(this, mix.flightModes)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new BoolField<1>(this, mix.noExpo)); + internalField.Append(new SignedField<3>(this, mix.carryTrim)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); if (version >= 214) - internalField.Append(new SpareBitsField<1>()); + internalField.Append(new SpareBitsField<1>(this)); else - internalField.Append(new UnsignedField<1>(_offsetMode)); - internalField.Append(new SignedField<16>(_weight)); - internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new SignedField<8>(_curveParam)); + internalField.Append(new UnsignedField<1>(this, _offsetMode)); + internalField.Append(new SignedField<16>(this, _weight)); + internalField.Append(new SwitchField<8>(this, mix.swtch, board, version)); + internalField.Append(new SignedField<8>(this, _curveParam)); if (version >= 214) { - internalField.Append(new UnsignedField<4>(mix.mixWarn)); - internalField.Append(new SpareBitsField<4>()); + internalField.Append(new UnsignedField<4>(this, mix.mixWarn)); + internalField.Append(new SpareBitsField<4>(this)); } else { - internalField.Append(new UnsignedField<8>(mix.mixWarn)); + internalField.Append(new UnsignedField<8>(this, mix.mixWarn)); } - internalField.Append(new UnsignedField<8>(mix.delayUp)); - internalField.Append(new UnsignedField<8>(mix.delayDown)); - internalField.Append(new UnsignedField<8>(mix.speedUp)); - internalField.Append(new UnsignedField<8>(mix.speedDown)); - internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new UnsignedField<8>(this, mix.delayUp)); + internalField.Append(new UnsignedField<8>(this, mix.delayDown)); + internalField.Append(new UnsignedField<8>(this, mix.speedUp)); + internalField.Append(new UnsignedField<8>(this, mix.speedDown)); + internalField.Append(new SourceField<8>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); if (version >= 214) - internalField.Append(new SignedField<16>(_offset)); + internalField.Append(new SignedField<16>(this, _offset)); else - internalField.Append(new SignedField<8>(_offset)); + internalField.Append(new SignedField<8>(this, _offset)); if (HAS_LARGE_LCD(board)) { - internalField.Append(new ZCharField<8>(mix.name)); - internalField.Append(new SpareBitsField<16>()); + internalField.Append(new ZCharField<8>(this, mix.name)); + internalField.Append(new SpareBitsField<16>(this)); } else { - internalField.Append(new ZCharField<6>(mix.name)); + internalField.Append(new ZCharField<6>(this, mix.name)); } } else if (IS_DBLRAM(board, version) && IS_AFTER_RELEASE_23_MARCH_2013(board, version)) { - internalField.Append(new UnsignedField<4>(_destCh)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new BoolField<1>(mix.noExpo)); - internalField.Append(new UnsignedField<1>(_weightMode)); - internalField.Append(new UnsignedField<1>(_offsetMode)); - internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new SignedField<8>(_weight)); - internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new UnsignedField<8>(mix.flightModes)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new SignedField<3>(mix.carryTrim)); - internalField.Append(new UnsignedField<2>(mix.mixWarn)); - internalField.Append(new SpareBitsField<1>()); - internalField.Append(new UnsignedField<4>(mix.delayUp)); - internalField.Append(new UnsignedField<4>(mix.delayDown)); - internalField.Append(new UnsignedField<4>(mix.speedUp)); - internalField.Append(new UnsignedField<4>(mix.speedDown)); - internalField.Append(new SignedField<8>(_curveParam)); - internalField.Append(new SignedField<8>(_offset)); + internalField.Append(new UnsignedField<4>(this, _destCh)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new BoolField<1>(this, mix.noExpo)); + internalField.Append(new UnsignedField<1>(this, _weightMode)); + internalField.Append(new UnsignedField<1>(this, _offsetMode)); + internalField.Append(new SourceField<8>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new SignedField<8>(this, _weight)); + internalField.Append(new SwitchField<8>(this, mix.swtch, board, version)); + internalField.Append(new UnsignedField<8>(this, mix.flightModes)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new SignedField<3>(this, mix.carryTrim)); + internalField.Append(new UnsignedField<2>(this, mix.mixWarn)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new UnsignedField<4>(this, mix.delayUp)); + internalField.Append(new UnsignedField<4>(this, mix.delayDown)); + internalField.Append(new UnsignedField<4>(this, mix.speedUp)); + internalField.Append(new UnsignedField<4>(this, mix.speedDown)); + internalField.Append(new SignedField<8>(this, _curveParam)); + internalField.Append(new SignedField<8>(this, _offset)); } else { - internalField.Append(new UnsignedField<4>(_destCh)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new BoolField<1>(mix.noExpo)); - internalField.Append(new UnsignedField<1>(_weightMode)); - internalField.Append(new UnsignedField<1>(_offsetMode)); - internalField.Append(new SignedField<8>(_weight)); - internalField.Append(new SwitchField<6>(mix.swtch, board, version)); - internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new UnsignedField<5>(mix.flightModes)); - internalField.Append(new SignedField<3>(mix.carryTrim)); - internalField.Append(new SourceField<6>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); - internalField.Append(new UnsignedField<2>(mix.mixWarn)); - internalField.Append(new UnsignedField<4>(mix.delayUp)); - internalField.Append(new UnsignedField<4>(mix.delayDown)); - internalField.Append(new UnsignedField<4>(mix.speedUp)); - internalField.Append(new UnsignedField<4>(mix.speedDown)); - internalField.Append(new SignedField<8>(_curveParam)); - internalField.Append(new SignedField<8>(_offset)); + internalField.Append(new UnsignedField<4>(this, _destCh)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new BoolField<1>(this, mix.noExpo)); + internalField.Append(new UnsignedField<1>(this, _weightMode)); + internalField.Append(new UnsignedField<1>(this, _offsetMode)); + internalField.Append(new SignedField<8>(this, _weight)); + internalField.Append(new SwitchField<6>(this, mix.swtch, board, version)); + internalField.Append(new UnsignedField<2>(this, (unsigned int &)mix.mltpx)); + internalField.Append(new UnsignedField<5>(this, mix.flightModes)); + internalField.Append(new SignedField<3>(this, mix.carryTrim)); + internalField.Append(new SourceField<6>(this, mix.srcRaw, board, version, FLAG_NOTELEMETRY)); + internalField.Append(new UnsignedField<2>(this, mix.mixWarn)); + internalField.Append(new UnsignedField<4>(this, mix.delayUp)); + internalField.Append(new UnsignedField<4>(this, mix.delayDown)); + internalField.Append(new UnsignedField<4>(this, mix.speedUp)); + internalField.Append(new UnsignedField<4>(this, mix.speedDown)); + internalField.Append(new SignedField<8>(this, _curveParam)); + internalField.Append(new SignedField<8>(this, _offset)); } } @@ -1249,113 +1251,113 @@ class MixField: public TransformedField { class InputField: public TransformedField { public: - InputField(ExpoData & expo, Board::Type board, unsigned int version): - TransformedField(internalField), - internalField("Input"), + InputField(DataField * parent, ExpoData & expo, Board::Type board, unsigned int version): + TransformedField(parent, internalField), + internalField(this, "Input"), expo(expo), board(board), version(version) { if (IS_ARM(board) && version >= 218) { - internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); - internalField.Append(new UnsignedField<14>(expo.scale, "Scale")); - internalField.Append(new SourceField<10>(expo.srcRaw, board, version, 0)); - internalField.Append(new SignedField<6>(expo.carryTrim, "CarryTrim")); - internalField.Append(new UnsignedField<5>(expo.chn, "Channel")); - internalField.Append(new SwitchField<9>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<9>(expo.flightModes)); - internalField.Append(new SignedField<8>(_weight, "Weight")); - internalField.Append(new SpareBitsField<1>()); + internalField.Append(new UnsignedField<2>(this, expo.mode, "Mode")); + internalField.Append(new UnsignedField<14>(this, expo.scale, "Scale")); + internalField.Append(new SourceField<10>(this, expo.srcRaw, board, version, 0)); + internalField.Append(new SignedField<6>(this, expo.carryTrim, "CarryTrim")); + internalField.Append(new UnsignedField<5>(this, expo.chn, "Channel")); + internalField.Append(new SwitchField<9>(this, expo.swtch, board, version)); + internalField.Append(new UnsignedField<9>(this, expo.flightModes)); + internalField.Append(new SignedField<8>(this, _weight, "Weight")); + internalField.Append(new SpareBitsField<1>(this)); if (IS_HORUS(board)) - internalField.Append(new ZCharField<6>(expo.name)); + internalField.Append(new ZCharField<6>(this, expo.name)); else if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<8>(expo.name)); + internalField.Append(new ZCharField<8>(this, expo.name)); else - internalField.Append(new ZCharField<6>(expo.name)); - internalField.Append(new SignedField<8>(_offset, "Offset")); - internalField.Append(new CurveReferenceField(expo.curve, board, version)); + internalField.Append(new ZCharField<6>(this, expo.name)); + internalField.Append(new SignedField<8>(this, _offset, "Offset")); + internalField.Append(new CurveReferenceField(this, expo.curve, board, version)); } else if (IS_TARANIS(board) && version >= 217) { - internalField.Append(new SourceField<10>(expo.srcRaw, board, version, 0)); - internalField.Append(new UnsignedField<14>(expo.scale, "Scale")); - internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); - internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.flightModes)); - internalField.Append(new SignedField<8>(_weight, "Weight")); - internalField.Append(new SignedField<6>(expo.carryTrim, "CarryTrim")); - internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); - internalField.Append(new ZCharField<8>(expo.name)); - internalField.Append(new SignedField<8>(_offset, "Offset")); - internalField.Append(new CurveReferenceField(expo.curve, board, version)); + internalField.Append(new SourceField<10>(this, expo.srcRaw, board, version, 0)); + internalField.Append(new UnsignedField<14>(this, expo.scale, "Scale")); + internalField.Append(new UnsignedField<8>(this, expo.chn, "Channel")); + internalField.Append(new SwitchField<8>(this, expo.swtch, board, version)); + internalField.Append(new UnsignedField<16>(this, expo.flightModes)); + internalField.Append(new SignedField<8>(this, _weight, "Weight")); + internalField.Append(new SignedField<6>(this, expo.carryTrim, "CarryTrim")); + internalField.Append(new UnsignedField<2>(this, expo.mode, "Mode")); + internalField.Append(new ZCharField<8>(this, expo.name)); + internalField.Append(new SignedField<8>(this, _offset, "Offset")); + internalField.Append(new CurveReferenceField(this, expo.curve, board, version)); } else if (IS_ARM(board) && version >= 217) { - internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); - internalField.Append(new UnsignedField<3>(expo.chn, "Channel")); - internalField.Append(new BoolField<2>(_curveMode)); - internalField.Append(new UnsignedField<9>(expo.flightModes, "Phases")); - internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new SignedField<8>(_weight, "Weight")); - internalField.Append(new ZCharField<6>(expo.name)); - internalField.Append(new SignedField<8>(_curveParam)); + internalField.Append(new UnsignedField<2>(this, expo.mode, "Mode")); + internalField.Append(new UnsignedField<3>(this, expo.chn, "Channel")); + internalField.Append(new BoolField<2>(this, _curveMode)); + internalField.Append(new UnsignedField<9>(this, expo.flightModes, "Phases")); + internalField.Append(new SwitchField<8>(this, expo.swtch, board, version)); + internalField.Append(new SignedField<8>(this, _weight, "Weight")); + internalField.Append(new ZCharField<6>(this, expo.name)); + internalField.Append(new SignedField<8>(this, _curveParam)); } else if (IS_TARANIS(board) && version >= 216) { - internalField.Append(new SourceField<8>(expo.srcRaw, board, version, 0)); - internalField.Append(new UnsignedField<16>(expo.scale, "Scale")); - internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); - internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.flightModes)); - internalField.Append(new SignedField<8>(_weight, "Weight")); - internalField.Append(new SignedField<6>(expo.carryTrim, "CarryTrim")); - internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); - internalField.Append(new ZCharField<8>(expo.name)); - internalField.Append(new SignedField<8>(_offset, "Offset")); - internalField.Append(new CurveReferenceField(expo.curve, board, version)); - internalField.Append(new SpareBitsField<8>()); + internalField.Append(new SourceField<8>(this, expo.srcRaw, board, version, 0)); + internalField.Append(new UnsignedField<16>(this, expo.scale, "Scale")); + internalField.Append(new UnsignedField<8>(this, expo.chn, "Channel")); + internalField.Append(new SwitchField<8>(this, expo.swtch, board, version)); + internalField.Append(new UnsignedField<16>(this, expo.flightModes)); + internalField.Append(new SignedField<8>(this, _weight, "Weight")); + internalField.Append(new SignedField<6>(this, expo.carryTrim, "CarryTrim")); + internalField.Append(new UnsignedField<2>(this, expo.mode, "Mode")); + internalField.Append(new ZCharField<8>(this, expo.name)); + internalField.Append(new SignedField<8>(this, _offset, "Offset")); + internalField.Append(new CurveReferenceField(this, expo.curve, board, version)); + internalField.Append(new SpareBitsField<8>(this)); } else if (IS_ARM(board) && version >= 216) { - internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); - internalField.Append(new UnsignedField<4>(expo.chn, "Channel")); - internalField.Append(new BoolField<2>(_curveMode)); - internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.flightModes, "Phases")); - internalField.Append(new SignedField<8>(_weight, "Weight")); - internalField.Append(new ZCharField<6>(expo.name)); - internalField.Append(new SignedField<8>(_curveParam)); + internalField.Append(new UnsignedField<2>(this, expo.mode, "Mode")); + internalField.Append(new UnsignedField<4>(this, expo.chn, "Channel")); + internalField.Append(new BoolField<2>(this, _curveMode)); + internalField.Append(new SwitchField<8>(this, expo.swtch, board, version)); + internalField.Append(new UnsignedField<16>(this, expo.flightModes, "Phases")); + internalField.Append(new SignedField<8>(this, _weight, "Weight")); + internalField.Append(new ZCharField<6>(this, expo.name)); + internalField.Append(new SignedField<8>(this, _curveParam)); } else if (IS_ARM(board)) { - internalField.Append(new UnsignedField<8>(expo.mode, "Mode")); - internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); - internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.flightModes, "Phases")); - internalField.Append(new SignedField<8>(_weight, "Weight")); - internalField.Append(new BoolField<8>(_curveMode)); + internalField.Append(new UnsignedField<8>(this, expo.mode, "Mode")); + internalField.Append(new UnsignedField<8>(this, expo.chn, "Channel")); + internalField.Append(new SwitchField<8>(this, expo.swtch, board, version)); + internalField.Append(new UnsignedField<16>(this, expo.flightModes, "Phases")); + internalField.Append(new SignedField<8>(this, _weight, "Weight")); + internalField.Append(new BoolField<8>(this, _curveMode)); if (HAS_LARGE_LCD(board)) { - internalField.Append(new ZCharField<8>(expo.name)); - internalField.Append(new SpareBitsField<16>()); + internalField.Append(new ZCharField<8>(this, expo.name)); + internalField.Append(new SpareBitsField<16>(this)); } else { - internalField.Append(new ZCharField<6>(expo.name)); + internalField.Append(new ZCharField<6>(this, expo.name)); } - internalField.Append(new SignedField<8>(_curveParam)); + internalField.Append(new SignedField<8>(this, _curveParam)); } else if (IS_DBLRAM(board, version) && IS_AFTER_RELEASE_23_MARCH_2013(board, version)) { - internalField.Append(new UnsignedField<2>(expo.mode)); - internalField.Append(new UnsignedField<2>(expo.chn)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new SpareBitsField<3>()); - internalField.Append(new UnsignedField<8>(expo.flightModes)); - internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new SignedField<8>(_weight)); - internalField.Append(new SignedField<8>(_curveParam)); + internalField.Append(new UnsignedField<2>(this, expo.mode)); + internalField.Append(new UnsignedField<2>(this, expo.chn)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new SpareBitsField<3>(this)); + internalField.Append(new UnsignedField<8>(this, expo.flightModes)); + internalField.Append(new SwitchField<8>(this, expo.swtch, board, version)); + internalField.Append(new SignedField<8>(this, _weight)); + internalField.Append(new SignedField<8>(this, _curveParam)); } else { - internalField.Append(new UnsignedField<2>(expo.mode)); - internalField.Append(new SwitchField<6>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<2>(expo.chn)); - internalField.Append(new UnsignedField<5>(expo.flightModes)); - internalField.Append(new BoolField<1>(_curveMode)); - internalField.Append(new SignedField<8>(_weight)); - internalField.Append(new SignedField<8>(_curveParam)); + internalField.Append(new UnsignedField<2>(this, expo.mode)); + internalField.Append(new SwitchField<6>(this, expo.swtch, board, version)); + internalField.Append(new UnsignedField<2>(this, expo.chn)); + internalField.Append(new UnsignedField<5>(this, expo.flightModes)); + internalField.Append(new BoolField<1>(this, _curveMode)); + internalField.Append(new SignedField<8>(this, _weight)); + internalField.Append(new SignedField<8>(this, _curveParam)); } } @@ -1456,54 +1458,54 @@ class LimitField: public StructField { return value - shift; } - LimitField(LimitData & limit, Board::Type board, unsigned int version): - StructField("Limit") + LimitField(DataField * parent, LimitData & limit, Board::Type board, unsigned int version): + StructField(parent, "Limit") { if (IS_ARM(board) && version >= 218) { - Append(new ConversionField< SignedField<11> >(limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>)); - Append(new ConversionField< SignedField<11> >(limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>)); - Append(new SignedField<10>(limit.ppmCenter)); - Append(new ConversionField< SignedField<11> >(limit.offset, exportLimitValue<0, 1024>, importLimitValue<0, 1024>)); - Append(new BoolField<1>(limit.symetrical)); - Append(new BoolField<1>(limit.revert)); - Append(new SpareBitsField<3>()); - Append(new SignedField<8>(limit.curve.value)); + Append(new ConversionField< SignedField<11> >(this, limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>)); + Append(new ConversionField< SignedField<11> >(this, limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>)); + Append(new SignedField<10>(this, limit.ppmCenter)); + Append(new ConversionField< SignedField<11> >(this, limit.offset, exportLimitValue<0, 1024>, importLimitValue<0, 1024>)); + Append(new BoolField<1>(this, limit.symetrical)); + Append(new BoolField<1>(this, limit.revert)); + Append(new SpareBitsField<3>(this)); + Append(new SignedField<8>(this, limit.curve.value)); if (HAS_LARGE_LCD(board)) - Append(new ZCharField<6>(limit.name)); + Append(new ZCharField<6>(this, limit.name)); else - Append(new ZCharField<4>(limit.name)); + Append(new ZCharField<4>(this, limit.name)); } else if (IS_TARANIS(board) && version >= 217) { - Append(new ConversionField< SignedField<11> >(limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>)); - Append(new ConversionField< SignedField<11> >(limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>)); - Append(new SignedField<10>(limit.ppmCenter)); - Append(new ConversionField< SignedField<11> >(limit.offset, exportLimitValue<0, 1024>, importLimitValue<0, 1024>)); - Append(new BoolField<1>(limit.symetrical)); - Append(new BoolField<1>(limit.revert)); - Append(new SpareBitsField<3>()); - Append(new SignedField<8>(limit.curve.value)); - Append(new ZCharField<6>(limit.name)); + Append(new ConversionField< SignedField<11> >(this, limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>)); + Append(new ConversionField< SignedField<11> >(this, limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>)); + Append(new SignedField<10>(this, limit.ppmCenter)); + Append(new ConversionField< SignedField<11> >(this, limit.offset, exportLimitValue<0, 1024>, importLimitValue<0, 1024>)); + Append(new BoolField<1>(this, limit.symetrical)); + Append(new BoolField<1>(this, limit.revert)); + Append(new SpareBitsField<3>(this)); + Append(new SignedField<8>(this, limit.curve.value)); + Append(new ZCharField<6>(this, limit.name)); } else { if (IS_TARANIS(board) && version >= 216) { - Append(new ConversionField< SignedField<16> >(limit.min, exportLimitValue<1000, 4096>, importLimitValue<1000, 4096>)); - Append(new ConversionField< SignedField<16> >(limit.max, exportLimitValue<-1000, 4096>, importLimitValue<-1000, 4096>)); - Append(new SignedField<8>(limit.ppmCenter)); - Append(new ConversionField< SignedField<14> >(limit.offset, exportLimitValue<0, 4096>, importLimitValue<0, 4096>)); + Append(new ConversionField< SignedField<16> >(this, limit.min, exportLimitValue<1000, 4096>, importLimitValue<1000, 4096>)); + Append(new ConversionField< SignedField<16> >(this, limit.max, exportLimitValue<-1000, 4096>, importLimitValue<-1000, 4096>)); + Append(new SignedField<8>(this, limit.ppmCenter)); + Append(new ConversionField< SignedField<14> >(this, limit.offset, exportLimitValue<0, 4096>, importLimitValue<0, 4096>)); } else { - Append(new ConversionField< SignedField<8> >(limit.min, +100, 10)); - Append(new ConversionField< SignedField<8> >(limit.max, -100, 10)); - Append(new SignedField<8>(limit.ppmCenter)); - Append(new SignedField<14>(limit.offset)); + Append(new ConversionField< SignedField<8> >(this, limit.min, +100, 10)); + Append(new ConversionField< SignedField<8> >(this, limit.max, -100, 10)); + Append(new SignedField<8>(this, limit.ppmCenter)); + Append(new SignedField<14>(this, limit.offset)); } - Append(new BoolField<1>(limit.symetrical)); - Append(new BoolField<1>(limit.revert)); + Append(new BoolField<1>(this, limit.symetrical)); + Append(new BoolField<1>(this, limit.revert)); if (HAS_LARGE_LCD(board)) { - Append(new ZCharField<6>(limit.name)); + Append(new ZCharField<6>(this, limit.name)); } if (IS_TARANIS(board) && version >= 216) { - Append(new SignedField<8>(limit.curve.value)); + Append(new SignedField<8>(this, limit.curve.value)); } } } @@ -1511,9 +1513,9 @@ class LimitField: public StructField { class CurvesField: public TransformedField { public: - CurvesField(CurveData * curves, Board::Type board, unsigned int version): - TransformedField(internalField), - internalField("Curves"), + CurvesField(DataField * parent, CurveData * curves, Board::Type board, unsigned int version): + TransformedField(parent, internalField), + internalField(this, "Curves"), curves(curves), board(board), version(version), @@ -1522,27 +1524,27 @@ class CurvesField: public TransformedField { { for (int i=0; i= 218) { - internalField.Append(new UnsignedField<1>((unsigned int &)curves[i].type)); - internalField.Append(new BoolField<1>(curves[i].smooth)); - internalField.Append(new ConversionField< SignedField<6> >(curves[i].count, -5)); - internalField.Append(new ZCharField<3>(curves[i].name)); + internalField.Append(new UnsignedField<1>(this, (unsigned int &)curves[i].type)); + internalField.Append(new BoolField<1>(this, curves[i].smooth)); + internalField.Append(new ConversionField< SignedField<6> >(this, curves[i].count, -5)); + internalField.Append(new ZCharField<3>(this, curves[i].name)); } else if (IS_TARANIS(board) && version >= 216) { - internalField.Append(new UnsignedField<3>((unsigned int &)curves[i].type)); - internalField.Append(new BoolField<1>(curves[i].smooth)); - internalField.Append(new SpareBitsField<4>()); - internalField.Append(new ConversionField< SignedField<8> >(curves[i].count, -5)); + internalField.Append(new UnsignedField<3>(this, (unsigned int &)curves[i].type)); + internalField.Append(new BoolField<1>(this, curves[i].smooth)); + internalField.Append(new SpareBitsField<4>(this)); + internalField.Append(new ConversionField< SignedField<8> >(this, curves[i].count, -5)); } else if (IS_ARM(board)) { - internalField.Append(new SignedField<16>(_curves[i])); + internalField.Append(new SignedField<16>(this, _curves[i])); } else { - internalField.Append(new SignedField<8>(_curves[i])); + internalField.Append(new SignedField<8>(this, _curves[i])); } } for (int i=0; i(_points[i])); + internalField.Append(new SignedField<8>(this, _points[i])); } } @@ -1558,14 +1560,14 @@ class CurvesField: public TransformedField { if (IS_STM32(board) && version >= 216) { offset += (curve->type == CurveData::CURVE_TYPE_CUSTOM ? curve->count * 2 - 2 : curve->count); if (offset > maxPoints) { - EEPROMWarnings.push_back(::QObject::tr("OpenTX only accepts %1 points in all curves").arg(maxPoints)); + setError(QObject::tr("OpenTX only accepts %1 points in all curves").arg(maxPoints)); break; } } else { offset += (curve->type == CurveData::CURVE_TYPE_CUSTOM ? curve->count * 2 - 2 : curve->count) - 5; if (offset > maxPoints - 5 * maxCurves) { - EEPROMWarnings.push_back(::QObject::tr("OpenTx only accepts %1 points in all curves").arg(maxPoints)); + setError(QObject::tr("OpenTx only accepts %1 points in all curves").arg(maxPoints)); break; } _curves[i] = offset; @@ -1758,9 +1760,9 @@ class AndSwitchesConversionTable: public ConversionTable { class LogicalSwitchField: public TransformedField { public: - LogicalSwitchField(LogicalSwitchData & csw, Board::Type board, unsigned int version, unsigned int variant, ModelData * model=NULL): - TransformedField(internalField), - internalField("LogicalSwitch"), + LogicalSwitchField(DataField * parent, LogicalSwitchData & csw, Board::Type board, unsigned int version, unsigned int variant, ModelData * model=NULL): + TransformedField(parent, internalField), + internalField(this, "LogicalSwitch"), csw(csw), board(board), version(version), @@ -1775,56 +1777,56 @@ class LogicalSwitchField: public TransformedField { v3(0) { if (IS_ARM(board) && version >= 218) { - internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); - internalField.Append(new SignedField<10>(v1)); - internalField.Append(new SignedField<10>(v3)); - internalField.Append(new ConversionField< SignedField<9> >((int &)csw.andsw, andswitchesConversionTable, "AND switch")); - internalField.Append(new SpareBitsField<1>()); // TODO extra switch mode - internalField.Append(new SpareBitsField<2>()); - internalField.Append(new SignedField<16>(v2)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.func, &functionsConversionTable, "Function")); + internalField.Append(new SignedField<10>(this, v1)); + internalField.Append(new SignedField<10>(this, v3)); + internalField.Append(new ConversionField< SignedField<9> >(this, (int &)csw.andsw, andswitchesConversionTable, "AND switch")); + internalField.Append(new SpareBitsField<1>(this)); // TODO extra switch mode + internalField.Append(new SpareBitsField<2>(this)); + internalField.Append(new SignedField<16>(this, v2)); } else if (IS_ARM(board) && version >= 217) { - internalField.Append(new ConversionField< UnsignedField<6> >(csw.func, &functionsConversionTable, "Function")); - internalField.Append(new SignedField<10>(v1)); - internalField.Append(new SignedField<16>(v2)); - internalField.Append(new SignedField<16>(v3)); + internalField.Append(new ConversionField< UnsignedField<6> >(this, csw.func, &functionsConversionTable, "Function")); + internalField.Append(new SignedField<10>(this, v1)); + internalField.Append(new SignedField<16>(this, v2)); + internalField.Append(new SignedField<16>(this, v3)); } else if (IS_ARM(board) && version >= 216) { - internalField.Append(new SignedField<8>(v1)); - internalField.Append(new SignedField<16>(v2)); - internalField.Append(new SignedField<16>(v3)); - internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); + internalField.Append(new SignedField<8>(this, v1)); + internalField.Append(new SignedField<16>(this, v2)); + internalField.Append(new SignedField<16>(this, v3)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.func, &functionsConversionTable, "Function")); } else if (IS_ARM(board) && version >= 215) { - internalField.Append(new SignedField<16>(v1)); - internalField.Append(new SignedField<16>(v2)); - internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); + internalField.Append(new SignedField<16>(this, v1)); + internalField.Append(new SignedField<16>(this, v2)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.func, &functionsConversionTable, "Function")); } else if (IS_ARM(board)) { - internalField.Append(new SignedField<8>(v1)); - internalField.Append(new SignedField<8>(v2)); - internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); + internalField.Append(new SignedField<8>(this, v1)); + internalField.Append(new SignedField<8>(this, v2)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.func, &functionsConversionTable, "Function")); } else { - internalField.Append(new SignedField<8>(v1)); - internalField.Append(new SignedField<8>(v2)); + internalField.Append(new SignedField<8>(this, v1)); + internalField.Append(new SignedField<8>(this, v2)); if (version >= 213) - internalField.Append(new ConversionField< UnsignedField<4> >(csw.func, &functionsConversionTable, "Function")); + internalField.Append(new ConversionField< UnsignedField<4> >(this, csw.func, &functionsConversionTable, "Function")); else - internalField.Append(new ConversionField< UnsignedField<8> >(csw.func, &functionsConversionTable, "Function")); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.func, &functionsConversionTable, "Function")); } if (IS_ARM(board)) { int scale = (version >= 216 ? 0 : 5); - internalField.Append(new ConversionField< UnsignedField<8> >(csw.delay, 0, scale)); - internalField.Append(new ConversionField< UnsignedField<8> >(csw.duration, 0, scale)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.delay, 0, scale)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.duration, 0, scale)); if (version >= 214 && version <= 217) { - internalField.Append(new ConversionField< SignedField<8> >((int &)csw.andsw, andswitchesConversionTable, "AND switch")); + internalField.Append(new ConversionField< SignedField<8> >(this, (int &)csw.andsw, andswitchesConversionTable, "AND switch")); } } else { if (version >= 213) { - internalField.Append(new ConversionField< UnsignedField<4> >((unsigned int &)csw.andsw, andswitchesConversionTable, "AND switch")); + internalField.Append(new ConversionField< UnsignedField<4> >(this, (unsigned int &)csw.andsw, andswitchesConversionTable, "AND switch")); } } } @@ -2087,9 +2089,9 @@ class CustomFunctionsConversionTable: public ConversionTable { template class SwitchesWarningField: public TransformedField { public: - SwitchesWarningField(uint64_t & sw, Board::Type board, unsigned int version): - TransformedField(internalField), - internalField(_sw, "SwitchesWarning"), + SwitchesWarningField(DataField * parent, uint64_t & sw, Board::Type board, unsigned int version): + TransformedField(parent, internalField), + internalField(this, _sw, "SwitchesWarning"), sw(sw), board(board), version(version) @@ -2126,9 +2128,9 @@ class SwitchesWarningField: public TransformedField { class ArmCustomFunctionField: public TransformedField { public: - ArmCustomFunctionField(CustomFunctionData & fn, Board::Type board, unsigned int version, unsigned int variant): - TransformedField(internalField), - internalField("CustomFunction"), + ArmCustomFunctionField(DataField * parent, CustomFunctionData & fn, Board::Type board, unsigned int version, unsigned int variant): + TransformedField(parent, internalField), + internalField(this, "CustomFunction"), fn(fn), board(board), version(version), @@ -2142,31 +2144,31 @@ class ArmCustomFunctionField: public TransformedField { memset(_param, 0, sizeof(_param)); if (version >= 218) { - internalField.Append(new SwitchField<9>(fn.swtch, board, version)); - internalField.Append(new ConversionField< UnsignedField<7> >(_func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new SwitchField<9>(this, fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<7> >(this, _func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); } else { - internalField.Append(new SwitchField<8>(fn.swtch, board, version)); - internalField.Append(new ConversionField< UnsignedField<8> >(_func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new SwitchField<8>(this, fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, _func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); } if (IS_TARANIS(board) && version >= 216) - internalField.Append(new CharField<8>(_param, false)); + internalField.Append(new CharField<8>(this, _param, false)); else if (IS_TARANIS(board)) - internalField.Append(new CharField<10>(_param, false)); + internalField.Append(new CharField<10>(this, _param, false)); else - internalField.Append(new CharField<6>(_param, false)); + internalField.Append(new CharField<6>(this, _param, false)); if (version >= 216) { - internalField.Append(new SignedField<8>(_active)); + internalField.Append(new SignedField<8>(this, _active)); } else if (version >= 214) { - internalField.Append(new UnsignedField<2>(_mode)); - internalField.Append(new UnsignedField<6>((unsigned int &)_active)); + internalField.Append(new UnsignedField<2>(this, _mode)); + internalField.Append(new UnsignedField<6>(this, (unsigned int &)_active)); } else { - internalField.Append(new UnsignedField<8>((unsigned int &)_active)); - internalField.Append(new SpareBitsField<8>()); + internalField.Append(new UnsignedField<8>(this, (unsigned int &)_active)); + internalField.Append(new SpareBitsField<8>(this)); } } @@ -2367,9 +2369,9 @@ class ArmCustomFunctionField: public TransformedField { class AvrCustomFunctionField: public TransformedField { public: - AvrCustomFunctionField(CustomFunctionData & fn, Board::Type board, unsigned int version, unsigned int variant): - TransformedField(internalField), - internalField("CustomFunction"), + AvrCustomFunctionField(DataField * parent, CustomFunctionData & fn, Board::Type board, unsigned int version, unsigned int variant): + TransformedField(parent, internalField), + internalField(this, "CustomFunction"), fn(fn), board(board), version(version), @@ -2382,30 +2384,30 @@ class AvrCustomFunctionField: public TransformedField { _active(0) { if (version >= 217 && IS_2560(board)) { - internalField.Append(new SwitchField<8>(fn.swtch, board, version)); - internalField.Append(new ConversionField< UnsignedField<8> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); - internalField.Append(new UnsignedField<2>(fn.adjustMode)); - internalField.Append(new UnsignedField<4>(_union_param)); - internalField.Append(new UnsignedField<1>(_active)); - internalField.Append(new SpareBitsField<1>()); + internalField.Append(new SwitchField<8>(this, fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<8> >(this, (unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new UnsignedField<2>(this, fn.adjustMode)); + internalField.Append(new UnsignedField<4>(this, _union_param)); + internalField.Append(new UnsignedField<1>(this, _active)); + internalField.Append(new SpareBitsField<1>(this)); } else if (version >= 216) { - internalField.Append(new SwitchField<6>(fn.swtch, board, version)); - internalField.Append(new ConversionField< UnsignedField<4> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); - internalField.Append(new UnsignedField<5>(_union_param)); - internalField.Append(new UnsignedField<1>(_active)); + internalField.Append(new SwitchField<6>(this, fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<4> >(this, (unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new UnsignedField<5>(this, _union_param)); + internalField.Append(new UnsignedField<1>(this, _active)); } else if (version >= 213) { - internalField.Append(new SwitchField<8>(fn.swtch, board, version)); - internalField.Append(new UnsignedField<3>(_union_param)); - internalField.Append(new ConversionField< UnsignedField<5> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new SwitchField<8>(this, fn.swtch, board, version)); + internalField.Append(new UnsignedField<3>(this, _union_param)); + internalField.Append(new ConversionField< UnsignedField<5> >(this, (unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); } else { - internalField.Append(new SwitchField<8>(fn.swtch, board, version)); - internalField.Append(new ConversionField< UnsignedField<7> >((unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); - internalField.Append(new BoolField<1>((bool &)fn.enabled)); + internalField.Append(new SwitchField<8>(this, fn.swtch, board, version)); + internalField.Append(new ConversionField< UnsignedField<7> >(this, (unsigned int &)fn.func, &functionsConversionTable, "Function", ::QObject::tr("OpenTX on this board doesn't accept this function"))); + internalField.Append(new BoolField<1>(this, (bool &)fn.enabled)); } - internalField.Append(new UnsignedField<8>(_param)); + internalField.Append(new UnsignedField<8>(this, _param)); } virtual void beforeExport() @@ -2556,25 +2558,29 @@ class AvrCustomFunctionField: public TransformedField { class FrskyScreenField: public DataField { public: - FrskyScreenField(FrSkyScreenData & screen, Board::Type board, unsigned int version, unsigned int variant): - DataField("Frsky Screen"), + FrskyScreenField(DataField * parent, FrSkyScreenData & screen, Board::Type board, unsigned int version, unsigned int variant): + DataField(parent, "Frsky Screen"), screen(screen), board(board), - version(version) + version(version), + none(this), + bars(this), + numbers(this), + script(this) { for (int i=0; i<4; i++) { if (IS_ARM(board) && version >= 217) { if (IS_TARANIS(board)) - bars.Append(new SourceField<16>(screen.body.bars[i].source, board, version, variant)); + bars.Append(new SourceField<16>(this, screen.body.bars[i].source, board, version, variant)); else - bars.Append(new SourceField<8>(screen.body.bars[i].source, board, version, variant)); - bars.Append(new UnsignedField<16>(screen.body.bars[i].barMin)); - bars.Append(new UnsignedField<16>(screen.body.bars[i].barMax)); + bars.Append(new SourceField<8>(this, screen.body.bars[i].source, board, version, variant)); + bars.Append(new UnsignedField<16>(this, screen.body.bars[i].barMin)); + bars.Append(new UnsignedField<16>(this, screen.body.bars[i].barMax)); } else { - bars.Append(new TelemetrySourceField<8>(screen.body.bars[i].source, board, version)); - bars.Append(new UnsignedField<8>(screen.body.bars[i].barMin)); - bars.Append(new UnsignedField<8>(screen.body.bars[i].barMax)); + bars.Append(new TelemetrySourceField<8>(this, screen.body.bars[i].source, board, version)); + bars.Append(new UnsignedField<8>(this, screen.body.bars[i].barMin)); + bars.Append(new UnsignedField<8>(this, screen.body.bars[i].barMax)); } } @@ -2582,27 +2588,27 @@ class FrskyScreenField: public DataField { for (int i=0; i<4; i++) { for (int j=0; j= 217) - numbers.Append(new SourceField<16>(screen.body.lines[i].source[j], board, version, variant)); + numbers.Append(new SourceField<16>(this, screen.body.lines[i].source[j], board, version, variant)); else if (IS_ARM(board) && version >= 217) - numbers.Append(new SourceField<8>(screen.body.lines[i].source[j], board, version, variant)); + numbers.Append(new SourceField<8>(this, screen.body.lines[i].source[j], board, version, variant)); else - numbers.Append(new TelemetrySourceField<8>(screen.body.lines[i].source[j], board, version)); + numbers.Append(new TelemetrySourceField<8>(this, screen.body.lines[i].source[j], board, version)); } } for (unsigned i=numbers.size(); i()); + numbers.Append(new SpareBitsField<1>(this)); } if (IS_TARANIS(board) && version >= 217) { - script.Append(new CharField<8>(screen.body.script.filename, true, "Script name")); - script.Append(new SpareBitsField<16*8>()); + script.Append(new CharField<8>(this, screen.body.script.filename, true, "Script name")); + script.Append(new SpareBitsField<16*8>(this)); } if (IS_ARM(board) && version >= 217) { if (IS_TARANIS(board)) - none.Append(new SpareBitsField<24*8>()); + none.Append(new SpareBitsField<24*8>(this)); else - none.Append(new SpareBitsField<20*8>()); + none.Append(new SpareBitsField<20*8>(this)); } } @@ -2765,8 +2771,8 @@ class TelemetryCurrentSourceConversionTable: public ConversionTable class FrskyField: public StructField { public: - FrskyField(FrSkyData & frsky, Board::Type board, unsigned int version, unsigned int variant): - StructField("FrSky"), + FrskyField(DataField * parent, FrSkyData & frsky, Board::Type board, unsigned int version, unsigned int variant): + StructField(parent, "FrSky"), telemetryVarioSourceConversionTable(board, version), screenTypesConversionTable(board, version), telemetryVoltsSourceConversionTable(board, version), @@ -2778,109 +2784,109 @@ class FrskyField: public StructField { if (IS_ARM(board)) { if (!IS_HORUS(board)) { if (version >= 217) { - Append(new UnsignedField<8>(frsky.voltsSource, "Volts Source")); - Append(new UnsignedField<8>(frsky.altitudeSource, "Altitude Source")); + Append(new UnsignedField<8>(this, frsky.voltsSource, "Volts Source")); + Append(new UnsignedField<8>(this, frsky.altitudeSource, "Altitude Source")); } else { for (int i = 0; i < (version >= 216 ? 4 : 2); i++) { - Append(new UnsignedField<8>(frsky.channels[i].ratio, "Ratio")); - Append(new SignedField<12>(frsky.channels[i].offset, "Offset")); - Append(new UnsignedField<4>(frsky.channels[i].type, "Type")); + Append(new UnsignedField<8>(this, frsky.channels[i].ratio, "Ratio")); + Append(new SignedField<12>(this, frsky.channels[i].offset, "Offset")); + Append(new UnsignedField<4>(this, frsky.channels[i].type, "Type")); for (int j = 0; j < 2; j++) - Append(new UnsignedField<8>(frsky.channels[i].alarms[j].value, "Alarm value")); + Append(new UnsignedField<8>(this, frsky.channels[i].alarms[j].value, "Alarm value")); for (int j = 0; j < 2; j++) - Append(new UnsignedField<2>(frsky.channels[i].alarms[j].level)); + Append(new UnsignedField<2>(this, frsky.channels[i].alarms[j].level)); for (int j = 0; j < 2; j++) - Append(new UnsignedField<1>(frsky.channels[i].alarms[j].greater)); - Append(new SpareBitsField<2>()); - Append(new UnsignedField<8>(frsky.channels[i].multiplier, 0, 5, "Multiplier")); + Append(new UnsignedField<1>(this, frsky.channels[i].alarms[j].greater)); + Append(new SpareBitsField<2>(this)); + Append(new UnsignedField<8>(this, frsky.channels[i].multiplier, 0, 5, "Multiplier")); } - Append(new UnsignedField<8>(frsky.usrProto)); + Append(new UnsignedField<8>(this, frsky.usrProto)); if (version >= 216) { - Append(new ConversionField >(frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); - Append(new SpareBitsField<1>()); + Append(new ConversionField >(this, frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); + Append(new SpareBitsField<1>(this)); } else { - Append(new ConversionField >(frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); + Append(new ConversionField >(this, frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); } - Append(new ConversionField >(frsky.blades, -2)); - Append(new ConversionField >(frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source")); + Append(new ConversionField >(this, frsky.blades, -2)); + Append(new ConversionField >(this, frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source")); } if (version >= 217) { for (int i = 0; i < 4; i++) { - Append(new UnsignedField<2>(frsky.screens[i].type)); + Append(new UnsignedField<2>(this, frsky.screens[i].type)); } for (int i = 0; i < 4; i++) { - Append(new FrskyScreenField(frsky.screens[i], board, version, variant)); + Append(new FrskyScreenField(this, frsky.screens[i], board, version, variant)); } } else { - Append(new UnsignedField<1>(frsky.screens[0].type)); - Append(new UnsignedField<1>(frsky.screens[1].type)); - Append(new UnsignedField<1>(frsky.screens[2].type)); - Append(new SpareBitsField<5>()); + Append(new UnsignedField<1>(this, frsky.screens[0].type)); + Append(new UnsignedField<1>(this, frsky.screens[1].type)); + Append(new UnsignedField<1>(this, frsky.screens[2].type)); + Append(new SpareBitsField<5>(this)); for (int i = 0; i < 3; i++) { - Append(new FrskyScreenField(frsky.screens[i], board, version, variant)); + Append(new FrskyScreenField(this, frsky.screens[i], board, version, variant)); } } } if (version >= 217) { - Append(new UnsignedField<7>(frsky.varioSource, "Vario Source")); - Append(new BoolField<1>(frsky.varioCenterSilent)); + Append(new UnsignedField<7>(this, frsky.varioSource, "Vario Source")); + Append(new BoolField<1>(this, frsky.varioCenterSilent)); } else { - Append(new ConversionField< UnsignedField<8> >(frsky.varioSource, &telemetryVarioSourceConversionTable, "Vario Source")); + Append(new ConversionField< UnsignedField<8> >(this, frsky.varioSource, &telemetryVarioSourceConversionTable, "Vario Source")); } - Append(new SignedField<8>(frsky.varioCenterMax)); - Append(new SignedField<8>(frsky.varioCenterMin)); - Append(new SignedField<8>(frsky.varioMin)); - Append(new SignedField<8>(frsky.varioMax)); + Append(new SignedField<8>(this, frsky.varioCenterMax)); + Append(new SignedField<8>(this, frsky.varioCenterMin)); + Append(new SignedField<8>(this, frsky.varioMin)); + Append(new SignedField<8>(this, frsky.varioMax)); for (int i=0; i<2; i++) { - Append(new ConversionField< UnsignedField<2> >(frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI")); - Append(new ConversionField< SignedField<6> >(frsky.rssiAlarms[i].value, -45+i*3)); + Append(new ConversionField< UnsignedField<2> >(this, frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI")); + Append(new ConversionField< SignedField<6> >(this, frsky.rssiAlarms[i].value, -45+i*3)); } if (version == 216) { - Append(new BoolField<1>(frsky.mAhPersistent)); - Append(new UnsignedField<15>(frsky.storedMah)); - Append(new SignedField<8>(frsky.fasOffset)); + Append(new BoolField<1>(this, frsky.mAhPersistent)); + Append(new UnsignedField<15>(this, frsky.storedMah)); + Append(new SignedField<8>(this, frsky.fasOffset)); } } else { for (int i=0; i<2; i++) { - Append(new UnsignedField<8>(frsky.channels[i].ratio, "Ratio")); - Append(new SignedField<12>(frsky.channels[i].offset, "Offset")); - Append(new UnsignedField<4>(frsky.channels[i].type, "Type")); + Append(new UnsignedField<8>(this, frsky.channels[i].ratio, "Ratio")); + Append(new SignedField<12>(this, frsky.channels[i].offset, "Offset")); + Append(new UnsignedField<4>(this, frsky.channels[i].type, "Type")); for (int j=0; j<2; j++) - Append(new UnsignedField<8>(frsky.channels[i].alarms[j].value, "Alarm value")); + Append(new UnsignedField<8>(this, frsky.channels[i].alarms[j].value, "Alarm value")); for (int j=0; j<2; j++) - Append(new UnsignedField<2>(frsky.channels[i].alarms[j].level)); + Append(new UnsignedField<2>(this, frsky.channels[i].alarms[j].level)); for (int j=0; j<2; j++) - Append(new UnsignedField<1>(frsky.channels[i].alarms[j].greater)); - Append(new UnsignedField<2>(frsky.channels[i].multiplier, 0, 3, "Multiplier")); + Append(new UnsignedField<1>(this, frsky.channels[i].alarms[j].greater)); + Append(new UnsignedField<2>(this, frsky.channels[i].multiplier, 0, 3, "Multiplier")); } - Append(new UnsignedField<2>(frsky.usrProto, "USR Proto")); - Append(new ConversionField< UnsignedField<2> >((unsigned int &)frsky.blades, -2)); + Append(new UnsignedField<2>(this, frsky.usrProto, "USR Proto")); + Append(new ConversionField< UnsignedField<2> >(this, (unsigned int &)frsky.blades, -2)); for (int i=0; i<2; i++) { - Append(new ConversionField< UnsignedField<1> >(frsky.screens[i].type, &screenTypesConversionTable, "Screen Type")); + Append(new ConversionField< UnsignedField<1> >(this, frsky.screens[i].type, &screenTypesConversionTable, "Screen Type")); } - Append(new ConversionField< UnsignedField<2> >(frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); - Append(new SignedField<4>(frsky.varioMin, "Vario Min")); - Append(new SignedField<4>(frsky.varioMax)); + Append(new ConversionField< UnsignedField<2> >(this, frsky.voltsSource, &telemetryVoltsSourceConversionTable, "Volts Source")); + Append(new SignedField<4>(this, frsky.varioMin, "Vario Min")); + Append(new SignedField<4>(this, frsky.varioMax)); for (int i=0; i<2; i++) { - Append(new ConversionField< UnsignedField<2> >(frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI level")); - Append(new ConversionField< SignedField<6> >(frsky.rssiAlarms[i].value, -45+i*3, 0, 0, 100, "RSSI value")); + Append(new ConversionField< UnsignedField<2> >(this, frsky.rssiAlarms[i].level, &rssiConversionTable[i], "RSSI level")); + Append(new ConversionField< SignedField<6> >(this, frsky.rssiAlarms[i].value, -45+i*3, 0, 0, 100, "RSSI value")); } for (int i=0; i<2; i++) { - Append(new FrskyScreenField(frsky.screens[i], board, version, variant)); + Append(new FrskyScreenField(this, frsky.screens[i], board, version, variant)); } - Append(new UnsignedField<3>(frsky.varioSource)); - Append(new SignedField<5>(frsky.varioCenterMin)); - Append(new ConversionField< UnsignedField<3> >(frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source")); - Append(new SignedField<5>(frsky.varioCenterMax)); + Append(new UnsignedField<3>(this, frsky.varioSource)); + Append(new SignedField<5>(this, frsky.varioCenterMin)); + Append(new ConversionField< UnsignedField<3> >(this, frsky.currentSource, &telemetryCurrentSourceConversionTable, "Current Source")); + Append(new SignedField<5>(this, frsky.varioCenterMax)); if (version >= 216) { - Append(new SignedField<8>(frsky.fasOffset)); + Append(new SignedField<8>(this, frsky.fasOffset)); } } } @@ -2895,15 +2901,15 @@ class FrskyField: public StructField { class MavlinkField: public StructField { public: - MavlinkField(MavlinkData & mavlink, Board::Type board, unsigned int version): - StructField("MavLink") + MavlinkField(DataField * parent, MavlinkData & mavlink, Board::Type board, unsigned int version): + StructField(parent, "MavLink") { - Append(new UnsignedField<4>(mavlink.rc_rssi_scale, "Rc_rssi_scale")); - Append(new UnsignedField<1>(mavlink.pc_rssi_en, "Pc_rssi_en")); - Append(new SpareBitsField<3>()); - Append(new SpareBitsField<8>()); - Append(new SpareBitsField<8>()); - Append(new SpareBitsField<8>()); + Append(new UnsignedField<4>(this, mavlink.rc_rssi_scale, "Rc_rssi_scale")); + Append(new UnsignedField<1>(this, mavlink.pc_rssi_en, "Pc_rssi_en")); + Append(new SpareBitsField<3>(this)); + Append(new SpareBitsField<8>(this)); + Append(new SpareBitsField<8>(this)); + Append(new SpareBitsField<8>(this)); } }; @@ -2926,26 +2932,26 @@ class CustomScreenField: public StructField { class SensorField: public TransformedField { public: - SensorField(SensorData & sensor, Board::Type board, unsigned int version): - TransformedField(internalField), - internalField("Sensor"), + SensorField(DataField * parent, SensorData & sensor, Board::Type board, unsigned int version): + TransformedField(parent, internalField), + internalField(this, "Sensor"), sensor(sensor), version(version), _param(0) { - internalField.Append(new UnsignedField<16>(_id, "id/persistentValue")); - internalField.Append(new UnsignedField<8>(_instance, "instance/formula")); - internalField.Append(new ZCharField<4>(sensor.label)); - internalField.Append(new UnsignedField<1>(sensor.type, "type")); - internalField.Append(new UnsignedField<5>(sensor.unit, "unit")); - internalField.Append(new UnsignedField<2>(sensor.prec, "prec")); - internalField.Append(new BoolField<1>(sensor.autoOffset)); - internalField.Append(new BoolField<1>(sensor.filter)); - internalField.Append(new BoolField<1>(sensor.logs)); - internalField.Append(new BoolField<1>(sensor.persistent)); - internalField.Append(new BoolField<1>(sensor.onlyPositive)); - internalField.Append(new UnsignedField<3>(_subid, "subid")); - internalField.Append(new UnsignedField<32>(_param, "param")); + internalField.Append(new UnsignedField<16>(this, _id, "id/persistentValue")); + internalField.Append(new UnsignedField<8>(this, _instance, "instance/formula")); + internalField.Append(new ZCharField<4>(this, sensor.label)); + internalField.Append(new UnsignedField<1>(this, sensor.type, "type")); + internalField.Append(new UnsignedField<5>(this, sensor.unit, "unit")); + internalField.Append(new UnsignedField<2>(this, sensor.prec, "prec")); + internalField.Append(new BoolField<1>(this, sensor.autoOffset)); + internalField.Append(new BoolField<1>(this, sensor.filter)); + internalField.Append(new BoolField<1>(this, sensor.logs)); + internalField.Append(new BoolField<1>(this, sensor.persistent)); + internalField.Append(new BoolField<1>(this, sensor.onlyPositive)); + internalField.Append(new UnsignedField<3>(this, _subid, "subid")); + internalField.Append(new UnsignedField<32>(this, _param, "param")); } virtual void beforeExport() @@ -3025,8 +3031,8 @@ int exportPpmDelay(int delay) { return (delay - 300) / 50; } int importPpmDelay(int delay) { return 300 + 50 * delay; } OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsigned int version, unsigned int variant): - TransformedField(internalField), - internalField("ModelData"), + TransformedField(NULL, internalField), + internalField(this, "ModelData"), modelData(modelData), board(board), version(version), @@ -3038,190 +3044,190 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig eepromImportDebug() << 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>(modelData.name, "Model name")); + internalField.Append(new ZCharField<15>(this, modelData.name, "Model name")); else if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<12>(modelData.name, "Model name")); + internalField.Append(new ZCharField<12>(this, modelData.name, "Model name")); else - internalField.Append(new ZCharField<10>(modelData.name, "Model name")); + internalField.Append(new ZCharField<10>(this, modelData.name, "Model name")); bool afterrelease21March2013 = IS_AFTER_RELEASE_21_MARCH_2013(board, version); if (afterrelease21March2013) { - internalField.Append(new UnsignedField<8>(modelData.moduleData[0].modelId)); + internalField.Append(new UnsignedField<8>(this, modelData.moduleData[0].modelId)); } if (IS_ARM(board) && version >= 217) { - internalField.Append(new UnsignedField<8>(modelData.moduleData[1].modelId)); + internalField.Append(new UnsignedField<8>(this, modelData.moduleData[1].modelId)); } if (HAS_LARGE_LCD(board) && version >= 215) { - internalField.Append(new CharField<10>(modelData.bitmap, true, "Model bitmap")); + internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap")); } for (int i=0; i= 218) { - internalField.Append(new SwitchField<9>(modelData.timers[i].mode, board, version, true)); - internalField.Append(new UnsignedField<23>(modelData.timers[i].val)); - internalField.Append(new SignedField<24>(modelData.timers[i].pvalue)); - internalField.Append(new UnsignedField<2>(modelData.timers[i].countdownBeep)); - internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep)); - internalField.Append(new UnsignedField<2>(modelData.timers[i].persistent)); - internalField.Append(new SpareBitsField<3>()); + internalField.Append(new SwitchField<9>(this, modelData.timers[i].mode, board, version, true)); + internalField.Append(new UnsignedField<23>(this, modelData.timers[i].val)); + internalField.Append(new SignedField<24>(this, modelData.timers[i].pvalue)); + internalField.Append(new UnsignedField<2>(this, modelData.timers[i].countdownBeep)); + internalField.Append(new BoolField<1>(this, modelData.timers[i].minuteBeep)); + internalField.Append(new UnsignedField<2>(this, modelData.timers[i].persistent)); + internalField.Append(new SpareBitsField<3>(this)); if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<8>(modelData.timers[i].name, "Timer name")); + internalField.Append(new ZCharField<8>(this, modelData.timers[i].name, "Timer name")); else - internalField.Append(new ZCharField<3>(modelData.timers[i].name, "Timer name")); + internalField.Append(new ZCharField<3>(this, modelData.timers[i].name, "Timer name")); } else if (IS_ARM(board) && version >= 217) { - internalField.Append(new SwitchField<8>(modelData.timers[i].mode, board, version, true)); - internalField.Append(new UnsignedField<24>(modelData.timers[i].val)); - internalField.Append(new SignedField<24>(modelData.timers[i].pvalue)); - internalField.Append(new UnsignedField<2>(modelData.timers[i].countdownBeep)); - internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep)); - internalField.Append(new UnsignedField<2>(modelData.timers[i].persistent)); - internalField.Append(new SpareBitsField<3>()); + internalField.Append(new SwitchField<8>(this, modelData.timers[i].mode, board, version, true)); + internalField.Append(new UnsignedField<24>(this, modelData.timers[i].val)); + internalField.Append(new SignedField<24>(this, modelData.timers[i].pvalue)); + internalField.Append(new UnsignedField<2>(this, modelData.timers[i].countdownBeep)); + internalField.Append(new BoolField<1>(this, modelData.timers[i].minuteBeep)); + internalField.Append(new UnsignedField<2>(this, modelData.timers[i].persistent)); + internalField.Append(new SpareBitsField<3>(this)); if (IS_TARANIS(board)) - internalField.Append(new ZCharField<8>(modelData.timers[i].name, "Timer name")); + internalField.Append(new ZCharField<8>(this, modelData.timers[i].name, "Timer name")); else - internalField.Append(new ZCharField<3>(modelData.timers[i].name, "Timer name")); + internalField.Append(new ZCharField<3>(this, modelData.timers[i].name, "Timer name")); } else if ((IS_ARM(board) || IS_2560(board)) && version >= 216) { - internalField.Append(new SwitchField<8>(modelData.timers[i].mode, board, version, true)); - internalField.Append(new UnsignedField<16>(modelData.timers[i].val)); - internalField.Append(new UnsignedField<2>(modelData.timers[i].countdownBeep)); - internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep)); - internalField.Append(new UnsignedField<2>(modelData.timers[i].persistent)); - internalField.Append(new SpareBitsField<3>()); - internalField.Append(new SignedField<16>(modelData.timers[i].pvalue)); + internalField.Append(new SwitchField<8>(this, modelData.timers[i].mode, board, version, true)); + internalField.Append(new UnsignedField<16>(this, modelData.timers[i].val)); + internalField.Append(new UnsignedField<2>(this, modelData.timers[i].countdownBeep)); + internalField.Append(new BoolField<1>(this, modelData.timers[i].minuteBeep)); + internalField.Append(new UnsignedField<2>(this, modelData.timers[i].persistent)); + internalField.Append(new SpareBitsField<3>(this)); + internalField.Append(new SignedField<16>(this, modelData.timers[i].pvalue)); } else if (afterrelease21March2013) { - internalField.Append(new SwitchField<8>(modelData.timers[i].mode, board, version, true)); - internalField.Append(new UnsignedField<12>(modelData.timers[i].val)); - internalField.Append(new BoolField<1>((bool &)modelData.timers[i].countdownBeep)); - internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep)); + internalField.Append(new SwitchField<8>(this, modelData.timers[i].mode, board, version, true)); + internalField.Append(new UnsignedField<12>(this, modelData.timers[i].val)); + internalField.Append(new BoolField<1>(this, (bool &)modelData.timers[i].countdownBeep)); + internalField.Append(new BoolField<1>(this, modelData.timers[i].minuteBeep)); if (HAS_PERSISTENT_TIMERS(board)) { - internalField.Append(new UnsignedField<1>(modelData.timers[i].persistent)); - internalField.Append(new SpareBitsField<1>()); - internalField.Append(new SignedField<16>(modelData.timers[i].pvalue)); + internalField.Append(new UnsignedField<1>(this, modelData.timers[i].persistent)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new SignedField<16>(this, modelData.timers[i].pvalue)); } else { - internalField.Append(new SpareBitsField<2>()); + internalField.Append(new SpareBitsField<2>(this)); } } else { - internalField.Append(new SwitchField<8>(modelData.timers[i].mode, board, version, true)); - internalField.Append(new UnsignedField<16>(modelData.timers[i].val)); + internalField.Append(new SwitchField<8>(this, modelData.timers[i].mode, board, version, true)); + internalField.Append(new UnsignedField<16>(this, modelData.timers[i].val)); if (HAS_PERSISTENT_TIMERS(board)) { - internalField.Append(new UnsignedField<1>(modelData.timers[i].persistent)); - internalField.Append(new SpareBitsField<15>()); + internalField.Append(new UnsignedField<1>(this, modelData.timers[i].persistent)); + internalField.Append(new SpareBitsField<15>(this)); } } } if (IS_ARM(board)) - internalField.Append(new UnsignedField<3>(modelData.telemetryProtocol)); + internalField.Append(new UnsignedField<3>(this, modelData.telemetryProtocol)); else - internalField.Append(new ConversionField< UnsignedField<3> >((unsigned int &)modelData.moduleData[0].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this telemetry protocol"))); + internalField.Append(new ConversionField< UnsignedField<3> >(this, (unsigned int &)modelData.moduleData[0].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this telemetry protocol"))); - internalField.Append(new BoolField<1>(modelData.thrTrim)); + internalField.Append(new BoolField<1>(this, modelData.thrTrim)); if (IS_ARM(board) && version >= 217) { - internalField.Append(new BoolField<1>(modelData.noGlobalFunctions)); - internalField.Append(new UnsignedField<2>(modelData.trimsDisplay)); - internalField.Append(new BoolField<1>(modelData.frsky.ignoreSensorIds)); + internalField.Append(new BoolField<1>(this, modelData.noGlobalFunctions)); + internalField.Append(new UnsignedField<2>(this, modelData.trimsDisplay)); + internalField.Append(new BoolField<1>(this, modelData.frsky.ignoreSensorIds)); } else if (IS_HORUS_OR_TARANIS(board) || (IS_ARM(board) && version >= 216)) { - internalField.Append(new SpareBitsField<4>()); + internalField.Append(new SpareBitsField<4>(this)); } else { - internalField.Append(new ConversionField< SignedField<4> >(modelData.moduleData[0].channelsCount, &channelsConversionTable, "Channels number", ::QObject::tr("OpenTX doesn't allow this number of channels"))); + internalField.Append(new ConversionField< SignedField<4> >(this, modelData.moduleData[0].channelsCount, &channelsConversionTable, "Channels number", ::QObject::tr("OpenTX doesn't allow this number of channels"))); } if (version >= 216) - internalField.Append(new SignedField<3>(modelData.trimInc)); + internalField.Append(new SignedField<3>(this, modelData.trimInc)); else - internalField.Append(new ConversionField< SignedField<3> >(modelData.trimInc, +2)); + internalField.Append(new ConversionField< SignedField<3> >(this, modelData.trimInc, +2)); - internalField.Append(new BoolField<1>(modelData.disableThrottleWarning)); + internalField.Append(new BoolField<1>(this, modelData.disableThrottleWarning)); if (IS_HORUS_OR_TARANIS(board) || (IS_ARM(board) && version >= 216)) - internalField.Append(new BoolField<1>(modelData.displayChecklist)); + internalField.Append(new BoolField<1>(this, modelData.displayChecklist)); else - internalField.Append(new BoolField<1>(modelData.moduleData[0].ppm.pulsePol)); + internalField.Append(new BoolField<1>(this, modelData.moduleData[0].ppm.pulsePol)); - internalField.Append(new BoolField<1>(modelData.extendedLimits)); - internalField.Append(new BoolField<1>(modelData.extendedTrims)); - internalField.Append(new BoolField<1>(modelData.throttleReversed)); + internalField.Append(new BoolField<1>(this, modelData.extendedLimits)); + internalField.Append(new BoolField<1>(this, modelData.extendedTrims)); + internalField.Append(new BoolField<1>(this, modelData.throttleReversed)); if (!IS_ARM(board) || version < 216) { - internalField.Append(new ConversionField< SignedField<8> >(modelData.moduleData[0].ppm.delay, exportPpmDelay, importPpmDelay)); + internalField.Append(new ConversionField< SignedField<8> >(this, modelData.moduleData[0].ppm.delay, exportPpmDelay, importPpmDelay)); } if (IS_ARM(board) || IS_2560(board)) - internalField.Append(new UnsignedField<16>(modelData.beepANACenter)); + internalField.Append(new UnsignedField<16>(this, modelData.beepANACenter)); else - internalField.Append(new UnsignedField<8>(modelData.beepANACenter)); + internalField.Append(new UnsignedField<8>(this, modelData.beepANACenter)); for (int i=0; i(modelData.moduleData[0].ppm.frameLength)); + internalField.Append(new SignedField<8>(this, modelData.moduleData[0].ppm.frameLength)); } - internalField.Append(new UnsignedField<8>(modelData.thrTraceSrc, "Throttle Source")); + internalField.Append(new UnsignedField<8>(this, modelData.thrTraceSrc, "Throttle Source")); if (!afterrelease21March2013) { - internalField.Append(new UnsignedField<8>(modelData.moduleData[0].modelId)); + internalField.Append(new UnsignedField<8>(this, modelData.moduleData[0].modelId)); } if (IS_HORUS(board)) - internalField.Append(new SwitchesWarningField<32>(modelData.switchWarningStates, board, version)); + internalField.Append(new SwitchesWarningField<32>(this, modelData.switchWarningStates, board, version)); else if (IS_TARANIS_X9E(board)) - internalField.Append(new SwitchesWarningField<64>(modelData.switchWarningStates, board, version)); + internalField.Append(new SwitchesWarningField<64>(this, modelData.switchWarningStates, board, version)); else if (IS_TARANIS(board)) - internalField.Append(new SwitchesWarningField<16>(modelData.switchWarningStates, board, version)); + internalField.Append(new SwitchesWarningField<16>(this, modelData.switchWarningStates, board, version)); else - internalField.Append(new SwitchesWarningField<8>(modelData.switchWarningStates, board, version)); + internalField.Append(new SwitchesWarningField<8>(this, modelData.switchWarningStates, board, version)); if (IS_TARANIS_X9E(board)) - internalField.Append(new UnsignedField<32>(modelData.switchWarningEnable)); + internalField.Append(new UnsignedField<32>(this, modelData.switchWarningEnable)); else if (!IS_HORUS(board) && version >= 216) - internalField.Append(new UnsignedField<8>(modelData.switchWarningEnable)); + internalField.Append(new UnsignedField<8>(this, modelData.switchWarningEnable)); if (board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) { for (int i=0; i= 218) { - internalField.Append(new ZCharField<3>(modelData.gvars_names[i], "GVar name")); - internalField.Append(new SpareBitsField<12>()); // TODO min - internalField.Append(new SpareBitsField<12>()); // TODO max - internalField.Append(new BoolField<1>(modelData.gvars_popups[i])); - internalField.Append(new SpareBitsField<1>()); - internalField.Append(new SpareBitsField<2>()); - internalField.Append(new SpareBitsField<4>()); + internalField.Append(new ZCharField<3>(this, modelData.gvars_names[i], "GVar name")); + internalField.Append(new SpareBitsField<12>(this)); // TODO min + internalField.Append(new SpareBitsField<12>(this)); // TODO max + internalField.Append(new BoolField<1>(this, modelData.gvars_popups[i])); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new SpareBitsField<2>(this)); + internalField.Append(new SpareBitsField<4>(this)); } else { - internalField.Append(new ZCharField<6>(modelData.gvars_names[i], "GVar name")); + internalField.Append(new ZCharField<6>(this, modelData.gvars_names[i], "GVar name")); if (version >= 216) { - internalField.Append(new BoolField<1>(modelData.gvars_popups[i])); - internalField.Append(new SpareBitsField<7>()); + internalField.Append(new BoolField<1>(this, modelData.gvars_popups[i])); + internalField.Append(new SpareBitsField<7>(this)); } } } @@ -3229,19 +3235,19 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig else if (variant & GVARS_VARIANT) { for (int i=0; i(modelData.flightModeData[0].gvars[i])); + internalField.Append(new SignedField<16>(this, modelData.flightModeData[0].gvars[i])); } } if ((board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) || (variant & FRSKY_VARIANT)) { - internalField.Append(new FrskyField(modelData.frsky, board, version, variant)); + internalField.Append(new FrskyField(this, modelData.frsky, board, version, variant)); } else if ((board == BOARD_STOCK || board == BOARD_M128) && (variant & MAVLINK_VARIANT)) { - internalField.Append(new MavlinkField(modelData.mavlink, board, version)); + internalField.Append(new MavlinkField(this, modelData.mavlink, board, version)); } if (IS_TARANIS(board) && version < 215) { - internalField.Append(new CharField<10>(modelData.bitmap, true, "Model bitmap")); + internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap")); } int modulesCount = 2; @@ -3249,66 +3255,66 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig if (IS_STM32(board)) { modulesCount = 3; if (version >= 217) { - internalField.Append(new SpareBitsField<3>()); - internalField.Append(new UnsignedField<3>(modelData.trainerMode)); - internalField.Append(new UnsignedField<2>(modelData.potsWarningMode)); + internalField.Append(new SpareBitsField<3>(this)); + internalField.Append(new UnsignedField<3>(this, modelData.trainerMode)); + internalField.Append(new UnsignedField<2>(this, modelData.potsWarningMode)); } else { - internalField.Append(new ConversionField< SignedField<8> >(modelData.moduleData[1].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this radio protocol"))); - internalField.Append(new UnsignedField<8>(modelData.trainerMode)); + internalField.Append(new ConversionField< SignedField<8> >(this, modelData.moduleData[1].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this radio protocol"))); + internalField.Append(new UnsignedField<8>(this, modelData.trainerMode)); } } else if (IS_ARM(board)) { if (version >= 217) { modulesCount = 3; - internalField.Append(new SpareBitsField<6>()); - internalField.Append(new UnsignedField<2>(modelData.potsWarningMode)); + internalField.Append(new SpareBitsField<6>(this)); + internalField.Append(new UnsignedField<2>(this, modelData.potsWarningMode)); } else if (version >= 216) { modulesCount = 3; - internalField.Append(new ConversionField< SignedField<8> >(modelData.moduleData[0].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this radio protocol"))); + internalField.Append(new ConversionField< SignedField<8> >(this, modelData.moduleData[0].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this radio protocol"))); } } if (IS_ARM(board) && version >= 215) { for (int module=0; module= 217) { - internalField.Append(new ConversionField >(modelData.moduleData[module].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this radio protocol"))); - internalField.Append(new SignedField<4>(subprotocols[module])); + internalField.Append(new ConversionField >(this, modelData.moduleData[module].protocol, &protocolsConversionTable, "Protocol", ::QObject::tr("OpenTX doesn't accept this radio protocol"))); + internalField.Append(new SignedField<4>(this, subprotocols[module])); } else { - internalField.Append(new SignedField<8>(subprotocols[module])); + internalField.Append(new SignedField<8>(this, subprotocols[module])); } - internalField.Append(new UnsignedField<8>(modelData.moduleData[module].channelsStart)); - internalField.Append(new ConversionField >(modelData.moduleData[module].channelsCount, -8)); + internalField.Append(new UnsignedField<8>(this, modelData.moduleData[module].channelsStart)); + internalField.Append(new ConversionField >(this, modelData.moduleData[module].channelsCount, -8)); if (version >= 217) { - internalField.Append(new UnsignedField<4>(modelData.moduleData[module].failsafeMode)); - internalField.Append(new UnsignedField<3>(modelData.moduleData[module].subType)); - internalField.Append(new BoolField<1>(modelData.moduleData[module].invertedSerial)); + 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)); } else { - internalField.Append(new ConversionField >(modelData.moduleData[module].failsafeMode, -1)); + internalField.Append(new ConversionField >(this, modelData.moduleData[module].failsafeMode, -1)); } for (int i=0; i<32; i++) { - internalField.Append(new SignedField<16>(modelData.moduleData[module].failsafeChannels[i])); + internalField.Append(new SignedField<16>(this, modelData.moduleData[module].failsafeChannels[i])); } if (version >= 217) { - internalField.Append(new ConversionField< SignedField<6> >(modelData.moduleData[module].ppm.delay, exportPpmDelay, importPpmDelay)); - internalField.Append(new BoolField<1>(modelData.moduleData[module].ppm.pulsePol)); - internalField.Append(new BoolField<1>(modelData.moduleData[module].ppm.outputType)); - internalField.Append(new SignedField<8>(modelData.moduleData[module].ppm.frameLength)); + 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)); } else { - internalField.Append(new ConversionField< SignedField<8> >(modelData.moduleData[module].ppm.delay, exportPpmDelay, importPpmDelay)); - internalField.Append(new SignedField<8>(modelData.moduleData[module].ppm.frameLength)); - internalField.Append(new BoolField<8>(modelData.moduleData[module].ppm.pulsePol)); + internalField.Append(new ConversionField< SignedField<8> >(this, modelData.moduleData[module].ppm.delay, exportPpmDelay, importPpmDelay)); + internalField.Append(new SignedField<8>(this, modelData.moduleData[module].ppm.frameLength)); + internalField.Append(new BoolField<8>(this, modelData.moduleData[module].ppm.pulsePol)); } } } if (IS_TARANIS(board) && version < 218) { for (int i=0; i(modelData.curves[i].name, "Curve name")); + internalField.Append(new ZCharField<6>(this, modelData.curves[i].name, "Curve name")); } } @@ -3316,30 +3322,30 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig if (version >= 218) { for (int i=0; i(script.filename, true, "Script filename")); - internalField.Append(new ZCharField<6>(script.name, "Script name")); + internalField.Append(new CharField<6>(this, script.filename, true, "Script filename")); + internalField.Append(new ZCharField<6>(this, script.name, "Script name")); for (int j=0; j<6; j++) { - internalField.Append(new SignedField<16>(script.inputs[j])); + internalField.Append(new SignedField<16>(this, script.inputs[j])); } } } else if (version >= 217) { for (int i=0; i<7; i++) { ScriptData & script = modelData.scriptData[i]; - internalField.Append(new CharField<8>(script.filename, true, "Script filename")); - internalField.Append(new ZCharField<8>(script.name, "Script name")); + internalField.Append(new CharField<8>(this, script.filename, true, "Script filename")); + internalField.Append(new ZCharField<8>(this, script.name, "Script name")); for (int j=0; j<8; j++) { - internalField.Append(new SignedField<8>(script.inputs[j])); + internalField.Append(new SignedField<8>(this, script.inputs[j])); } } } else if (version >= 216) { for (int i=0; i<7; i++) { ScriptData & script = modelData.scriptData[i]; - internalField.Append(new CharField<10>(script.filename, true, "Script filename")); - internalField.Append(new ZCharField<10>(script.name, "Script name")); + internalField.Append(new CharField<10>(this, script.filename, true, "Script filename")); + internalField.Append(new ZCharField<10>(this, script.name, "Script name")); for (int j=0; j<10; j++) { - internalField.Append(new SignedField<8>(script.inputs[j])); + internalField.Append(new SignedField<8>(this, script.inputs[j])); } } } @@ -3348,61 +3354,61 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig if (IS_ARM(board) && version >= 216) { for (int i=0; i<32; i++) { if (HAS_LARGE_LCD(board)) - internalField.Append(new ZCharField<4>(modelData.inputNames[i], "Input name")); + internalField.Append(new ZCharField<4>(this, modelData.inputNames[i], "Input name")); else - internalField.Append(new ZCharField<3>(modelData.inputNames[i], "Input name")); + internalField.Append(new ZCharField<3>(this, modelData.inputNames[i], "Input name")); } } if (IS_ARM(board) && version >= 217) { for (int i=0; i<8; i++) { if (i < MAX_POTS(board, version)+MAX_SLIDERS(board)) - internalField.Append(new BoolField<1>(modelData.potsWarningEnabled[i])); + internalField.Append(new BoolField<1>(this, modelData.potsWarningEnabled[i])); else - internalField.Append(new SpareBitsField<1>()); + internalField.Append(new SpareBitsField<1>(this)); } } else if (IS_ARM(board) && version >= 216) { for (int i=0; i<6; i++) { if (i < MAX_POTS(board, version)+MAX_SLIDERS(board)) - internalField.Append(new BoolField<1>(modelData.potsWarningEnabled[i])); + internalField.Append(new BoolField<1>(this, modelData.potsWarningEnabled[i])); else - internalField.Append(new SpareBitsField<1>()); + internalField.Append(new SpareBitsField<1>(this)); } - internalField.Append(new UnsignedField<2>(modelData.potsWarningMode)); + internalField.Append(new UnsignedField<2>(this, modelData.potsWarningMode)); } if (IS_ARM(board) && version >= 216) { for (int i=0; i < MAX_POTS(board, version)+MAX_SLIDERS(board); i++) { - internalField.Append(new SignedField<8>(modelData.potPosition[i])); + internalField.Append(new SignedField<8>(this, modelData.potPosition[i])); } } if (IS_ARM(board) && version == 216) { - internalField.Append(new SpareBitsField<16>()); + internalField.Append(new SpareBitsField<16>(this)); } if (IS_SKY9X(board) && version >= 217) { - internalField.Append(new SpareBitsField<8>()); - internalField.Append(new SpareBitsField<8>()); + internalField.Append(new SpareBitsField<8>(this)); + internalField.Append(new SpareBitsField<8>(this)); } if (IS_ARM(board) && version >= 217) { for (int i=0; i(modelData.toplcdTimer)); + internalField.Append(new UnsignedField<8>(this, modelData.toplcdTimer)); } if (IS_HORUS(board)) { for (int i = 0; i < 5; i++) { - internalField.Append(new CharField<610>(modelData.customScreenData[i], false, "Custom screen blob")); + internalField.Append(new CharField<610>(this, modelData.customScreenData[i], false, "Custom screen blob")); } - internalField.Append(new CharField<216>(modelData.topbarData, false, "Top bar blob")); - internalField.Append(new SpareBitsField<8>()); // current view + internalField.Append(new CharField<216>(this, modelData.topbarData, false, "Top bar blob")); + internalField.Append(new SpareBitsField<8>(this)); // current view } } @@ -3503,8 +3509,8 @@ void OpenTxModelData::afterImport() } OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type board, unsigned int version, unsigned int variant): - TransformedField(internalField), - internalField("General Settings"), + TransformedField(NULL, internalField), + internalField(this, "General Settings"), generalData(generalData), board(board), version(version), @@ -3515,280 +3521,280 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type generalData.version = version; generalData.variant = variant; - internalField.Append(new UnsignedField<8>(generalData.version)); + internalField.Append(new UnsignedField<8>(this, generalData.version)); if (version >= 213 || (!IS_ARM(board) && version >= 212)) - internalField.Append(new UnsignedField<16>(generalData.variant)); + internalField.Append(new UnsignedField<16>(this, generalData.variant)); if (version >= 216) { for (int i=0; i(generalData.calibMid[i])); - internalField.Append(new SignedField<16>(generalData.calibSpanNeg[i])); - internalField.Append(new SignedField<16>(generalData.calibSpanPos[i])); + internalField.Append(new SignedField<16>(this, generalData.calibMid[i])); + internalField.Append(new SignedField<16>(this, generalData.calibSpanNeg[i])); + internalField.Append(new SignedField<16>(this, generalData.calibSpanPos[i])); } } else { for (int i=0; i(generalData.calibMid[i])); + internalField.Append(new SignedField<16>(this, generalData.calibMid[i])); } for (int i=0; i(generalData.calibSpanNeg[i])); + internalField.Append(new SignedField<16>(this, generalData.calibSpanNeg[i])); } for (int i=0; i(generalData.calibSpanPos[i])); + internalField.Append(new SignedField<16>(this, generalData.calibSpanPos[i])); } } - internalField.Append(new UnsignedField<16>(chkSum)); + internalField.Append(new UnsignedField<16>(this, chkSum)); if (!IS_HORUS(board)) { - internalField.Append(new UnsignedField<8>(generalData.currModelIndex)); - internalField.Append(new UnsignedField<8>(generalData.contrast)); + internalField.Append(new UnsignedField<8>(this, generalData.currModelIndex)); + internalField.Append(new UnsignedField<8>(this, generalData.contrast)); } - internalField.Append(new UnsignedField<8>(generalData.vBatWarn)); - internalField.Append(new SignedField<8>(generalData.txVoltageCalibration)); - internalField.Append(new SignedField<8>(generalData.backlightMode)); + internalField.Append(new UnsignedField<8>(this, generalData.vBatWarn)); + internalField.Append(new SignedField<8>(this, generalData.txVoltageCalibration)); + internalField.Append(new SignedField<8>(this, generalData.backlightMode)); for (int i=0; i(generalData.trainer.calib[i])); + internalField.Append(new SignedField<16>(this, generalData.trainer.calib[i])); } for (int i=0; i(generalData.trainer.mix[i].src)); - internalField.Append(new UnsignedField<2>(generalData.trainer.mix[i].mode)); - internalField.Append(new SignedField<8>(generalData.trainer.mix[i].weight)); + internalField.Append(new UnsignedField<6>(this, generalData.trainer.mix[i].src)); + internalField.Append(new UnsignedField<2>(this, generalData.trainer.mix[i].mode)); + internalField.Append(new SignedField<8>(this, generalData.trainer.mix[i].weight)); } - internalField.Append(new UnsignedField<8>(generalData.view, 0, MAX_VIEWS(board)-1)); + internalField.Append(new UnsignedField<8>(this, generalData.view, 0, MAX_VIEWS(board)-1)); - internalField.Append(new SpareBitsField<2>()); // TODO buzzerMode? - internalField.Append(new BoolField<1>(generalData.fai)); - internalField.Append(new SignedField<2>((int &)generalData.beeperMode)); - internalField.Append(new BoolField<1>(generalData.flashBeep)); - internalField.Append(new BoolField<1>(generalData.disableMemoryWarning)); - internalField.Append(new BoolField<1>(generalData.disableAlarmWarning)); + internalField.Append(new SpareBitsField<2>(this)); // TODO buzzerMode? + internalField.Append(new BoolField<1>(this, generalData.fai)); + internalField.Append(new SignedField<2>(this, (int &)generalData.beeperMode)); + internalField.Append(new BoolField<1>(this, generalData.flashBeep)); + internalField.Append(new BoolField<1>(this, generalData.disableMemoryWarning)); + internalField.Append(new BoolField<1>(this, generalData.disableAlarmWarning)); - internalField.Append(new UnsignedField<2>(generalData.stickMode)); - internalField.Append(new SignedField<5>(generalData.timezone)); + internalField.Append(new UnsignedField<2>(this, generalData.stickMode)); + internalField.Append(new SignedField<5>(this, generalData.timezone)); if (version >= 217 && IS_HORUS_OR_TARANIS(board)) { - internalField.Append(new BoolField<1>(generalData.adjustRTC)); + internalField.Append(new BoolField<1>(this, generalData.adjustRTC)); } else { - internalField.Append(new SpareBitsField<1>()); + internalField.Append(new SpareBitsField<1>(this)); } - internalField.Append(new UnsignedField<8>(generalData.inactivityTimer)); + internalField.Append(new UnsignedField<8>(this, generalData.inactivityTimer)); if (IS_9X(board)) { if (version >= 215) { - internalField.Append(new UnsignedField<3>(generalData.mavbaud)); + internalField.Append(new UnsignedField<3>(this, generalData.mavbaud)); } else { - internalField.Append(new SpareBitsField<1>()); - internalField.Append(new BoolField<1>(generalData.minuteBeep)); - internalField.Append(new BoolField<1>(generalData.preBeep)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new BoolField<1>(this, generalData.minuteBeep)); + internalField.Append(new BoolField<1>(this, generalData.preBeep)); } } else { - internalField.Append(new SpareBitsField<3>()); + internalField.Append(new SpareBitsField<3>(this)); } if (version >= 216 && IS_HORUS(board)) - internalField.Append(new SpareBitsField<3>()); + internalField.Append(new SpareBitsField<3>(this)); else if (version >= 216 && IS_TARANIS(board)) - internalField.Append(new SignedField<3>(generalData.splashDuration)); + internalField.Append(new SignedField<3>(this, generalData.splashDuration)); else if (version >= 213 || (!IS_ARM(board) && version >= 212)) - internalField.Append(new UnsignedField<3>(generalData.splashMode)); // TODO + internalField.Append(new UnsignedField<3>(this, generalData.splashMode)); // TODO else - internalField.Append(new SpareBitsField<3>()); - internalField.Append(new SignedField<2>((int &)generalData.hapticMode)); + internalField.Append(new SpareBitsField<3>(this)); + internalField.Append(new SignedField<2>(this, (int &)generalData.hapticMode)); if (IS_ARM(board)) - internalField.Append(new SignedField<8>(generalData.switchesDelay)); + internalField.Append(new SignedField<8>(this, generalData.switchesDelay)); else - internalField.Append(new SpareBitsField<8>()); // TODO blOffBright + blOnBright + internalField.Append(new SpareBitsField<8>(this)); // TODO blOffBright + blOnBright - internalField.Append(new UnsignedField<8>(generalData.backlightDelay)); - internalField.Append(new UnsignedField<8>(generalData.templateSetup)); - internalField.Append(new SignedField<8>(generalData.PPM_Multiplier)); - internalField.Append(new SignedField<8>(generalData.hapticLength)); + internalField.Append(new UnsignedField<8>(this, generalData.backlightDelay)); + internalField.Append(new UnsignedField<8>(this, generalData.templateSetup)); + internalField.Append(new SignedField<8>(this, generalData.PPM_Multiplier)); + internalField.Append(new SignedField<8>(this, generalData.hapticLength)); if (version < 216 || (version < 218 && !IS_9X(board)) || (!IS_9X(board) && !IS_TARANIS(board) && !IS_HORUS(board))) { - internalField.Append(new UnsignedField<8>(generalData.reNavigation)); + internalField.Append(new UnsignedField<8>(this, generalData.reNavigation)); } if (version >= 216 && !IS_TARANIS(board) && !IS_HORUS(board)) { - internalField.Append(new UnsignedField<8>(generalData.stickReverse)); + internalField.Append(new UnsignedField<8>(this, generalData.stickReverse)); } - internalField.Append(new SignedField<3>(generalData.beeperLength)); - internalField.Append(new SignedField<3>(generalData.hapticStrength)); - internalField.Append(new UnsignedField<1>(generalData.gpsFormat)); - internalField.Append(new SpareBitsField<1>()); // unexpectedShutdown + internalField.Append(new SignedField<3>(this, generalData.beeperLength)); + internalField.Append(new SignedField<3>(this, generalData.hapticStrength)); + internalField.Append(new UnsignedField<1>(this, generalData.gpsFormat)); + internalField.Append(new SpareBitsField<1>(this)); // unexpectedShutdown - internalField.Append(new UnsignedField<8>(generalData.speakerPitch)); + internalField.Append(new UnsignedField<8>(this, generalData.speakerPitch)); if (IS_ARM(board)) - internalField.Append(new ConversionField< SignedField<8> >(generalData.speakerVolume, -12, 0, 0, 23, "Volume")); + internalField.Append(new ConversionField< SignedField<8> >(this, generalData.speakerVolume, -12, 0, 0, 23, "Volume")); else - internalField.Append(new ConversionField< SignedField<8> >(generalData.speakerVolume, -7, 0, 0, 7, "Volume")); + internalField.Append(new ConversionField< SignedField<8> >(this, generalData.speakerVolume, -7, 0, 0, 7, "Volume")); if (version >= 214 || (!IS_ARM(board) && version >= 213)) { - internalField.Append(new SignedField<8>(generalData.vBatMin)); - internalField.Append(new SignedField<8>(generalData.vBatMax)); + internalField.Append(new SignedField<8>(this, generalData.vBatMin)); + internalField.Append(new SignedField<8>(this, generalData.vBatMax)); } if (IS_ARM(board)) { - internalField.Append(new UnsignedField<8>(generalData.backlightBright)); - if (version < 218) internalField.Append(new SignedField<8>(generalData.txCurrentCalibration)); + internalField.Append(new UnsignedField<8>(this, generalData.backlightBright)); + if (version < 218) internalField.Append(new SignedField<8>(this, generalData.txCurrentCalibration)); if (version >= 213) { - if (version < 218) internalField.Append(new SignedField<8>(generalData.temperatureWarn)); // TODO - if (version < 218) internalField.Append(new UnsignedField<8>(generalData.mAhWarn)); - if (version < 218) internalField.Append(new UnsignedField<16>(generalData.mAhUsed)); - internalField.Append(new UnsignedField<32>(generalData.globalTimer)); - if (version < 218) internalField.Append(new SignedField<8>(generalData.temperatureCalib)); // TODO - internalField.Append(new UnsignedField<8>(generalData.btBaudrate)); // TODO - if (version < 218) internalField.Append(new BoolField<8>(generalData.optrexDisplay)); //TODO - if (version < 218) internalField.Append(new UnsignedField<8>(generalData.sticksGain)); // TODO + if (version < 218) internalField.Append(new SignedField<8>(this, generalData.temperatureWarn)); // TODO + if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.mAhWarn)); + if (version < 218) internalField.Append(new UnsignedField<16>(this, generalData.mAhUsed)); + internalField.Append(new UnsignedField<32>(this, generalData.globalTimer)); + if (version < 218) internalField.Append(new SignedField<8>(this, generalData.temperatureCalib)); // TODO + internalField.Append(new UnsignedField<8>(this, generalData.btBaudrate)); // TODO + if (version < 218) internalField.Append(new BoolField<8>(this, generalData.optrexDisplay)); //TODO + if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.sticksGain)); // TODO } if (version >= 214) { - if (version < 218) internalField.Append(new UnsignedField<8>(generalData.rotarySteps)); // TODO - internalField.Append(new UnsignedField<8>(generalData.countryCode)); - internalField.Append(new UnsignedField<1>(generalData.imperial)); + if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.rotarySteps)); // TODO + internalField.Append(new UnsignedField<8>(this, generalData.countryCode)); + internalField.Append(new UnsignedField<1>(this, generalData.imperial)); if (version >= 218) { - internalField.Append(new BoolField<1>(generalData.jitterFilter)); - internalField.Append(new SpareBitsField<6>()); + internalField.Append(new BoolField<1>(this, generalData.jitterFilter)); + internalField.Append(new SpareBitsField<6>(this)); } else { - internalField.Append(new SpareBitsField<7>()); + internalField.Append(new SpareBitsField<7>(this)); } } if (version >= 215) { - internalField.Append(new CharField<2>(generalData.ttsLanguage, true, "TTS language")); + internalField.Append(new CharField<2>(this, generalData.ttsLanguage, true, "TTS language")); if (version >= 218) { - internalField.Append(new SignedField<4>(generalData.beepVolume)); - internalField.Append(new SignedField<4>(generalData.wavVolume)); - internalField.Append(new SignedField<4>(generalData.varioVolume)); - internalField.Append(new SignedField<4>(generalData.backgroundVolume)); + internalField.Append(new SignedField<4>(this, generalData.beepVolume)); + internalField.Append(new SignedField<4>(this, generalData.wavVolume)); + internalField.Append(new SignedField<4>(this, generalData.varioVolume)); + internalField.Append(new SignedField<4>(this, generalData.backgroundVolume)); } else { - internalField.Append(new SignedField<8>(generalData.beepVolume)); - internalField.Append(new SignedField<8>(generalData.wavVolume)); - internalField.Append(new SignedField<8>(generalData.varioVolume)); + internalField.Append(new SignedField<8>(this, generalData.beepVolume)); + internalField.Append(new SignedField<8>(this, generalData.wavVolume)); + internalField.Append(new SignedField<8>(this, generalData.varioVolume)); } if (version >= 216) { - internalField.Append(new SignedField<8>(generalData.varioPitch)); - internalField.Append(new SignedField<8>(generalData.varioRange)); - internalField.Append(new SignedField<8>(generalData.varioRepeat)); + internalField.Append(new SignedField<8>(this, generalData.varioPitch)); + internalField.Append(new SignedField<8>(this, generalData.varioRange)); + internalField.Append(new SignedField<8>(this, generalData.varioRepeat)); } - if (version < 218) internalField.Append(new SignedField<8>(generalData.backgroundVolume)); + if (version < 218) internalField.Append(new SignedField<8>(this, generalData.backgroundVolume)); } if (version >= 218) { for (int i=0; i= 216) { if (version >= 218) { - internalField.Append(new UnsignedField<4>(generalData.hw_uartMode)); + internalField.Append(new UnsignedField<4>(this, generalData.hw_uartMode)); for (uint8_t i=0; i<4; i++) { - internalField.Append(new UnsignedField<1>(generalData.sliderConfig[i])); + internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[i])); } } else if (version >= 217) { - internalField.Append(new UnsignedField<6>(generalData.hw_uartMode)); + internalField.Append(new UnsignedField<6>(this, generalData.hw_uartMode)); if (IS_TARANIS_X9E(board)) { - internalField.Append(new UnsignedField<1>(generalData.sliderConfig[2])); - internalField.Append(new UnsignedField<1>(generalData.sliderConfig[3])); + internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[2])); + internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[3])); } else { - internalField.Append(new SpareBitsField<2>()); + internalField.Append(new SpareBitsField<2>(this)); } } else { - internalField.Append(new UnsignedField<8>(generalData.hw_uartMode)); + internalField.Append(new UnsignedField<8>(this, generalData.hw_uartMode)); } if (IS_HORUS(board)) { for (int i=0; i<16; i++) { if (i < MAX_SWITCHES(board, version)) - internalField.Append(new UnsignedField<2>(generalData.switchConfig[i])); + internalField.Append(new UnsignedField<2>(this, generalData.switchConfig[i])); else - internalField.Append(new SpareBitsField<2>()); + internalField.Append(new SpareBitsField<2>(this)); } } for (int i=0; i<4; i++) { if (i < MAX_POTS(board, version)) - internalField.Append(new UnsignedField<2>(generalData.potConfig[i])); + internalField.Append(new UnsignedField<2>(this, generalData.potConfig[i])); else - internalField.Append(new SpareBitsField<2>()); + internalField.Append(new SpareBitsField<2>(this)); } if (!IS_HORUS(board)) - internalField.Append(new UnsignedField<8>(generalData.backlightColor)); + internalField.Append(new UnsignedField<8>(this, generalData.backlightColor)); } if (IS_TARANIS_X9E(board)) - internalField.Append(new SpareBitsField<64>()); // switchUnlockStates + internalField.Append(new SpareBitsField<64>(this)); // switchUnlockStates else if (IS_TARANIS(board)) - internalField.Append(new SpareBitsField<16>()); // switchUnlockStates + internalField.Append(new SpareBitsField<16>(this)); // switchUnlockStates if (version == 217) { for (int i=0; i(generalData.switchName[i], "Switch name")); + internalField.Append(new ZCharField<3>(this, generalData.switchName[i], "Switch name")); } for (int i=0; i(generalData.stickName[i], "Stick name")); + internalField.Append(new ZCharField<3>(this, generalData.stickName[i], "Stick name")); } for (int i=0; i(generalData.potName[i], "Pot name")); + internalField.Append(new ZCharField<3>(this, generalData.potName[i], "Pot name")); } for (int i=0; i(generalData.sliderName[i], "Slider name")); + internalField.Append(new ZCharField<3>(this, generalData.sliderName[i], "Slider name")); } - internalField.Append(new CharField<17>(generalData.currModelFilename, true, "Current model filename")); + internalField.Append(new CharField<17>(this, generalData.currModelFilename, true, "Current model filename")); } else if (IS_TARANIS(board) && version >= 217) { for (int i=0; i(generalData.switchConfig[i])); + internalField.Append(new UnsignedField<2>(this, generalData.switchConfig[i])); else - internalField.Append(new SpareBitsField<2>()); + internalField.Append(new SpareBitsField<2>(this)); } if (IS_TARANIS_X9E(board)) { - internalField.Append(new SpareBitsField<64-2*18>()); + internalField.Append(new SpareBitsField<64-2*18>(this)); } for (int i=0; i(generalData.switchName[i], "Switch name")); + internalField.Append(new ZCharField<3>(this, generalData.switchName[i], "Switch name")); } for (int i=0; i(generalData.stickName[i], "Stick name")); + internalField.Append(new ZCharField<3>(this, generalData.stickName[i], "Stick name")); } for (int i=0; i(generalData.potName[i], "Pot name")); + internalField.Append(new ZCharField<3>(this, generalData.potName[i], "Pot name")); } for (int i=0; i(generalData.sliderName[i], "Slider name")); + internalField.Append(new ZCharField<3>(this, generalData.sliderName[i], "Slider name")); } } if (IS_HORUS(board)) { - internalField.Append(new BoolField<1>(generalData.bluetoothEnable)); - internalField.Append(new UnsignedField<7>(generalData.backlightOffBright)); - internalField.Append(new ZCharField<10>(generalData.bluetoothName, "Bluetooth name")); + internalField.Append(new BoolField<1>(this, generalData.bluetoothEnable)); + internalField.Append(new UnsignedField<7>(this, generalData.backlightOffBright)); + internalField.Append(new ZCharField<10>(this, generalData.bluetoothName, "Bluetooth name")); } else if (IS_TARANIS_X9E(board) && version >= 217) { - internalField.Append(new BoolField<8>(generalData.bluetoothEnable)); - internalField.Append(new ZCharField<10>(generalData.bluetoothName, "Bluetooth name")); + internalField.Append(new BoolField<8>(this, generalData.bluetoothEnable)); + internalField.Append(new ZCharField<10>(this, generalData.bluetoothName, "Bluetooth name")); } if (IS_HORUS(board)) { - internalField.Append(new CharField<8>(generalData.themeName, true, "Theme name")); + internalField.Append(new CharField<8>(this, generalData.themeName, true, "Theme name")); for (int i=0; i<5; i++) { - internalField.Append(new CharField<8>((char *)generalData.themeOptionValue[i], true, "Theme blob")); + internalField.Append(new CharField<8>(this, (char *)generalData.themeOptionValue[i], true, "Theme blob")); } } } diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index 41df80ef2..8cb7d3968 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -42,17 +42,28 @@ class OpenTxGeneralData: public TransformedField { virtual const char * getName() { return internalField.getName(); } + QStringList errors() + { + return _errors; + } + protected: virtual void beforeExport(); virtual void afterImport(); + virtual void setError(const QString & error) + { + qWarning() << error; + _errors << error; + } + StructField internalField; GeneralSettings & generalData; Board::Type board; unsigned int version; int inputsCount; unsigned int chkSum; - // unsigned int potsType[4]; + QStringList _errors; }; class ProtocolsConversionTable: public ConversionTable @@ -111,21 +122,31 @@ class OpenTxModelData: public TransformedField { virtual const char * getName() { return internalField.getName(); } + QStringList errors() + { + return _errors; + } + protected: virtual void beforeExport(); virtual void afterImport(); + virtual void setError(const QString & error) + { + qWarning() << error; + _errors << error; + } + StructField internalField; ModelData & modelData; Board::Type board; unsigned int version; unsigned int variant; - - private: char name[256]; int subprotocols[CPN_MAX_MODULES+1/*trainer*/]; ProtocolsConversionTable protocolsConversionTable; ChannelsConversionTable channelsConversionTable; + QStringList _errors; }; void OpenTxEepromCleanup(void); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 5508f1509..044dc9584 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -201,29 +201,6 @@ bool OpenTxEepromInterface::loadFromByteArray(T & dest, const QByteArray & data) return loadFromByteArray(dest, raw, version); } -template -bool -OpenTxEepromInterface::saveRadioSettings(GeneralSettings &settings, Board::Type board, uint8_t version, uint32_t variant) -{ - T open9xSettings(settings, board, version, variant); - // open9xSettings.Dump(); - QByteArray eeprom; - open9xSettings.Export(eeprom); - int sz = efile->writeRlc2(FILE_GENERAL, FILE_TYP_GENERAL, (const uint8_t *) eeprom.constData(), eeprom.size()); - return (sz == eeprom.size()); -} - -template -bool OpenTxEepromInterface::saveModel(unsigned int index, ModelData &model, uint8_t version, uint32_t variant) -{ - T open9xModel(model, board, version, variant); - // open9xModel.Dump(); - QByteArray eeprom; - open9xModel.Export(eeprom); - int sz = efile->writeRlc2(FILE_MODEL(index), FILE_TYP_MODEL, (const uint8_t *) eeprom.constData(), eeprom.size()); - return (sz == eeprom.size()); -} - unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t * eeprom, int size) { std::cout << "trying " << getName() << " import..."; @@ -324,9 +301,30 @@ uint8_t OpenTxEepromInterface::getLastDataVersion(Board::Type board) } } +void OpenTxEepromInterface::showErrors(const QString & title, const QStringList & errors) +{ + QString msg; + if (errors.empty()) { + msg = QObject::tr("Unknown error"); + } + else { + int noErrorsToDisplay = std::min((int)errors.size(), 10); + for (int n = 0; n < noErrorsToDisplay; n++) { + msg += " -" + errors.at(n) + "\n"; + } + if (noErrorsToDisplay < errors.size()) { + msg += QObject::tr(" ... plus %1 errors").arg(errors.size() - noErrorsToDisplay) + "\n" + msg; + } + } + + QMessageBox::warning(NULL, + QObject::tr("Error"), + title + "\n" + msg); +} + int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, uint8_t version, uint32_t variant) { - EEPROMWarnings.clear(); + // TODO QMessageBox::warning should not be called here if (version == 0) { version = getLastDataVersion(board); @@ -346,36 +344,30 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u variant |= TARANIS_X7_VARIANT; } - int result = saveRadioSettings((GeneralSettings &)radioData.generalSettings, board, version, variant); - if (!result) { + OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant); + // generator.Dump(); + QByteArray data; + generator.Export(data); + int sz = efile->writeRlc2(FILE_GENERAL, FILE_TYP_GENERAL, (const uint8_t *)data.constData(), data.size()); + if (sz == 0 || generator.errors().count() > 0) { + showErrors(QObject::tr("Cannot write radio settings"), generator.errors()); return 0; } for (int i = 0; i < getCurrentFirmware()->getCapability(Models); i++) { if (!radioData.models[i].isEmpty()) { - result = saveModel(i, (ModelData &)radioData.models[i], version, variant); - if (!result) { + OpenTxModelData generator((ModelData &)radioData.models[i], board, version, variant); + // generator.Dump(); + QByteArray data; + generator.Export(data); + int sz = efile->writeRlc2(FILE_MODEL(i), FILE_TYP_MODEL, (const uint8_t *)data.constData(), data.size()); + if (sz == 0 || generator.errors().count() > 0) { + showErrors(QObject::tr("Cannot write model %1").arg(radioData.models[i].name), generator.errors()); return 0; } } } - if (!EEPROMWarnings.empty()) { - QString msg; - int noErrorsToDisplay = std::min((int) EEPROMWarnings.size(), 10); - for (int n = 0; n < noErrorsToDisplay; n++) { - msg += "-" + EEPROMWarnings.front() + "\n"; - EEPROMWarnings.pop_front(); - } - if (!EEPROMWarnings.empty()) { - msg = QObject::tr("(displaying only first 10 warnings)") + "\n" + msg; - } - EEPROMWarnings.clear(); - QMessageBox::warning(NULL, - QObject::tr("Warning"), - QObject::tr("EEPROM saved with these warnings:") + "\n" + msg); - } - return size; } diff --git a/companion/src/firmwares/opentx/opentxinterface.h b/companion/src/firmwares/opentx/opentxinterface.h index a13b731c5..f9cfdf745 100644 --- a/companion/src/firmwares/opentx/opentxinterface.h +++ b/companion/src/firmwares/opentx/opentxinterface.h @@ -67,12 +67,8 @@ class OpenTxEepromInterface : public EEPROMInterface bool loadRadioSettingsFromRLE(GeneralSettings & settings, RleFile * rleFile, uint8_t version); bool loadModelFromRLE(ModelData & model, RleFile * rleFile, unsigned int index, uint8_t version, uint32_t variant); - - template - bool saveModel(unsigned int index, ModelData & model, uint8_t version, uint32_t variant); - - template - bool saveRadioSettings(GeneralSettings & settings, Board::Type board, uint8_t version, uint32_t variant); + + void showErrors(const QString & title, const QStringList & errors); uint8_t getLastDataVersion(Board::Type board); diff --git a/companion/src/flasheepromdialog.cpp b/companion/src/flasheepromdialog.cpp index 9f1df84e5..02c4571c7 100644 --- a/companion/src/flasheepromdialog.cpp +++ b/companion/src/flasheepromdialog.cpp @@ -229,8 +229,7 @@ void FlashEEpromDialog::on_burnButton_clicked() QFile file(filename); uint8_t *eeprom = (uint8_t*)malloc(getEEpromSize(getCurrentBoard())); int eeprom_size = getCurrentEEpromInterface()->save(eeprom, *radioData, 0, getCurrentFirmware()->getVariantNumber()); - if (!eeprom_size) { - QMessageBox::warning(this, tr("Error"), tr("Cannot write file %1:\n%2.").arg(filename).arg(file.errorString())); + if (eeprom_size == 0) { return; } if (!file.open(QIODevice::WriteOnly)) { diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index df21e42d1..54ca04143 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -589,14 +589,16 @@ void MainWindow::openFile() void MainWindow::save() { - if (activeMdiChild() && activeMdiChild()->save()) + if (activeMdiChild() && activeMdiChild()->save()) { statusBar()->showMessage(tr("File saved"), 2000); + } } void MainWindow::saveAs() { - if (activeMdiChild() && activeMdiChild()->saveAs()) + if (activeMdiChild() && activeMdiChild()->saveAs()) { statusBar()->showMessage(tr("File saved"), 2000); + } } void MainWindow::openRecentFile() diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp index 4f425f17d..f61d8b8c4 100644 --- a/companion/src/mdichild.cpp +++ b/companion/src/mdichild.cpp @@ -605,7 +605,7 @@ bool MdiChild::saveAs(bool isNew) if (isNew) return saveFile(fileName); else - return saveFile(fileName,true); + return saveFile(fileName, true); } bool MdiChild::saveFile(const QString & filename, bool setCurrent) @@ -614,7 +614,6 @@ bool MdiChild::saveFile(const QString & filename, bool setCurrent) Storage storage(filename); bool result = storage.write(radioData); if (!result) { - QMessageBox::warning(this, "Companion", tr("Cannot save file"), QMessageBox::Ok); return false; } diff --git a/companion/src/modeledit/CMakeLists.txt b/companion/src/modeledit/CMakeLists.txt index d6d39a561..945a68f96 100644 --- a/companion/src/modeledit/CMakeLists.txt +++ b/companion/src/modeledit/CMakeLists.txt @@ -22,7 +22,7 @@ set(modeledit_SRCS logicalswitches.cpp customfunctions.cpp # templates.cpp - mixerslist.cpp + mixerslistwidget.cpp node.cpp edge.cpp ) @@ -35,7 +35,7 @@ set(modeledit_HDRS logicalswitches.h customfunctions.h # templates.h - mixerslist.h + mixerslistwidget.h node.h ) diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index 6291be880..8bca86aae 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -33,7 +33,7 @@ InputsPanel::InputsPanel(QWidget *parent, ModelData & model, GeneralSettings & g QGridLayout * exposLayout = new QGridLayout(this); - ExposlistWidget = new MixersList(this, true); + ExposlistWidget = new MixersListWidget(this, true); QPushButton * qbUp = new QPushButton(this); QPushButton * qbDown = new QPushButton(this); QPushButton * qbClear = new QPushButton(this); diff --git a/companion/src/modeledit/inputs.h b/companion/src/modeledit/inputs.h index 33904df26..8656c6f59 100644 --- a/companion/src/modeledit/inputs.h +++ b/companion/src/modeledit/inputs.h @@ -22,7 +22,7 @@ #define _INPUTS_H_ #include "modeledit.h" -#include "mixerslist.h" +#include "mixerslistwidget.h" #include "modelprinter.h" class InputsPanel : public ModelPanel @@ -53,7 +53,7 @@ class InputsPanel : public ModelPanel private: bool expoInserted; - MixersList *ExposlistWidget; + MixersListWidget *ExposlistWidget; bool firstLine; int inputsCount; ModelPrinter modelPrinter; diff --git a/companion/src/modeledit/mixerslist.cpp b/companion/src/modeledit/mixerslistwidget.cpp similarity index 89% rename from companion/src/modeledit/mixerslist.cpp rename to companion/src/modeledit/mixerslistwidget.cpp index e209615f7..a14e2583d 100644 --- a/companion/src/modeledit/mixerslist.cpp +++ b/companion/src/modeledit/mixerslistwidget.cpp @@ -18,9 +18,9 @@ * GNU General Public License for more details. */ -#include "mixerslist.h" +#include "mixerslistwidget.h" -MixersList::MixersList(QWidget *parent, bool expo) : +MixersListWidget::MixersListWidget(QWidget * parent, bool expo) : QListWidget(parent), expo(expo) { @@ -33,7 +33,7 @@ MixersList::MixersList(QWidget *parent, bool expo) : setItemDelegate(new MixersDelegate(parent)); //set custom paint handler } -void MixersList::keyPressEvent(QKeyEvent *event) +void MixersListWidget::keyPressEvent(QKeyEvent *event) { emit keyWasPressed(event); } @@ -42,7 +42,7 @@ void MixersList::keyPressEvent(QKeyEvent *event) /** @brief Override to give us different mime type for mixers and inputs */ -QStringList MixersList::mimeTypes () const +QStringList MixersListWidget::mimeTypes () const { QStringList types; if (expo) types << "application/x-companion-expo-item"; @@ -50,7 +50,7 @@ QStringList MixersList::mimeTypes () const return types; } -void MixersList::dropEvent(QDropEvent *event) +void MixersListWidget::dropEvent(QDropEvent * event) { QList list; foreach(QListWidgetItem *item, selectedItems()) { @@ -62,9 +62,9 @@ void MixersList::dropEvent(QDropEvent *event) dropMimeData(indexAt(event->pos()).row(),event->mimeData(),event->dropAction()); } -bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction action ) +bool MixersListWidget::dropMimeData(int index, const QMimeData * data, Qt::DropAction action ) { - // qDebug() << "MixersList::dropMimeData() index:" << index << "formats" << data->formats(); + // qDebug() << "MixersListWidget::dropMimeData() index:" << index << "formats" << data->formats(); QByteArray dropData = data->data(expo ? "application/x-companion-expo-item" : "application/x-companion-mix-item"); if (dropData.isNull() ) return false; QDataStream stream(&dropData, QIODevice::ReadOnly); @@ -77,7 +77,7 @@ bool MixersList::dropMimeData( int index, const QMimeData * data, Qt::DropAction QList lsVars; lsVars = v.values(); qba.append(lsVars.at(1).toByteArray().mid(1)); - // qDebug() << "MixersList::dropMimeData() added" << lsVars.count() << "items, data:" << lsVars; + // qDebug() << "MixersListWidget::dropMimeData() added" << lsVars.count() << "items, data:" << lsVars; } if(qba.length()>0) { diff --git a/companion/src/modeledit/mixerslist.h b/companion/src/modeledit/mixerslistwidget.h similarity index 91% rename from companion/src/modeledit/mixerslist.h rename to companion/src/modeledit/mixerslistwidget.h index a42ace1d0..7ef66a187 100644 --- a/companion/src/modeledit/mixerslist.h +++ b/companion/src/modeledit/mixerslistwidget.h @@ -18,20 +18,20 @@ * GNU General Public License for more details. */ -#ifndef _MIXERSLIST_H_ -#define _MIXERSLIST_H_ +#ifndef _MIXERSLISTWIDGET_H_ +#define _MIXERSLISTWIDGET_H_ #include #define MIX_ROW_HEIGHT_INCREASE 8 //how much space is added above mixer row (for new channel), if 0 space adding is disabled const int GroupHeaderRole = (Qt::UserRole+2); //defines new user role for list items. If value is > 0, then space is added before that item -class MixersList : public QListWidget +class MixersListWidget : public QListWidget { Q_OBJECT public: - explicit MixersList(QWidget *parent, bool expo); + explicit MixersListWidget(QWidget *parent, bool expo); void keyPressEvent(QKeyEvent *event); void dropEvent(QDropEvent *event); @@ -70,4 +70,4 @@ class MixersDelegate : public QStyledItemDelegate }; -#endif // _MIXERSLIST_H_ +#endif // _MIXERSLISTWIDGET_H_ diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index dd2dba750..08427b4f8 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -29,7 +29,7 @@ MixesPanel::MixesPanel(QWidget *parent, ModelData & model, GeneralSettings & gen { QGridLayout * mixesLayout = new QGridLayout(this); - MixerlistWidget = new MixersList(this, false); // TODO enum + mixersListWidget = new MixersListWidget(this, false); // TODO enum QPushButton * qbUp = new QPushButton(this); QPushButton * qbDown = new QPushButton(this); QPushButton * qbClear = new QPushButton(this); @@ -42,20 +42,20 @@ MixesPanel::MixesPanel(QWidget *parent, ModelData & model, GeneralSettings & gen qbClear->setText(tr("Clear Mixes")); qbClear->setIcon(CompanionIcon("clear.png")); - mixesLayout->addWidget(MixerlistWidget,1,1,1,3); + mixesLayout->addWidget(mixersListWidget,1,1,1,3); mixesLayout->addWidget(qbUp,2,1); mixesLayout->addWidget(qbClear,2,2); mixesLayout->addWidget(qbDown,2,3); - connect(MixerlistWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(mixerlistWidget_customContextMenuRequested(QPoint))); - connect(MixerlistWidget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(mixerlistWidget_doubleClicked(QModelIndex))); - connect(MixerlistWidget,SIGNAL(mimeDropped(int,const QMimeData*,Qt::DropAction)),this,SLOT(mimeMixerDropped(int,const QMimeData*,Qt::DropAction))); + connect(mixersListWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(mixerlistWidget_customContextMenuRequested(QPoint))); + connect(mixersListWidget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(mixerlistWidget_doubleClicked(QModelIndex))); + connect(mixersListWidget,SIGNAL(mimeDropped(int,const QMimeData*,Qt::DropAction)),this,SLOT(mimeMixerDropped(int,const QMimeData*,Qt::DropAction))); connect(qbUp,SIGNAL(pressed()),SLOT(moveMixUp())); connect(qbDown,SIGNAL(pressed()),SLOT(moveMixDown())); connect(qbClear,SIGNAL(pressed()),SLOT(clearMixes())); - connect(MixerlistWidget,SIGNAL(keyWasPressed(QKeyEvent*)), this, SLOT(mixerlistWidget_KeyPress(QKeyEvent*))); + connect(mixersListWidget,SIGNAL(keyWasPressed(QKeyEvent*)), this, SLOT(mixerlistWidget_KeyPress(QKeyEvent*))); } MixesPanel::~MixesPanel() @@ -64,17 +64,17 @@ MixesPanel::~MixesPanel() void MixesPanel::update() { - // curDest -> destination channel - // i -> mixer number - MixerlistWidget->clear(); - firstLine = true; + mixersListWidget->clear(); + unsigned int curDest = 0; unsigned int outputs = firmware->getCapability(Outputs); for (int i=0; igetCapability(Mixes); i++) { MixData & mix = model->mixData[i]; - // qDebug() << "mix.destCh: " << mix.destCh; - if (mix.destCh == 0 || mix.destCh>outputs) continue; + if (mix.destCh == 0 || mix.destCh > outputs) { + // we reached the end of the mixes list + break; + } QString str = ""; while (curDest < mix.destCh-1) { curDest++; @@ -111,19 +111,18 @@ bool MixesPanel::AddMixerLine(int dest) QByteArray qba(1, (quint8)dest); if (dest >= 0) { //add mix data - MixData *md = &model->mixData[dest]; + MixData * md = &model->mixData[dest]; qba.append((const char*)md, sizeof(MixData)); } itm->setData(Qt::UserRole, qba); #if MIX_ROW_HEIGHT_INCREASE > 0 - if (new_ch && !firstLine) { - //increase size of this row + // TODO why? + if (new_ch && mixersListWidget->count() == 0) { + // increase size of this row itm->setData(GroupHeaderRole, 1); } #endif - MixerlistWidget->addItem(itm); - firstLine = false; - // qDebug() << "MixesPanel::AddMixerLine(): dest" << dest << "text" << str; + mixersListWidget->addItem(itm); return new_ch; } @@ -217,15 +216,21 @@ void MixesPanel::gm_openMix(int index) int MixesPanel::getMixerIndex(unsigned int dch) { - int i = 0; - while ((model->mixData[i].destCh <= dch) && (model->mixData[i].destCh) && (i < firmware->getCapability(Mixes))) i++; - if (i == firmware->getCapability(Mixes)) return -1; - return i; + for (int i=0; i < firmware->getCapability(Mixes); i++) { + if (!model->mixData[i].destCh) { + // we reached the end of used mixes + return i; + } + if (model->mixData[i].destCh > dch) { + return i; + } + } + return -1; } void MixesPanel::mixerlistWidget_doubleClicked(QModelIndex index) { - int idx = MixerlistWidget->item(index.row())->data(Qt::UserRole).toByteArray().at(0); + int idx = mixersListWidget->item(index.row())->data(Qt::UserRole).toByteArray().at(0); if (idx<0) { int i = -idx; idx = getMixerIndex(i); //get mixer index to insert @@ -253,7 +258,7 @@ void MixesPanel::mixersDeleteList(QList list) QList MixesPanel::createMixListFromSelected() { QList list; - foreach(QListWidgetItem *item, MixerlistWidget->selectedItems()) { + foreach(QListWidgetItem *item, mixersListWidget->selectedItems()) { int idx= item->data(Qt::UserRole).toByteArray().at(0); if(idx >= 0 && idxgetCapability(Mixes)) list << idx; } @@ -263,10 +268,10 @@ QList MixesPanel::createMixListFromSelected() // TODO duplicated code void MixesPanel::setSelectedByMixList(QList list) { - for(int i=0; icount(); i++) { - int t = MixerlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); + for(int i=0; icount(); i++) { + int t = mixersListWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); if(list.contains(t)) { - MixerlistWidget->item(i)->setSelected(true); + mixersListWidget->item(i)->setSelected(true); } } } @@ -314,7 +319,7 @@ void MixesPanel::mixersCopy() void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) { - if(mimeData->hasFormat("application/x-companion-mix")) { + if (mimeData->hasFormat("application/x-companion-mix")) { int idx; // mixer index int dch; @@ -349,9 +354,9 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) void MixesPanel::mixersPaste() { - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - QListWidgetItem *item = MixerlistWidget->currentItem(); + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + QListWidgetItem * item = mixersListWidget->currentItem(); if (item) { pasteMixerMimeData(mimeData, item->data(Qt::UserRole).toByteArray().at(0)); } @@ -365,7 +370,7 @@ void MixesPanel::mixersDuplicate() void MixesPanel::mixerOpen() { - int idx = MixerlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); + int idx = mixersListWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); if(idx < 0) { int i = -idx; idx = getMixerIndex(i); //get mixer index to insert @@ -382,7 +387,7 @@ void MixesPanel::mixerOpen() void MixesPanel::mixerHighlight() { - int idx = MixerlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); + int idx = mixersListWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); int dest; if (idx<0) { dest = -idx; @@ -392,17 +397,17 @@ void MixesPanel::mixerHighlight() } highlightedSource = ( (int)highlightedSource == dest) ? 0 : dest; // qDebug() << "MixesPanel::mixerHighlight(): " << highlightedSource ; - for(int i=0; icount(); i++) { - int t = MixerlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); - MixerlistWidget->item(i)->setText(getMixerText(t, 0)); + for(int i=0; icount(); i++) { + int t = mixersListWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); + mixersListWidget->item(i)->setText(getMixerText(t, 0)); } } void MixesPanel::mixerAdd() { - if (!MixerlistWidget->currentItem()) return; + if (!mixersListWidget->currentItem()) return; - int index = MixerlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); + int index = mixersListWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); if(index < 0) { // if empty then return relavent index int i = -index; @@ -422,7 +427,7 @@ void MixesPanel::mixerAdd() void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) { - QPoint globalPos = MixerlistWidget->mapToGlobal(pos); + QPoint globalPos = mixersListWidget->mapToGlobal(pos); const QClipboard *clipboard = QApplication::clipboard(); const QMimeData *mimeData = clipboard->mimeData(); @@ -447,7 +452,7 @@ void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) void MixesPanel::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction action) { - int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); + int idx= mixersListWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); //qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; if (action==Qt::CopyAction) { pasteMixerMimeData(data, idx); @@ -472,10 +477,10 @@ void MixesPanel::mixerlistWidget_KeyPress(QKeyEvent *event) if(event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) mixerOpen(); if(event->matches(QKeySequence::MoveToNextLine)) { - MixerlistWidget->setCurrentRow(MixerlistWidget->currentRow()+1); + mixersListWidget->setCurrentRow(mixersListWidget->currentRow()+1); } if(event->matches(QKeySequence::MoveToPreviousLine)) { - MixerlistWidget->setCurrentRow(MixerlistWidget->currentRow()-1); + mixersListWidget->setCurrentRow(mixersListWidget->currentRow()-1); } } diff --git a/companion/src/modeledit/mixes.h b/companion/src/modeledit/mixes.h index c871ef2bc..c2dd54bc2 100644 --- a/companion/src/modeledit/mixes.h +++ b/companion/src/modeledit/mixes.h @@ -22,7 +22,7 @@ #define _MIXES_H_ #include "modeledit.h" -#include "mixerslist.h" +#include "mixerslistwidget.h" #include "mixerdialog.h" #include "modelprinter.h" @@ -59,10 +59,9 @@ class MixesPanel : public ModelPanel void pasteMixerMimeData(const QMimeData * mimeData, int destIdx); private: - MixersList *MixerlistWidget; + MixersListWidget * mixersListWidget; bool mixInserted; unsigned int highlightedSource; - bool firstLine; ModelPrinter modelPrinter; int getMixerIndex(unsigned int dch); diff --git a/companion/src/radiodata.cpp b/companion/src/radiodata.cpp index 3833e1766..4d09f71b9 100644 --- a/companion/src/radiodata.cpp +++ b/companion/src/radiodata.cpp @@ -38,6 +38,25 @@ void RawSource::convert(Board::Type before, Board::Type after) } } } + + // SWI to SWR don't exist on !X9E board + if (!IS_TARANIS_X9E(after) && IS_TARANIS_X9E(before)) { + if (type == SOURCE_TYPE_SWITCH && index >= 8) { + index = index % 8; + } + } + + // No SE and SG on X7 board + if (IS_TARANIS_X7(after)) { + if (IS_TARANIS_X9(before) || IS_HORUS(before)) { + if (type == SOURCE_TYPE_SWITCH && index >= 6) { + index -= 2; + } + else if (type == SOURCE_TYPE_SWITCH && index >= 4) { + index -= 1; + } + } + } } void MixData::convert(Board::Type before, Board::Type after) diff --git a/companion/src/storage/bineeprom.cpp b/companion/src/storage/bineeprom.cpp index 1c7c0fd58..ffbebdcab 100644 --- a/companion/src/storage/bineeprom.cpp +++ b/companion/src/storage/bineeprom.cpp @@ -60,6 +60,7 @@ bool BinEepromFormat::write(const RadioData & radioData) result = writeToFile(eeprom, eeprom_size); } else { + // TODO here we could call setError(eepromInterface->errors()) setError(QObject::tr("Cannot save EEPROM")); result = false; } diff --git a/companion/src/storage/firmwareinterface.cpp b/companion/src/storage/firmwareinterface.cpp index f9ea5a5dd..34b580f47 100644 --- a/companion/src/storage/firmwareinterface.cpp +++ b/companion/src/storage/firmwareinterface.cpp @@ -330,16 +330,16 @@ bool FirmwareInterface::isValid() return isValidFlag; } -unsigned int FirmwareInterface::save(QString fileName) +unsigned int FirmwareInterface::save(const QString & filename) { uint8_t * binflash = (uint8_t*)malloc(FSIZE_MAX); if (binflash == NULL) { return -1; } memcpy(binflash, flash.constData(), flashSize); - QFile file(fileName); + QFile file(filename); - int fileType = getStorageType(fileName); + int fileType = getStorageType(filename); if (fileType == STORAGE_TYPE_HEX) { if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) { //reading HEX TEXT file diff --git a/companion/src/storage/firmwareinterface.h b/companion/src/storage/firmwareinterface.h index e25e22262..ce9aa994a 100644 --- a/companion/src/storage/firmwareinterface.h +++ b/companion/src/storage/firmwareinterface.h @@ -56,7 +56,7 @@ class FirmwareInterface int getSplashWidth(); uint getSplashHeight(); QImage::Format getSplashFormat(); - unsigned int save(QString fileName); + unsigned int save(const QString & fileName); bool isValid(); private: diff --git a/companion/src/storage/storage.cpp b/companion/src/storage/storage.cpp index b5e4c3f78..936af71c5 100644 --- a/companion/src/storage/storage.cpp +++ b/companion/src/storage/storage.cpp @@ -118,8 +118,9 @@ bool convertEEprom(const QString & sourceEEprom, const QString & destinationEEpr } QFile destinationFile(destinationEEprom); - if (!destinationFile.open(QIODevice::WriteOnly)) + if (!destinationFile.open(QIODevice::WriteOnly)) { return false; + } int result = destinationFile.write(eeprom.constData(), size); destinationFile.close();