Bsongis/r9 m fixes (#5406)

R9M support
This commit is contained in:
Bertrand Songis
2017-12-08 11:26:46 +01:00
committed by GitHub
parent 9c27947345
commit a6044a684d
31 changed files with 771 additions and 495 deletions
+93 -44
View File
@@ -103,30 +103,54 @@ enum MenuModelSetupItems {
#define MODEL_SETUP_RANGE_OFS 7*FW
#define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
#if defined(BINDING_OPTIONS)
void onBindMenu(const char * result)
{
if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition);
if (result == STR_BINDING_25MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_25MW_CH1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_25;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_500MW_CH9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LBT_POWER_500;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = false;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
}
else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = false;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off = true;
g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
}
else {
return;
}
moduleFlag[INTERNAL_MODULE] = MODULE_BIND;
moduleFlag[moduleIdx] = MODULE_BIND;
}
#endif
@@ -219,8 +243,6 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
}
}
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
int getSwitchWarningsCount()
{
int count = 0;
@@ -253,7 +275,7 @@ 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 (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#if TIMERS == 1
#define TIMERS_ROWS TIMER_ROWS(0)
@@ -306,8 +328,11 @@ void menuModelSetup(event_t event)
EXTERNAL_MODULE_MODE_ROWS,
MULTIMODULE_STATUS_ROWS
EXTERNAL_MODULE_CHANNELS_ROWS,
((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol))|| IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW,
FAILSAFE_ROWS(EXTERNAL_MODULE), EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW,
((IS_MODULE_XJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || IS_MODULE_SBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_PXX(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW,
FAILSAFE_ROWS(EXTERNAL_MODULE),
EXTERNAL_MODULE_OPTION_ROW,
MULTIMODULE_MODULE_ROWS
EXTERNAL_MODULE_POWER_ROW,
LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS});
#endif
MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX);
@@ -741,6 +766,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 (IS_MODULE_DSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_MODES, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0));
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -775,6 +802,8 @@ void menuModelSetup(event_t event)
case 1:
if (IS_MODULE_DSM2(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
else if (IS_MODULE_R9M(EXTERNAL_MODULE))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LBT);
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
@@ -787,7 +816,8 @@ void menuModelSetup(event_t event)
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
} else {
}
else {
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
}
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
@@ -807,8 +837,9 @@ void menuModelSetup(event_t event)
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) {
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL));
break;
} else {
const mm_protocol_definition* pdef = getMultiProtocolDefinition(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false));
}
else {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false));
if (pdef->maxSubtype > 0)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, pdef->maxSubtype);
}
@@ -967,11 +998,11 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM);
}
if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) {
if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (xOffsetBind)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && l_posHorz==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx));
if (checkIncDec_Ret) {
modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx];
}
@@ -986,29 +1017,40 @@ void menuModelSetup(event_t event)
#if defined(MULTIMODULE)
if (multiBindStatus == MULTI_BIND_FINISHED) {
multiBindStatus = MULTI_NORMAL_OPERATION;
s_editMode=0;
s_editMode = 0;
}
#endif
#if defined(BINDING_OPTIONS)
if (attr && l_posHorz>0) {
if(s_editMode>0) {
if (s_editMode>0) {
if (l_posHorz == 1) {
if (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16 && s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) {
if(event==EVT_KEY_BREAK(KEY_ENTER)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
POPUP_MENU_SELECT_ITEM(g_model.moduleData[INTERNAL_MODULE].pxx.receiver_telem_off + (g_model.moduleData[INTERNAL_MODULE].pxx.receiver_channel_9_16 << 1));
if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) {
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
uint8_t default_selection;
if (IS_MODULE_R9M_LBT(moduleIdx)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_500MW_CH9_16_TELEM_OFF);
default_selection = 2;
}
else {
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON);
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1);
}
POPUP_MENU_SELECT_ITEM(default_selection);
POPUP_MENU_START(onBindMenu);
continue;
}
if (moduleFlag[INTERNAL_MODULE] == MODULE_BIND) {
if (moduleFlag[moduleIdx] == MODULE_BIND) {
newFlag = MODULE_BIND;
}
else {
if (!popupMenuNoItems) {
s_editMode=0; // this is when popup is exited before a choice is made
s_editMode = 0; // this is when popup is exited before a choice is made
}
}
}
@@ -1070,7 +1112,9 @@ void menuModelSetup(event_t event)
break;
}
break;
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: {
case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
#if defined(MULTIMODULE)
@@ -1100,12 +1144,12 @@ void menuModelSetup(event_t event)
}
#endif
if (IS_MODULE_R9M(moduleIdx)) {
if (IS_TELEMETRY_INTERNAL_MODULE) {
lcdDrawTextAlignedLeft(y, STR_SPORT_OUT);
if (IS_TELEMETRY_INTERNAL_MODULE()) {
lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL);
}
else {
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_SPORT_OUT, attr, event);
g_model.moduleData[moduleIdx].pxx.sport_out = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].pxx.sport_out, MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEMETRY, attr, event);
}
}
else if (IS_MODULE_SBUS(moduleIdx)) {
@@ -1114,18 +1158,22 @@ void menuModelSetup(event_t event)
}
}
break;
case ITEM_MODEL_EXTERNAL_MODULE_POWER: {
case ITEM_MODEL_EXTERNAL_MODULE_POWER:
{
uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);
#if defined (MULTIMODULE)
if (IS_MODULE_MULTIMODULE(moduleIdx))
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
#endif
if (IS_MODULE_R9M(moduleIdx)) {
if (IS_MODULE_R9M_FCC(moduleIdx)) {
// Power selection is only available on R9M FCC
lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, getR9MPowerString(g_model.moduleData[moduleIdx].pxx.power), attr);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr);
if (attr)
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, 3);
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX);
}
#if defined (MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
}
#endif
break;
}
@@ -1136,7 +1184,8 @@ void menuModelSetup(event_t event)
else
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
break;
case ITEM_MODEL_EXTERNAL_MODULE_STATUS: {
case ITEM_MODEL_EXTERNAL_MODULE_STATUS:
{
lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS);
char statusText[64];