Merge pull request #6269 from opentx/3djc/pxx2

3djc/pxx2
This commit is contained in:
Bertrand Songis
2018-12-16 23:31:18 +01:00
committed by GitHub
28 changed files with 218 additions and 72 deletions
-5
View File
@@ -46,7 +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)
# 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).")
@@ -312,10 +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()
set(SRC
${SRC}
opentx.cpp
+12 -3
View File
@@ -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 {
+34 -4
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)
@@ -727,8 +734,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);
@@ -755,6 +767,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) {
@@ -764,7 +777,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);
@@ -1191,6 +1204,7 @@ void menuModelSetup(event_t event)
}
}
#endif
#if defined(PCBXLITE)
if (isModuleR9M(moduleIdx)) {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
if (IS_TELEMETRY_INTERNAL_MODULE()) {
@@ -1201,6 +1215,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);
}
@@ -1246,6 +1263,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:
+19 -22
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)
+19 -22
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)
+9 -1
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);
+33
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,6 +558,12 @@ 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;
}
+15
View File
@@ -321,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,
+32 -1
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)
{
+4
View File
@@ -66,7 +66,11 @@ uint8_t getRequiredProtocol(uint8_t port)
required_protocol = PROTOCOL_CHANNELS_PXX;
break;
case MODULE_TYPE_R9M:
#if defined(PCBXLITE)
required_protocol = PROTOCOL_CHANNELS_PXX;
#else
required_protocol = PROTOCOL_CHANNELS_PXX2;
#endif
break;
case MODULE_TYPE_SBUS:
required_protocol = PROTOCOL_CHANNELS_SBUS;
+6 -2
View File
@@ -166,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,
@@ -184,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"
+5
View File
@@ -59,6 +59,11 @@ void processFrskyPXX2Data(uint8_t data)
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);
}
+5 -2
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;
@@ -120,7 +121,7 @@ void telemetryWakeup()
varioWakeup();
}
#endif
#define FRSKY_BAD_ANTENNA() (IS_RAS_VALUE_VALID() && telemetryData.swr.value > 0x33)
static tmr10ms_t alarmsCheckTime = 0;
@@ -202,7 +203,9 @@ void telemetryInterrupt10ms()
wshhStreaming--;
}
#endif
if (R9ModuleStreaming > 0) {
R9ModuleStreaming--;
}
if (telemetryStreaming > 0) {
telemetryStreaming--;
}
+6 -1
View File
@@ -36,6 +36,7 @@
#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;
@@ -128,9 +129,13 @@ inline uint8_t modelTelemetryProtocol()
}
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_TELEMETRY_MULTIMODULE;
+2
View File
@@ -92,6 +92,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)
@@ -144,6 +145,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;
+6 -3
View File
@@ -188,8 +188,9 @@ extern const char STR_OPEN9X[];
#define OFS_VFAILSAFE (OFS_USBMODES + sizeof(TR_USBMODES))
#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))
@@ -294,7 +295,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)
@@ -361,6 +363,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[];
+1
View File
@@ -563,6 +563,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"
+1
View File
@@ -568,6 +568,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"
+1
View File
@@ -566,6 +566,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"
+1
View File
@@ -571,6 +571,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"
+1
View File
@@ -563,6 +563,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"
+1
View File
@@ -580,6 +580,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"
+1
View File
@@ -569,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 "Inter."
#define TR_TRIMS "Trims"
#define TR_FADEIN "Diss.In"
+1
View File
@@ -563,6 +563,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"
+1
View File
@@ -570,6 +570,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"
+1
View File
@@ -570,6 +570,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"
+1
View File
@@ -582,6 +582,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"
-6
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)
}