diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 1adf9cf8e..bdde309f5 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -868,6 +868,11 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_SHENQI, MM_RF_PROTO_FY326, MM_RF_PROTO_SFHSS, + MM_RF_PROTO_J6PRO, + MM_RF_PROTO_FQ777, + MM_RF_PROTO_ASSAN, + MM_RF_PROTO_HONTAI, + MM_RF_PROTO_OLRS, MM_RF_PROTO_CUSTOM, MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM }; @@ -894,32 +899,26 @@ class ModuleData { unsigned int failsafeMode; int failsafeChannels[C9X_NUM_CHNOUT]; - // By pure coincidence the struct are unions with the same datatype in Companion - // and the firmware itself. If this changes the multi struct needs it own logic in the eeprom interface - union { - struct { + + struct { int delay; bool pulsePol; // false = positive bool outputType; // false = open drain, true = push pull int frameLength; - } ppm; - struct { - int rfProtocol; - bool autoBindMode; - bool lowPowerMode; - int optionValue; - } multi; - }; + } ppm; + + struct { + unsigned int rfProtocol; + bool autoBindMode; + bool lowPowerMode; + bool customProto; + int optionValue; + } multi; + - // Currently the Eeprom read/write code does not work with unions - // define a hack for the multi rf Protocol to get the real numbers here - // (reverse the int => ms logic of the ppm delay) - int getMultiRfProtocol () { return (multi.rfProtocol - 300) / 50; } - void setMultiRfProtocol (int val) { multi.rfProtocol = 300 + 50 * val; } void clear() { memset(this, 0, sizeof(ModuleData)); } QString polarityToString() const { return ppm.pulsePol ? QObject::tr("Positive") : QObject::tr("Negative"); } // TODO ModelPrinter - }; #define C9X_MAX_SCRIPTS 7 diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index f1a824c18..4ee1eca38 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -3290,7 +3290,17 @@ void OpenTxModelData::beforeExport() subprotocols[module] = modelData.moduleData[module].protocol - PULSES_PXX_XJT_X16; else if (modelData.moduleData[module].protocol >= PULSES_LP45 && modelData.moduleData[module].protocol <= PULSES_DSMX) subprotocols[module] = modelData.moduleData[module].protocol - PULSES_LP45; - else + else if (modelData.moduleData[module].protocol == PULSES_MULTIMODULE) { + // copy multi settings to ppm settings to get them written to the eeprom + // (reverse the int => ms logic of the ppm delay) since only ppm is written + + subprotocols[module] = modelData.moduleData[module].multi.rfProtocol & (0x1f); + int multiByte = ((modelData.moduleData[module].multi.rfProtocol >> 4) & 0x03) | (modelData.moduleData[module].multi.customProto << 7); + modelData.moduleData[module].ppm.delay = 300 + 50 * multiByte; + modelData.moduleData[module].ppm.frameLength = modelData.moduleData[module].multi.optionValue; + modelData.moduleData[module].ppm.outputType = modelData.moduleData[module].multi.lowPowerMode; + modelData.moduleData[module].ppm.pulsePol = modelData.moduleData[module].multi.autoBindMode; + } else subprotocols[module] = (module==0 ? -1 : 0); } } @@ -3324,6 +3334,15 @@ void OpenTxModelData::afterImport() modelData.moduleData[module].protocol += subprotocols[module]; else modelData.moduleData[module].protocol = PULSES_OFF; + } else if (modelData.moduleData[module].protocol == PULSES_MULTIMODULE) { + // Copy data from ppm struct to multi struct + unsigned int multiByte = (unsigned int)((modelData.moduleData[module].ppm.delay - 300) / 50); + modelData.moduleData[module].multi.rfProtocol = subprotocols[module] | ((multiByte & 0x3) << 4); + + modelData.moduleData[module].multi.customProto = (multiByte & 0x80) == 0x80; + modelData.moduleData[module].multi.optionValue = modelData.moduleData[module].ppm.frameLength; + modelData.moduleData[module].multi.lowPowerMode = modelData.moduleData[module].ppm.outputType; + modelData.moduleData[module].multi.autoBindMode = modelData.moduleData[module].ppm.pulsePol; } } diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index cb2424ee3..1cfa11818 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -183,7 +183,7 @@ ModulePanel::ModulePanel(QWidget *parent, ModelData & model, ModuleData & module for (int i=0; i<=MM_RF_PROTO_LAST; i++) { - ui->multiProtocol->addItem(ModelPrinter::printMultiRfProtocol(i), (QVariant) i); + ui->multiProtocol->addItem(ModelPrinter::printMultiRfProtocol(i, false), (QVariant) i); } if (firmware->getCapability(HasFailsafe)) { @@ -318,19 +318,19 @@ void ModulePanel::update() // Multi settings fields ui->label_multiProtocol->setVisible(mask & MASK_MULTIMODULE); ui->multiProtocol->setVisible(mask & MASK_MULTIMODULE); - ui->multiProtocol->setCurrentIndex(module.getMultiRfProtocol()); + ui->multiProtocol->setCurrentIndex(module.multi.rfProtocol); ui->label_multiSubType->setVisible(mask & MASK_MULTIMODULE); ui->multiSubType->setVisible(mask & MASK_MULTIMODULE); if (mask & MASK_MULTIMODULE) { - int numEntries = getNumSubtypes(static_cast(module.getMultiRfProtocol())); + int numEntries = getNumSubtypes(static_cast(module.multi.rfProtocol)); // Removes extra items ui->multiSubType->setMaxCount(numEntries); for (int i=0; i < numEntries; i++) { if (i < ui->multiSubType->count()) - ui->multiSubType->setItemText(i, ModelPrinter::printMultiSubType(module.getMultiRfProtocol(), i)); + ui->multiSubType->setItemText(i, ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i)); else - ui->multiSubType->addItem(ModelPrinter::printMultiSubType(module.getMultiRfProtocol(), i), (QVariant) i); + ui->multiSubType->addItem(ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i), (QVariant) i); } } ui->multiSubType->setCurrentIndex(module.subType); @@ -474,7 +474,7 @@ void ModulePanel::on_multiProtocol_currentIndexChanged(int index) { if (!lock) { lock=true; - module.setMultiRfProtocol(index); + module.multi.rfProtocol = index; unsigned int maxSubTypes = getNumSubtypes(static_cast(index)); module.subType = std::min(module.subType, maxSubTypes -1); update(); diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 6d1205d53..2cafc0607 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -105,36 +105,37 @@ QString ModelPrinter::printModuleProtocol(unsigned int protocol) return CHECK_IN_ARRAY(strings, protocol); } -QString ModelPrinter::printMultiRfProtocol(int rfProtocol) +QString ModelPrinter::printMultiRfProtocol(int rfProtocol, bool custom) { static const char *strings[] = { "FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023", - "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "Custom" + "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","OLRS","Custom" }; - if (rfProtocol > MM_RF_PROTO_CUSTOM) - return "Custom - proto " + QString::number(rfProtocol & 0x1f); + if (custom) + return "Custom - proto " + QString::number(rfProtocol); else return CHECK_IN_ARRAY(strings, rfProtocol); } -QString ModelPrinter::printMultiSubType(int rfProtocol, int subType) { +QString ModelPrinter::printMultiSubType(int rfProtocol, bool custom, int subType) { /* custom protocols */ static const char *custom_subtype_strings[] = {"Subtype 0","Subtype 1","Subtype 2","Subtype 3","Subtype 4","Subtype 5","Subtype 6","Subtype 7"}; static const char *flysky_strings[] = {"Standard","V9x9","V6x6","V912"}; - static const char *frsky_strings[] = {"D16", "D8", "D16 8ch", "LR12"}; + static const char *frsky_strings[] = {"D16", "D8", "D16 8ch", "V8"}; static const char *hisky_strings[] = { "HiSky", "HK310" }; - static const char *dsm2_strings[] = {"DSM2", "DSMX"}; + static const char *dsm2_strings[] = {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"}; static const char *yd717_strings[] = {"YD717", "Skywalker", "Syma X2", "XINXUN", "NIHUI"}; static const char *symax_strings[] = {"Standard", "Syma X5C"}; static const char *cx10_strings[] = {"Green", "Blue", "DM007", "Q282", "JC3015a", "JC3015b", "MK33041", "Q242"}; static const char *cg023_strings[] = {"CG023", "YD829", "H3 3D"}; - static const char* kn_strings[] = {"WLtoys", "FeiLun"}; - static const char* mt99_strings[] = {"MT99","H7","YZ"}; - static const char* mjxq_strings[] = {"WLH08", "X600", "X800", "H26D", "E010"}; + static const char *kn_strings[] = {"WLtoys", "FeiLun"}; + static const char *mt99_strings[] = {"MT99","H7","YZ"}; + static const char *mjxq_strings[] = {"WLH08", "X600", "X800", "H26D", "E010"}; + static const char *hontai_strings[] = {"Standard","JJRC X1","X5C1 Clone"}; - if (rfProtocol >= MM_RF_PROTO_CUSTOM) { + if (custom) return CHECK_IN_ARRAY(custom_subtype_strings, subType); - } + switch (rfProtocol) { case MM_RF_PROTO_FLYSKY: return CHECK_IN_ARRAY(flysky_strings, subType); @@ -158,6 +159,8 @@ QString ModelPrinter::printMultiSubType(int rfProtocol, int subType) { return CHECK_IN_ARRAY(mt99_strings, subType); case MM_RF_PROTO_MJXQ: return CHECK_IN_ARRAY(mjxq_strings, subType); + case MM_RF_PROTO_HONTAI: + return CHECK_IN_ARRAY(hontai_strings, subType); default: return "DEFAULT"; } @@ -175,7 +178,7 @@ QString ModelPrinter::printModule(int idx) { result += " " + tr("Receiver number(%1)").arg(module.modelId); } if (module.protocol == PULSES_MULTIMODULE) - result += " " + tr("radio Protocol %1, subType %2, option value %3").arg(printMultiRfProtocol(module.multi.rfProtocol)).arg(printMultiSubType(module.multi.rfProtocol, module.subType)).arg(module.multi.optionValue); + result += " " + tr("radio Protocol %1, subType %2, option value %3").arg(printMultiRfProtocol(module.multi.rfProtocol, module.multi.customProto)).arg(printMultiSubType(module.multi.rfProtocol, module.multi.customProto, module.subType)).arg(module.multi.optionValue); return result; } } diff --git a/companion/src/modelprinter.h b/companion/src/modelprinter.h index a633d8aac..d4d28e714 100644 --- a/companion/src/modelprinter.h +++ b/companion/src/modelprinter.h @@ -38,8 +38,8 @@ class ModelPrinter: public QObject QString printTrimIncrementMode(); QString printThrottleTrimMode(); static QString printModuleProtocol(unsigned int protocol); - static QString printMultiRfProtocol(int rfProtocol); - static QString printMultiSubType(int rfProtocol, int subType); + static QString printMultiRfProtocol(int rfProtocol, bool custom); + static QString printMultiSubType(int rfProtocol, bool custom, int subType); QString printFlightModeSwitch(int index); QString printFlightModeName(int index); QString printFlightModes(unsigned int flightModes);