diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index 89a9da15a..92c7f5183 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -105,6 +105,7 @@ class ProtocolsConversionTable: public ConversionTable else if (IS_ARM(board)) { val++; addConversion(PULSES_MULTIMODULE, val++); + addConversion(PULSES_PXX_R9M, val++); } } }; diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 65ad294cf..9fbb9d704 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -800,6 +800,7 @@ int OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_PXX_XJT_X16: case PULSES_PXX_XJT_D8: case PULSES_PXX_XJT_LR12: + case PULSES_PXX_R9M: //case PULSES_PXX_DJT: // Unavailable for now case PULSES_LP45: case PULSES_DSM2: @@ -832,6 +833,7 @@ int OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_PXX_XJT_X16: case PULSES_PXX_XJT_D8: case PULSES_PXX_XJT_LR12: + case PULSES_PXX_R9M: case PULSES_LP45: case PULSES_DSM2: case PULSES_DSMX: diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 11620aca5..7f192359e 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -261,7 +261,8 @@ ModulePanel::~ModulePanel() bool ModulePanel::moduleHasFailsafes() { - return ((PulsesProtocol)module.protocol == PulsesProtocol::PULSES_PXX_XJT_X16 && firmware->getCapability(HasFailsafe));; + return (((PulsesProtocol)module.protocol == PulsesProtocol::PULSES_PXX_XJT_X16 || (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_PXX_R9M) + && firmware->getCapability(HasFailsafe));; } void ModulePanel::setupFailsafes() @@ -369,8 +370,9 @@ void ModulePanel::update() case PULSES_PXX_XJT_D8: case PULSES_PXX_XJT_LR12: case PULSES_PXX_DJT: + case PULSES_PXX_R9M: mask |= MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT; - if (protocol==PULSES_PXX_XJT_X16 || protocol==PULSES_PXX_XJT_LR12) + if (protocol==PULSES_PXX_XJT_X16 || protocol==PULSES_PXX_XJT_LR12 || protocol==PULSES_PXX_R9M) mask |= MASK_RX_NUMBER; if (IS_HORUS(firmware->getBoard()) && moduleIdx==0) mask |= MASK_ANTENNA; diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 2f4e83535..7375375f5 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -119,7 +119,8 @@ QString ModelPrinter::printModuleProtocol(unsigned int protocol) "PPM16", "PPMsim", "FrSky XJT (D16)", "FrSky XJT (D8)", "FrSky XJT (LR12)", "FrSky DJT", "Crossfire", - "DIY Multiprotocol Module" + "DIY Multiprotocol Module", + "FrSky R9M Module" }; return CHECK_IN_ARRAY(strings, protocol); diff --git a/companion/src/radiodata.h b/companion/src/radiodata.h index 99c05cd8e..80d6287b3 100644 --- a/companion/src/radiodata.h +++ b/companion/src/radiodata.h @@ -774,6 +774,7 @@ enum PulsesProtocol { PULSES_PXX_DJT, PULSES_CROSSFIRE, PULSES_MULTIMODULE, + PULSES_PXX_R9M, PULSES_PROTOCOL_LAST }; diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index b06ddb83d..c0ff8dae4 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -674,11 +674,12 @@ PACK(struct ModuleData { int8_t optionValue; } multi); NOBACKUP(struct { - uint8_t spare:4; + uint8_t power:2; // 0 10 mW, 1 100 mW, 2 500 mW, 3 1W + uint8_t spare:2; uint8_t receiver_telem_off:1; // false = receiver telem enabled uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16 uint8_t external_antenna:1; // false = internal antenna, true = external antenna - uint8_t spare2:1; + uint8_t sport_out:1; uint8_t spare3; } pxx); }; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 70e44dd60..649d69217 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -78,10 +78,11 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_OUTPUT_TYPE, #endif ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_EXTERNAL_MODULE_OPTIONS, #if defined(MULTIMODULE) ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, - ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER, #endif + ITEM_MODEL_EXTERNAL_MODULE_POWER, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -133,9 +134,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_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_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 + #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_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW #if defined(PCBSKY9X) && defined(REVX) #define OUTPUT_TYPE_ROWS() (IS_MODULE_PPM(EXTERNAL_MODULE) ? (uint8_t)0 : HIDDEN_ROW) , @@ -215,7 +215,9 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_BIND_ROWS(), OUTPUT_TYPE_ROWS() FAILSAFE_ROWS(EXTERNAL_MODULE), + EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS + EXTERNAL_MODULE_POWER_ROW, EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS }); #elif defined(CPUARM) @@ -228,7 +230,9 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_BIND_ROWS(), OUTPUT_TYPE_ROWS() FAILSAFE_ROWS(EXTERNAL_MODULE), + EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS + EXTERNAL_MODULE_POWER_ROW, EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS }); #elif defined(CPUM64) @@ -875,7 +879,7 @@ void menuModelSetup(event_t event) else { lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); } - if (IS_MODULE_XJT(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { + if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz==0) { if (editMode>0 || p1valdiff) { @@ -961,11 +965,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_FAILSAFE: #endif #if defined(CPUARM) - case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: - { + case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - ModuleData & moduleData = g_model.moduleData[moduleIdx]; - if (IS_MODULE_XJT(moduleIdx)) { + ModuleData &moduleData = g_model.moduleData[moduleIdx]; + if (IS_MODULE_PXX(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_FAILSAFE); lcdDrawTextAlignedLeft(y, TR_FAILSAFE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 @@ -981,25 +984,27 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); } - } - else if (menuHorizontalPosition == 1) { + } else if (menuHorizontalPosition == 1) { s_editMode = 0; if (moduleData.failsafeMode == FAILSAFE_CUSTOM && event == EVT_KEY_FIRST(KEY_ENTER)) { g_moduleIdx = moduleIdx; pushMenu(menuModelFailsafe); } - } - else { + } else { lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN, 8); } } } + } + break; + case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) - else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; + if (IS_MODULE_MULTIMODULE(moduleIdx)) { + int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); - const mm_protocol_definition* pdef = getMultiProtocolDefinition(multi_proto); + const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) lcdDrawTextAlignedLeft(y, pdef->optionsstr); @@ -1018,9 +1023,26 @@ void menuModelSetup(event_t event) } } #endif + if (IS_MODULE_R9M(moduleIdx)) { + g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event); + } + break; } - break; - + case ITEM_MODEL_EXTERNAL_MODULE_POWER: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); +#if defined(MULTIMODULE) + if (IS_MODULE_MULTIMODULE(moduleIdx)) { + 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); + } +#endif + if (IS_MODULE_R9M(moduleIdx)) { + lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3); + } + } + break; #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) @@ -1028,9 +1050,6 @@ void menuModelSetup(event_t 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); - break; case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); diff --git a/radio/src/gui/128x64/radio_diaganas.cpp b/radio/src/gui/128x64/radio_diaganas.cpp index 1e686ef87..4af4e1c1c 100644 --- a/radio/src/gui/128x64/radio_diaganas.cpp +++ b/radio/src/gui/128x64/radio_diaganas.cpp @@ -66,7 +66,7 @@ void menuRadioDiagAnalogs(event_t event) lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH + 2, STR_BATT_CALIB); putsVolts(LEN_CALIB_FIELDS*FW+FW, MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH + 2, getBatteryVoltage(), (menuVerticalPosition==HEADER_LINE ? INVERS | (s_editMode > 0 ? BLINK : 0) : 0) | PREC2 | LEFT); // SWR - if(IS_MODULE_XJT(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON()) { + if(IS_MODULE_PXX(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON()) { lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH + 1 * FH + 2, "RAS"); lcdDrawNumber(LEN_CALIB_FIELDS*FW+FW, MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH + 1 * FH + 2, telemetryData.swr.value, LEFT); } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 4156dc5ee..1a78d06d4 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -82,10 +82,11 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_BIND, ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_EXTERNAL_MODULE_OPTIONS, #if defined(MULTIMODULE) ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, - ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER, #endif + ITEM_MODEL_EXTERNAL_MODULE_POWER, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_CHANNELS, @@ -238,7 +239,6 @@ int getSwitchWarningsCount() #define INTERNAL_MODULE_MODE_ROWS 0 // (OFF / RF protocols) #endif #define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) -#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 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())) @@ -284,7 +284,7 @@ void menuModelSetup(event_t event) MULTIMODULE_STATUS_ROW EXTERNAL_MODULE_CHANNELS_ROWS, (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (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, - FAILSAFE_ROWS(EXTERNAL_MODULE), MULTIMODULE_MODULE_ROWS + FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #else MENU_TAB({ 0, 0, TIMERS_ROWS, TOPLCD_ROWS 0, 1, 0, 0, @@ -299,9 +299,9 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_STATUS_ROW EXTERNAL_MODULE_CHANNELS_ROWS, - (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (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, - FAILSAFE_ROWS(EXTERNAL_MODULE), MULTIMODULE_MODULE_ROWS - LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); + (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, + FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #endif MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); @@ -699,9 +699,9 @@ void menuModelSetup(event_t event) if (attr) { g_model.moduleData[INTERNAL_MODULE].rfProtocol = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].rfProtocol, RF_PROTO_OFF, RF_PROTO_LAST, EE_MODEL, isRfProtocolAvailable); if (checkIncDec_Ret) { - g_model.moduleData[0].type = MODULE_TYPE_XJT; - g_model.moduleData[0].channelsStart = 0; - g_model.moduleData[0].channelsCount = DEFAULT_CHANNELS(INTERNAL_MODULE); + g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_XJT; + g_model.moduleData[INTERNAL_MODULE].channelsStart = 0; + g_model.moduleData[INTERNAL_MODULE].channelsCount = DEFAULT_CHANNELS(INTERNAL_MODULE); } } break; @@ -818,7 +818,7 @@ void menuModelSetup(event_t event) lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+NUM_CHANNELS(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0)); - if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16) { + if (IS_R9M_OR_XJTD16(moduleIdx)) { if (NUM_CHANNELS(moduleIdx) > 8) lcdDrawText(lcdLastRightPos+5, y, "(18ms)"); else @@ -886,7 +886,7 @@ void menuModelSetup(event_t event) else { lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); } - if (IS_MODULE_XJT(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { + if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz==0) { if (s_editMode>0) { @@ -962,7 +962,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (IS_MODULE_XJT(moduleIdx)) { + if (IS_MODULE_PXX(moduleIdx)) { ModuleData & moduleData = g_model.moduleData[moduleIdx]; lcdDrawTextAlignedLeft(y, STR_FAILSAFE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0); @@ -989,42 +989,64 @@ void menuModelSetup(event_t event) } } } -#if defined(MULTIMODULE) - else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; - - const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); - const mm_protocol_definition* pdef = getMultiProtocolDefinition(multi_proto); - if (pdef->optionsstr) - lcdDrawTextAlignedLeft(y, pdef->optionsstr); - - if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) - optionValue = 50 + 5 * optionValue; - - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); - if (attr) { - if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70); - } else if (multi_proto == MM_RF_PROTO_OLRS) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7); - } else { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); - } - } - } -#endif break; } + break; + case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) + if (IS_MODULE_MULTIMODULE(moduleIdx)) { + int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; + + const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); + const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_proto); + if (pdef->optionsstr) + lcdDrawTextAlignedLeft(y, pdef->optionsstr); + + if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) + optionValue = 50 + 5 * optionValue; + + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + if (attr) { + if (multi_proto == MM_RF_PROTO_FS_AFHDS2A) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70); + } + else if (multi_proto == MM_RF_PROTO_OLRS) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7); + } + else { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); + } + } + } +#endif + if (IS_MODULE_R9M(moduleIdx)) { + g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event); + } + } + break; + case ITEM_MODEL_EXTERNAL_MODULE_POWER: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); +#if defined (MULTIMODULE) + if (IS_MODULE_MULTIMODULE(moduleIdx)) + 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); +#endif + if (IS_MODULE_R9M(moduleIdx)) { + lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3); + } + break; + } + +#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); 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); - break; case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp index fdce6a953..2b9181a47 100644 --- a/radio/src/gui/212x64/radio_diaganas.cpp +++ b/radio/src/gui/212x64/radio_diaganas.cpp @@ -42,7 +42,7 @@ void menuRadioDiagAnalogs(event_t event) } // SWR - if((IS_MODULE_XJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (IS_MODULE_XJT(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { + if((IS_MODULE_XJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (IS_MODULE_PXX(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH, "RAS"); lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swr.value, RIGHT); lcdDrawText(LCD_W/2, MENU_HEADER_HEIGHT+6*FH, "XJTVER"); diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 4f047ef23..256b77f1d 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -75,10 +75,11 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_BIND, ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_EXTERNAL_MODULE_OPTIONS, #if defined(MULTIMODULE) ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, - ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER, #endif + ITEM_MODEL_EXTERNAL_MODULE_POWER, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_CHANNELS, @@ -208,7 +209,6 @@ int getSwitchWarningsCount() return count; } -#define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) #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)) @@ -261,7 +261,7 @@ bool menuModelSetup(event_t event) MULTIMODULE_STATUS_ROW EXTERNAL_MODULE_CHANNELS_ROWS, (IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) ? (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, - FAILSAFE_ROWS(EXTERNAL_MODULE), MULTIMODULE_MODULE_ROWS + FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2) }); if (menuEvent) { @@ -747,11 +747,11 @@ bool menuModelSetup(event_t event) drawStringWithIndex(MODEL_SETUP_2ND_COLUMN, y, STR_CH, moduleData.channelsStart+1, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(lcdNextPos+5, y, "-"); drawStringWithIndex(lcdNextPos+5, y, STR_CH, moduleData.channelsStart+NUM_CHANNELS(moduleIdx), menuHorizontalPosition==1 ? attr : 0); - if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16) { + if (IS_R9M_OR_XJTD16(moduleIdx)) { if (NUM_CHANNELS(moduleIdx) > 8) - lcdDrawText(lcdNextPos+15, y, "(18ms)"); + lcdDrawText(lcdNextPos + 15, y, "(18ms)"); else - lcdDrawText(lcdNextPos+15, y, "(9ms)"); + lcdDrawText(lcdNextPos + 15, y, "(9ms)"); } if (attr && s_editMode>0) { switch (menuHorizontalPosition) { @@ -807,7 +807,7 @@ bool menuModelSetup(event_t event) else { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RECEIVER_NUM); } - if (IS_MODULE_XJT(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { + if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) { if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2); if (attr && l_posHorz==0 && s_editMode>0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); @@ -874,7 +874,7 @@ bool menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (IS_MODULE_XJT(moduleIdx)) { + if (IS_MODULE_PXX(moduleIdx)) { ModuleData & moduleData = g_model.moduleData[moduleIdx]; lcdDrawText(MENUS_MARGIN_LEFT, y, STR_FAILSAFE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition==0 ? attr : 0); @@ -898,16 +898,20 @@ bool menuModelSetup(event_t event) } } else { - lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W-MODEL_SETUP_2ND_COLUMN-2, 8, TEXT_COLOR); + lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - 2, 8, TEXT_COLOR); } } } + break; + } + case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) - else if (IS_MODULE_MULTIMODULE(moduleIdx)) { - int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; + if (IS_MODULE_MULTIMODULE(moduleIdx)) { + int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); - const mm_protocol_definition* pdef = getMultiProtocolDefinition(multi_proto); + const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) lcdDrawText(MENUS_MARGIN_LEFT, y, pdef->optionsstr); @@ -926,8 +930,28 @@ bool menuModelSetup(event_t event) } } #endif - break; + if (IS_MODULE_R9M(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SPORT_OUT); + g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, attr, event); + } } + break; + case ITEM_MODEL_EXTERNAL_MODULE_POWER: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + if (IS_MODULE_R9M(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT, y, TR_MULTI_RFPOWER); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3); + } +#if defined(MULTIMODULE) + else if (IS_MODULE_MULTIMODULE(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER); + g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); + } +#endif + } + break; #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) @@ -936,10 +960,6 @@ bool menuModelSetup(event_t event) 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: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER); - g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); - break; case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_STATUS); diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index 88f6a19f2..4f45bf253 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -178,7 +178,7 @@ bool menuStatsAnalogs(event_t event) } // SWR - if((IS_MODULE_XJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (IS_MODULE_XJT(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { + if((IS_MODULE_XJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (IS_MODULE_PXX(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+7*FH, "RAS"); lcdDrawNumber(MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.swr.value); lcdDrawText(MENUS_MARGIN_LEFT + LCD_W/2, MENU_CONTENT_TOP+7*FH, "XJTVER"); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 0c1eaa0e0..495f370ff 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -68,6 +68,7 @@ bool isCurrentSensor(int sensor); bool isTelemetryFieldAvailable(int index); bool isTelemetryFieldComparisonAvailable(int index); bool isSensorAvailable(int sensor); +const char* getR9MPowerString(int power); bool modelHasNotes(); #endif @@ -119,13 +120,13 @@ void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); #if defined(MULTIMODULE) #define MULTIMODULE_STATUS_ROW IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? TITLE_ROW : HIDDEN_ROW, -#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_MODULE_ROWS 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(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) (getMultiProtocolDefinition(x)->maxSubtype > 0) #define MULTIMODULE_HASOPTIONS(x) (getMultiProtocolDefinition(x)->optionsstr != nullptr) -#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol(true)))) ? (uint8_t) 0: HIDDEN_ROW +#define MULTIMODULE_OPTIONS_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) && MULTIMODULE_HASOPTIONS(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))) ? (uint8_t) 0: HIDDEN_ROW #define MULTI_MAX_RX_NUM(x) (g_model.moduleData[x].getMultiProtocol(true) == MM_RF_PROTO_OLRS ? 4 : 15) // only packed to save flash PACK( @@ -144,15 +145,24 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define MULTIMODULE_SUBTYPE_ROWS(x) #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 #define MULTI_MAX_RX_NUM(x) 15 +#define MULTIMODULE_OPTIONS_ROW HIDDEN_ROW #endif -#define MAX_RX_NUM(x) (IS_MODULE_DSM2(x) ? 20 : IS_MODULE_MULTIMODULE(x) ? MULTI_MAX_RX_NUM(x) : 63) +// Multi failsafe is WIP +#define MULTIMODULE_HASFAILSAFE(x) false + +#define MAX_RX_NUM(x) (IS_MODULE_DSM2(x) ? 20 : IS_MODULE_MULTIMODULE(x) ? MULTI_MAX_RX_NUM(x) : 63) #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 IS_R9M_OR_XJTD16(x) ((IS_MODULE_XJT(x) && g_model.moduleData[x].rfProtocol== RF_PROTO_X16) || IS_MODULE_R9M(x)) -#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 FAILSAFE_ROWS(x) ((IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || IS_MODULE_R9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#define EXTERNAL_MODULE_OPTION_ROW (IS_MODULE_R9M(EXTERNAL_MODULE) ? (uint8_t) 0 : MULTIMODULE_OPTIONS_ROW) +#define EXTERNAL_MODULE_POWER_ROW (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) || IS_MODULE_R9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); + + #endif // _GUI_COMMON_H_ diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 9d63e55b6..8f08b3edf 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -705,3 +705,18 @@ void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, Lcd else lcdDrawMMM(x, y, flags); } + +const char* getR9MPowerString(int power) +{ + switch (power) { + case 0: + return " 10 mW"; + case 1: + return "100 mW"; + case 2: + return "500 mW"; + case 3: + default: + return " 1 W"; + } +} diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 1466557e2..712529dde 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -569,6 +569,7 @@ enum ModuleTypes { MODULE_TYPE_DSM2, MODULE_TYPE_CROSSFIRE, MODULE_TYPE_MULTIMODULE, + MODULE_TYPE_R9M, MODULE_TYPE_COUNT }; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index f2de31a4e..9d55dfa70 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1024,7 +1024,7 @@ void checkSDVersion() void checkFailsafe() { for (int i=0; i>>>>>> Implement R9M protocol according to PXX spec 1.7 #define TR_BINDING_MODE1 "Ch1-8 Telem ON" #define TR_BINDING_MODE2 "Ch1-8 Telem OFF" #define TR_BINDING_MODE3 "Ch9-16 Telem ON" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e328d7ff3..3901c6cae 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" @@ -859,6 +859,7 @@ #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_SPORT_OUT INDENT "S.port out" #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index b819cf621..e4ad8924b 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -100,7 +100,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" @@ -854,6 +854,7 @@ #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_SPORT_OUT INDENT "S.port out" #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 55f65371b..bc6e825c6 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -96,7 +96,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Ameryka""Japonia""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" @@ -860,6 +860,7 @@ #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_SPORT_OUT INDENT "S.port out" #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 8edafa42d..b50185229 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" @@ -836,6 +836,7 @@ #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_SPORT_OUT INDENT "S.port out" #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 58543cd7c..a72ef2725 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -95,7 +95,7 @@ #define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT" +#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" @@ -873,6 +873,7 @@ #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_SPORT_OUT INDENT "S.port out" #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input")