diff --git a/CREDITS.txt b/CREDITS.txt index 93a63aff1..414023ed6 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1451,3 +1451,9 @@ Jaroslav Gazik Philippe Desrichard Vincent Heron Marcel Schäfer +Stefano Pascucci +Frédéric Bourgois +Stefan Hufnagl +Jean Philippe Bonacci +Jack Mitchell +Santiago Iglesias Garcia diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 15fac6e5f..d25d8f985 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -46,8 +46,6 @@ option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) -option(MODULE_R9M_FLEX_FW "Add R9M options for non certified firmwwares" OFF) -option(PXX2 "Enable PXX v2 support" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -313,14 +311,6 @@ if(NIGHTLY_BUILD_WARNING) add_definitions(-DNIGHTLY_BUILD_WARNING) endif(NIGHTLY_BUILD_WARNING) -if(MODULE_R9M_FLEX_FW) - add_definitions(-DMODULE_R9M_FLEX_FW) -endif() - -if(PXX2) - add_definitions(-DPXX2) -endif() - set(SRC ${SRC} opentx.cpp diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index fc4423444..40d520517 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -226,12 +226,12 @@ enum BeeperMode { #endif #if defined(PCBTARANIS) || defined(PCBHORUS) -#define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) + #define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) #elif defined(PCBSKY9X) #define IS_INTERNAL_MODULE_ENABLED() (false) #endif -#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) +#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) enum UartModes { #if defined(CLI) || defined(DEBUG) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index dbab633c1..9caae197f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -406,9 +406,18 @@ PACK(struct ModuleData { int8_t rfProtocol:4; uint8_t channelsStart; int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; union { struct { diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 5142df59c..2422e0dc0 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -155,8 +155,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext active &= (bool)CFN_ACTIVE(cfn); } - if (active || IS_PLAY_BOTH_FUNC(CFN_FUNC(cfn))) { - + if (active) { switch (CFN_FUNC(cfn)) { #if defined(OVERRIDE_CHANNEL_FUNCTION) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 20dcc8e21..974fe00bb 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -97,6 +97,9 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, +#if !defined(PCBXLITE) + ITEM_MODEL_EXTERNAL_MODULE_FREQ, +#endif #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -160,17 +163,21 @@ enum MenuModelSetupItems { #define OUTPUT_TYPE_ROWS() #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) - +#if defined(PCBXLITE) #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 - +#else + #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#endif #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) #define POT_WARN_ITEMS() ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) #define TIMER_ROWS 2, 0, 0, 0, 0 #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, -#else +#elif defined(PCBXLITE) #define EXTRA_MODULE_ROWS +#else + #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #endif #if defined(PCBX7) @@ -733,8 +740,13 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); +#if defined(PCBXLITE) else if (isModuleR9M(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); +#else + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); +#endif #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -761,6 +773,7 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); +#if defined(PCBXLITE) else if (isModuleR9M(EXTERNAL_MODULE)) { uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { @@ -770,7 +783,7 @@ void menuModelSetup(event_t event) } g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; } - +#endif #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1197,6 +1210,7 @@ void menuModelSetup(event_t event) } } #endif +#if defined(PCBXLITE) if (isModuleR9M(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); if (IS_TELEMETRY_INTERNAL_MODULE()) { @@ -1207,6 +1221,9 @@ void menuModelSetup(event_t event) } } else if (isModuleSBUS(moduleIdx)) { +#else + if (isModuleSBUS(moduleIdx)) { +#endif lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1252,6 +1269,19 @@ void menuModelSetup(event_t event) } break; +#if !defined(PCBXLITE) + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawTextAlignedLeft(y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; +#endif #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 5e763fd5c..1e322f8d0 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -543,7 +543,7 @@ void menuModelTelemetryFrsky(event_t event) case ITEM_TELEMETRY_RSSI_LABEL: #if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_MULTIMODULE && + if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FS_AFHDS2A) lcdDrawTextAlignedLeft(y, "RSNR"); else diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 4f8c5ead2..193f3b805 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -88,6 +88,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_LINE1, @@ -253,7 +254,8 @@ int getSwitchWarningsCount() #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 -#define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : isModuleMultimodule(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -296,6 +298,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTRA_MODULE_ROWS LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS}); MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); @@ -733,8 +736,8 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -771,15 +774,6 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1129,16 +1123,7 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1174,6 +1159,18 @@ void menuModelSetup(event_t event) break; } + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawTextAlignedLeft(y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; + #if defined (MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 0931e475b..ef90129b2 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -82,6 +82,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_LINE1, @@ -236,7 +237,8 @@ int getSwitchWarningsCount() #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 -#define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : isModuleMultimodule(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -285,6 +287,7 @@ bool menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTRA_MODULE_ROWS LABEL(Trainer), 0, TRAINER_LINE1_ROWS, @@ -693,8 +696,8 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); - else if (isModuleR9M(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -728,15 +731,6 @@ bool menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1068,16 +1062,7 @@ bool menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_WARN_BATTVOLTAGE); drawValueWithUnit(MODEL_SETUP_4TH_COLUMN, y, getBatteryVoltage(), UNIT_VOLTS, attr|PREC2|LEFT); } @@ -1116,6 +1101,18 @@ bool menuModelSetup(event_t event) } break; + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; + #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index e8bb01f92..065017c6f 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] { +static const uint8_t __alpha_button_on[] __ALIGNED(4) = { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] { +static const uint8_t __alpha_button_off[] __ALIGNED(4) = { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index c48ee4463..1b06616ce 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -54,6 +54,8 @@ bool isSwitchAvailableInCustomFunctions(int swtch); bool isSwitchAvailableInMixes(int swtch); bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); +bool isR9ModuleRunning(int module); +bool isR9MMFlex(int module); bool isModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); @@ -155,12 +157,18 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define FAILSAFE_ROWS(x) ((isModuleXJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#if defined(PCBXLITE) #define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#else +#define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#endif #if defined(PCBXLITE) && !defined(MODULE_R9M_FULLSIZE) #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW -#else +#elif defined(PCBXLITE) #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW +#else +#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #endif void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 4768e0aa2..571a04efe 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -486,6 +486,15 @@ bool isSourceAvailableInResetSpecialFunction(int index) } } +bool isR9ModuleRunning(int module) +{ +#if defined(SIMU) + return g_model.moduleData[module].type == MODULE_TYPE_R9M && TELEMETRY_STREAMING(); // Simu uses telemetry simu to activate/desactivate R9 +#else + return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; +#endif +} +#if defined(PCBXLITE) bool isR9MModeAvailable(int mode) { #if defined(MODULE_R9M_FLEX_FW) @@ -495,6 +504,17 @@ bool isR9MModeAvailable(int mode) #endif } +#else +bool isR9MModeAvailable(int mode) +{ + return mode <= MODULE_SUBTYPE_R9M_EUPLUS; +} +#endif +bool isR9MMFlex(int module) +{ + return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; +} + bool isModuleAvailable(int module) { #if defined(CROSSFIRE) @@ -516,7 +536,14 @@ bool isModuleAvailable(int module) return false; } #endif +#if defined(PCBTARANIS) || defined(PCBHORUS) + if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + return false; + } +#endif + return true; + } bool isRfProtocolAvailable(int protocol) @@ -531,29 +558,35 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif +#if defined(PCBTARANIS) || defined(PCBHORUS) + if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { + return false; + } +#endif + return true; } bool isTelemetryProtocolAvailable(int protocol) { #if defined(PCBTARANIS) - if (protocol == PROTOCOL_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) { return false; } #endif - if (protocol== PROTOCOL_PULSES_CROSSFIRE) { + if (protocol== PROTOCOL_TELEMETRY_CROSSFIRE) { return false; } #if !defined(MULTIMODULE) - if (protocol == PROTOCOL_SPEKTRUM || protocol == PROTOCOL_FLYSKY_IBUS || protocol == PROTOCOL_MULTIMODULE) { + if (protocol == PROTOCOL_TELEMETRY_SPEKTRUM || protocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS || protocol == PROTOCOL_TELEMETRY_MULTIMODULE) { return false; } #endif #if defined(PCBHORUS) - if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { return false; } #endif diff --git a/radio/src/io/frsky_sport.cpp b/radio/src/io/frsky_sport.cpp index a65de6159..1cd8de569 100644 --- a/radio/src/io/frsky_sport.cpp +++ b/radio/src/io/frsky_sport.cpp @@ -176,7 +176,7 @@ const char * sportUpdatePowerOn(ModuleIndex module) sportUpdateState = SPORT_POWERUP_REQ; sportWaitState(SPORT_IDLE, 500); // Clear the fifo - telemetryInit(PROTOCOL_FRSKY_SPORT); + telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); #if defined(PCBTARANIS) || defined(PCBHORUS) if (module == INTERNAL_MODULE) @@ -199,7 +199,7 @@ const char * sportUpdatePowerOn(ModuleIndex module) return NULL; } - if (telemetryProtocol != PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol != PROTOCOL_TELEMETRY_FRSKY_SPORT) { return TR("Not responding", "Not S.Port 1"); } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 3024536b5..dacfab2d6 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -23,20 +23,8 @@ #include "datastructs.h" -#define WARN_THR_BIT 0x01 -#define WARN_BEP_BIT 0x80 -#define WARN_SW_BIT 0x02 -#define WARN_MEM_BIT 0x04 -#define WARN_BVAL_BIT 0x38 - -#define WARN_THR (!(g_eeGeneral.warnOpts & WARN_THR_BIT)) -#define WARN_BEP (!(g_eeGeneral.warnOpts & WARN_BEP_BIT)) -#define WARN_SW (!(g_eeGeneral.warnOpts & WARN_SW_BIT)) -#define WARN_MEM (!(g_eeGeneral.warnOpts & WARN_MEM_BIT)) -#define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 ) - - #define EEPROM_VER 218 - #define FIRST_CONV_EEPROM_VER 216 +#define EEPROM_VER 218 +#define FIRST_CONV_EEPROM_VER 216 #define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol #define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted @@ -53,10 +41,7 @@ #define IS_TRAINER_EXTERNAL_MODULE() false #endif - #define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) - - #define IS_PLAY_BOTH_FUNC(func) (0) - #define IS_VOLUME_FUNC(func) ((func) == FUNC_VOLUME) +#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) #if defined(GVARS) #define IS_ADJUST_GV_FUNC(func) ((func) == FUNC_ADJUST_GVAR) @@ -141,21 +126,20 @@ enum CurveRefType { CURVE_REF_CUSTOM }; - #define MIN_EXPO_WEIGHT -100 #define EXPO_VALID(ed) ((ed)->mode) #define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) - #define limit_min_max_t int16_t - #define LIMIT_EXT_PERCENT 150 - #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) - #define PPM_CENTER_MAX 500 - #define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000) - #define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000) - #define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset) - #define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) - #define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) - #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) +#define limit_min_max_t int16_t +#define LIMIT_EXT_PERCENT 150 +#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) +#define PPM_CENTER_MAX 500 +#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000) +#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000) +#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset) +#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) +#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) +#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) #define TRIM_OFF (1) #define TRIM_ON (0) @@ -191,8 +175,6 @@ enum CurveRefType { #define MD_OFFSET(md) (md->offset) #define MD_OFFSET_TO_UNION(md, var) var.word = md->offset #define MD_UNION_TO_OFFSET(var, md) md->offset = var.word -// #define MD_SETOFFSET(md, val) md->offset = val - enum LogicalSwitchesFunctions { LS_FUNC_NONE, @@ -222,14 +204,6 @@ enum LogicalSwitchesFunctions { #define MAX_LS_DELAY 250 /*25s*/ #define MAX_LS_ANDSW SWSRC_LAST -//#define TELEM_FLAG_TIMEOUT 0x01 -#define TELEM_FLAG_LOG 0x02 -//#define TELEM_FLAG_PERSISTENT 0x04 -//#define TELEM_FLAG_SCALE 0x08 -#define TELEM_FLAG_AUTO_OFFSET 0x10 -#define TELEM_FLAG_FILTER 0x20 -#define TELEM_FLAG_LOSS_ALARM 0x40 - enum TelemetrySensorType { TELEM_TYPE_CUSTOM, @@ -251,16 +225,10 @@ enum TelemetrySensorFormula }; enum VarioSource { -#if !defined(TELEMETRY_FRSKY_SPORT) - VARIO_SOURCE_ALTI, - VARIO_SOURCE_ALTI_PLUS, -#endif VARIO_SOURCE_VSPEED, VARIO_SOURCE_A1, VARIO_SOURCE_A2, -#if defined(TELEMETRY_FRSKY_SPORT) VARIO_SOURCE_DTE, -#endif VARIO_SOURCE_COUNT, VARIO_SOURCE_LAST = VARIO_SOURCE_COUNT-1 }; @@ -292,8 +260,6 @@ enum FrskyVoltsSource { FRSKY_VOLTS_SOURCE_LAST=FRSKY_VOLTS_SOURCE_CELLS }; - - enum SwashType { SWASH_TYPE_NONE, SWASH_TYPE_120, @@ -310,8 +276,8 @@ enum SwashType { #define ROTARY_ENCODER_MAX 1024 - #define TRIMS_ARRAY_SIZE 8 - #define TRIM_MODE_NONE 0x1F // 0b11111 +#define TRIMS_ARRAY_SIZE 8 +#define TRIM_MODE_NONE 0x1F // 0b11111 #define IS_MANUAL_RESET_TIMER(idx) (g_model.timers[idx].persistent == 2) @@ -321,37 +287,23 @@ enum SwashType { #define TIMER_COUNTDOWN_START(x) 10 #endif -enum Protocols { - PROTO_PPM, -#if defined(PXX) || defined(DSM2) || defined(IRPROTOS) - PROTO_PXX, +enum ChannelsProtocols { + PROTOCOL_CHANNELS_PPM, +#if defined(PXX) || defined(DSM2) + PROTOCOL_CHANNELS_PXX, #endif -#if defined(DSM2) || defined(IRPROTOS) - PROTO_DSM2_LP45, - PROTO_DSM2_DSM2, - PROTO_DSM2_DSMX, +#if defined(DSM2) + PROTOCOL_CHANNELS_DSM2_LP45, + PROTOCOL_CHANNELS_DSM2_DSM2, + PROTOCOL_CHANNELS_DSM2_DSMX, #endif - PROTO_CROSSFIRE, -#if defined(IRPROTOS) - // only used on AVR - // we will need 4 bits for proto :( - PROTO_SILV, - PROTO_TRAC09, - PROTO_PICZ, - PROTO_SWIFT, -#endif - PROTO_MULTIMODULE, - PROTO_SBUS, - PROTO_PXX2, - PROTO_NONE + PROTOCOL_CHANNELS_CROSSFIRE, + PROTOCOL_CHANNELS_MULTIMODULE, + PROTOCOL_CHANNELS_SBUS, + PROTOCOL_CHANNELS_PXX2, + PROTOCOL_CHANNELS_NONE }; -#if defined(PXX2) -#define PROTO_PXX_EXTERNAL_MODULE PROTO_PXX2 -#else -#define PROTO_PXX_EXTERNAL_MODULE PROTO_PXX -#endif - enum XJTRFProtocols { RF_PROTO_OFF = -1, RF_PROTO_X16, @@ -369,6 +321,21 @@ enum R9MSubTypes MODULE_SUBTYPE_R9M_LAST=MODULE_SUBTYPE_R9M_AUPLUS }; +enum R9MRegion +{ + MODULE_R9M_REGION_FCC, + MODULE_R9M_REGION_EU, + MODULE_R9M_REGION_FLEX, + MODULE_R9M_REGION_LAST=MODULE_R9M_REGION_FLEX +}; + +enum R9MFrenquency +{ + MODULE_R9M_FREQ_868MHZ, + MODULE_R9M_FREQ_915MHZ, + MODULE_R9M_FREQ_LAST=MODULE_R9M_FREQ_915MHZ +}; + enum MultiModuleRFProtocols { MM_RF_PROTO_CUSTOM = -1, MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM, @@ -492,17 +459,18 @@ enum ThrottleSources { THROTTLE_SOURCE_CH1, }; -enum TelemetryType +enum TelemetryProtocols { PROTOCOL_TELEMETRY_FIRST, - PROTOCOL_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, - PROTOCOL_FRSKY_D, - PROTOCOL_FRSKY_D_SECONDARY, - PROTOCOL_PULSES_CROSSFIRE, - PROTOCOL_SPEKTRUM, - PROTOCOL_FLYSKY_IBUS, - PROTOCOL_MULTIMODULE, - PROTOCOL_TELEMETRY_LAST=PROTOCOL_MULTIMODULE + PROTOCOL_TELEMETRY_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, + PROTOCOL_TELEMETRY_FRSKY_D, + PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY, + PROTOCOL_TELEMETRY_CROSSFIRE, + PROTOCOL_TELEMETRY_SPEKTRUM, + PROTOCOL_TELEMETRY_FLYSKY_IBUS, + PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_PXX2, }; enum DisplayTrims @@ -512,8 +480,6 @@ enum DisplayTrims DISPLAY_TRIMS_ALWAYS }; -#define TOTAL_EEPROM_USAGE (sizeof(ModelData)*MAX_MODELS + sizeof(RadioData)) - extern RadioData g_eeGeneral; extern ModelData g_model; diff --git a/radio/src/pulses/dsm2_arm.cpp b/radio/src/pulses/dsm2_arm.cpp index 99b6506b0..97a4a4818 100644 --- a/radio/src/pulses/dsm2_arm.cpp +++ b/radio/src/pulses/dsm2_arm.cpp @@ -125,10 +125,10 @@ void setupPulsesDSM2(uint8_t port) modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; switch (s_current_protocol[port]) { - case PROTO_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_LP45: dsmDat[0] = 0x00; break; - case PROTO_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSM2: dsmDat[0] = 0x10; break; default: // DSMX diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 2ecb78168..7d9a7275c 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -88,7 +88,7 @@ inline bool isModulePPM(uint8_t idx) { return idx == TRAINER_MODULE || (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || - (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM)); + (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #else inline bool isModulePPM(uint8_t idx) @@ -99,6 +99,7 @@ inline bool isModulePPM(uint8_t idx) } #endif +#if defined(PCBXLITE) inline bool isModuleR9M(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_R9M; @@ -128,7 +129,37 @@ inline bool isModuleR9M_AU_PLUS(uint8_t idx) { return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_AUPLUS; } +#else +inline bool isModuleR9M(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_R9M; +} +inline bool isModuleR9M_FCC(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FCC; +} + +inline bool isModuleR9M_LBT(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_EU; +} + +inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_R9M_REGION_EU; +} + +inline bool isModuleR9M_EUPLUS(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_868MHZ; +} + +inline bool isModuleR9M_AU_PLUS(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_915MHZ; +} +#endif inline bool isModulePXX(uint8_t idx) { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 6a0739149..3fe9977cf 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -51,7 +51,7 @@ enum ModuleFlag #endif #if defined(DSM2) - #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTO_DSM2_LP45 && protocol<=PROTO_DSM2_DSMX) + #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTOCOL_CHANNELS_DSM2_LP45 && protocol<=PROTOCOL_CHANNELS_DSM2_DSMX) #else #define IS_DSM2_PROTOCOL(protocol) (0) #endif @@ -63,7 +63,7 @@ enum ModuleFlag #endif #if defined(MULTIMODULE) - #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTO_MULTIMODULE) + #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTOCOL_CHANNELS_MULTIMODULE) #if !defined(DSM2) #error You need to enable DSM2 = PPM for MULTIMODULE support #endif @@ -71,7 +71,7 @@ enum ModuleFlag #define IS_MULTIMODULE_PROTOCOL(protocol) (0) #endif - #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTO_SBUS) + #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) #include "pulses_arm.h" diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index f91a36194..290369e3a 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -19,11 +19,8 @@ */ #include "opentx.h" - -#if defined(PXX2) #include "io/pxx2.h" #include "pulses/pxx2.h" -#endif uint8_t s_pulses_paused = 0; uint8_t s_current_protocol[NUM_MODULES] = { MODULES_INIT(255) }; @@ -47,14 +44,14 @@ uint8_t getRequiredProtocol(uint8_t port) switch (g_model.moduleData[INTERNAL_MODULE].type) { #if defined(TARANIS_INTERNAL_PPM) case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; + required_protocol = PROTOCOL_CHANNELS_PPM; break; #endif case MODULE_TYPE_XJT: - required_protocol = PROTO_PXX; + required_protocol = PROTOCOL_CHANNELS_PXX; break; default: - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } break; @@ -63,30 +60,36 @@ uint8_t getRequiredProtocol(uint8_t port) default: switch (g_model.moduleData[EXTERNAL_MODULE].type) { case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; + required_protocol = PROTOCOL_CHANNELS_PPM; break; case MODULE_TYPE_XJT: + required_protocol = PROTOCOL_CHANNELS_PXX; + break; case MODULE_TYPE_R9M: - required_protocol = PROTO_PXX_EXTERNAL_MODULE; // either PXX or PXX2 depending on compilation options +#if defined(PCBXLITE) + required_protocol = PROTOCOL_CHANNELS_PXX; +#else + required_protocol = PROTOCOL_CHANNELS_PXX2; +#endif break; case MODULE_TYPE_SBUS: - required_protocol = PROTO_SBUS; + required_protocol = PROTOCOL_CHANNELS_SBUS; break; #if defined(MULTIMODULE) case MODULE_TYPE_MULTIMODULE: - required_protocol = PROTO_MULTIMODULE; + required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; break; #endif #if defined(DSM2) case MODULE_TYPE_DSM2: - required_protocol = limit(PROTO_DSM2_LP45, PROTO_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTO_DSM2_DSMX); + required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); // The module is set to OFF during one second before BIND start { static tmr10ms_t bindStartTime = 0; if (moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) { if (bindStartTime == 0) bindStartTime = get_tmr10ms(); if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } } @@ -98,24 +101,24 @@ uint8_t getRequiredProtocol(uint8_t port) #endif #if defined(CROSSFIRE) case MODULE_TYPE_CROSSFIRE: - required_protocol = PROTO_CROSSFIRE; + required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; break; #endif default: - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } break; } if (s_pulses_paused) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; } #if 0 // will need an EEPROM conversion if (moduleFlag[port] == MODULE_OFF) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; } #endif @@ -146,38 +149,36 @@ void setupPulses(uint8_t port) if (s_current_protocol[port] != required_protocol) { init_needed = true; switch (s_current_protocol[port]) { // stop existing protocol hardware - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: disable_pxx(port); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: disable_serial(port); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: + case PROTOCOL_CHANNELS_CROSSFIRE: disable_module_timer(port); break; #endif -#if defined(PXX2) - case PROTO_PXX2: + case PROTOCOL_CHANNELS_PXX2: disable_module_timer(port); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: disable_serial(port); break; - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: disable_ppm(port); break; @@ -190,28 +191,28 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: setupPulsesPXX(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: setupPulsesSbus(port); scheduleNextMixerCalculation(port, SBUS_PERIOD); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: setupPulsesDSM2(port); scheduleNextMixerCalculation(port, DSM2_PERIOD); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: - if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE && !init_needed) { + case PROTOCOL_CHANNELS_CROSSFIRE: + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE && !init_needed) { uint8_t * crossfire = modulePulsesData[port].crossfire.pulses; uint8_t len; #if defined(LUA) @@ -232,26 +233,25 @@ void setupPulses(uint8_t port) break; #endif -#if defined(PXX2) - case PROTO_PXX2: - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && !init_needed) { + case PROTOCOL_CHANNELS_PXX2: + // here we have to wait that telemetryInit() is called, hence this test + if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2 && !init_needed) { modulePulsesData[port].pxx2.setupFrame(port); sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); } scheduleNextMixerCalculation(port, PXX2_PERIOD); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: setupPulsesMultimodule(port); scheduleNextMixerCalculation(port, MULTIMODULE_PERIOD); break; #endif - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: #if defined(PCBSKY9X) - case PROTO_NONE: + case PROTOCOL_CHANNELS_NONE: #endif setupPulsesPPMModule(port); scheduleNextMixerCalculation(port, PPM_PERIOD(port)); @@ -263,41 +263,39 @@ void setupPulses(uint8_t port) if (init_needed) { switch (required_protocol) { // Start new protocol hardware here - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: init_pxx(port); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: init_serial(port, DSM2_BAUDRATE, DSM2_PERIOD * 2000); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: + case PROTOCOL_CHANNELS_CROSSFIRE: init_module_timer(port, CROSSFIRE_PERIOD, true); break; #endif -#if defined(PXX2) - case PROTO_PXX2: + case PROTOCOL_CHANNELS_PXX2: init_module_timer(port, PXX2_PERIOD, true); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: init_serial(port, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); break; #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: init_serial(port, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); break; - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: init_ppm(port); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 744abb07b..79a2347e1 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -82,9 +82,7 @@ union ModulePulsesData { PwmPxxPulses pxx; #endif -#if defined(PXX2) Pxx2Pulses pxx2; -#endif #if defined(PPM_PIN_SERIAL) Dsm2SerialPulsesData dsm2; @@ -168,6 +166,8 @@ void setCustomFailsafe(uint8_t moduleIndex); #define LEN_R9M_LBT_POWER_VALUES "\015" #define TR_R9M_FCC_POWER_VALUES "(100 mW)" #define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0 ""100mW no tele" +#define LEN_R9MFLEX_FREQ "\006" +#define TR_R9MFLEX_FREQ "868Mhz""915Mhz" enum R9MFCCPowerValues { R9M_FCC_POWER_100 = 0, @@ -186,8 +186,10 @@ enum R9MLBTPowerValues { #else -#define LEN_R9M_REGION "\006" -#define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" +#define LEN_R9M_REGION "\004" +#define TR_R9M_REGION "FCC\0""EU\0 ""FLEX" +#define LEN_R9MFLEX_FREQ "\006" +#define TR_R9MFLEX_FREQ "868Mhz""915Mhz" #define LEN_R9M_FCC_POWER_VALUES "\006" #define LEN_R9M_LBT_POWER_VALUES "\013" #define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0" diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 19a547ac7..f63ee0580 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -166,7 +166,7 @@ void PxxPulses::addExtraFlags(uint8_t port) extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); if (isModuleR9M(port)) { extra_flags |= (min(g_model.moduleData[port].pxx.power, isModuleR9M_FCC_VARIANT(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); - if(isModuleR9M_EUPLUS(port)) + if (isModuleR9M_EUPLUS(port)) extra_flags |= (1 << 6); } diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 02296bbe5..0fcf7f89e 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -150,6 +150,17 @@ class StandardPxxTransport: public BitTransport, public PxxCrcMixin { addByteWithoutCrc(byte); }; + void addRawByte(uint8_t byte) + { + for (uint8_t i = 0; i < 8; i++) { + if (byte & 0x80) + BitTransport::addPart(1); + else + BitTransport::addPart(0); + byte <<= 1; + } + } + void addByteWithoutCrc(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { @@ -187,23 +198,28 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { addWithByteStuffing(byte); } - void addByteWithoutCrc(uint8_t byte) + void addRawByte(uint8_t byte) { *ptr++ = byte; } + void addByteWithoutCrc(uint8_t byte) + { + addWithByteStuffing(byte); + } + void addWithByteStuffing(uint8_t byte) { if (0x7E == byte) { - *ptr++ = 0x7D; - *ptr++ = 0x5E; + addRawByte(0x7D); + addRawByte(0x5E); } else if (0x7D == byte) { - *ptr++ = 0x7D; - *ptr++ = 0x5D; + addRawByte(0x7D); + addRawByte(0x5D); } else { - *ptr++ = byte; + addRawByte(byte); } } diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 444202d26..03624e7ea 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -33,7 +33,7 @@ class Pxx1Pulses: public PxxPulses void addHead() { // send 7E, do not CRC - PxxTransport::addByteWithoutCrc(0x7E); + PxxTransport::addRawByte(0x7E); } void addCrc() diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index d7d32b588..0f613074b 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -24,7 +24,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) { initFrame(); - initCrc(); static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; uint8_t sendUpperChannels = 0; @@ -38,38 +37,23 @@ void Pxx2Pulses::setupFrame(uint8_t port) // Flag1 uint8_t flag1 = addFlag1(port); - // Flag2 - addByte(0); + // Flag2 = Extra flags + addExtraFlags(port); // Channels addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); - // Extra flags - addExtraFlags(port); - - // Flag3, reserved - addByte(0); - #if defined(LUA) - if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - // CMD/Resp - addByte(1); + if (outputTelemetryBufferTrigger != 0x7E && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) + addByte(outputTelemetryBufferTrigger); for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); } outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } - else { - // CMD/Resp - addByte(0); - } -#else - // CMD/Resp - addByte(0); #endif - // CRC - addByte(crc); // TODO need to check the CRC chosen algorithm + endFrame(); } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 939d0204d..5893ef975 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -23,6 +23,7 @@ #include "./pxx.h" +// should not be used anymore class SportCrcMixin { protected: void initCrc() @@ -41,17 +42,17 @@ class SportCrcMixin { }; -class Pxx2Transport: public DataBuffer, public SportCrcMixin { +class Pxx2Transport: public DataBuffer, public PxxCrcMixin { protected: void addByte(uint8_t byte) { - SportCrcMixin::addToCrc(byte); - *ptr++ = byte; - } + PxxCrcMixin::addToCrc(byte); + addByteWithoutCrc(byte); + }; - void addTail() + void addByteWithoutCrc(uint8_t byte) { - // nothing + *ptr++ = byte; } }; @@ -59,13 +60,43 @@ class Pxx2Pulses: public PxxPulses { public: void setupFrame(uint8_t port); - protected: - uint8_t data[64]; - uint8_t * ptr; + void addHead() + { + // send 7E, do not CRC + Pxx2Transport::addByteWithoutCrc(0x7E); + + // reserve 1 byte for LEN + Pxx2Transport::addByteWithoutCrc(0x00); + + // TYPE_C + TYPE_ID + Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + } + + void addCrc() + { + Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); + Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc); + } void initFrame() { + // init the CRC counter + initCrc(); + + // reset the frame pointer Pxx2Transport::initBuffer(); + + // add the frame head + addHead(); + } + + void endFrame() + { + // update the frame LEN = frame length minus the 2 first bytes + data[1] = getSize() - 2; + + // now add the CRC + addCrc(); } }; diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 51110e88b..3acf9aaa1 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -132,13 +132,7 @@ set(PULSES_SRC ppm_arm.cpp pxx.cpp pxx1.cpp + pxx2.cpp dsm2_arm.cpp sbus_arm.cpp ) - -if(PXX2) - set(PULSES_SRC - ${PULSES_SRC} - pxx2.cpp - ) -endif() diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index a930fd227..b372d8744 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -124,7 +124,7 @@ extern "C" void INTMODULE_DMA_STREAM_IRQHandler(void) void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; diff --git a/radio/src/targets/common/arm/stm32/serial2_driver.cpp b/radio/src/targets/common/arm/stm32/serial2_driver.cpp index 049f09374..cb39d4173 100644 --- a/radio/src/targets/common/arm/stm32/serial2_driver.cpp +++ b/radio/src/targets/common/arm/stm32/serial2_driver.cpp @@ -97,7 +97,7 @@ void serial2Init(unsigned int mode, unsigned int protocol) break; #endif case UART_MODE_TELEMETRY: - if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { uart3Setup(FRSKY_D_BAUDRATE, true); } break; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 724c16837..630db99c1 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -215,7 +215,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { + if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCR3 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); @@ -234,7 +234,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { + else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 8541c0742..b7df7b3ef 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -175,7 +175,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } @@ -205,7 +205,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) else { telemetryNoDMAFifo.push(data); #if defined(LUA) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index c49fd1119..d12b6b046 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -60,7 +60,7 @@ enum EnumKeys KEY_PLUS = KEY_UP, KEY_RIGHT, KEY_LEFT, - + TRM_BASE, TRM_LH_DWN = TRM_BASE, TRM_LH_UP, @@ -261,6 +261,8 @@ void init_pxx(uint32_t port); void disable_pxx(uint32_t port); void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t port); +void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); +void disable_module_timer( uint32_t module_index); // SD driver #if defined(SIMU) @@ -405,8 +407,9 @@ void debugPutc(const char c); // Telemetry driver void telemetryPortInit(uint32_t baudrate, uint8_t mode); uint32_t telemetryTransmitPending(); -void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size); +void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size); void rxPdcUsart( void (*pChProcess)(uint8_t x) ); +void sportSendBuffer(const uint8_t * buffer, uint32_t size); // Second UART driver void serial2TelemetryInit(unsigned int protocol); diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 02f8d5cf5..4764b1c43 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -129,6 +129,22 @@ void init_no_pulses(uint32_t port) } } +void init_module_timer(uint32_t port, uint32_t period, uint8_t state) +{ + if (port == EXTERNAL_MODULE) { + // TODO use period here + init_main_ppm(3000, 0); + } +} + +void disable_module_timer(uint32_t port) +{ + if (port == EXTERNAL_MODULE) { + disable_ppm(EXTERNAL_MODULE); + } +} + + void disable_no_pulses(uint32_t port) { if (port == EXTERNAL_MODULE) { @@ -261,7 +277,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID3) { // Use the current protocol, don't switch until set_up_pulses switch (s_current_protocol[EXTERNAL_MODULE]) { - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: // Alternate periods of 6.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -284,9 +300,9 @@ extern "C" void PWM_IRQHandler(void) } break; - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: // Alternate periods of 19.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -309,9 +325,9 @@ extern "C" void PWM_IRQHandler(void) break; #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: // Todo: how to do inverted polarity on this platform? // Alternate periods of 5.5mS and 3.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; diff --git a/radio/src/targets/sky9x/telemetry_driver.cpp b/radio/src/targets/sky9x/telemetry_driver.cpp index e9dc3edaa..4875c5d35 100644 --- a/radio/src/targets/sky9x/telemetry_driver.cpp +++ b/radio/src/targets/sky9x/telemetry_driver.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -135,12 +135,11 @@ void rxPdcUsart( void (*pChProcess)(uint8_t x) ) #endif } -uint32_t txPdcUsart(uint8_t *buffer, uint32_t size) +uint32_t txPdcUsart(const uint8_t * buffer, uint32_t size) { - Usart *pUsart = SECOND_USART; + Usart * pUsart = SECOND_USART; - if ( pUsart->US_TNCR == 0 ) - { + if (pUsart->US_TNCR == 0) { #ifndef SIMU pUsart->US_TNPR = (uint32_t)buffer ; #endif @@ -174,7 +173,12 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) #endif } -void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size) +void sportSendBuffer(const uint8_t * buffer, uint32_t size) +{ + telemetryTransmitBuffer(buffer, size); +} + +void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size) { txPdcUsart(buffer, size); } diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 522ae7ba0..2e15ba244 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -238,7 +238,7 @@ void extmodulePxxStart() void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { + if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance @@ -249,7 +249,7 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { + else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { #if defined(EXTMODULE_USART) DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 1999dc796..4610474a6 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -60,7 +60,7 @@ void intmoduleNoneStart() void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -70,7 +70,7 @@ void intmoduleSendNextFrame() INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) - else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) { + else if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2; INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index f3b58159e..c805f56e8 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -127,7 +127,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } @@ -157,7 +157,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) else { telemetryFifo.push(data); #if defined(LUA) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); @@ -174,7 +174,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) uint8_t telemetryGetByte(uint8_t * byte) { #if defined(SERIAL2) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { if (serial2Mode == UART_MODE_TELEMETRY) return serial2RxFifo.pop(*byte); else diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 02622bfeb..5dbe882eb 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -20,6 +20,76 @@ #include "opentx.h" +bool checkPXX2PacketCRC(const uint8_t * packet) +{ + // TODO ... + + return true; + // TRACE("checkPXX2PacketCRC(): checksum error "); + // DUMP(packet, FRSKY_SPORT_PACKET_SIZE); +} + +void createFrSkyPXX2Sensor(uint16_t type, uint8_t value){ + uint8_t buffer[5] = {0x18, 0x10, 0, 0, 0}; + buffer[2] = type & 0xF; + buffer[3] = type >> 8; + buffer[4] = value; + sportProcessTelemetryPacketWithoutCrc(buffer); +} + +void processFrskyPXX2Data(uint8_t data) +{ + static uint8_t dataState = STATE_DATA_IDLE; + + switch (dataState) { + case STATE_DATA_IDLE: + if (data == START_STOP) { + telemetryRxBufferCount = 0; + dataState = STATE_DATA_START; + } + break; + + case STATE_DATA_START: + if (telemetryRxBufferCount == 0 && data > 0x0C) { + // wrong length + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; + if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { + if (checkPXX2PacketCRC(telemetryRxBuffer)) { + R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected + uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; + if (R9Region != 0x04) { + g_model.moduleData[EXTERNAL_MODULE].r9m.region = R9Region; + } + if (telemetryRxBuffer[2] & 0x80) { + createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); + } + else { + createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); + } + if((telemetryRxBuffer[3] & 0x04) == 0) { + createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); + } + if (telemetryRxBuffer[0] == 0x0C) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + } + } + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + } + else { + // overflow guard + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + break; + } +} + void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index e138dcf62..2e88e4843 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,6 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" +#include "../io/pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { @@ -32,12 +33,7 @@ enum FrSkyDataState { STATE_DATA_XOR, }; -#if defined(PXX2) -#include "io/pxx2.h" -#define FRSKY_SPORT_BAUDRATE PXX2_BAUDRATE -#else #define FRSKY_SPORT_BAUDRATE 57600 -#endif #define FRSKY_D_BAUDRATE 9600 @@ -194,9 +190,12 @@ enum FrSkyDataState { #define BATT_ID 0xf104 #define RAS_ID 0xf105 #define XJT_VERSION_ID 0xf106 +#define R9_PWR_ID 0xf107 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f + + // Default sensor data IDs (Physical IDs + CRC) #define DATA_ID_VARIO 0x00 // 0 #define DATA_ID_FLVSS 0xA1 // 1 @@ -206,7 +205,6 @@ enum FrSkyDataState { #define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UR 0xC6 // 6 - #if defined(NO_RAS) #define IS_RAS_VALUE_VALID() (false) #elif defined(PCBX10) @@ -219,13 +217,6 @@ enum FrSkyDataState { #define IS_HIDDEN_TELEMETRY_VALUE(id) ((id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID)) -enum AlarmLevel { - alarm_off = 0, - alarm_yellow = 1, - alarm_orange = 2, - alarm_red = 3 -}; - #define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) #define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) @@ -287,11 +278,11 @@ typedef enum { // FrSky D Telemetry Protocol void processHubPacket(uint8_t id, int16_t value); -void frskyDSendNextAlarm(); void frskyDProcessPacket(const uint8_t *packet); // FrSky S.PORT Telemetry Protocol void sportProcessTelemetryPacket(const uint8_t * packet); +void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet); void telemetryWakeup(); void telemetryReset(); @@ -311,14 +302,6 @@ enum TelemetryProtocol TELEM_PROTO_FLYSKY_IBUS, }; -enum TelemAnas { - TELEM_ANA_A1, - TELEM_ANA_A2, - TELEM_ANA_A3, - TELEM_ANA_A4, - TELEM_ANA_COUNT -}; - struct TelemetryData { TelemetryValueWithMin swr; // TODO Min not needed TelemetryValueWithMin rssi; // TODO Min not needed @@ -328,12 +311,7 @@ struct TelemetryData { extern TelemetryData telemetryData; - typedef uint16_t frskyCellVoltage_t; - -void frskySetCellsCount(uint8_t cellscount); -void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts); -void frskyUpdateCells(); - void processFrskyTelemetryData(uint8_t data); +void processFrskyPXX2Data(uint8_t data); #endif // _FRSKY_H_ diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 9369c3024..7cc80ff36 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -36,6 +36,7 @@ const FrSkySportSensor sportSensors[] = { { A3_FIRST_ID, A3_LAST_ID, 0, ZSTR_A3, UNIT_VOLTS, 2 }, { A4_FIRST_ID, A4_LAST_ID, 0, ZSTR_A4, UNIT_VOLTS, 2 }, { BATT_ID, BATT_ID, 0, ZSTR_BATT, UNIT_VOLTS, 1 }, + { R9_PWR_ID, R9_PWR_ID, 0, ZSTR_R9PW, UNIT_MILLIWATTS, 0 }, { T1_FIRST_ID, T1_LAST_ID, 0, ZSTR_TEMP1, UNIT_CELSIUS, 0 }, { T2_FIRST_ID, T2_LAST_ID, 0, ZSTR_TEMP2, UNIT_CELSIUS, 0 }, { RPM_FIRST_ID, RPM_LAST_ID, 0, ZSTR_RPM, UNIT_RPMS, 0 }, @@ -92,7 +93,7 @@ const FrSkySportSensor * getFrSkySportSensor(uint16_t id, uint8_t subId=0) return result; } -bool checkSportPacket(const uint8_t *packet) +bool checkSportPacket(const uint8_t * packet) { short crc = 0; for (int i=1; i 0x33) static tmr10ms_t alarmsCheckTime = 0; @@ -196,7 +203,9 @@ void telemetryInterrupt10ms() wshhStreaming--; } #endif - + if (R9ModuleStreaming > 0) { + R9ModuleStreaming--; + } if (telemetryStreaming > 0) { telemetryStreaming--; } @@ -216,11 +225,8 @@ void telemetryReset() } telemetryStreaming = 0; // reset counter only if valid frsky packets are being detected - link_counter = 0; telemetryState = TELEMETRY_INIT; - - } // we don't reset the telemetry here as we would also reset the consumption after model load @@ -228,12 +234,12 @@ void telemetryInit(uint8_t protocol) { telemetryProtocol = protocol; - if (protocol == PROTOCOL_FRSKY_D) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D) { telemetryPortInit(FRSKY_D_BAUDRATE, TELEMETRY_SERIAL_DEFAULT); } #if defined(MULTIMODULE) - else if (protocol == PROTOCOL_MULTIMODULE || protocol == PROTOCOL_FLYSKY_IBUS) { + else if (protocol == PROTOCOL_TELEMETRY_MULTIMODULE || protocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS) { // The DIY Multi module always speaks 100000 baud regardless of the telemetry protocol in use telemetryPortInit(MULTIMODULE_BAUDRATE, TELEMETRY_SERIAL_8E2); #if defined(LUA) @@ -241,14 +247,14 @@ void telemetryInit(uint8_t protocol) outputTelemetryBufferTrigger = 0x7E; #endif } - else if (protocol == PROTOCOL_SPEKTRUM) { + else if (protocol == PROTOCOL_TELEMETRY_SPEKTRUM) { // Spektrum's own small race RX (SPM4648) uses 125000 8N1, use the same since there is no real standard telemetryPortInit(125000, TELEMETRY_SERIAL_DEFAULT); } #endif #if defined(CROSSFIRE) - else if (protocol == PROTOCOL_PULSES_CROSSFIRE) { + else if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { telemetryPortInit(CROSSFIRE_BAUDRATE, TELEMETRY_SERIAL_DEFAULT); #if defined(LUA) outputTelemetryBufferSize = 0; @@ -259,12 +265,19 @@ void telemetryInit(uint8_t protocol) #endif #if defined(SERIAL2) || defined(PCBSKY9X) - else if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + else if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { telemetryPortInit(0, TELEMETRY_SERIAL_DEFAULT); - serial2TelemetryInit(PROTOCOL_FRSKY_D_SECONDARY); + serial2TelemetryInit(PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY); } #endif + else if (protocol == PROTOCOL_TELEMETRY_PXX2) { + telemetryPortInit(PXX2_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); +#if defined(LUA) + outputTelemetryBufferSize = 0; + outputTelemetryBufferTrigger = 0x7E; +#endif + } else { telemetryPortInit(FRSKY_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); #if defined(LUA) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 21c4067df..daaf9947d 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -36,13 +36,12 @@ #endif extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time +extern uint8_t R9ModuleStreaming; // >0 (true) == R9 module is connected and sending data 0 = no data detected for some time #if defined(WS_HOW_HIGH) extern uint8_t wshhStreaming; #endif -extern uint8_t link_counter; - enum TelemetryStates { TELEMETRY_INIT, TELEMETRY_OK, @@ -99,7 +98,6 @@ void delTelemetryIndex(uint8_t index); int availableTelemetryIndex(); int lastUsedTelemetryIndex(); -int32_t getTelemetryValue(uint8_t index, uint8_t & prec); int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec); void frskySportSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance); @@ -109,35 +107,43 @@ void frskyDSetDefault(int index, uint16_t id); #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH) extern uint8_t telemetryProtocol; -#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) + #if defined (MULTIMODULE) #define IS_D16_MULTI() ((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)) -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_MULTIMODULE && IS_D16_MULTI())) +#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && IS_D16_MULTI())) #else -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT) +#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) #endif -#define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_SPEKTRUM) +#define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) inline uint8_t modelTelemetryProtocol() { #if defined(CROSSFIRE) if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) { - return PROTOCOL_PULSES_CROSSFIRE; + return PROTOCOL_TELEMETRY_CROSSFIRE; } #endif - + if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) { return g_model.telemetryProtocol; } - + + if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { +#if defined(PCBXLITE) + return PROTOCOL_TELEMETRY_FRSKY_SPORT; +#else + return PROTOCOL_TELEMETRY_PXX2; +#endif + } + #if defined(MULTIMODULE) if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { - return PROTOCOL_MULTIMODULE; + return PROTOCOL_TELEMETRY_MULTIMODULE; } #endif // default choice - return PROTOCOL_FRSKY_SPORT; + return PROTOCOL_TELEMETRY_FRSKY_SPORT; } #include "telemetry_sensors.h" diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 049f3742a..d7ff7e15e 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -33,7 +33,7 @@ bool isFaiForbidden(source_t idx) switch (telemetryProtocol) { - case PROTOCOL_FRSKY_SPORT: + case PROTOCOL_TELEMETRY_FRSKY_SPORT: if (sensor->id == RSSI_ID) { return false; } @@ -42,7 +42,7 @@ bool isFaiForbidden(source_t idx) } break; - case PROTOCOL_FRSKY_D: + case PROTOCOL_TELEMETRY_FRSKY_D: if (sensor->id == D_RSSI_ID) { return false; } @@ -52,7 +52,7 @@ bool isFaiForbidden(source_t idx) break; #if defined(CROSSFIRE) - case PROTOCOL_PULSES_CROSSFIRE: + case PROTOCOL_TELEMETRY_CROSSFIRE: if (sensor->id == RX_RSSI1_INDEX) { return false; } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0f9bce91b..8a71c26d4 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -93,6 +93,7 @@ const char STR_OPEN9X[] = ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) ISTR(R9M_REGION) + ISTR(R9MFLEX_FREQ) ISTR(R9M_FCC_POWER_VALUES) ISTR(R9M_LBT_POWER_VALUES) ISTR(TELEMETRY_PROTOCOLS) @@ -145,6 +146,7 @@ const char STR_PPMFRAME[] = TR_PPMFRAME; const char STR_REFRESHRATE[] = TR_REFRESHRATE; const char SSTR_WARN_BATTVOLTAGE[] = STR_WARN_BATTVOLTAGE; const char STR_MS[] = TR_MS; +const char STR_FREQUENCY[] = TR_FREQUENCY; const char STR_SWITCH[] = TR_SWITCH; const char STR_TRIMS[] = TR_TRIMS; const char STR_FADEIN[] = TR_FADEIN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 7169b4d8f..b796717d9 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -189,8 +189,9 @@ extern const char STR_OPEN9X[]; #define OFS_VFAILSAFE (OFS_JACKMODES + sizeof(TR_JACKMODES)) #define OFS_VTRAINERMODES (OFS_VFAILSAFE + sizeof(TR_VFAILSAFE)) #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) - #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) - #define OFS_R9M_FCC_POWER_VALUES (OFS_R9M_REGION + sizeof(TR_R9M_REGION)) + #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) + #define OFS_R9MFLEX_FREQ (OFS_R9M_REGION + sizeof(TR_R9M_REGION)) + #define OFS_R9M_FCC_POWER_VALUES (OFS_R9MFLEX_FREQ + sizeof(TR_R9MFLEX_FREQ)) #define OFS_R9M_LBT_POWER_VALUES (OFS_R9M_FCC_POWER_VALUES + sizeof(TR_R9M_FCC_POWER_VALUES)) #define OFS_TELEMETRY_PROTOCOLS (OFS_R9M_LBT_POWER_VALUES + sizeof(TR_R9M_LBT_POWER_VALUES)) #define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS)) @@ -296,7 +297,8 @@ extern const char STR_OPEN9X[]; #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) - #define STR_R9M_REGION (STR_OPEN9X + OFS_R9M_REGION) + #define STR_R9M_REGION (STR_OPEN9X + OFS_R9M_REGION) + #define STR_R9MFLEX_FREQ (STR_OPEN9X + OFS_R9MFLEX_FREQ) #define STR_R9M_FCC_POWER_VALUES (STR_OPEN9X + OFS_R9M_FCC_POWER_VALUES) #define STR_R9M_LBT_POWER_VALUES (STR_OPEN9X + OFS_R9M_LBT_POWER_VALUES) #define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS) @@ -363,6 +365,7 @@ extern const char STR_PPMFRAME[]; extern const char STR_REFRESHRATE[]; extern const char SSTR_WARN_BATTVOLTAGE[]; extern const char STR_MS[]; +extern const char STR_FREQUENCY[]; extern const char STR_SWITCH[]; extern const char STR_TRIMS[]; extern const char STR_FADEIN[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 35a8f888e..ef89556b2 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -152,7 +152,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -160,21 +160,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POZ""NEG" @@ -579,6 +569,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Spínač" #define TR_TRIMS "Trimy" #define TR_FADEIN "Přechod Zap" @@ -1199,6 +1190,7 @@ #define TR_JITTER_FILTER "ADC Filtr" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index beba5a70f..cacf86882 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -155,7 +155,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -163,21 +163,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -584,6 +574,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schalt.", "Schalter") #define TR_TRIMS "Trims" #define TR_FADEIN "Langs. Ein" @@ -1197,6 +1188,7 @@ #define TR_JITTER_FILTER "ADC Filter" // ---------------------------------------------------------------- #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index d70bcaf01..ebe496299 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -154,7 +154,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -162,22 +162,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -583,6 +572,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" #define TR_TRIMS "Trims" #define TR_FADEIN "Fade in" @@ -1208,6 +1198,7 @@ #define TR_JITTER_FILTER "ADC filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index b920bf446..598e55106 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -154,7 +154,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -162,21 +162,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -587,6 +577,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Interr" #define TR_TRIMS "Trims" #define TR_FADEIN "Inicio" @@ -1203,6 +1194,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 7ac064105..fc6212810 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -154,7 +154,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -162,21 +162,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -579,6 +569,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" #define TR_TRIMS "Trims" #define TR_FADEIN "Fade In" @@ -1189,6 +1180,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 4fa2f1a46..97da8d7a0 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -154,7 +154,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -162,21 +162,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SLV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -596,6 +586,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Inter", "Interrupteur") #define TR_TRIMS "Trims" #define TR_FADEIN "Fondu ON" @@ -1215,6 +1206,7 @@ #define TR_JITTER_FILTER "Filtre ADC" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 0ce36835d..f37fcffee 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -154,7 +154,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -162,21 +162,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -585,6 +575,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Inter." #define TR_TRIMS "Trims" #define TR_FADEIN "Diss.In" @@ -1198,6 +1189,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 54ad35d8f..289853bf9 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -156,7 +156,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -164,21 +164,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -579,6 +569,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schak.", "Schakelaar") #define TR_TRIMS "Trims" #define TR_FADEIN "Fade in" @@ -1205,6 +1196,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 19cb896aa..fc023768c 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -155,7 +155,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -163,21 +163,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POZ""NEG" @@ -586,6 +576,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Przełą" #define TR_TRIMS "Trymy" #define TR_FADEIN "Pojawia" @@ -1199,6 +1190,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index a86ea0973..9479748d6 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -153,7 +153,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -161,21 +161,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" @@ -586,6 +576,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Chave" #define TR_TRIMS "Trims" #define TR_FADEIN "Aparecer" @@ -1202,6 +1193,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index b254cece8..2359af0b9 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -152,7 +152,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -160,19 +160,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "Pos""Neg" @@ -596,6 +588,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Brytare" #define TR_TRIMS "Trimmar" #define TR_FADEIN "Tona In" @@ -1210,6 +1203,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 3e16c3b4f..50b61319e 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -79,7 +79,6 @@ options_taranis = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranisplus = { @@ -97,7 +96,6 @@ options_taranisplus = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_xlite = { @@ -114,7 +112,6 @@ options_xlite = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "stdr9m": ("MODULE_R9M_FULLSIZE", "YES", None), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranisx9e = { @@ -132,7 +129,6 @@ options_taranisx9e = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "horussticks": ("STICKS", "HORUS", "STANDARD"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_x12s = { @@ -147,7 +143,6 @@ options_x12s = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "pcbdev": ("PCBREV", "10", None), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_x10 = { @@ -161,5 +156,4 @@ options_x10 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) }