From bcf7b48359a64921160b7ff845ba11f25fac892a Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 12 Sep 2016 19:04:07 +0200 Subject: [PATCH 01/13] Implement parsing the bind packet from DSM2 (untested) --- radio/src/myeeprom.h | 5 ++ radio/src/pulses/multi_arm.cpp | 14 ++++-- radio/src/telemetry/spektrum.cpp | 80 ++++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 8 deletions(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 8833b7a35..6fd489900 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -527,6 +527,11 @@ enum MultiModuleRFProtocols { }; #define MM_RF_DSM2_22MS_6CH_OPTION 2 +#define MM_RF_DSM2_11MS_7CH_OPTION 7 + +#define MM_RF_DSM2_SUBTYPE_DSM2 0 +#define MM_RF_DSM2_SUBTYPE_DSMX 1 + #define MM_RF_FRSKY_SUBTYPE_D16 0 #define MM_RF_FRSKY_SUBTYPE_D8 1 diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index 454fde987..6c879ce7e 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -118,6 +118,7 @@ void setupPulsesMultimodule(uint8_t port) int type = g_model.moduleData[port].multi.rfProtocol + 1; int subtype = g_model.moduleData[port].subType; + int8_t optionValue = g_model.moduleData[port].multi.optionValue; uint8_t protoByte = 0; if (moduleFlag[port] == MODULE_BIND) @@ -126,6 +127,12 @@ void setupPulsesMultimodule(uint8_t port) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol + if (type == MM_RF_PROTO_DSM2 && g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) { + // Autobinding should always be done in DSMX 11ms + subtype = MM_RF_DSM2_SUBTYPE_DSMX; + optionValue = MM_RF_DSM2_11MS_7CH_OPTION; + } + // 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky) // all protos > frskyx are therefore also off by one if (type >= 15) @@ -156,7 +163,8 @@ void setupPulsesMultimodule(uint8_t port) if (g_model.moduleData[port].multi.rfProtocol >= MM_RF_PROTO_CUSTOM) type = g_model.moduleData[port].multi.rfProtocol & 0x1f; - protoByte |= (type & 0x1f) | (g_model.moduleData[port].multi.autoBindMode << 6); + + protoByte |= (type & 0x1f); // (g_model.moduleData[port].multi.autoBindMode << 6) sendByteMulti(protoByte); @@ -167,10 +175,8 @@ void setupPulsesMultimodule(uint8_t port) ); - - //TODO: option_protocol, use same default as multi module // byte 3 - sendByteMulti(g_model.moduleData[port].multi.optionValue); + sendByteMulti(optionValue); uint32_t bits = 0; uint8_t bitsavailable = 0; diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 82197eae9..86dc79f45 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -40,7 +40,9 @@ */ #define I2C_PSEUDO_TX 0xf0 + #define SPEKTRUM_TELEMETRY_LENGTH 18 +#define DSM_BIND_PACKET_LENGTH 12 #define I2C_HIGH_CURRENT 0x03 #define I2C_GPS 0x17 @@ -190,6 +192,7 @@ const SpektrumSensor spektrumSensors[] = { {I2C_QOS, 12, uint16, ZSTR_A2, UNIT_VOLTS, 2}, {I2C_PSEUDO_TX, 0, uint8, ZSTR_TX_RSSI, UNIT_RAW, 0}, + {I2C_PSEUDO_TX, 4, uint32, ZSTR_CHANS_STATE, UNIT_RAW, 0}, {0, 0, int16, NULL, UNIT_RAW, 0} //sentinel }; @@ -211,9 +214,9 @@ static int32_t bcdToInt32(uint32_t bcd) } // Spektrum uses Big Endian data types -static int32_t spektrumGetValue(uint8_t *packet, int startByte, SpektrumDataType type) +static int32_t spektrumGetValue(const uint8_t *packet, int startByte, SpektrumDataType type) { - uint8_t * data = packet + startByte; + const uint8_t * data = packet + startByte; switch (type) { case uint8: return *((uint8_t *) (data)); @@ -254,9 +257,9 @@ bool isSpektrumValidValue(int32_t value, const SpektrumDataType type) } } -void processSpektrumPacket(uint8_t *packet) +void processSpektrumPacket(const uint8_t *packet) { - setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 1, 0, 0, packet[1], UNIT_RAW, 0); + setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0); // highest bit indicates that TM1100 is in use, ignore it uint8_t i2cAddress = (packet[2] & 0x7f); uint8_t instance = packet[3]; @@ -318,6 +321,68 @@ void processSpektrumPacket(uint8_t *packet) } } +// Parse the DSM2 bind reponse, Fields are as per http://www.rcgroups.com/forums/showpost.php?p=35692146&postcount=5191 +// "I" here means the multi module + +/* +0 0xAA -> telemetry start +1 0x80 -> bind packet +2-5 4 bytes -> Cyrf ID of the TX xor 0xFF but you don't care as I've checked it already... +6 1 byte -> RX version but you don't care... +7 1 byte -> number of channels, example 0x06=6 channels +8 1 byte -> max DSM type allowed: + 0x01 =>22ms 1024 DSM2 1 packet => number of channels is <8 and no telemetry + 0x02 => 22ms 1024 DSM2 2 packets => either a number of channel >7 or telemetry enable RX + 0x12 => 11ms 2048 DSM2 2 packets => can be any number of channels with/without telemetry -> this mode might be supported following Mike's trials, note the channels should be duplicated between the packets which is not the case today + 0xa2 => 22ms 2048 DSMX 1 packet => number of channels is <8 and no telemetry + 0xb2 => 11ms 2048 DSMX => can be any number of channels with/without telemetry -> this mode is only half supported since the channels should be duplicated between the packets which is not the case but might be supported following Mike's trials +9 0x00: not sure of the use of this byte since I've always seen it at 0... +10 2 bytes CRC but you don't care as I've checked it already... + */ +void processDSMBindPacket(const uint8_t *packet) +{ + uint32_t debugval; + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_PROTO_DSM2 + && g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode) { + + int channels = packet[7]; + // Only sets channel etc when in DSM multi mode + g_model.moduleData[EXTERNAL_MODULE].channelsCount = channels - 8; + if (packet[8] & 0xa0) { + g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSMX; + } else { + g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSM2; + } + + bool use11ms = false; + // 11ms mode (and less than 8 channels since more channels don't worke with 11ms for now + if ((packet[8] & 0x10) && (channels < 8)) { + use11ms = true; + } + + // 4 - 7 => 4-7 ch @ 11ms + if (use11ms) { + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = limit(4, channels, 7); + } else { + if (channels <= 7) { + // 0 -3 => 4-7 ch @ 22ms + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = limit(0, channels - 4, 3); + } else { + // 8 - 12 => 8-12 ch @ 22ms + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = limit(8, channels, 12); + } + } + storageDirty(EE_MODEL); + + } + + debugval = packet[9] << 24 | packet[8] << 16 | packet[7] << 8 | packet[6]; + + /* log the bind packet as telemetry for quick debugging */ + setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0); + +} + void processSpektrumTelemetryData(uint8_t data) { if (telemetryRxBufferCount == 0 && data != 0xAA) { @@ -333,6 +398,13 @@ void processSpektrumTelemetryData(uint8_t data) telemetryRxBufferCount = 0; } + if (telemetryRxBuffer[1] == 0x80 && telemetryRxBufferCount >= DSM_BIND_PACKET_LENGTH) { + processDSMBindPacket(telemetryRxBuffer); + telemetryRxBufferCount = 0; + return; + } + + if (telemetryRxBufferCount >= SPEKTRUM_TELEMETRY_LENGTH) { debugPrintf("[SPK] Packet 0x%02X rssi 0x%02X: ic2 0x%02x, %02x: ", telemetryRxBuffer[0], telemetryRxBuffer[1], telemetryRxBuffer[2], telemetryRxBuffer[3]); From c592fed9f1487dd1f6dbb989519e96c0acfa0c3a Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 16 Sep 2016 11:37:07 +0300 Subject: [PATCH 02/13] Implement the new multi protocols --- radio/src/gui/128x64/model_setup.cpp | 4 ++++ radio/src/gui/212x64/model_setup.cpp | 4 ++++ radio/src/gui/480x272/model_setup.cpp | 4 ++++ radio/src/myeeprom.h | 2 ++ radio/src/translations.cpp | 1 + radio/src/translations.h | 18 ++++++++++-------- radio/src/translations/cz.h.txt | 5 ++++- radio/src/translations/de.h.txt | 17 ++++++++++------- radio/src/translations/en.h.txt | 5 ++++- radio/src/translations/es.h.txt | 5 ++++- radio/src/translations/fi.h.txt | 5 ++++- radio/src/translations/fr.h.txt | 3 +++ radio/src/translations/it.h.txt | 5 ++++- radio/src/translations/nl.h.txt | 5 ++++- radio/src/translations/pl.h.txt | 5 ++++- radio/src/translations/pt.h.txt | 5 ++++- radio/src/translations/se.h.txt | 5 ++++- 17 files changed, 74 insertions(+), 24 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 35d4d4ef8..a564fcaa0 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -677,6 +677,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_SYMAX, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; case MM_RF_PROTO_CX10: + case MM_RF_PROTO_HONTAI: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_CX10, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; case MM_RF_PROTO_CG023: @@ -688,6 +689,9 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_MJXQ: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; + case MM_RF_PROTO_HONTAI: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; case MM_RF_PROTO_CUSTOM: lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2); diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index db8f6dff0..de955f540 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -752,6 +752,9 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_MJXQ: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; + case MM_RF_PROTO_HONTAI: + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; case MM_RF_PROTO_CUSTOM: lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+16*FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); @@ -820,6 +823,7 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4); break; case MM_RF_PROTO_CX10: + case MM_RF_PROTO_HONTAI: CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); break; case MM_RF_PROTO_CUSTOM: diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 2e23101c0..6ee8e21a1 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -683,6 +683,9 @@ bool menuModelSetup(event_t event) case MM_RF_PROTO_MJXQ: lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; + case MM_RF_PROTO_HONTAI: + lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + break; case MM_RF_PROTO_CUSTOM: lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2); lcdDrawNumber(MODEL_SETUP_4TH_COLUMN + MODEL_SETUP_BIND_OFS, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); @@ -737,6 +740,7 @@ bool menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); break; case MM_RF_PROTO_CG023: + case MM_RF_PROTO_HONTAI: CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2); break; case MM_RF_PROTO_FLYSKY: diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 6fd489900..67eadbe13 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -522,6 +522,8 @@ enum MultiModuleRFProtocols { 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 }; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 92e4d6838..2429c22f2 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -122,6 +122,7 @@ const pm_char STR_OPEN9X[] PROGMEM = ISTR(SUBTYPE_KN) ISTR(SUBTYPE_MT99) ISTR(SUBTYPE_MJXQ) + ISTR(SUBTYPE_HONTAI) ISTR(OPTIONS_DSM) #endif ISTR(VOLTSRC) diff --git a/radio/src/translations.h b/radio/src/translations.h index c6c4f35a7..ce71beaac 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -223,7 +223,8 @@ extern const pm_char STR_OPEN9X[]; #define OFS_SUBTYPE_KN (OFS_SUBTYPE_CG023 + sizeof(TR_SUBTYPE_CG023)) #define OFS_SUBTYPE_MT99 (OFS_SUBTYPE_KN + sizeof(TR_SUBTYPE_KN)) #define OFS_SUBTYPE_MJXQ (OFS_SUBTYPE_MT99 + sizeof(TR_SUBTYPE_MT99)) - #define OFS_OPTIONS_DSM (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) + #define OFS_SUBTYPE_HONTAI (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) + #define OFS_OPTIONS_DSM (OFS_SUBTYPE_HONTAI + sizeof(TR_SUBTYPE_HONTAI)) #define OFS_VOLTSRC (OFS_OPTIONS_DSM + sizeof(TR_OPTIONS_DSM)) #else #define OFS_VOLTSRC (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) @@ -356,6 +357,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_SUBTYPE_KN (STR_OPEN9X + OFS_SUBTYPE_KN) #define STR_SUBTYPE_MT99 (STR_OPEN9X + OFS_SUBTYPE_MT99) #define STR_SUBTYPE_MJXQ (STR_OPEN9X + OFS_SUBTYPE_MJXQ) + #define STR_SUBTYPE_HONTAI (STR_OPEN9X + OFS_SUBTYPE_HONTAI) #define STR_OPTIONS_DSM (STR_OPEN9X + OFS_OPTIONS_DSM) #endif #define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES) @@ -715,13 +717,13 @@ extern const pm_char STR_EEPROM_CONVERTING[]; extern const pm_char STR_THROTTLEWARN[]; extern const pm_char STR_ALARMSWARN[]; extern const pm_char STR_SWITCHWARN[]; -extern const pm_char STR_FAILSAFEWARN[]; -extern const pm_char STR_WRONG_SDCARDVERSION[]; -extern const pm_char STR_WRONG_PCBREV[]; -extern const pm_char STR_EMERGENCY_MODE[]; -extern const pm_char STR_PCBREV_ERROR[]; -extern const pm_char STR_NO_FAILSAFE[]; -extern const pm_char STR_KEYSTUCK[]; +extern const pm_char STR_FAILSAFEWARN[]; +extern const pm_char STR_WRONG_SDCARDVERSION[]; +extern const pm_char STR_WRONG_PCBREV[]; +extern const pm_char STR_EMERGENCY_MODE[]; +extern const pm_char STR_PCBREV_ERROR[]; +extern const pm_char STR_NO_FAILSAFE[]; +extern const pm_char STR_KEYSTUCK[]; extern const pm_char STR_SPEAKER_VOLUME[]; extern const pm_char STR_LCD[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 74f60b0e0..e13410052 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -141,6 +141,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 19a53d062..ad07b6b59 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -111,7 +111,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -145,6 +145,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" @@ -933,13 +936,13 @@ #define TR_THROTTLEWARN "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" -#define TR_FAILSAFEWARN "FAILSAFE" -#define TR_WRONG_SDCARDVERSION "Wrong files version" -#define TR_WRONG_PCBREV "Wrong PCB detected" +#define TR_FAILSAFEWARN "FAILSAFE" +#define TR_WRONG_SDCARDVERSION "Wrong files version" +#define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" -#define TR_PCBREV_ERROR "PCB error" -#define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") -#define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt +#define TR_PCBREV_ERROR "PCB error" +#define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") +#define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt #define TR_INVERT_THR TR("Gas umkehren?", "Vollgas hinten?") // Th9x 9XR #define TR_SPEAKER_VOLUME INDENT "Lautstärke" #define TR_LCD "Bildschirm" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 275d113d6..83c618104 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -111,7 +111,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -145,6 +145,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c227339cb..e8f83e56e 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -141,6 +141,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 1b176109c..679d4fed8 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -141,6 +141,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index ccff7aec4..67a609200 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -141,6 +141,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 2b90e3bb7..dbbbbb04f 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -141,6 +141,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 673525d17..f476c57e9 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -112,7 +112,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -146,6 +146,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 175543acf..c59984285 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -108,7 +108,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -142,6 +142,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index a350e3ec2..b757cff1a 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" @@ -142,6 +142,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 6266b7c93..ef5e2fd73 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -141,6 +141,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" From c055e932471a7da677c007c540ce971581f528f2 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 3 Oct 2016 22:46:54 +0200 Subject: [PATCH 03/13] Rework DSM2/X support, auto protocol selection for DSM2 Support more than 31 protocols for the multi module. Breaks existing multi eeproms, need to reselect protocols --- radio/src/datastructs.h | 16 +++- radio/src/gui/128x64/model_setup.cpp | 23 ------ radio/src/gui/212x64/model_setup.cpp | 112 +++++++++++--------------- radio/src/gui/480x272/model_setup.cpp | 18 +---- radio/src/gui/gui_common.h | 25 ++++++ radio/src/myeeprom.h | 10 +-- radio/src/opentx.h | 4 +- radio/src/pulses/multi_arm.cpp | 31 ++++--- radio/src/telemetry/spektrum.cpp | 40 ++++----- radio/src/telemetry/telemetry.h | 4 +- radio/src/translations.cpp | 4 +- radio/src/translations.h | 7 +- radio/src/translations/cz.h.txt | 8 +- radio/src/translations/de.h.txt | 8 +- radio/src/translations/en.h.txt | 8 +- radio/src/translations/es.h.txt | 8 +- radio/src/translations/fi.h.txt | 8 +- radio/src/translations/fr.h.txt | 6 +- radio/src/translations/it.h.txt | 8 +- radio/src/translations/nl.h.txt | 8 +- radio/src/translations/pl.h.txt | 8 +- radio/src/translations/pt.h.txt | 8 +- radio/src/translations/se.h.txt | 8 +- 23 files changed, 198 insertions(+), 182 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 5ac1a1f65..b74bdb318 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -661,7 +661,9 @@ PACK(struct ModuleData { int8_t frameLength; } ppm; NOBACKUP(struct { - uint8_t rfProtocol:6; // can be changed to rfProtocol if rfProtocol gets more bits, currently 6 bits used + uint8_t rfProtocolExtra:2; + uint8_t spare:3; + uint8_t customProto:1; uint8_t autoBindMode:1; uint8_t lowPowerMode:1; int8_t optionValue; @@ -673,6 +675,18 @@ PACK(struct ModuleData { uint8_t spare3; } pxx); }; + + // Helper functions to set both of the rfProto protocol at the same time + inline uint8_t getMultiProtocol() + { + return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); + } + + inline void setMultiProtocol(uint8_t proto) + { + rfProtocol = (uint8_t) (proto & 0x0f); + multi.rfProtocolExtra = (proto & 0x30) >> 4; + } }); /* diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a564fcaa0..3d377690e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -129,11 +129,8 @@ enum MenuModelSetupItems { #endif #define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) - #define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW) - #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)(x) : HIDDEN_ROW) #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) - #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) #define EXTERNAL_MODULE_BIND_ROWS() (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW #if defined(PCBSKY9X) && defined(REVX) @@ -143,26 +140,6 @@ enum MenuModelSetupItems { #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) -#if defined(MULTIMODULE) - #define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x >= MM_RF_PROTO_CUSTOM) - #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW -#else - #define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW -#endif - #define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x)) - -#if defined(MULTIMODULE) - #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ) - #define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1 - #define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, - #define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t) 0 : HIDDEN_ROW - #define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, -#else - #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 - #define MULTIMODULE_MODULE_ROWS - #define MULTIMODULE_SUBTYPE_ROWS(x) -#endif - #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #define CURSOR_ON_CELL (true) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index de955f540..783197e8f 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -211,33 +211,14 @@ int getSwitchWarningsCount() #define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x)) #endif #define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) -#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW) -#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) -#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : TRAINER_CHANNELS_ROWS())) -#if defined MULTIMODULE - #define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x >= MM_RF_PROTO_CUSTOM) - #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW -#else - #define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW -#endif -#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x)) #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 -#if defined(MULTIMODULE) - #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ) - #define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1 - #define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, -#else - #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 - #define MULTIMODULE_MODULE_ROWS -#endif - #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 #if TIMERS == 1 @@ -714,7 +695,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); @@ -729,7 +710,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; case MM_RF_PROTO_DSM2: - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType+1, menuHorizontalPosition==2 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_DSM, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; case MM_RF_PROTO_YD717: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); @@ -756,7 +737,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; case MM_RF_PROTO_CUSTOM: - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(), menuHorizontalPosition==2 ? attr : 0, 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+16*FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); break; } @@ -777,19 +758,20 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); + uint8_t multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); if (checkIncDec_Ret) { - // When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST. - // Reset to MM_RF_PROTO_LAST-1 in that case - if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) { - g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1; - } + g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM); + if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); g_model.moduleData[EXTERNAL_MODULE].subType = 0; // Sensible default for DSM2 (same as for ppm): 6ch@22ms - if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_22MS_6CH_OPTION; - else - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) { + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; + } else { + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; + } + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; } } #endif @@ -803,33 +785,34 @@ void menuModelSetup(event_t event) break; #if defined(MULTIMODULE) case 2: - switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) { - case MM_RF_PROTO_HISKY: - case MM_RF_PROTO_DSM2: - case MM_RF_PROTO_SYMAX: - case MM_RF_PROTO_KN: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); - break; - case MM_RF_PROTO_CG023: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2); - break; - case MM_RF_PROTO_FLYSKY: - case MM_RF_PROTO_MT99XX: - case MM_RF_PROTO_FRSKY: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3); - break; - case MM_RF_PROTO_MJXQ: - case MM_RF_PROTO_YD717: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4); - break; - case MM_RF_PROTO_CX10: - case MM_RF_PROTO_HONTAI: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); - break; - case MM_RF_PROTO_CUSTOM: - //custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol - g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL); - break; + if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) { + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(), 0, 63, EE_MODEL)); + break; + } else { + switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol()) { + case MM_RF_PROTO_HISKY: + case MM_RF_PROTO_SYMAX: + case MM_RF_PROTO_KN: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); + break; + case MM_RF_PROTO_CG023: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2); + break; + case MM_RF_PROTO_FLYSKY: + case MM_RF_PROTO_MT99XX: + case MM_RF_PROTO_FRSKY: + case MM_RF_PROTO_DSM2: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3); + break; + case MM_RF_PROTO_MJXQ: + case MM_RF_PROTO_YD717: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4); + break; + case MM_RF_PROTO_CX10: + case MM_RF_PROTO_HONTAI: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); + break; + } } break; case 3: @@ -989,7 +972,7 @@ void menuModelSetup(event_t event) } #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - switch (g_model.moduleData[moduleIdx].multi.rfProtocol) + switch (g_model.moduleData[moduleIdx].getMultiProtocol()) { case MM_RF_PROTO_FRSKY: case MM_RF_PROTO_SFHSS: @@ -999,13 +982,13 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ); break; case MM_RF_PROTO_DSM2: - g_model.moduleData[moduleIdx].multi.optionValue = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMFRAME, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event); + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMPRNG, attr, event); break; default: lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) { + if (g_model.moduleData[moduleIdx].getMultiProtocol() != MM_RF_PROTO_DSM2) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); if (attr) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); @@ -1017,7 +1000,10 @@ void menuModelSetup(event_t event) } #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); + else + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); break; case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER: g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 6ee8e21a1..e1d9ba290 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -179,34 +179,18 @@ int getSwitchWarningsCount() } #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) -#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x)) #define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) -#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW) #define INTERNAL_MODULE_MODE_ROWS (uint8_t)0 #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) -#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : TRAINER_CHANNELS_ROWS())) #if defined MULTIMODULE - #define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x >= MM_RF_PROTO_CUSTOM) - #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW -#else - #define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW -#endif -#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x)) + #define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 -#if defined(MULTIMODULE) - #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ) - #define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1 - #define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, -#else - #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 - #define MULTIMODULE_MODULE_ROWS -#endif #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index e9c052430..f0f227261 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -109,4 +109,29 @@ void drawFatalErrorScreen(const char * message); void runFatalErrorScreen(const char * message); #endif +// model_setup Defines that are used in all uis in the same way +#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) + + +#if defined(MULTIMODULE) +#define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, +#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol()) ? (uint8_t)2 : (uint8_t)1 +#define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol()) ? (uint8_t) 0 : HIDDEN_ROW +#define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, +#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ || x == MM_RF_PROTO_HONTAI) +#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 ) +#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (g_model.moduleData[x].multi.customProto || MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol()))) ? (uint8_t) 0: HIDDEN_ROW + +#else +#define MULTIMODULE_MODULE_ROWS +#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW +#define MULTIMODULE_SUBTYPE_ROWS(x) +#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 +#endif + +#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) +#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW) + +#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x)) + #endif // _GUI_COMMON_H_ diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 67eadbe13..2ef219222 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -528,11 +528,11 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM }; -#define MM_RF_DSM2_22MS_6CH_OPTION 2 -#define MM_RF_DSM2_11MS_7CH_OPTION 7 - -#define MM_RF_DSM2_SUBTYPE_DSM2 0 -#define MM_RF_DSM2_SUBTYPE_DSMX 1 +#define MM_RF_DSM2_SUBTYPE_DSM2_22 0 +#define MM_RF_DSM2_SUBTYPE_DSM2_11 1 +#define MM_RF_DSM2_SUBTYPE_DSMX_22 2 +#define MM_RF_DSM2_SUBTYPE_DSMX_11 3 +#define MM_RF_DSM2_SUBTYPE_AUTO 4 #define MM_RF_FRSKY_SUBTYPE_D16 0 diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 6f928f9b0..73f0deb91 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -394,8 +394,10 @@ void memswap(void * a, void * b, uint8_t size); #if defined(MULTIMODULE) #define IS_MODULE_MULTIMODULE(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_MULTIMODULE) + #define IS_MODULE_MULTIMODULE_DSM(idx) (IS_MODULE_MULTIMODULE(idx) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) #else #define IS_MODULE_MULTIMODULE(idx) (false) + #define IS_MODULE_MULTIMODULE_DSM(idx) (false) #endif #if defined(PCBTARANIS) || defined(PCBHORUS) @@ -423,7 +425,7 @@ void memswap(void * a, void * b, uint8_t size); #endif #define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.moduleData[EXTERNAL_MODULE].type]) #define MAX_CHANNELS(idx) (idx==INTERNAL_MODULE ? MAX_INTERNAL_MODULE_CHANNELS() : (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8())) - #define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || IS_MODULE_MULTIMODULE(idx)) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount)) + #define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || (IS_MODULE_MULTIMODULE(idx) && !IS_MODULE_MULTIMODULE_DSM(idx))) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount)) #elif defined(PCBSKY9X) && !defined(REVA) #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || idx==EXTRA_MODULE || (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM)) #define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_XJT) diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index 6c879ce7e..0ccaea301 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -111,12 +111,11 @@ void setupPulsesMultimodule(uint8_t port) modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; - // header, byte 0, always 0x55 - sendByteMulti(0x55); // byte 1+2, protocol information - int type = g_model.moduleData[port].multi.rfProtocol + 1; + // Our enumeration starts at 0 + int type = g_model.moduleData[port].getMultiProtocol() + 1; int subtype = g_model.moduleData[port].subType; int8_t optionValue = g_model.moduleData[port].multi.optionValue; @@ -127,10 +126,17 @@ void setupPulsesMultimodule(uint8_t port) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol - if (type == MM_RF_PROTO_DSM2 && g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) { + if (g_model.moduleData[port].getMultiProtocol() && g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) { // Autobinding should always be done in DSMX 11ms - subtype = MM_RF_DSM2_SUBTYPE_DSMX; - optionValue = MM_RF_DSM2_11MS_7CH_OPTION; + subtype = MM_RF_DSM2_SUBTYPE_AUTO; + + // The multi module wants the number of channels as options value and negative amout if the + // broken PRNG table is to be used. + if (optionValue==0) + optionValue = NUM_CHANNELS(EXTERNAL_MODULE); + else + optionValue = -(NUM_CHANNELS(EXTERNAL_MODULE)); + } // 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky) @@ -142,7 +148,7 @@ void setupPulsesMultimodule(uint8_t port) if (type >= 23) type = type + 1; - if (g_model.moduleData[port].multi.rfProtocol == MM_RF_PROTO_FRSKY) { + if (g_model.moduleData[port].getMultiProtocol() == MM_RF_PROTO_FRSKY) { if(subtype == MM_RF_FRSKY_SUBTYPE_D8) { //D8 type = 3; @@ -160,11 +166,14 @@ void setupPulsesMultimodule(uint8_t port) } } - if (g_model.moduleData[port].multi.rfProtocol >= MM_RF_PROTO_CUSTOM) - type = g_model.moduleData[port].multi.rfProtocol & 0x1f; + // header, byte 0, 0x55 for proto 0-31 0x54 for 32-63 + if (type <= 31) + sendByteMulti(0x55); + else + sendByteMulti(0x54); - - protoByte |= (type & 0x1f); // (g_model.moduleData[port].multi.autoBindMode << 6) + // (g_model.moduleData[port].multi.autoBindMode << 6) + protoByte |= (type & 0x1f); sendByteMulti(protoByte); diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 86dc79f45..dff161a16 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -331,47 +331,39 @@ void processSpektrumPacket(const uint8_t *packet) 6 1 byte -> RX version but you don't care... 7 1 byte -> number of channels, example 0x06=6 channels 8 1 byte -> max DSM type allowed: - 0x01 =>22ms 1024 DSM2 1 packet => number of channels is <8 and no telemetry + 0x01 => 22ms 1024 DSM2 1 packet => number of channels is <8 and no telemetry 0x02 => 22ms 1024 DSM2 2 packets => either a number of channel >7 or telemetry enable RX 0x12 => 11ms 2048 DSM2 2 packets => can be any number of channels with/without telemetry -> this mode might be supported following Mike's trials, note the channels should be duplicated between the packets which is not the case today 0xa2 => 22ms 2048 DSMX 1 packet => number of channels is <8 and no telemetry 0xb2 => 11ms 2048 DSMX => can be any number of channels with/without telemetry -> this mode is only half supported since the channels should be duplicated between the packets which is not the case but might be supported following Mike's trials 9 0x00: not sure of the use of this byte since I've always seen it at 0... 10 2 bytes CRC but you don't care as I've checked it already... + + Examples: DSM #Chan RXver + Inductrix 0xa2 07 1 + LemonRX+Sat+tele 0xb2 07 1 + */ void processDSMBindPacket(const uint8_t *packet) { uint32_t debugval; - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_PROTO_DSM2 + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2 && g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode) { int channels = packet[7]; // Only sets channel etc when in DSM multi mode g_model.moduleData[EXTERNAL_MODULE].channelsCount = channels - 8; - if (packet[8] & 0xa0) { - g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSMX; - } else { - g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSM2; - } - bool use11ms = false; - // 11ms mode (and less than 8 channels since more channels don't worke with 11ms for now - if ((packet[8] & 0x10) && (channels < 8)) { - use11ms = true; - } + // bool use11ms = (packet[8] & 0x10) ; + if (packet[8] >= 0xb2) + g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSMX_11; + else if (packet[8] >= 0xa2) + g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSMX_22; + else if (packet[8] >= 0x12) + g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSM2_11; + else + g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSM2_22; - // 4 - 7 => 4-7 ch @ 11ms - if (use11ms) { - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = limit(4, channels, 7); - } else { - if (channels <= 7) { - // 0 -3 => 4-7 ch @ 22ms - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = limit(0, channels - 4, 3); - } else { - // 8 - 12 => 8-12 ch @ 22ms - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = limit(8, channels, 12); - } - } storageDirty(EE_MODEL); } diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index e19bdeb8a..eb66603f8 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -147,9 +147,9 @@ inline uint8_t modelTelemetryProtocol() #if defined(MULTIMODULE) if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { - if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) return PROTOCOL_SPEKTRUM; - else if ((g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_FRSKY) && + else if ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_FRSKY) && (g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH)) return PROTOCOL_FRSKY_SPORT; else diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 2429c22f2..73131524a 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -115,6 +115,7 @@ const pm_char STR_OPEN9X[] PROGMEM = ISTR(SUBTYPE_FLYSKY) ISTR(SUBTYPE_FRSKY) ISTR(SUBTYPE_HISKY) + ISTR(SUBTYPE_DSM) ISTR(SUBTYPE_YD717) ISTR(SUBTYPE_SYMAX) ISTR(SUBTYPE_CX10) @@ -468,8 +469,9 @@ const pm_char STR_MULTI_RFTUNE[] PROGMEM = TR_MULTI_RFTUNE; const pm_char STR_MULTI_VIDFREQ[] PROGMEM = TR_MULTI_VIDFREQ; const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION; const pm_char STR_MULTI_AUTOBIND[] PROGMEM = TR_MULTI_AUTOBIND; +const pm_char STR_MULTI_DSM_AUTODTECT[] PROGMEM = TR_MULTI_DSM_AUTODTECT; const pm_char STR_MULTI_LOWPOWER[] PROGMEM = TR_MULTI_LOWPOWER; -const pm_char STR_MULTI_DSMFRAME[] PROGMEM = TR_MULTI_DSMFRAME; +const pm_char STR_MULTI_DSMPRNG[] PROGMEM = TR_MULTI_DSMPRNG; #if LCD_W < 212 const pm_char STR_SUBTYPE[] PROGMEM = TR_SUBTYPE; #endif diff --git a/radio/src/translations.h b/radio/src/translations.h index ce71beaac..f8d706f60 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -216,7 +216,8 @@ extern const pm_char STR_OPEN9X[]; #define OFS_SUBTYPE_FLYSKY (OFS_MULTI_PROTOCOLS + sizeof(TR_MULTI_PROTOCOLS)) #define OFS_SUBTYPE_FRSKY (OFS_SUBTYPE_FLYSKY + sizeof(TR_SUBTYPE_FLYSKY)) #define OFS_SUBTYPE_HISKY (OFS_SUBTYPE_FRSKY + sizeof(TR_SUBTYPE_FRSKY)) - #define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY)) + #define OFS_SUBTYPE_DSM (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY)) + #define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_DSM + sizeof(TR_SUBTYPE_DSM)) #define OFS_SUBTYPE_SYMAX (OFS_SUBTYPE_YD717 + sizeof(TR_SUBTYPE_YD717)) #define OFS_SUBTYPE_CX10 (OFS_SUBTYPE_SYMAX + sizeof(TR_SUBTYPE_SYMAX)) #define OFS_SUBTYPE_CG023 (OFS_SUBTYPE_CX10 + sizeof(TR_SUBTYPE_CX10)) @@ -350,6 +351,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_SUBTYPE_FLYSKY (STR_OPEN9X + OFS_SUBTYPE_FLYSKY) #define STR_SUBTYPE_FRSKY (STR_OPEN9X + OFS_SUBTYPE_FRSKY) #define STR_SUBTYPE_HISKY (STR_OPEN9X + OFS_SUBTYPE_HISKY) + #define STR_SUBTYPE_DSM (STR_OPEN9X + OFS_SUBTYPE_DSM) #define STR_SUBTYPE_YD717 (STR_OPEN9X + OFS_SUBTYPE_YD717) #define STR_SUBTYPE_SYMAX (STR_OPEN9X + OFS_SUBTYPE_SYMAX) #define STR_SUBTYPE_CX10 (STR_OPEN9X + OFS_SUBTYPE_CX10) @@ -599,8 +601,9 @@ extern const pm_char STR_MULTI_OPTION[]; extern const pm_char STR_MULTI_VIDFREQ[]; extern const pm_char STR_MULTI_RFTUNE[]; extern const pm_char STR_MULTI_AUTOBIND[]; +extern const pm_char STR_MULTI_DSM_AUTODTECT[]; extern const pm_char STR_MULTI_LOWPOWER[]; -extern const pm_char STR_MULTI_DSMFRAME[]; +extern const pm_char STR_MULTI_DSMPRNG[]; #if LCD_W < 212 extern const pm_char STR_SUBTYPE[]; #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e13410052..e2327c100 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -118,7 +118,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -890,9 +891,10 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT"Limit" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index ad07b6b59..fa36a556f 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -111,7 +111,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -122,7 +122,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " @@ -893,9 +894,10 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM Frm", INDENT "DSM Rahmenformat") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 83c618104..7a8c4ad4b 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -111,7 +111,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -122,7 +122,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -859,9 +860,10 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index e8f83e56e..a2776b86d 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -118,7 +118,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -838,9 +839,10 @@ #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync " TR_ENTER #define TR_LIMIT INDENT"Limite" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 679d4fed8..428504458 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -118,7 +118,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -838,9 +839,10 @@ #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT"Limit" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 67a609200..1b8097d90 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Perso\0" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Perso\0" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -118,7 +118,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -873,6 +874,7 @@ #define TR_MULTI_DSMFRAME INDENT "Format trame DSM" #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option perso") #define TR_MULTI_AUTOBIND INDENT "Bind automatique" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR( INDENT "low power", INDENT "Mode basse puiss.") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Limite" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index dbbbbb04f..cf366c914 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -118,7 +118,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -873,9 +874,10 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limiti" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index f476c57e9..c86ca85bd 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -112,7 +112,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -123,7 +123,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -867,9 +868,10 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index c59984285..ac3c635b4 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -108,7 +108,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -119,7 +119,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -875,9 +876,10 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Synch]" #define TR_LIMIT INDENT "Limit" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index b757cff1a..44cb5df09 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" @@ -119,7 +119,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -834,9 +835,10 @@ #define TR_SYNCMENU "Sync [MENU]" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index ef5e2fd73..3bd696ddc 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -107,7 +107,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -118,7 +118,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1 +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 " @@ -887,9 +888,10 @@ #define TR_SYNCMENU "Synk [MENU]" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format") +#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_LIMIT INDENT "Nivå" #define TR_MINRSSI "Min Rssi" From b56b7d06cbe02cb30baade0e3d24add0924da066 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 6 Oct 2016 23:12:44 +0200 Subject: [PATCH 04/13] Allow Companion to read/write the change struct format and make reading/writing a bit cleaner --- companion/src/eeprominterface.h | 35 +++++++++---------- .../src/firmwares/opentx/opentxeeprom.cpp | 21 ++++++++++- companion/src/modeledit/setup.cpp | 12 +++---- companion/src/modelprinter.cpp | 29 ++++++++------- companion/src/modelprinter.h | 4 +-- 5 files changed, 61 insertions(+), 40 deletions(-) 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); From 278e71d6f932b312fca23d46a4a9c02a55d4da8f Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 7 Oct 2016 01:04:19 +0200 Subject: [PATCH 05/13] Fix the custom protocol logic for multi There parts that were not handling custom vs non custom right --- radio/src/datastructs.h | 6 +++++- radio/src/gui/212x64/model_setup.cpp | 27 +++++++++++++++------------ radio/src/gui/gui_common.h | 12 ++++++------ radio/src/myeeprom.h | 6 +++--- radio/src/opentx.h | 12 ++++++++---- radio/src/pulses/multi_arm.cpp | 15 ++++++++++----- radio/src/telemetry/spektrum.cpp | 2 +- radio/src/telemetry/telemetry.h | 4 ++-- 8 files changed, 50 insertions(+), 34 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index b74bdb318..06c6e8a68 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -644,6 +644,8 @@ PACK(struct TelemetrySensor { * Module structure */ +// Only used in case switch and if statements as "virtual" protocol +#define MM_RF_CUSTOM_SELECTED 0xff PACK(struct ModuleData { uint8_t type:4; int8_t rfProtocol:4; @@ -677,8 +679,10 @@ PACK(struct ModuleData { }; // Helper functions to set both of the rfProto protocol at the same time - inline uint8_t getMultiProtocol() + inline uint8_t getMultiProtocol(bool returnCustom) { + if (returnCustom && multi.customProto) + return MM_RF_CUSTOM_SELECTED; return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 783197e8f..a16fd1e95 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -695,11 +695,14 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); + if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + multi_rfProto = MM_RF_PROTO_LAST + 1; // Custom proto has its string after all other valid protocols + // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); - switch(multi_rfProto) { + switch(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_FLYSKY: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; @@ -736,8 +739,8 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_HONTAI: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; - case MM_RF_PROTO_CUSTOM: - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(), menuHorizontalPosition==2 ? attr : 0, 2); + case MM_RF_CUSTOM_SELECTED: + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), menuHorizontalPosition==2 ? attr : 0, 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+16*FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); break; } @@ -758,15 +761,15 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - uint8_t multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM); if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto) g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); g_model.moduleData[EXTERNAL_MODULE].subType = 0; - // Sensible default for DSM2 (same as for ppm): 6ch@22ms - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) { + // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; } else { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; @@ -786,10 +789,10 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) case 2: if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) { - g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(), 0, 63, EE_MODEL)); + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL)); break; } else { - switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol()) { + switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_HISKY: case MM_RF_PROTO_SYMAX: case MM_RF_PROTO_KN: @@ -972,7 +975,7 @@ void menuModelSetup(event_t event) } #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - switch (g_model.moduleData[moduleIdx].getMultiProtocol()) + switch ( g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_FRSKY: case MM_RF_PROTO_SFHSS: @@ -988,7 +991,7 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].getMultiProtocol() != MM_RF_PROTO_DSM2) { + if (g_model.moduleData[moduleIdx].getMultiProtocol(true) != MM_RF_PROTO_DSM2) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); if (attr) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); @@ -1000,7 +1003,7 @@ void menuModelSetup(event_t event) } #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); else g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index f0f227261..95a583ae7 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -110,17 +110,17 @@ void runFatalErrorScreen(const char * message); #endif // model_setup Defines that are used in all uis in the same way -#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) +#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) #if defined(MULTIMODULE) #define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, -#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol()) ? (uint8_t)2 : (uint8_t)1 -#define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol()) ? (uint8_t) 0 : HIDDEN_ROW +#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t)2 : (uint8_t)1 +#define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t) 0 : HIDDEN_ROW #define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, -#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ || x == MM_RF_PROTO_HONTAI) -#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 ) -#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (g_model.moduleData[x].multi.customProto || MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol()))) ? (uint8_t) 0: HIDDEN_ROW +#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ || x == MM_RF_PROTO_HONTAI || x == MM_RF_CUSTOM_SELECTED) +#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_CUSTOM_SELECTED) +#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol(true)))) ? (uint8_t) 0: HIDDEN_ROW #else #define MULTIMODULE_MODULE_ROWS diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 2ef219222..efd4fd9a0 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -498,8 +498,9 @@ enum RFProtocols { }; enum MultiModuleRFProtocols { + MM_RF_PROTO_CUSTOM = -1, + MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM, MM_RF_PROTO_FLYSKY=0, - MM_RF_PROTO_FIRST=MM_RF_PROTO_FLYSKY, MM_RF_PROTO_HUBSAN, MM_RF_PROTO_FRSKY, MM_RF_PROTO_HISKY, @@ -524,8 +525,7 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_ASSAN, MM_RF_PROTO_HONTAI, MM_RF_PROTO_OLRS, - MM_RF_PROTO_CUSTOM, - MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM + MM_RF_PROTO_LAST= MM_RF_PROTO_OLRS }; #define MM_RF_DSM2_SUBTYPE_DSM2_22 0 diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 73f0deb91..4261d4ad7 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -387,17 +387,15 @@ void memswap(void * a, void * b, uint8_t size); #if defined(CPUARM) // Order is the same as in enum Protocols in myeeprom.h (none, ppm, xjt, dsm, crossfire, multi) - static const int8_t maxChannelsModules[] = { 0, 8, 8, -2, 8, 8 }; // relative to 8! + static const int8_t maxChannelsModules[] = { 0, 8, 8, -2, 8, 4 }; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! #define MAX_TRAINER_CHANNELS_M8() (MAX_TRAINER_CHANNELS-8) #endif #if defined(MULTIMODULE) #define IS_MODULE_MULTIMODULE(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_MULTIMODULE) - #define IS_MODULE_MULTIMODULE_DSM(idx) (IS_MODULE_MULTIMODULE(idx) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) #else #define IS_MODULE_MULTIMODULE(idx) (false) - #define IS_MODULE_MULTIMODULE_DSM(idx) (false) #endif #if defined(PCBTARANIS) || defined(PCBHORUS) @@ -425,7 +423,7 @@ void memswap(void * a, void * b, uint8_t size); #endif #define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.moduleData[EXTERNAL_MODULE].type]) #define MAX_CHANNELS(idx) (idx==INTERNAL_MODULE ? MAX_INTERNAL_MODULE_CHANNELS() : (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8())) - #define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || (IS_MODULE_MULTIMODULE(idx) && !IS_MODULE_MULTIMODULE_DSM(idx))) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount)) + #define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || (IS_MODULE_MULTIMODULE(idx) && (g_model.moduleData[idx].getMultiProtocol(true) != MM_RF_PROTO_DSM2))) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount)) #elif defined(PCBSKY9X) && !defined(REVA) #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || idx==EXTRA_MODULE || (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM)) #define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_XJT) @@ -442,7 +440,13 @@ void memswap(void * a, void * b, uint8_t size); #define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8()) #define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount) #endif + +#if defined(MULTIMODULE) +#define IS_MULTIMODULE_DSM(idx) (IS_MODULE_MULTIMODULE(idx) && g_model.moduleData[idx].getMultiProtocol(true) == MM_RF_PROTO_DSM2) +#define DEFAULT_CHANNELS(idx) (IS_MODULE_PPM(idx) ? 0 : IS_MULTIMODULE_DSM(idx) ? -1 : MAX_CHANNELS(idx)) +#else #define DEFAULT_CHANNELS(idx) (IS_MODULE_PPM(idx) ? 0 : MAX_CHANNELS(idx)) +#endif #if defined(CPUARM) #define MASK_CFN_TYPE uint64_t // current max = 64 function switches diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index 0ccaea301..020ef683a 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -115,7 +115,7 @@ void setupPulsesMultimodule(uint8_t port) // byte 1+2, protocol information // Our enumeration starts at 0 - int type = g_model.moduleData[port].getMultiProtocol() + 1; + int type = g_model.moduleData[port].getMultiProtocol(false) + 1; int subtype = g_model.moduleData[port].subType; int8_t optionValue = g_model.moduleData[port].multi.optionValue; @@ -126,11 +126,11 @@ void setupPulsesMultimodule(uint8_t port) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol - if (g_model.moduleData[port].getMultiProtocol() && g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) { + if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_DSM2 && g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) { // Autobinding should always be done in DSMX 11ms subtype = MM_RF_DSM2_SUBTYPE_AUTO; - // The multi module wants the number of channels as options value and negative amout if the + // The multi module wants the number of channels as options value and negative amount if the // broken PRNG table is to be used. if (optionValue==0) optionValue = NUM_CHANNELS(EXTERNAL_MODULE); @@ -148,7 +148,7 @@ void setupPulsesMultimodule(uint8_t port) if (type >= 23) type = type + 1; - if (g_model.moduleData[port].getMultiProtocol() == MM_RF_PROTO_FRSKY) { + if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_FRSKY) { if(subtype == MM_RF_FRSKY_SUBTYPE_D8) { //D8 type = 3; @@ -172,8 +172,13 @@ void setupPulsesMultimodule(uint8_t port) else sendByteMulti(0x54); - // (g_model.moduleData[port].multi.autoBindMode << 6) + + + protoByte |= (type & 0x1f); + if(g_model.moduleData[port].getMultiProtocol(true) != MM_RF_PROTO_DSM2) + protoByte |= (g_model.moduleData[port].multi.autoBindMode << 6); + sendByteMulti(protoByte); diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index dff161a16..00bf0c80c 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -347,7 +347,7 @@ void processSpektrumPacket(const uint8_t *packet) void processDSMBindPacket(const uint8_t *packet) { uint32_t debugval; - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2 + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2 && g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode) { int channels = packet[7]; diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index eb66603f8..c426ed975 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -147,9 +147,9 @@ inline uint8_t modelTelemetryProtocol() #if defined(MULTIMODULE) if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_DSM2) + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_DSM2) return PROTOCOL_SPEKTRUM; - else if ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MM_RF_PROTO_FRSKY) && + else if ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FRSKY) && (g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH)) return PROTOCOL_FRSKY_SPORT; else From 4082a320b89be563d09eb6dd292feed5e4b15f9d Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 7 Oct 2016 01:20:21 +0200 Subject: [PATCH 06/13] Fix also companion not use the CUSTOM protocol as normal protocol anymore. --- companion/src/eeprominterface.cpp | 3 +-- companion/src/eeprominterface.h | 3 +-- companion/src/modeledit/setup.cpp | 4 ++++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index fc7249db4..1e440a498 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -1864,11 +1864,11 @@ unsigned int getNumSubtypes(MultiModuleRFProtocols type) { case MM_RF_PROTO_KN: return 2; - case MM_RF_PROTO_FRSKY: case MM_RF_PROTO_CG023: case MM_RF_PROTO_MT99XX: return 3; + case MM_RF_PROTO_FRSKY: case MM_RF_PROTO_FLYSKY: return 4; @@ -1877,7 +1877,6 @@ unsigned int getNumSubtypes(MultiModuleRFProtocols type) { return 5; case MM_RF_PROTO_CX10: - case MM_RF_PROTO_CUSTOM: return 8; default: return 1; diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index bdde309f5..8500042dc 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -873,8 +873,7 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_ASSAN, MM_RF_PROTO_HONTAI, MM_RF_PROTO_OLRS, - MM_RF_PROTO_CUSTOM, - MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM + MM_RF_PROTO_LAST= MM_RF_PROTO_OLRS }; unsigned int getNumSubtypes(MultiModuleRFProtocols type); diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 1cfa11818..41781e77c 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -324,6 +324,8 @@ void ModulePanel::update() if (mask & MASK_MULTIMODULE) { int numEntries = getNumSubtypes(static_cast(module.multi.rfProtocol)); + if (module.multi.customProto) + numEntries=8; // Removes extra items ui->multiSubType->setMaxCount(numEntries); for (int i=0; i < numEntries; i++) { @@ -476,6 +478,8 @@ void ModulePanel::on_multiProtocol_currentIndexChanged(int index) lock=true; module.multi.rfProtocol = index; unsigned int maxSubTypes = getNumSubtypes(static_cast(index)); + if (module.multi.customProto) + maxSubTypes=8; module.subType = std::min(module.subType, maxSubTypes -1); update(); emit modified(); From 543a1d14e866e28979fb267ff2ee91f9984fcd8f Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 7 Oct 2016 02:29:47 +0200 Subject: [PATCH 07/13] Port all Multi changes also to 9X and Horus UI --- radio/src/datastructs.h | 10 +-- radio/src/gui/128x64/model_setup.cpp | 57 ++++++++------ radio/src/gui/212x64/model_setup.cpp | 6 +- radio/src/gui/480x272/model_setup.cpp | 109 ++++++++++++++------------ radio/src/opentx.h | 1 + 5 files changed, 99 insertions(+), 84 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 06c6e8a68..cdb326f1c 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -679,18 +679,18 @@ PACK(struct ModuleData { }; // Helper functions to set both of the rfProto protocol at the same time - inline uint8_t getMultiProtocol(bool returnCustom) - { + NOBACKUP(inline uint8_t getMultiProtocol(bool returnCustom) { if (returnCustom && multi.customProto) return MM_RF_CUSTOM_SELECTED; return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); - } + }) - inline void setMultiProtocol(uint8_t proto) + NOBACKUP(inline void setMultiProtocol(uint8_t proto) { rfProtocol = (uint8_t) (proto & 0x0f); multi.rfProtocolExtra = (proto & 0x30) >> 4; - } + }) + }); /* diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3d377690e..2e745526d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -579,7 +579,10 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); + if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + multi_rfProto = MM_RF_PROTO_LAST + 1; // Custom proto has its string after all other valid protocols + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); } #endif @@ -598,19 +601,20 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); + int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); + CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); if (checkIncDec_Ret) { - // When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST. - // Reset to MM_RF_PROTO_LAST-1 in that case - if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) { - g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1; - } + g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM); + if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); g_model.moduleData[EXTERNAL_MODULE].subType = 0; - // Sensible default for DSM2 (same as for ppm): 6ch@22ms - if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_22MS_6CH_OPTION; - else - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; + // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; + } else { + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; + } + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; } } #endif @@ -630,8 +634,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_SUBTYPE: { lcdDrawTextAlignedLeft(y, STR_SUBTYPE); - int8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); - switch (multi_rfProto) { + switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_FLYSKY: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; @@ -642,7 +645,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; case MM_RF_PROTO_DSM2: - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType + 1, menuHorizontalPosition == 0 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_DSM, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; case MM_RF_PROTO_YD717: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); @@ -654,7 +657,6 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_SYMAX, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; case MM_RF_PROTO_CX10: - case MM_RF_PROTO_HONTAI: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_CX10, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0); break; case MM_RF_PROTO_CG023: @@ -669,17 +671,16 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_HONTAI: lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; - case MM_RF_PROTO_CUSTOM: - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2); + case MM_RF_CUSTOM_SELECTED: + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2); break; } if (attr && (editMode > 0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: - switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) { + switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_HISKY: - case MM_RF_PROTO_DSM2: case MM_RF_PROTO_SYMAX: case MM_RF_PROTO_KN: CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); @@ -689,6 +690,7 @@ void menuModelSetup(event_t event) break; case MM_RF_PROTO_FLYSKY: case MM_RF_PROTO_FRSKY: + case MM_RF_PROTO_DSM2: case MM_RF_PROTO_MT99XX: CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3); break; @@ -699,9 +701,9 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_CX10: CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); break; - case MM_RF_PROTO_CUSTOM: + case MM_RF_CUSTOM_SELECTED: //custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol - g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL); + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL)); break; } break; @@ -886,7 +888,7 @@ void menuModelSetup(event_t event) } #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - switch (g_model.moduleData[moduleIdx].multi.rfProtocol) + switch (g_model.moduleData[moduleIdx].getMultiProtocol(true)) { case MM_RF_PROTO_FRSKY: case MM_RF_PROTO_SFHSS: @@ -896,13 +898,13 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ); break; case MM_RF_PROTO_DSM2: - g_model.moduleData[moduleIdx].multi.optionValue = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMFRAME, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event); + g_model.moduleData[moduleIdx].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMPRNG, attr, event); break; default: lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) { + if (g_model.moduleData[moduleIdx].getMultiProtocol(true) != MM_RF_PROTO_DSM2) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); if (attr) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); @@ -915,7 +917,10 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); + else + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); break; case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER: g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index a16fd1e95..d32649b91 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -985,7 +985,7 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ); break; case MM_RF_PROTO_DSM2: - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMPRNG, attr, event); + g_model.moduleData[moduleIdx].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMPRNG, attr, event); break; default: lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION); @@ -1004,9 +1004,9 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); else - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); break; case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER: g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index e1d9ba290..223d123e6 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -186,8 +186,6 @@ int getSwitchWarningsCount() #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : TRAINER_CHANNELS_ROWS())) -#if defined MULTIMODULE - #define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 @@ -630,10 +628,12 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); + int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); + if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + multi_rfProto = MM_RF_PROTO_LAST + 1; // Custom proto has its string after all other valid protocols lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); - switch(multi_rfProto) { + switch(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_FLYSKY: lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; @@ -644,7 +644,7 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; case MM_RF_PROTO_DSM2: - lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType+1, menuHorizontalPosition==2 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_DSM, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; case MM_RF_PROTO_YD717: lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); @@ -670,8 +670,8 @@ bool menuModelSetup(event_t event) case MM_RF_PROTO_HONTAI: lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); break; - case MM_RF_PROTO_CUSTOM: - lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2); + case MM_RF_CUSTOM_SELECTED: + lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), menuHorizontalPosition==2 ? attr : 0, 2); lcdDrawNumber(MODEL_SETUP_4TH_COLUMN + MODEL_SETUP_BIND_OFS, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2); break; } @@ -690,59 +690,64 @@ bool menuModelSetup(event_t event) case 1: if (IS_MODULE_DSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); +#if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); + int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); + CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST); if (checkIncDec_Ret) { - // When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST. - // Reset to MM_RF_PROTO_LAST-1 in that case - if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) { - g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1; - } + g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM); + if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); g_model.moduleData[EXTERNAL_MODULE].subType = 0; - // Sensible default for DSM2 (same as for ppm): 6ch@22ms - if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_22MS_6CH_OPTION; - else - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; + // Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1; + } else { + g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0; + } + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0; } } +#endif else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, RF_PROTO_X16, RF_PROTO_LAST); } if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; g_model.moduleData[EXTERNAL_MODULE].channelsCount = DEFAULT_CHANNELS(EXTERNAL_MODULE); + g_model.moduleData[EXTERNAL_MODULE].channelsCount = MAX_EXTERNAL_MODULE_CHANNELS(); } break; #if defined(MULTIMODULE) case 2: - switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) { - case MM_RF_PROTO_HISKY: - case MM_RF_PROTO_DSM2: - case MM_RF_PROTO_SYMAX: - case MM_RF_PROTO_KN: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); - break; - case MM_RF_PROTO_CG023: - case MM_RF_PROTO_HONTAI: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2); - break; - case MM_RF_PROTO_FLYSKY: - case MM_RF_PROTO_FRSKY: - case MM_RF_PROTO_MT99XX: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3); - break; - case MM_RF_PROTO_MJXQ: - case MM_RF_PROTO_YD717: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4); - break; - case MM_RF_PROTO_CX10: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); - break; - case MM_RF_PROTO_CUSTOM: - //custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol - g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL); - break; + if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) { + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL)); + break; + } else { + switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { + case MM_RF_PROTO_HISKY: + case MM_RF_PROTO_SYMAX: + case MM_RF_PROTO_KN: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1); + break; + case MM_RF_PROTO_CG023: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2); + break; + case MM_RF_PROTO_FLYSKY: + case MM_RF_PROTO_MT99XX: + case MM_RF_PROTO_FRSKY: + case MM_RF_PROTO_DSM2: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3); + break; + case MM_RF_PROTO_MJXQ: + case MM_RF_PROTO_YD717: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4); + break; + case MM_RF_PROTO_CX10: + case MM_RF_PROTO_HONTAI: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7); + break; + } } break; case 3: @@ -886,23 +891,24 @@ bool menuModelSetup(event_t event) } #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - switch (g_model.moduleData[moduleIdx].multi.rfProtocol) + switch (g_model.moduleData[moduleIdx].getMultiProtocol(true)) { case MM_RF_PROTO_FRSKY: + case MM_RF_PROTO_SFHSS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFTUNE); break; case MM_RF_PROTO_HUBSAN: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_VIDFREQ); break; case MM_RF_PROTO_DSM2: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSMFRAME); - g_model.moduleData[moduleIdx].multi.optionValue = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSMPRNG); + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; default: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) { + if (g_model.moduleData[moduleIdx].getMultiProtocol(true) != MM_RF_PROTO_DSM2) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); @@ -913,7 +919,10 @@ bool menuModelSetup(event_t event) } #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND); + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSM_AUTODTECT); + else + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND); g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER: diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 4261d4ad7..b02ebed29 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -432,6 +432,7 @@ void memswap(void * a, void * b, uint8_t size); #define MAX_EXTRA_MODULE_CHANNELS() (8) // Only PPM (16ch PPM) #define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : (idx==EXTRA_MODULE ? MAX_EXTRA_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8())) #define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount) + #define IS_MODULE_CROSSFIRE(idx) (false) #else #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM)) #define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_XJT) From a21d3e6f2e31afcb8639bab494826260c1ac1c16 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sat, 8 Oct 2016 15:26:09 +0200 Subject: [PATCH 08/13] Fix sending number of dam channels, give DSM2 debug telemetry output a better name --- radio/src/pulses/multi_arm.cpp | 13 ++++++------- radio/src/telemetry/spektrum.cpp | 2 +- radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 13 files changed, 18 insertions(+), 8 deletions(-) diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index 020ef683a..a7efb942c 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -126,9 +126,11 @@ void setupPulsesMultimodule(uint8_t port) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol - if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_DSM2 && g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) { + if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_DSM2){ + // Autobinding should always be done in DSMX 11ms - subtype = MM_RF_DSM2_SUBTYPE_AUTO; + if(g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) + subtype = MM_RF_DSM2_SUBTYPE_AUTO; // The multi module wants the number of channels as options value and negative amount if the // broken PRNG table is to be used. @@ -173,22 +175,19 @@ void setupPulsesMultimodule(uint8_t port) sendByteMulti(0x54); - - + // protocol byte protoByte |= (type & 0x1f); if(g_model.moduleData[port].getMultiProtocol(true) != MM_RF_PROTO_DSM2) protoByte |= (g_model.moduleData[port].multi.autoBindMode << 6); sendByteMulti(protoByte); - - // power always set to high (0 << 7) + // byte 2, subtype, powermode, model id sendByteMulti((g_model.header.modelId[port] & 0x0f) | ((subtype & 0x7) << 4) | (g_model.moduleData[port].multi.lowPowerMode << 7) ); - // byte 3 sendByteMulti(optionValue); diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 00bf0c80c..2b4ac18f2 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -192,7 +192,7 @@ const SpektrumSensor spektrumSensors[] = { {I2C_QOS, 12, uint16, ZSTR_A2, UNIT_VOLTS, 2}, {I2C_PSEUDO_TX, 0, uint8, ZSTR_TX_RSSI, UNIT_RAW, 0}, - {I2C_PSEUDO_TX, 4, uint32, ZSTR_CHANS_STATE, UNIT_RAW, 0}, + {I2C_PSEUDO_TX, 4, uint32, ZSTR_BIND, UNIT_RAW, 0}, {0, 0, int16, NULL, UNIT_RAW, 0} //sentinel }; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e2327c100..f243648d5 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1356,3 +1356,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index fa36a556f..324e318a2 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1356,3 +1356,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 7a8c4ad4b..60fd01f80 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1327,3 +1327,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index a2776b86d..316e506ae 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1297,3 +1297,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 428504458..876d3341b 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1291,3 +1291,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 1b8097d90..f12791018 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1329,3 +1329,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index cf366c914..2b6a9a73b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1333,3 +1333,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index c86ca85bd..d452abd1d 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1337,3 +1337,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index ac3c635b4..461bb4cfa 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1335,3 +1335,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 44cb5df09..0d894b7b4 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1292,3 +1292,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 3bd696ddc..07eff9dd0 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1351,3 +1351,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" +#define ZSTR_BIND "BIND" From f12ce22ade0ffc95595663ce157a2f10199ee0f4 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 13 Oct 2016 22:51:38 +0200 Subject: [PATCH 09/13] SFHSS also allows frequency fine tuning --- radio/src/gui/gui_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 95a583ae7..1b5a04691 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -119,7 +119,7 @@ void runFatalErrorScreen(const char * message); #define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t) 0 : HIDDEN_ROW #define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ || x == MM_RF_PROTO_HONTAI || x == MM_RF_CUSTOM_SELECTED) -#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_CUSTOM_SELECTED) +#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x == MM_RF_CUSTOM_SELECTED) #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol(true)))) ? (uint8_t) 0: HIDDEN_ROW #else From 6bec8cef5a138f4f33bbf878a56a2b15f1422e9f Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 16 Oct 2016 22:17:11 +0200 Subject: [PATCH 10/13] Stop bind on bind response received --- radio/src/gui/212x64/model_setup.cpp | 7 +++++++ radio/src/telemetry/spektrum.cpp | 6 ++++++ radio/src/telemetry/spektrum.h | 1 + 3 files changed, 14 insertions(+) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index d32649b91..2f60ad74e 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -929,6 +929,12 @@ void menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); uint8_t newFlag = 0; +#if defined(MULTIMODULE) + if (spektrumBindFinished) { + spektrumBindFinished = false; + s_editMode=0; + } +#endif if (attr && l_posHorz>0 && s_editMode>0) { if (l_posHorz == 1) newFlag = MODULE_BIND; @@ -937,6 +943,7 @@ void menuModelSetup(event_t event) } } moduleFlag[moduleIdx] = newFlag; + } } break; diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 2b4ac18f2..5b0242bda 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -257,6 +257,7 @@ bool isSpektrumValidValue(int32_t value, const SpektrumDataType type) } } +bool spektrumBindFinished = 0; void processSpektrumPacket(const uint8_t *packet) { setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0); @@ -373,6 +374,11 @@ void processDSMBindPacket(const uint8_t *packet) /* log the bind packet as telemetry for quick debugging */ setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0); + /* Finally stop binding as the rx just told us that it is bound */ + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2 + && moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) { + spektrumBindFinished=true; + } } void processSpektrumTelemetryData(uint8_t data) diff --git a/radio/src/telemetry/spektrum.h b/radio/src/telemetry/spektrum.h index e78b44a98..5585cf277 100644 --- a/radio/src/telemetry/spektrum.h +++ b/radio/src/telemetry/spektrum.h @@ -24,4 +24,5 @@ void processSpektrumTelemetryData(uint8_t data); void spektrumSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance); +extern bool spektrumBindFinished; #endif From 1aa6d113ee7c78053393fbf9e486272748dcab67 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 16 Oct 2016 22:48:46 +0200 Subject: [PATCH 11/13] Remove DSM wrong PNRG since the multi will avoid ids that trigger this problem --- radio/src/gui/128x64/model_setup.cpp | 11 +++------ radio/src/gui/212x64/model_setup.cpp | 11 +++------ radio/src/gui/480x272/model_setup.cpp | 12 +++------ radio/src/gui/gui_common.h | 2 +- radio/src/pulses/multi_arm.cpp | 8 ++---- radio/src/translations.cpp | 1 - radio/src/translations.h | 29 +++++++++++----------- radio/src/translations/cz.h.txt | 1 - radio/src/translations/de.h.txt | 35 +++++++++++++-------------- radio/src/translations/en.h.txt | 1 - radio/src/translations/es.h.txt | 1 - radio/src/translations/fi.h.txt | 1 - radio/src/translations/fr.h.txt | 1 - radio/src/translations/it.h.txt | 1 - radio/src/translations/nl.h.txt | 1 - radio/src/translations/pl.h.txt | 1 - radio/src/translations/pt.h.txt | 1 - radio/src/translations/se.h.txt | 1 - 18 files changed, 43 insertions(+), 76 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2e745526d..f1c89ebae 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -897,18 +897,13 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_HUBSAN: lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ); break; - case MM_RF_PROTO_DSM2: - g_model.moduleData[moduleIdx].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMPRNG, attr, event); - break; default: lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].getMultiProtocol(true) != MM_RF_PROTO_DSM2) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); - if (attr) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); - } + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); } } #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 2f60ad74e..4954cb94d 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -991,18 +991,13 @@ void menuModelSetup(event_t event) case MM_RF_PROTO_HUBSAN: lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ); break; - case MM_RF_PROTO_DSM2: - g_model.moduleData[moduleIdx].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMPRNG, attr, event); - break; default: lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].getMultiProtocol(true) != MM_RF_PROTO_DSM2) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); - if (attr) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); - } + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); } } #endif diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 223d123e6..fc1ec83df 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -900,19 +900,13 @@ bool menuModelSetup(event_t event) case MM_RF_PROTO_HUBSAN: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_VIDFREQ); break; - case MM_RF_PROTO_DSM2: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSMPRNG); - g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue, MODEL_SETUP_2ND_COLUMN, y, attr, event); - break; default: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_OPTION); break; } - if (g_model.moduleData[moduleIdx].getMultiProtocol(true) != MM_RF_PROTO_DSM2) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); - if (attr) - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); - } + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); } #endif break; diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 1b5a04691..e2bf03501 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -119,7 +119,7 @@ void runFatalErrorScreen(const char * message); #define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t) 0 : HIDDEN_ROW #define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ || x == MM_RF_PROTO_HONTAI || x == MM_RF_CUSTOM_SELECTED) -#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x == MM_RF_CUSTOM_SELECTED) +#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_SFHSS || x == MM_RF_CUSTOM_SELECTED) #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol(true)))) ? (uint8_t) 0: HIDDEN_ROW #else diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi_arm.cpp index a7efb942c..1543d05a9 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi_arm.cpp @@ -132,12 +132,8 @@ void setupPulsesMultimodule(uint8_t port) if(g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) subtype = MM_RF_DSM2_SUBTYPE_AUTO; - // The multi module wants the number of channels as options value and negative amount if the - // broken PRNG table is to be used. - if (optionValue==0) - optionValue = NUM_CHANNELS(EXTERNAL_MODULE); - else - optionValue = -(NUM_CHANNELS(EXTERNAL_MODULE)); + // Multi module in DSM mode wants the number of channels to be used as option value + optionValue = NUM_CHANNELS(EXTERNAL_MODULE); } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 73131524a..85ac2d38c 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -471,7 +471,6 @@ const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION; const pm_char STR_MULTI_AUTOBIND[] PROGMEM = TR_MULTI_AUTOBIND; const pm_char STR_MULTI_DSM_AUTODTECT[] PROGMEM = TR_MULTI_DSM_AUTODTECT; const pm_char STR_MULTI_LOWPOWER[] PROGMEM = TR_MULTI_LOWPOWER; -const pm_char STR_MULTI_DSMPRNG[] PROGMEM = TR_MULTI_DSMPRNG; #if LCD_W < 212 const pm_char STR_SUBTYPE[] PROGMEM = TR_SUBTYPE; #endif diff --git a/radio/src/translations.h b/radio/src/translations.h index f8d706f60..1dc8df2e1 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -216,16 +216,16 @@ extern const pm_char STR_OPEN9X[]; #define OFS_SUBTYPE_FLYSKY (OFS_MULTI_PROTOCOLS + sizeof(TR_MULTI_PROTOCOLS)) #define OFS_SUBTYPE_FRSKY (OFS_SUBTYPE_FLYSKY + sizeof(TR_SUBTYPE_FLYSKY)) #define OFS_SUBTYPE_HISKY (OFS_SUBTYPE_FRSKY + sizeof(TR_SUBTYPE_FRSKY)) - #define OFS_SUBTYPE_DSM (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY)) - #define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_DSM + sizeof(TR_SUBTYPE_DSM)) + #define OFS_SUBTYPE_DSM (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY)) + #define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_DSM + sizeof(TR_SUBTYPE_DSM)) #define OFS_SUBTYPE_SYMAX (OFS_SUBTYPE_YD717 + sizeof(TR_SUBTYPE_YD717)) #define OFS_SUBTYPE_CX10 (OFS_SUBTYPE_SYMAX + sizeof(TR_SUBTYPE_SYMAX)) #define OFS_SUBTYPE_CG023 (OFS_SUBTYPE_CX10 + sizeof(TR_SUBTYPE_CX10)) #define OFS_SUBTYPE_KN (OFS_SUBTYPE_CG023 + sizeof(TR_SUBTYPE_CG023)) #define OFS_SUBTYPE_MT99 (OFS_SUBTYPE_KN + sizeof(TR_SUBTYPE_KN)) #define OFS_SUBTYPE_MJXQ (OFS_SUBTYPE_MT99 + sizeof(TR_SUBTYPE_MT99)) - #define OFS_SUBTYPE_HONTAI (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) - #define OFS_OPTIONS_DSM (OFS_SUBTYPE_HONTAI + sizeof(TR_SUBTYPE_HONTAI)) + #define OFS_SUBTYPE_HONTAI (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ)) + #define OFS_OPTIONS_DSM (OFS_SUBTYPE_HONTAI + sizeof(TR_SUBTYPE_HONTAI)) #define OFS_VOLTSRC (OFS_OPTIONS_DSM + sizeof(TR_OPTIONS_DSM)) #else #define OFS_VOLTSRC (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS)) @@ -351,7 +351,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_SUBTYPE_FLYSKY (STR_OPEN9X + OFS_SUBTYPE_FLYSKY) #define STR_SUBTYPE_FRSKY (STR_OPEN9X + OFS_SUBTYPE_FRSKY) #define STR_SUBTYPE_HISKY (STR_OPEN9X + OFS_SUBTYPE_HISKY) - #define STR_SUBTYPE_DSM (STR_OPEN9X + OFS_SUBTYPE_DSM) + #define STR_SUBTYPE_DSM (STR_OPEN9X + OFS_SUBTYPE_DSM) #define STR_SUBTYPE_YD717 (STR_OPEN9X + OFS_SUBTYPE_YD717) #define STR_SUBTYPE_SYMAX (STR_OPEN9X + OFS_SUBTYPE_SYMAX) #define STR_SUBTYPE_CX10 (STR_OPEN9X + OFS_SUBTYPE_CX10) @@ -359,7 +359,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_SUBTYPE_KN (STR_OPEN9X + OFS_SUBTYPE_KN) #define STR_SUBTYPE_MT99 (STR_OPEN9X + OFS_SUBTYPE_MT99) #define STR_SUBTYPE_MJXQ (STR_OPEN9X + OFS_SUBTYPE_MJXQ) - #define STR_SUBTYPE_HONTAI (STR_OPEN9X + OFS_SUBTYPE_HONTAI) + #define STR_SUBTYPE_HONTAI (STR_OPEN9X + OFS_SUBTYPE_HONTAI) #define STR_OPTIONS_DSM (STR_OPEN9X + OFS_OPTIONS_DSM) #endif #define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES) @@ -601,9 +601,8 @@ extern const pm_char STR_MULTI_OPTION[]; extern const pm_char STR_MULTI_VIDFREQ[]; extern const pm_char STR_MULTI_RFTUNE[]; extern const pm_char STR_MULTI_AUTOBIND[]; -extern const pm_char STR_MULTI_DSM_AUTODTECT[]; +extern const pm_char STR_MULTI_DSM_AUTODTECT[]; extern const pm_char STR_MULTI_LOWPOWER[]; -extern const pm_char STR_MULTI_DSMPRNG[]; #if LCD_W < 212 extern const pm_char STR_SUBTYPE[]; #endif @@ -720,13 +719,13 @@ extern const pm_char STR_EEPROM_CONVERTING[]; extern const pm_char STR_THROTTLEWARN[]; extern const pm_char STR_ALARMSWARN[]; extern const pm_char STR_SWITCHWARN[]; -extern const pm_char STR_FAILSAFEWARN[]; -extern const pm_char STR_WRONG_SDCARDVERSION[]; -extern const pm_char STR_WRONG_PCBREV[]; -extern const pm_char STR_EMERGENCY_MODE[]; -extern const pm_char STR_PCBREV_ERROR[]; -extern const pm_char STR_NO_FAILSAFE[]; -extern const pm_char STR_KEYSTUCK[]; +extern const pm_char STR_FAILSAFEWARN[]; +extern const pm_char STR_WRONG_SDCARDVERSION[]; +extern const pm_char STR_WRONG_PCBREV[]; +extern const pm_char STR_EMERGENCY_MODE[]; +extern const pm_char STR_PCBREV_ERROR[]; +extern const pm_char STR_NO_FAILSAFE[]; +extern const pm_char STR_KEYSTUCK[]; extern const pm_char STR_SPEAKER_VOLUME[]; extern const pm_char STR_LCD[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index f243648d5..6569a37cd 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -891,7 +891,6 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 324e318a2..86c052eeb 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -111,7 +111,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" @@ -122,8 +122,8 @@ #define LEN_SUBTYPE_HISKY "\005" #define TR_SUBTYPE_HISKY "HiSky""HK310" -#define LEN_SUBTYPE_DSM "\006" -#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" +#define LEN_SUBTYPE_DSM "\006" +#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms" #define LEN_SUBTYPE_YD717 "\007" #define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 " @@ -146,9 +146,9 @@ #define LEN_SUBTYPE_MJXQ "\005" #define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0" -#define LEN_SUBTYPE_HONTAI "\007" -#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" - +#define LEN_SUBTYPE_HONTAI "\007" +#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln" + #define LEN_OPTIONS_DSM "\011" #define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms" @@ -774,8 +774,8 @@ #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Ein für") #define TR_THROTTLEWARNING TR("Gasalarm", INDENT "Gas Alarm") #define TR_SWITCHWARNING TR("Sch. Alarm", INDENT "Schalter-Alarm") -#define TR_POTWARNINGSTATE TR(IF_CPUARM(INDENT) "Pot&Slid.", INDENT "Pots & sliders") -#define TR_SLIDERWARNING TR(IF_CPUARM(INDENT) "Slid. pos.", INDENT "Slider positions") +#define TR_POTWARNINGSTATE TR(IF_CPUARM(INDENT) "Pot&Slid.", INDENT "Pots & sliders") +#define TR_SLIDERWARNING TR(IF_CPUARM(INDENT) "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR("Pot Warn.", INDENT "Poti-Warnung") #define TR_TIMEZONE TR("Zeitzone", "GPS-Zeitzone +/-Std") #define TR_ADJUST_RTC INDENT "Uhrzeit per GPS setzen" @@ -894,10 +894,9 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" @@ -938,13 +937,13 @@ #define TR_THROTTLEWARN "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" -#define TR_FAILSAFEWARN "FAILSAFE" -#define TR_WRONG_SDCARDVERSION "Wrong files version" -#define TR_WRONG_PCBREV "Wrong PCB detected" -#define TR_EMERGENCY_MODE "EMERGENCY MODE" -#define TR_PCBREV_ERROR "PCB error" -#define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") -#define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt +#define TR_FAILSAFEWARN "FAILSAFE" +#define TR_WRONG_SDCARDVERSION "Wrong files version" +#define TR_WRONG_PCBREV "Wrong PCB detected" +#define TR_EMERGENCY_MODE "EMERGENCY MODE" +#define TR_PCBREV_ERROR "PCB error" +#define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") +#define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt #define TR_INVERT_THR TR("Gas umkehren?", "Vollgas hinten?") // Th9x 9XR #define TR_SPEAKER_VOLUME INDENT "Lautstärke" #define TR_LCD "Bildschirm" @@ -1356,4 +1355,4 @@ #define ZSTR_QOS_R "FdeR" #define ZSTR_QOS_F "FLss" #define ZSTR_QOS_H "Hold" -#define ZSTR_BIND "BIND" +#define ZSTR_BIND "BIND" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 60fd01f80..3e4534aeb 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -860,7 +860,6 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 316e506ae..7acd84c5b 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -839,7 +839,6 @@ #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 876d3341b..f1aed384f 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -839,7 +839,6 @@ #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index f12791018..988df7e30 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -871,7 +871,6 @@ #endif #define TR_MULTI_RFTUNE INDENT "Ajustement fréq." #define TR_MULTI_VIDFREQ INDENT "Fréquence vidéo" -#define TR_MULTI_DSMFRAME INDENT "Format trame DSM" #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option perso") #define TR_MULTI_AUTOBIND INDENT "Bind automatique" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 2b6a9a73b..e466aa9d4 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -874,7 +874,6 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index d452abd1d..ba73d1fde 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -868,7 +868,6 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 461bb4cfa..75b412cf8 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -876,7 +876,6 @@ #endif #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 0d894b7b4..592f6eab4 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -835,7 +835,6 @@ #define TR_SYNCMENU "Sync [MENU]" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 07eff9dd0..cb71f91aa 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -888,7 +888,6 @@ #define TR_SYNCMENU "Synk [MENU]" #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_DSMPRNG TR(INDENT "Wrong PNRG", INDENT "Wrong PRNG tables") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") #define TR_MULTI_AUTOBIND INDENT "Autobind" #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") From c4ad38670f06a5ce7a7b46acd946f7fabce435f5 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 21 Oct 2016 17:00:59 +0200 Subject: [PATCH 12/13] Fix french translation and move custom protocol string in its own string --- radio/src/gui/128x64/model_setup.cpp | 6 +++--- radio/src/gui/212x64/model_setup.cpp | 7 ++++--- radio/src/gui/480x272/model_setup.cpp | 5 +++-- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 4 +++- radio/src/translations/de.h.txt | 4 +++- radio/src/translations/en.h.txt | 4 +++- radio/src/translations/es.h.txt | 4 +++- radio/src/translations/fi.h.txt | 4 +++- radio/src/translations/fr.h.txt | 4 +++- radio/src/translations/it.h.txt | 4 +++- radio/src/translations/nl.h.txt | 4 +++- radio/src/translations/pl.h.txt | 4 +++- radio/src/translations/pt.h.txt | 4 +++- radio/src/translations/se.h.txt | 4 +++- 16 files changed, 45 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f1c89ebae..0aa2eeab5 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -581,9 +581,9 @@ void menuModelSetup(event_t event) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) - multi_rfProto = MM_RF_PROTO_LAST + 1; // Custom proto has its string after all other valid protocols - - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_CUSTOM, menuHorizontalPosition==1 ? attr : 0); + else + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); } #endif if (attr && (editMode>0 || p1valdiff)) { diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 4954cb94d..ddd35efd1 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -696,11 +696,12 @@ void menuModelSetup(event_t event) #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); - if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) - multi_rfProto = MM_RF_PROTO_LAST + 1; // Custom proto has its string after all other valid protocols // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); + if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) + lcdDrawText(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_CUSTOM, menuHorizontalPosition==1 ? attr : 0); + else + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); switch(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_FLYSKY: diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index fc1ec83df..c08d83b89 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -630,8 +630,9 @@ bool menuModelSetup(event_t event) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) - multi_rfProto = MM_RF_PROTO_LAST + 1; // Custom proto has its string after all other valid protocols - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); + lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_CUSTOM, menuHorizontalPosition==1 ? attr : 0); + else + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); switch(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) { case MM_RF_PROTO_FLYSKY: diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 85ac2d38c..24c378f93 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -465,6 +465,7 @@ const pm_char STR_MONITOR_SCREENS[] PROGMEM = TR_MONITOR_SCREENS; #endif #if defined(MULTIMODULE) +const pm_char STR_MULTI_CUSTOM[] PROGMEM = TR_MULTI_CUSTOM; const pm_char STR_MULTI_RFTUNE[] PROGMEM = TR_MULTI_RFTUNE; const pm_char STR_MULTI_VIDFREQ[] PROGMEM = TR_MULTI_VIDFREQ; const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION; diff --git a/radio/src/translations.h b/radio/src/translations.h index 1dc8df2e1..d225a01b3 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -597,6 +597,7 @@ extern const pm_char STR_FAS_OFFSET[]; #endif #if defined(MULTIMODULE) +extern const pm_char STR_MULTI_CUSTOM[]; extern const pm_char STR_MULTI_OPTION[]; extern const pm_char STR_MULTI_VIDFREQ[]; extern const pm_char STR_MULTI_RFTUNE[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 6569a37cd..e5b24145e 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 86c052eeb..94480248d 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -111,7 +111,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 3e4534aeb..ff8fe18a7 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -111,7 +111,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7acd84c5b..7101d98af 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index f1aed384f..109f3b33d 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 988df7e30..02035b5ae 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Perso\0" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Perso" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e466aa9d4..d7bfe02f5 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index ba73d1fde..a293481ab 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -112,7 +112,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 75b412cf8..e0643db02 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -108,7 +108,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 592f6eab4..89f4f04f1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index cb71f91aa..ce9e5632a 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -107,7 +107,9 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 ""Custom" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 " + +#define TR_MULTI_CUSTOM "Custom" #define LEN_SUBTYPE_FLYSKY "\004" #define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912" From e13dd6490d6dbbc25fa610278e5ab67f3af93362 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Fri, 21 Oct 2016 17:14:01 +0200 Subject: [PATCH 13/13] Rename "autobind" to "bind on powerup" The autobind designation confused many users. Bind on power up should give more clarity --- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 2 +- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e5b24145e..a1cf6fe06 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -894,7 +894,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 94480248d..0a76eadb2 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -897,7 +897,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index ff8fe18a7..fd92ad414 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -863,7 +863,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7101d98af..ff467e59b 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -842,7 +842,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync " TR_ENTER diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 109f3b33d..83bd860b1 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -842,7 +842,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index d7bfe02f5..216df5e3b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -877,7 +877,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Sync]" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index a293481ab..012b2c295 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -871,7 +871,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index e0643db02..1de84ec8d 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -879,7 +879,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "[Synch]" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 89f4f04f1..00edfc06e 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -838,7 +838,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_LIMIT INDENT"Limite" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index ce9e5632a..7b6d383a6 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -891,7 +891,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") #define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") -#define TR_MULTI_AUTOBIND INDENT "Autobind" +#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_LIMIT INDENT "Nivå"