1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-20 23:05:12 +03:00

Merge branch 'bsongis/pxx2' into bsongis/x-lites

This commit is contained in:
Bertrand Songis 2019-02-01 14:19:08 +01:00
commit 3dfe50c10b
55 changed files with 612 additions and 509 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -406,9 +406,18 @@ PACK(struct ModuleData {
int8_t rfProtocol:4;
uint8_t channelsStart;
int8_t channelsCount; // 0=8 channels
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 {

View file

@ -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)

View file

@ -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:

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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");
}

View file

@ -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;

View file

@ -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

View file

@ -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)
{

View file

@ -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"

View file

@ -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<uint8_t>(PROTO_DSM2_LP45, PROTO_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTO_DSM2_DSMX);
required_protocol = limit<uint8_t>(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;

View file

@ -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"

View file

@ -166,7 +166,7 @@ void PxxPulses<PxxTransport>::addExtraFlags(uint8_t port)
extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2);
if (isModuleR9M(port)) {
extra_flags |= (min<uint8_t>(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);
}

View file

@ -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<uint8_t, 64>, 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);
}
}

View file

@ -33,7 +33,7 @@ class Pxx1Pulses: public PxxPulses<PxxTransport>
void addHead()
{
// send 7E, do not CRC
PxxTransport::addByteWithoutCrc(0x7E);
PxxTransport::addRawByte(0x7E);
}
void addCrc()

View file

@ -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();
}

View file

@ -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<uint8_t, 64>, public SportCrcMixin {
class Pxx2Transport: public DataBuffer<uint8_t, 64>, 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<Pxx2Transport> {
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();
}
};

View file

@ -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()

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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_

View file

@ -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<FRSKY_SPORT_PACKET_SIZE; ++i) {
@ -138,17 +139,22 @@ void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, u
void sportProcessTelemetryPacket(const uint8_t * packet)
{
uint8_t physicalId = packet[0] & 0x1F;
uint8_t primId = packet[1];
uint16_t id = *((uint16_t *)(packet+2));
uint32_t data = SPORT_DATA_S32(packet);
if (!checkSportPacket(packet)) {
TRACE("sportProcessTelemetryPacket(): checksum error ");
DUMP(packet, FRSKY_SPORT_PACKET_SIZE);
return;
}
sportProcessTelemetryPacketWithoutCrc(packet);
}
void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet)
{
uint8_t physicalId = packet[0] & 0x1F;
uint8_t primId = packet[1];
uint16_t id = *((uint16_t *)(packet+2));
uint32_t data = SPORT_DATA_S32(packet);
if (primId == DATA_FRAME) {
uint8_t instance = physicalId + 1;
if (id == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) {
@ -159,6 +165,10 @@ void sportProcessTelemetryPacket(const uint8_t * packet)
else
telemetryData.rssi.set(data);
}
else if (id == R9_PWR_ID) {
uint32_t r9pwr[] = {100, 200, 500, 1000};
data = r9pwr[SPORT_DATA_U8(packet) & 0x03];
}
else if (id == XJT_VERSION_ID) {
telemetryData.xjtVersion = HUB_DATA_U16(packet);
if (!IS_RAS_VALUE_VALID()) {

View file

@ -21,6 +21,7 @@
#include "opentx.h"
uint8_t telemetryStreaming = 0;
uint8_t R9ModuleStreaming = 0;
uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
uint8_t telemetryRxBufferCount = 0;
@ -28,8 +29,6 @@ uint8_t telemetryRxBufferCount = 0;
uint8_t wshhStreaming = 0;
#endif
uint8_t link_counter = 0;
uint8_t telemetryState = TELEMETRY_INIT;
TelemetryData telemetryData;
@ -40,44 +39,53 @@ uint8_t telemetryProtocol = 255;
uint8_t serialInversion = 0;
#endif
void processTelemetryData(uint8_t data)
{
#if defined(CROSSFIRE)
if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE) {
if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) {
processCrossfireTelemetryData(data);
return;
}
#endif
#if defined(MULTIMODULE)
if (telemetryProtocol == PROTOCOL_SPEKTRUM) {
if (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) {
processSpektrumTelemetryData(data);
return;
}
if (telemetryProtocol == PROTOCOL_FLYSKY_IBUS) {
if (telemetryProtocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS) {
processFlySkyTelemetryData(data);
return;
}
if (telemetryProtocol == PROTOCOL_MULTIMODULE) {
if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE) {
processMultiTelemetryData(data);
return;
}
#endif
if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) {
processFrskyPXX2Data(data);
return;
}
processFrskyTelemetryData(data);
}
void telemetryWakeup()
{
uint8_t requiredTelemetryProtocol = modelTelemetryProtocol();
#if defined(REVX)
uint8_t requiredSerialInversion = g_model.moduleData[EXTERNAL_MODULE].invertedSerial;
if (telemetryProtocol != requiredTelemetryProtocol || serialInversion != requiredSerialInversion) {
serialInversion = requiredSerialInversion;
#else
if (telemetryProtocol != requiredTelemetryProtocol) {
#endif
telemetryInit(requiredTelemetryProtocol);
}
#else
if (telemetryProtocol != requiredTelemetryProtocol) {
telemetryInit(requiredTelemetryProtocol);
}
#endif
#if defined(STM32)
uint8_t data;
@ -89,7 +97,7 @@ void telemetryWakeup()
} while (telemetryGetByte(&data));
}
#elif defined(PCBSKY9X)
if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) {
if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) {
uint8_t data;
while (telemetrySecondPortReceive(data)) {
processTelemetryData(data);
@ -101,7 +109,6 @@ void telemetryWakeup()
}
#endif
for (int i=0; i<MAX_TELEMETRY_SENSORS; i++) {
const TelemetrySensor & sensor = g_model.telemetrySensors[i];
if (sensor.type == TELEM_TYPE_CALCULATED) {
@ -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)

View file

@ -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,20 +107,20 @@ 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
@ -130,14 +128,22 @@ inline uint8_t modelTelemetryProtocol()
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"

View file

@ -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;
}

View file

@ -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;

View file

@ -190,7 +190,8 @@ extern const char STR_OPEN9X[];
#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_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))
@ -297,6 +298,7 @@ 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_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[];

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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)
}