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

Bsongis/xjt lite support (#6563)

External XJT Lite support added
This commit is contained in:
Bertrand Songis 2019-07-15 08:51:00 +02:00 committed by GitHub
parent 9792bf52d4
commit ccc93ce439
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 328 additions and 153 deletions

View file

@ -183,8 +183,6 @@ enum MenuModelSetupItems {
#define INTERNAL_MODULE_TYPE_ROWS (0) // Module type + RF protocols #define INTERNAL_MODULE_TYPE_ROWS (0) // Module type + RF protocols
#endif #endif
#define EXTERNAL_MODULE_BIND_ROWS ((isModuleXJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX1(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW
#if defined(PCBSKY9X) && defined(REVX) #if defined(PCBSKY9X) && defined(REVX)
#define OUTPUT_TYPE_ROW (isModulePPM(EXTERNAL_MODULE) ? (uint8_t)0 : HIDDEN_ROW), #define OUTPUT_TYPE_ROW (isModulePPM(EXTERNAL_MODULE) ? (uint8_t)0 : HIDDEN_ROW),
#elif defined(PCBSKY9X) #elif defined(PCBSKY9X)
@ -264,7 +262,7 @@ void onBluetoothConnectMenu(const char * result)
LABEL(InternalModule), \ LABEL(InternalModule), \
INTERNAL_MODULE_TYPE_ROWS, \ INTERNAL_MODULE_TYPE_ROWS, \
INTERNAL_MODULE_CHANNELS_ROWS, \ INTERNAL_MODULE_CHANNELS_ROWS, \
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), \ IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleModelIndexAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \
ANTENNA_ROW \ ANTENNA_ROW \
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \ IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \
@ -764,7 +762,7 @@ void menuModelSetup(event_t event)
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0);
if (isModuleXJT(INTERNAL_MODULE)) if (isModuleXJT(INTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleXJT2(INTERNAL_MODULE)) else if (isModuleACCESS(INTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
if (attr) { if (attr) {
if (menuHorizontalPosition == 0) { if (menuHorizontalPosition == 0) {
@ -785,7 +783,7 @@ void menuModelSetup(event_t event)
} }
} }
else if (isModulePXX2(INTERNAL_MODULE)) { else if (isModulePXX2(INTERNAL_MODULE)) {
g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_LAST, EE_MODEL, isRfProtocolAvailable); g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL, isRfProtocolAvailable);
} }
} }
#else #else
@ -795,7 +793,7 @@ void menuModelSetup(event_t event)
} }
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_ISRM_PXX2_RF_PROTOCOLS, index, attr); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_ISRM_PXX2_RF_PROTOCOLS, index, attr);
if (attr) { if (attr) {
index = checkIncDec(event, index, 0, MODULE_SUBTYPE_ISRM_PXX2_LAST + 1 /* because of --- */, EE_MODEL); index = checkIncDec(event, index, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16 + 1 /* because of --- */, EE_MODEL);
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
memclear(&g_model.moduleData[INTERNAL_MODULE], sizeof(ModuleData)); memclear(&g_model.moduleData[INTERNAL_MODULE], sizeof(ModuleData));
if (index > 0) { if (index > 0) {
@ -824,7 +822,7 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, INDENT TR_MODE); lcdDrawTextAlignedLeft(y, INDENT TR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0);
if (isModuleXJT(EXTERNAL_MODULE)) if (isModuleXJT(EXTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleDSM2(EXTERNAL_MODULE)) else if (isModuleDSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) else if (isModuleR9MNonAccess(EXTERNAL_MODULE))
@ -896,7 +894,7 @@ void menuModelSetup(event_t event)
} }
#endif #endif
else { else {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, 0, MODULE_SUBTYPE_PXX1_LAST); CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_PXX1_LAST);
} }
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
@ -1065,6 +1063,9 @@ void menuModelSetup(event_t event)
lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0));
lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawChar(lcdLastRightPos, y, '-');
lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+sentModuleChannels(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0)); lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+sentModuleChannels(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0));
const char * delay = getModuleDelay(moduleIdx);
if (delay)
lcdDrawText(lcdLastRightPos+4, y, delay, SMLSIZE);
if (attr && s_editMode > 0) { if (attr && s_editMode > 0) {
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:
@ -1122,7 +1123,7 @@ void menuModelSetup(event_t event)
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2);
if (attr) { if (attr) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx];
} }
@ -1300,7 +1301,7 @@ void menuModelSetup(event_t event)
else { else {
horzpos_t l_posHorz = menuHorizontalPosition; horzpos_t l_posHorz = menuHorizontalPosition;
coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; coord_t xOffsetBind = MODEL_SETUP_BIND_OFS;
if (isModuleXJT(moduleIdx) && IS_D8_RX(moduleIdx)) { if (!isModuleModelIndexAvailable(moduleIdx)) {
xOffsetBind = 0; xOffsetBind = 0;
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER);
if (attr) l_posHorz += 1; if (attr) l_posHorz += 1;
@ -1313,7 +1314,7 @@ void menuModelSetup(event_t event)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); 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 (attr && l_posHorz == 0) {
if (s_editMode > 0) { if (s_editMode > 0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx];
} }
@ -1340,7 +1341,7 @@ void menuModelSetup(event_t event)
if (attr && l_posHorz > 0) { if (attr && l_posHorz > 0) {
if (s_editMode > 0) { if (s_editMode > 0) {
if (l_posHorz == 1) { if (l_posHorz == 1) {
if (isModuleR9MNonAccess(moduleIdx) || (isModuleXJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol == MODULE_SUBTYPE_PXX1_ACCST_D16) || (isModuleXJT2(moduleIdx) && g_model.moduleData[moduleIdx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16) || (isModuleR9MAccess(moduleIdx) && g_model.moduleData[moduleIdx].subType != MODULE_SUBTYPE_R9M_PXX2_ACCESS)) { if (isModuleR9MNonAccess(moduleIdx) || isModuleXJTD16(moduleIdx) || (isModuleACCESS(moduleIdx) && g_model.moduleData[moduleIdx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16) || (isModuleR9MAccess(moduleIdx) && g_model.moduleData[moduleIdx].subType != MODULE_SUBTYPE_R9M_PXX2_ACCESS)) {
#if defined(PCBXLITE) #if defined(PCBXLITE)
if (EVT_KEY_MASK(event) == KEY_ENTER) { if (EVT_KEY_MASK(event) == KEY_ENTER) {
#elif defined(PCBSKY9X) || defined(PCBAR9X) #elif defined(PCBSKY9X) || defined(PCBAR9X)

View file

@ -315,8 +315,8 @@ void menuModelSetup(event_t event)
LABEL(InternalModule), LABEL(InternalModule),
INTERNAL_MODULE_TYPE_ROWS, INTERNAL_MODULE_TYPE_ROWS,
INTERNAL_MODULE_CHANNELS_ROWS, INTERNAL_MODULE_CHANNELS_ROWS,
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleFailsafeAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)),
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options
@ -328,8 +328,8 @@ void menuModelSetup(event_t event)
EXTERNAL_MODULE_MODE_ROWS, EXTERNAL_MODULE_MODE_ROWS,
MULTIMODULE_STATUS_ROWS MULTIMODULE_STATUS_ROWS
EXTERNAL_MODULE_CHANNELS_ROWS, EXTERNAL_MODULE_CHANNELS_ROWS,
IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, ((isModuleXJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX1(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS),
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum for ACCESS
IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_OPTION_ROW), IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_OPTION_ROW),
MULTIMODULE_MODULE_ROWS MULTIMODULE_MODULE_ROWS
EXTERNAL_MODULE_POWER_ROW, EXTERNAL_MODULE_POWER_ROW,
@ -722,7 +722,7 @@ void menuModelSetup(event_t event)
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0);
if (isModuleXJT(INTERNAL_MODULE)) if (isModuleXJT(INTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleXJT2(INTERNAL_MODULE)) else if (isModuleACCESS(INTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
if (attr) { if (attr) {
if (menuHorizontalPosition == 0) { if (menuHorizontalPosition == 0) {
@ -935,12 +935,9 @@ void menuModelSetup(event_t event)
lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0));
lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawChar(lcdLastRightPos, y, '-');
lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+sentModuleChannels(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0)); lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+sentModuleChannels(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0));
if (IS_R9M_OR_XJTD16(moduleIdx)) { const char * delay = getModuleDelay(moduleIdx);
if (sentModuleChannels(moduleIdx) > 8) if (delay)
lcdDrawText(lcdLastRightPos+5, y, "(18ms)"); lcdDrawText(lcdLastRightPos+5, y, delay);
else
lcdDrawText(lcdLastRightPos+5, y, "(9ms)");
}
if (attr && s_editMode>0) { if (attr && s_editMode>0) {
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:
@ -1033,7 +1030,7 @@ void menuModelSetup(event_t event)
else { else {
horzpos_t l_posHorz = menuHorizontalPosition; horzpos_t l_posHorz = menuHorizontalPosition;
coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; coord_t xOffsetBind = MODEL_SETUP_BIND_OFS;
if (isModuleXJT(moduleIdx) && IS_D8_RX(moduleIdx)) { if (!isModuleModelIndexAvailable(moduleIdx)) {
xOffsetBind = 0; xOffsetBind = 0;
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER);
if (attr) l_posHorz += 1; if (attr) l_posHorz += 1;
@ -1046,7 +1043,7 @@ void menuModelSetup(event_t event)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); 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 (attr && l_posHorz==0) {
if (s_editMode>0) { if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx];
} }
@ -1285,7 +1282,7 @@ void menuModelSetup(event_t event)
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2);
if (attr) { if (attr) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx];
} }

View file

@ -372,7 +372,7 @@ void startRegisterDialog(uint8_t module)
void checkModelIdUnique(uint8_t moduleIdx) void checkModelIdUnique(uint8_t moduleIdx)
{ {
if (isModulePXX1(moduleIdx) && IS_D8_RX(moduleIdx)) if (isModuleXJTD8(moduleIdx))
return; return;
char * warn_buf = reusableBuffer.moduleSetup.msg; char * warn_buf = reusableBuffer.moduleSetup.msg;
@ -609,7 +609,7 @@ bool menuModelSetup(event_t event)
LABEL(InternalModule), LABEL(InternalModule),
INTERNAL_MODULE_TYPE_ROWS, INTERNAL_MODULE_TYPE_ROWS,
INTERNAL_MODULE_CHANNELS_ROWS, INTERNAL_MODULE_CHANNELS_ROWS,
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleXJT(INTERNAL_MODULE) ? (HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1) : (isModulePPM(INTERNAL_MODULE) ? (uint8_t)1 : HIDDEN_ROW))), IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleModelIndexAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))),
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum
ANTENNA_ROW ANTENNA_ROW
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)),
@ -623,7 +623,7 @@ bool menuModelSetup(event_t event)
EXTERNAL_MODULE_MODE_ROWS, EXTERNAL_MODULE_MODE_ROWS,
MULTIMODULE_STATUS_ROWS MULTIMODULE_STATUS_ROWS
EXTERNAL_MODULE_CHANNELS_ROWS, EXTERNAL_MODULE_CHANNELS_ROWS,
((isModuleXJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX1(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, EXTERNAL_MODULE_BIND_ROWS,
FAILSAFE_ROWS(EXTERNAL_MODULE), FAILSAFE_ROWS(EXTERNAL_MODULE),
EXTERNAL_MODULE_OPTION_ROW, EXTERNAL_MODULE_OPTION_ROW,
MULTIMODULE_MODULE_ROWS MULTIMODULE_MODULE_ROWS
@ -990,7 +990,7 @@ bool menuModelSetup(event_t event)
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0);
if (isModuleXJT(INTERNAL_MODULE)) if (isModuleXJT(INTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleXJT2(INTERNAL_MODULE)) else if (isModuleACCESS(INTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
if (attr) { if (attr) {
if (menuHorizontalPosition == 0) { if (menuHorizontalPosition == 0) {
@ -1145,12 +1145,9 @@ bool menuModelSetup(event_t event)
drawStringWithIndex(MODEL_SETUP_2ND_COLUMN, y, STR_CH, moduleData.channelsStart+1, menuHorizontalPosition==0 ? attr : 0); drawStringWithIndex(MODEL_SETUP_2ND_COLUMN, y, STR_CH, moduleData.channelsStart+1, menuHorizontalPosition==0 ? attr : 0);
lcdDrawText(lcdNextPos+5, y, "-"); lcdDrawText(lcdNextPos+5, y, "-");
drawStringWithIndex(lcdNextPos+5, y, STR_CH, moduleData.channelsStart+sentModuleChannels(moduleIdx), menuHorizontalPosition==1 ? attr : 0); drawStringWithIndex(lcdNextPos+5, y, STR_CH, moduleData.channelsStart+sentModuleChannels(moduleIdx), menuHorizontalPosition==1 ? attr : 0);
if (IS_R9M_OR_XJTD16(moduleIdx)) { const char * delay = getModuleDelay(moduleIdx);
if (sentModuleChannels(moduleIdx) > 8) if (delay)
lcdDrawText(lcdNextPos + 15, y, "(18ms)"); lcdDrawText(lcdNextPos + 15, y, delay);
else
lcdDrawText(lcdNextPos + 15, y, "(9ms)");
}
if (attr && s_editMode>0) { if (attr && s_editMode>0) {
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:
@ -1273,7 +1270,7 @@ bool menuModelSetup(event_t event)
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER_NUM); lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER_NUM);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2);
if (attr) { if (attr) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
if (event == EVT_KEY_LONG(KEY_ENTER)) { if (event == EVT_KEY_LONG(KEY_ENTER)) {
killEvents(event); killEvents(event);
uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx); uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx);
@ -1434,7 +1431,7 @@ bool menuModelSetup(event_t event)
else { else {
int l_posHorz = menuHorizontalPosition; int l_posHorz = menuHorizontalPosition;
coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; coord_t xOffsetBind = MODEL_SETUP_BIND_OFS;
if (isModuleXJT(moduleIdx) && IS_D8_RX(moduleIdx)) { if (!isModuleModelIndexAvailable(moduleIdx)) {
xOffsetBind = 0; xOffsetBind = 0;
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER); lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER);
if (attr) l_posHorz += 1; if (attr) l_posHorz += 1;
@ -1447,7 +1444,7 @@ bool menuModelSetup(event_t event)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2); 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 (attr && l_posHorz==0) {
if (s_editMode>0) { if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
if (event == EVT_KEY_LONG(KEY_ENTER)) { if (event == EVT_KEY_LONG(KEY_ENTER)) {
killEvents(event); killEvents(event);
uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx); uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx);

View file

@ -28,7 +28,7 @@ extern uint8_t g_moduleIdx;
void onTxOptionsUpdateConfirm(const char * result) void onTxOptionsUpdateConfirm(const char * result)
{ {
if (result == STR_OK) { if (result == STR_OK) {
reusableBuffer.hardwareAndSettings.moduleSettingsDirty = 2; reusableBuffer.hardwareAndSettings.moduleSettings.dirty = 2;
moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings);
} }
else { else {
@ -78,15 +78,11 @@ void menuModelModuleOptions(event_t event)
memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings));
#if defined(SIMU) #if defined(SIMU)
reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK;
#else
// no need to initialize reusableBuffer.hardwareAndSettings.moduleState.state to PXX2_HARDWARE_INFO
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID);
#endif #endif
} }
uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID;
// uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; // uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant;
uint8_t optionsAvailable = getModuleOptions(modelId) & ((1 << MODULE_OPTION_EXTERNAL_ANTENNA) | (1 << MODULE_OPTION_POWER)); uint8_t optionsAvailable = getModuleOptions(modelId) & ((1 << MODULE_OPTION_EXTERNAL_ANTENNA) | (1 << MODULE_OPTION_POWER));
SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT, { SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT, {
@ -104,7 +100,7 @@ void menuModelModuleOptions(event_t event)
if (menuEvent) { if (menuEvent) {
killEvents(KEY_EXIT); killEvents(KEY_EXIT);
moduleState[g_moduleIdx].mode = MODULE_MODE_NORMAL; moduleState[g_moduleIdx].mode = MODULE_MODE_NORMAL;
if (reusableBuffer.hardwareAndSettings.moduleSettingsDirty) { if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty) {
abortPopMenu(); abortPopMenu();
POPUP_CONFIRMATION(STR_UPDATE_TX_OPTIONS, onTxOptionsUpdateConfirm); POPUP_CONFIRMATION(STR_UPDATE_TX_OPTIONS, onTxOptionsUpdateConfirm);
} }
@ -113,14 +109,15 @@ void menuModelModuleOptions(event_t event)
} }
} }
if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettingsDirty) { if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettings.dirty) {
killEvents(event); killEvents(event);
reusableBuffer.hardwareAndSettings.moduleSettingsDirty = 0; reusableBuffer.hardwareAndSettings.moduleSettings.dirty = 0;
moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings);
} }
if (reusableBuffer.hardwareAndSettings.moduleSettingsDirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) {
popMenu(); popMenu();
return;
} }
if (modelId != 0 && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { if (modelId != 0 && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) {
@ -151,7 +148,7 @@ void menuModelModuleOptions(event_t event)
case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA: case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA:
reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, "Ext. antenna", attr, event); reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, "Ext. antenna", attr, event);
if (attr && checkIncDec_Ret) { if (attr && checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.moduleSettingsDirty = true; reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true;
} }
break; break;
@ -164,7 +161,7 @@ void menuModelModuleOptions(event_t event)
if (attr) { if (attr) {
reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30, 0, &isPowerAvailable); reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30, 0, &isPowerAvailable);
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.moduleSettingsDirty = true; reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true;
} }
} }
break; break;

View file

@ -38,33 +38,48 @@ void onRxOptionsUpdateConfirm(const char * result)
} }
enum { enum {
ITEM_RECEIVER_TELEMETRY, ITEM_RECEIVER_SETTINGS_TELEMETRY,
ITEM_RECEIVER_PWM_RATE, ITEM_RECEIVER_SETTINGS_PWM_RATE,
ITEM_RECEIVER_SPORT_FPORT, ITEM_RECEIVER_SETTINGS_SPORT_FPORT,
ITEM_RECEIVER_PINMAP_FIRST ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1,
ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2,
ITEM_RECEIVER_SETTINGS_PINMAP_FIRST
}; };
#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW)
void menuModelReceiverOptions(event_t event) void menuModelReceiverOptions(event_t event)
{ {
const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2;
uint8_t wbar = LCD_W / 2 - 20; uint8_t wbar = LCD_W / 2 - 20;
auto outputsCount = min<uint8_t>(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); auto outputsCount = min<uint8_t>(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount);
SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount);
if (event == EVT_ENTRY) { if (event == EVT_ENTRY) {
memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings));
#if defined(SIMU) #if defined(SIMU)
reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK;
reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8; reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8;
#else
// no need to initialize reusableBuffer.hardwareAndSettings.receiverSettings.state to PXX2_HARDWARE_INFO
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], reusableBuffer.hardwareAndSettings.receiverSettings.receiverId, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId);
#endif #endif
} }
uint8_t receiverId = reusableBuffer.hardwareAndSettings.receiverSettings.receiverId;
uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.modelID;
SUBMENU_NOTITLE(ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, {
0, // Telemetry
0, // PWM rate
IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0),
uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW),
uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW),
0 // channels ...
});
if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) { if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) {
reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_READ; if (modelId)
moduleState[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; moduleState[g_moduleIdx].readReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings);
else
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], receiverId, receiverId);
} }
if (menuEvent) { if (menuEvent) {
@ -81,10 +96,8 @@ void menuModelReceiverOptions(event_t event)
if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) {
killEvents(event); killEvents(event);
reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE;
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 0; reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 0;
reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; moduleState[g_moduleIdx].writeReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings);
moduleState[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS;
} }
if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) {
@ -92,6 +105,13 @@ void menuModelReceiverOptions(event_t event)
return; return;
} }
if (modelId != 0 && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) {
menuVerticalPosition = 0;
while (menuVerticalPosition < ITEM_RECEIVER_SETTINGS_PINMAP_FIRST && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) {
++menuVerticalPosition;
}
}
int8_t sub = menuVerticalPosition; int8_t sub = menuVerticalPosition;
lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS);
drawReceiverName(FW * 13, 0, g_moduleIdx, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); drawReceiverName(FW * 13, 0, g_moduleIdx, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId);
@ -101,34 +121,47 @@ void menuModelReceiverOptions(event_t event)
for (uint8_t k=0; k<LCD_LINES-1; k++) { for (uint8_t k=0; k<LCD_LINES-1; k++) {
coord_t y = MENU_HEADER_HEIGHT + 1 + k*FH; coord_t y = MENU_HEADER_HEIGHT + 1 + k*FH;
uint8_t i = k + menuVerticalOffset; uint8_t i = k + menuVerticalOffset;
for (int j=0; j<=i; ++j) {
if (j<(int)DIM(mstate_tab) && mstate_tab[j] == HIDDEN_ROW) {
++i;
}
}
LcdFlags attr = (sub==i ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); LcdFlags attr = (sub==i ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0);
switch (i) { switch (i) {
case ITEM_RECEIVER_TELEMETRY: case ITEM_RECEIVER_SETTINGS_TELEMETRY:
reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem. disabled", attr, event); reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, STR_TELEMETRY_DISABLED, attr, event);
if (attr && checkIncDec_Ret) { if (attr && checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true;
} }
break; break;
case ITEM_RECEIVER_PWM_RATE: case ITEM_RECEIVER_SETTINGS_PWM_RATE:
reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event); reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event);
if (attr && checkIncDec_Ret) { if (attr && checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true;
} }
break; break;
case ITEM_RECEIVER_SPORT_FPORT: case ITEM_RECEIVER_SETTINGS_SPORT_FPORT:
reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port", attr, event); reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port", attr, event);
if (attr && checkIncDec_Ret) { if (attr && checkIncDec_Ret) {
reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true;
} }
break; break;
case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1:
lcdDrawText(LCD_W/2, y+1, STR_MORE_OPTIONS_AVAILABLE, SMLSIZE|CENTERED);
break;
case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2:
lcdDrawText(LCD_W/2, y+1, STR_OPENTX_UPGRADE_REQUIRED, SMLSIZE|CENTERED);
break;
default: default:
// Pin // Pin
{ {
uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; uint8_t pin = i - ITEM_RECEIVER_SETTINGS_PINMAP_FIRST;
if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) { if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) {
uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin];
uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping; uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping;

View file

@ -26,10 +26,16 @@ void onBindMenu(const char * result)
if (result == STR_BINDING_1_8_TELEM_ON) { if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_25_TELEM;
}
} }
else if (result == STR_BINDING_1_8_TELEM_OFF) { else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_100_NOTELEM;
}
} }
else if (result == STR_BINDING_9_16_TELEM_ON) { else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;

View file

@ -586,7 +586,7 @@ bool isInternalModuleAvailable(int moduleType)
bool isExternalModuleAvailable(int moduleType) bool isExternalModuleAvailable(int moduleType)
{ {
#if !defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) #if !defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML)
if (isModuleTypeR9MLite(moduleType)) if (isModuleTypeR9MLite(moduleType) || moduleType == MODULE_TYPE_XJT_LITE_PXX2)
return false; return false;
#endif #endif
@ -600,16 +600,16 @@ bool isExternalModuleAvailable(int moduleType)
return false; return false;
#endif #endif
#if !defined(R9M_SIZE_STD) #if !defined(HARDWARE_EXTERNAL_MODULE_SIZE_STD)
if (moduleType == MODULE_TYPE_R9M_PXX1) if (moduleType == MODULE_TYPE_R9M_PXX1)
return false; return false;
#endif #endif
if (moduleType == MODULE_TYPE_ISRM_PXX2 || moduleType == MODULE_TYPE_R9M_PXX2) if (moduleType == MODULE_TYPE_R9M_PXX2 || moduleType == MODULE_TYPE_ISRM_PXX2)
return false; return false; // doesn't exist for now
#if !defined(PXX2) #if !defined(PXX2)
if (moduleType == MODULE_TYPE_R9M_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PRO_PXX2) { if (moduleType == MODULE_TYPE_XJT_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PRO_PXX2) {
return false; return false;
} }
#endif #endif

View file

@ -117,7 +117,7 @@ void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0);
// model_setup Defines that are used in all uis in the same way // model_setup Defines that are used in all uis in the same way
#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1) #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1)
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MODULE_SUBTYPE_MULTI_DSM2)) ? (uint8_t)0 : (uint8_t)1) #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MODULE_SUBTYPE_MULTI_DSM2)) ? (uint8_t)0 : (uint8_t)1)
#define EXTERNAL_MODULE_BIND_ROWS (isModuleXJTD8(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX1(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW
#if defined(MULTIMODULE) #if defined(MULTIMODULE)
#define MULTIMODULE_STATUS_ROWS isModuleMultimodule(EXTERNAL_MODULE) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(EXTERNAL_MODULE) && multiSyncStatus.isValid()) ? TITLE_ROW : HIDDEN_ROW, #define MULTIMODULE_STATUS_ROWS isModuleMultimodule(EXTERNAL_MODULE) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(EXTERNAL_MODULE) && multiSyncStatus.isValid()) ? TITLE_ROW : HIDDEN_ROW,
@ -127,8 +127,6 @@ void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0);
#define MULTIMODULE_SUBTYPE_ROWS(x) isModuleMultimodule(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, #define MULTIMODULE_SUBTYPE_ROWS(x) isModuleMultimodule(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW,
#define MULTIMODULE_HAS_SUBTYPE(x) (getMultiProtocolDefinition(x)->maxSubtype > 0) #define MULTIMODULE_HAS_SUBTYPE(x) (getMultiProtocolDefinition(x)->maxSubtype > 0)
#define MULTIMODULE_HASOPTIONS(x) (getMultiProtocolDefinition(x)->optionsstr != nullptr) #define MULTIMODULE_HASOPTIONS(x) (getMultiProtocolDefinition(x)->optionsstr != nullptr)
#define MULTI_MAX_RX_NUM(x) (g_model.moduleData[x].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_OLRS ? 4 : 15)
#define MULTIMODULE_HASFAILSAFE(x) (isModuleMultimodule(x) && multiModuleStatus.isValid() && multiModuleStatus.supportsFailsafe())
#define MULTIMODULE_OPTIONS_ROW (isModuleMultimodule(EXTERNAL_MODULE) && MULTIMODULE_HASOPTIONS(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))) ? (uint8_t) 0: HIDDEN_ROW #define MULTIMODULE_OPTIONS_ROW (isModuleMultimodule(EXTERNAL_MODULE) && MULTIMODULE_HASOPTIONS(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))) ? (uint8_t) 0: HIDDEN_ROW
// When using packed, the pointer in here end up not being aligned, which clang and gcc complain about // When using packed, the pointer in here end up not being aligned, which clang and gcc complain about
@ -145,24 +143,15 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol);
#else #else
#define MULTIMODULE_STATUS_ROWS #define MULTIMODULE_STATUS_ROWS
#define MULTIMODULE_MODULE_ROWS #define MULTIMODULE_MODULE_ROWS
#define MULTIMODULE_HASFAILSAFE(x) false
#define MULTIMODULE_SUBTYPE_ROWS(x) #define MULTIMODULE_SUBTYPE_ROWS(x)
#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0
#define MULTI_MAX_RX_NUM(x) 15
#define MULTIMODULE_OPTIONS_ROW HIDDEN_ROW #define MULTIMODULE_OPTIONS_ROW HIDDEN_ROW
#endif #endif
#define MAX_RX_NUM(x) (isModuleDSM2(x) ? 20 : isModuleMultimodule(x) ? MULTI_MAX_RX_NUM(x) : 63) #define FAILSAFE_ROWS(x) isModuleFailsafeAvailable(x) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW
#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == MODULE_SUBTYPE_PXX1_ACCST_D8) #define EXTERNAL_MODULE_OPTION_ROW (isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW)
#define IS_R9M_OR_XJTD16(x) ((isModuleXJT(x) && g_model.moduleData[x].rfProtocol== MODULE_SUBTYPE_PXX1_ACCST_D16) || isModuleR9MNonAccess(x))
#define FAILSAFE_ROWS(x) ((isModuleXJTVariant(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
#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW)
#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE)) ? (isModuleR9MLiteNonPro(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE)) ? (isModuleR9MLiteNonPro(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags);
#endif // _GUI_COMMON_H_ #endif // _GUI_COMMON_H_

View file

@ -383,7 +383,7 @@ void applyDefaultTemplate()
#if defined(EEPROM) #if defined(EEPROM)
void checkModelIdUnique(uint8_t index, uint8_t module) void checkModelIdUnique(uint8_t index, uint8_t module)
{ {
if (isModulePXX1(module) && IS_D8_RX(module)) if (isModuleXJTD8(module))
return; return;
uint8_t modelId = g_model.header.modelId[module]; uint8_t modelId = g_model.header.modelId[module];
@ -453,7 +453,7 @@ uint8_t findNextUnusedModelId(uint8_t index, uint8_t module)
uint8_t new_id = 1; uint8_t new_id = 1;
uint8_t tst_mask = 1; uint8_t tst_mask = 1;
for (;new_id < MAX_RX_NUM(module); new_id++) { for (;new_id < getMaxRxNum(module); new_id++) {
if (!(usedModelIds[new_id >> 3] & tst_mask)) { if (!(usedModelIds[new_id >> 3] & tst_mask)) {
// found free ID // found free ID
return new_id; return new_id;
@ -859,9 +859,9 @@ static void checkRTCBattery()
void checkFailsafe() void checkFailsafe()
{ {
for (int i=0; i<NUM_MODULES; i++) { for (int i=0; i<NUM_MODULES; i++) {
if (isModulePXX1(i)) { if (isModuleFailsafeAvailable(i)) {
ModuleData & moduleData = g_model.moduleData[i]; ModuleData & moduleData = g_model.moduleData[i];
if (HAS_RF_PROTOCOL_FAILSAFE(moduleData.rfProtocol) && moduleData.failsafeMode == FAILSAFE_NOT_SET) { if (moduleData.failsafeMode == FAILSAFE_NOT_SET) {
ALERT(STR_FAILSAFEWARN, STR_NO_FAILSAFE, AU_ERROR); ALERT(STR_FAILSAFEWARN, STR_NO_FAILSAFE, AU_ERROR);
break; break;
} }

View file

@ -1170,14 +1170,10 @@ union ReusableBuffer
struct { struct {
ModuleInformation modules[NUM_MODULES]; ModuleInformation modules[NUM_MODULES];
uint32_t updateTime; uint32_t updateTime;
union { union {
ModuleSettings moduleSettings; ModuleSettings moduleSettings;
ReceiverSettings receiverSettings; ReceiverSettings receiverSettings;
}; };
uint8_t moduleSettingsDirty;
} hardwareAndSettings; } hardwareAndSettings;
struct { struct {

View file

@ -13,8 +13,9 @@ enum ModuleType {
MODULE_TYPE_R9M_LITE_PRO_PXX1, MODULE_TYPE_R9M_LITE_PRO_PXX1,
MODULE_TYPE_R9M_LITE_PRO_PXX2, MODULE_TYPE_R9M_LITE_PRO_PXX2,
MODULE_TYPE_SBUS, MODULE_TYPE_SBUS,
MODULE_TYPE_MAX = MODULE_TYPE_SBUS, MODULE_TYPE_XJT_LITE_PXX2,
MODULE_TYPE_COUNT MODULE_TYPE_COUNT,
MODULE_TYPE_MAX = MODULE_TYPE_COUNT - 1
}; };
/* FrSky XJT / ISRM */ /* FrSky XJT / ISRM */
@ -30,8 +31,9 @@ enum ModuleSubtypePXX1 {
enum ModuleSubtypeISRM_PXX2 { enum ModuleSubtypeISRM_PXX2 {
MODULE_SUBTYPE_ISRM_PXX2_ACCESS, MODULE_SUBTYPE_ISRM_PXX2_ACCESS,
MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16,
MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12, // not implemented in the module as of today MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12,
MODULE_SUBTYPE_ISRM_PXX2_LAST = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16 MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8,
MODULE_SUBTYPE_ISRM_PXX2_LAST = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8
}; };
enum ModuleSubtypeR9M_PXX2 { enum ModuleSubtypeR9M_PXX2 {
@ -50,9 +52,6 @@ enum AntennaTypes {
XJT_EXTERNAL_ANTENNA XJT_EXTERNAL_ANTENNA
}; };
#define HAS_RF_PROTOCOL_FAILSAFE(rf) ((rf) == MODULE_SUBTYPE_PXX1_ACCST_D16)
#define HAS_RF_PROTOCOL_MODELINDEX(rf) (((rf) == MODULE_SUBTYPE_PXX1_ACCST_D16) || ((rf) == MODULE_SUBTYPE_PXX1_ACCST_LR12))
/* FrSky R9M / R9M-Lite & co */ /* FrSky R9M / R9M-Lite & co */
enum ModuleSubtypeR9M { enum ModuleSubtypeR9M {

View file

@ -23,6 +23,9 @@
#include "bitfield.h" #include "bitfield.h"
#include "definitions.h" #include "definitions.h"
#if defined(MULTIMODULE)
#include "telemetry/multi.h"
#endif
#define CROSSFIRE_CHANNELS_COUNT 16 #define CROSSFIRE_CHANNELS_COUNT 16
@ -50,7 +53,7 @@ inline bool isModuleMultimoduleDSM2(uint8_t)
inline bool isModuleTypeXJT(uint8_t type) inline bool isModuleTypeXJT(uint8_t type)
{ {
return type == MODULE_TYPE_XJT_PXX1; return type == MODULE_TYPE_XJT_PXX1 || type == MODULE_TYPE_XJT_LITE_PXX2;
} }
inline bool isModuleXJT(uint8_t idx) inline bool isModuleXJT(uint8_t idx)
@ -58,17 +61,26 @@ inline bool isModuleXJT(uint8_t idx)
return isModuleTypeXJT(g_model.moduleData[idx].type); return isModuleTypeXJT(g_model.moduleData[idx].type);
} }
inline bool isModuleXJT2(uint8_t idx) inline bool isModuleXJTD8(uint8_t idx)
{
return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D8;
}
inline bool isModuleXJTLR12(uint8_t idx)
{
return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_LR12;
}
inline bool isModuleXJTD16(uint8_t idx)
{
return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D16;
}
inline bool isModuleACCESS(uint8_t idx)
{ {
return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2; return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2;
} }
inline bool isModuleXJTVariant(uint8_t idx)
{
return g_model.moduleData[idx].type == MODULE_TYPE_XJT_PXX1 || g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2;
}
#if defined(CROSSFIRE) #if defined(CROSSFIRE)
inline bool isModuleCrossfire(uint8_t idx) inline bool isModuleCrossfire(uint8_t idx)
{ {
@ -164,27 +176,32 @@ inline bool isModuleR9MLite(uint8_t idx)
inline bool isModuleR9M_FCC(uint8_t idx) inline bool isModuleR9M_FCC(uint8_t idx)
{ {
return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].rfProtocol == MODULE_SUBTYPE_R9M_FCC;
}
inline bool isModuleTypeLite(uint8_t type)
{
return isModuleTypeR9MLite(type) || type == MODULE_TYPE_XJT_LITE_PXX2;
} }
inline bool isModuleR9M_LBT(uint8_t idx) inline bool isModuleR9M_LBT(uint8_t idx)
{ {
return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].rfProtocol == MODULE_SUBTYPE_R9M_EU;
} }
inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) inline bool isModuleR9M_FCC_VARIANT(uint8_t idx)
{ {
return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].rfProtocol != MODULE_SUBTYPE_R9M_EU;
} }
inline bool isModuleR9M_EUPLUS(uint8_t idx) inline bool isModuleR9M_EUPLUS(uint8_t idx)
{ {
return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EUPLUS; return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].rfProtocol == MODULE_SUBTYPE_R9M_EUPLUS;
} }
inline bool isModuleR9M_AU_PLUS(uint8_t idx) inline bool isModuleR9M_AU_PLUS(uint8_t idx)
{ {
return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_AUPLUS; return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].rfProtocol == MODULE_SUBTYPE_R9M_AUPLUS;
} }
inline bool isModuleTypePXX1(uint8_t type) inline bool isModuleTypePXX1(uint8_t type)
@ -199,13 +216,13 @@ inline bool isModulePXX1(uint8_t idx)
inline bool isModulePXX2(uint8_t idx) inline bool isModulePXX2(uint8_t idx)
{ {
return isModuleXJT2(idx) || isModuleR9MAccess(idx); return isModuleACCESS(idx) || isModuleR9MAccess(idx);
} }
inline bool isModuleRFAccess(uint8_t idx) inline bool isModuleRFAccess(uint8_t idx)
{ {
if (isModuleXJT2(idx)) { if (isModuleACCESS(idx)) {
return g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCESS; return g_model.moduleData[idx].rfProtocol == MODULE_SUBTYPE_ISRM_PXX2_ACCESS;
} }
else if (isModuleR9MAccess(idx)) { else if (isModuleR9MAccess(idx)) {
return true; return true;
@ -251,7 +268,7 @@ inline int8_t maxModuleChannels_M8(uint8_t idx)
if (isExtraModule(idx)) if (isExtraModule(idx))
return MAX_EXTRA_MODULE_CHANNELS_M8; return MAX_EXTRA_MODULE_CHANNELS_M8;
else if (isModuleXJT(idx)) else if (isModuleXJT(idx))
return maxChannelsXJT[1 + g_model.moduleData[idx].rfProtocol]; return maxChannelsXJT[1 + g_model.moduleData[idx].subType];
else else
return maxChannelsModules[g_model.moduleData[idx].type]; return maxChannelsModules[g_model.moduleData[idx].type];
} }
@ -264,6 +281,10 @@ inline int8_t defaultModuleChannels_M8(uint8_t idx)
return 0; // 8 channels return 0; // 8 channels
else if (isModuleMultimoduleDSM2(idx)) else if (isModuleMultimoduleDSM2(idx))
return -1; // 7 channels return -1; // 7 channels
else if (isModuleXJTD8(idx))
return 0; // 8 channels
else if (isModuleXJTLR12(idx))
return 4; // 12 channels
else if (isModulePXX2(idx)) else if (isModulePXX2(idx))
return 8; // 16 channels return 8; // 16 channels
else else
@ -363,6 +384,15 @@ static const uint8_t receiverOptions[] = {
0b11111111, // R9-MM+OTA 0b11111111, // R9-MM+OTA
}; };
enum ModuleCapabilities {
MODULE_CAPABILITY_COUNT
};
enum ReceiverCapabilities {
RECEIVER_CAPABILITY_FPORT,
RECEIVER_CAPABILITY_COUNT
};
inline uint8_t getReceiverOptions(uint8_t modelId) inline uint8_t getReceiverOptions(uint8_t modelId)
{ {
if (modelId < DIM(receiverOptions)) if (modelId < DIM(receiverOptions))
@ -373,7 +403,7 @@ inline uint8_t getReceiverOptions(uint8_t modelId)
inline bool isReceiverOptionAvailable(uint8_t modelId, uint8_t option) inline bool isReceiverOptionAvailable(uint8_t modelId, uint8_t option)
{ {
return receiverOptions[modelId] & (1 << option); return getReceiverOptions(modelId) & (1 << option);
} }
inline bool isDefaultModelRegistrationID() inline bool isDefaultModelRegistrationID()
@ -381,4 +411,63 @@ inline bool isDefaultModelRegistrationID()
return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0; return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0;
} }
inline bool isModuleModelIndexAvailable(uint8_t idx)
{
if (isModuleXJT(idx))
return g_model.moduleData[idx].subType != MODULE_SUBTYPE_PXX1_ACCST_D8;
if (isModuleR9M(idx))
return true;
if (isModuleDSM2(idx))
return true;
if (isModuleACCESS(idx))
return true;
return false;
}
inline bool isModuleFailsafeAvailable(uint8_t idx)
{
#if defined(PXX2)
if (isModuleACCESS(idx))
return true;
#endif
if (isModuleXJT(idx))
return g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D16;
#if defined(MULTIMODULE)
if (isModuleMultimodule(idx))
return multiModuleStatus.isValid() && multiModuleStatus.supportsFailsafe();
#endif
if (isModuleR9M(idx))
return true;
return false;
}
inline uint8_t getMaxRxNum(uint8_t idx)
{
if (isModuleDSM2(idx))
return 20;
#if defined(MULTIMODULE)
if (isModuleMultimodule(idx))
return g_model.moduleData[idx].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_OLRS ? 4 : 15;
#endif
return 63;
}
inline const char * getModuleDelay(uint8_t idx)
{
if (isModuleXJTD16(idx) || isModuleR9MNonAccess(idx))
return sentModuleChannels(idx) > 8 ? "(18ms)" : "(9ms)";
return nullptr;
}
#endif // _MODULES_H_ #endif // _MODULES_H_

View file

@ -74,6 +74,7 @@ uint8_t getRequiredProtocol(uint8_t module)
case MODULE_TYPE_ISRM_PXX2: case MODULE_TYPE_ISRM_PXX2:
case MODULE_TYPE_R9M_LITE_PRO_PXX2: case MODULE_TYPE_R9M_LITE_PRO_PXX2:
case MODULE_TYPE_XJT_LITE_PXX2:
protocol = PROTOCOL_CHANNELS_PXX2_HIGHSPEED; protocol = PROTOCOL_CHANNELS_PXX2_HIGHSPEED;
break; break;

View file

@ -94,6 +94,8 @@ PACK(struct PXX2HardwareInformation {
PXX2Version hwVersion; PXX2Version hwVersion;
PXX2Version swVersion; PXX2Version swVersion;
uint8_t variant; uint8_t variant;
uint32_t capabilities; // variable length
uint8_t capabilityNotSupported;
}); });
PACK(struct ModuleInformation { PACK(struct ModuleInformation {
@ -110,9 +112,10 @@ PACK(struct ModuleInformation {
class ModuleSettings { class ModuleSettings {
public: public:
uint8_t state; // 0x00 = READ 0x40 = WRITE uint8_t state; // 0x00 = READ 0x40 = WRITE
tmr10ms_t retryTime; tmr10ms_t timeout;
uint8_t externalAntenna; uint8_t externalAntenna;
int8_t txPower; int8_t txPower;
uint8_t dirty;
}; };
class ReceiverSettings { class ReceiverSettings {
@ -167,6 +170,7 @@ PACK(struct ModuleState {
union { union {
ModuleInformation * moduleInformation; ModuleInformation * moduleInformation;
ModuleSettings * moduleSettings; ModuleSettings * moduleSettings;
ReceiverSettings * receiverSettings;
BindInformation * bindInformation; BindInformation * bindInformation;
OtaUpdateInformation * otaUpdateInformation; OtaUpdateInformation * otaUpdateInformation;
}; };
@ -196,9 +200,22 @@ PACK(struct ModuleState {
{ {
moduleSettings = source; moduleSettings = source;
moduleSettings->state = PXX2_SETTINGS_WRITE; moduleSettings->state = PXX2_SETTINGS_WRITE;
moduleSettings->retryTime = 0; moduleSettings->timeout = 0;
mode = MODULE_MODE_MODULE_SETTINGS; mode = MODULE_MODE_MODULE_SETTINGS;
} }
void readReceiverSettings(ReceiverSettings * destination)
{
receiverSettings = destination;
receiverSettings->state = PXX2_SETTINGS_READ;
mode = MODULE_MODE_RECEIVER_SETTINGS;
}
void writeReceiverSettings(ReceiverSettings * source)
{
receiverSettings = source;
receiverSettings->state = PXX2_SETTINGS_WRITE;
receiverSettings->timeout = 0;
mode = MODULE_MODE_RECEIVER_SETTINGS;
}
}); });
extern ModuleState moduleState[NUM_MODULES]; extern ModuleState moduleState[NUM_MODULES];
@ -393,10 +410,9 @@ inline void SEND_FAILSAFE_1S()
void setCustomFailsafe(uint8_t moduleIndex); void setCustomFailsafe(uint8_t moduleIndex);
enum R9MLiteLBTPowerValues { enum R9MLiteLBTPowerValues {
R9M_LITE_LBT_POWER_25 = 0, R9M_LITE_LBT_POWER_25_TELEM = 0,
R9M_LITE_LBT_POWER_25_16, R9M_LITE_LBT_POWER_100_NOTELEM,
R9M_LITE_LBT_POWER_100, R9M_LITE_LBT_POWER_MAX = R9M_LITE_LBT_POWER_100_NOTELEM
R9M_LITE_LBT_POWER_MAX = R9M_LITE_LBT_POWER_100
}; };
enum R9MFCCPowerValues { enum R9MFCCPowerValues {
@ -416,5 +432,5 @@ enum R9MLBTPowerValues {
}; };
#define BIND_CH9TO16_ALLOWED(idx) (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power != R9M_LBT_POWER_25) #define BIND_CH9TO16_ALLOWED(idx) (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power != R9M_LBT_POWER_25)
#define BIND_TELEM_ALLOWED(idx) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M_PXX1) ? (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE) && (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power < R9M_LBT_POWER_200)) : (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE) && (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power < R9M_LITE_LBT_POWER_100)) #define BIND_TELEM_ALLOWED(idx) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M_PXX1) ? (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE) && (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power < R9M_LBT_POWER_200)) : (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE) && (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power < R9M_LITE_LBT_POWER_100_NOTELEM))
#endif // _PULSES_H_ #endif // _PULSES_H_

View file

@ -39,8 +39,15 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module)
void Pxx2Pulses::addFlag1(uint8_t module) void Pxx2Pulses::addFlag1(uint8_t module)
{ {
uint8_t flag1 = g_model.moduleData[module].subType << 4; uint8_t subType;
Pxx2Transport::addByte(flag1); if (isModuleXJT(module)) {
static const uint8_t PXX2_XJT_MODULE_SUBTYPES[] = {0x01, 0x03, 0x02};
subType = PXX2_XJT_MODULE_SUBTYPES[min<uint8_t>(g_model.moduleData[module].subType, 2)];
}
else {
subType = g_model.moduleData[module].subType;
}
Pxx2Transport::addByte(subType << 4);
} }
void Pxx2Pulses::addPulsesValues(uint16_t low, uint16_t high) void Pxx2Pulses::addPulsesValues(uint16_t low, uint16_t high)
@ -180,7 +187,7 @@ void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module)
{ {
ModuleSettings * destination = moduleState[module].moduleSettings; ModuleSettings * destination = moduleState[module].moduleSettings;
if (get_tmr10ms() > destination->retryTime) { if (get_tmr10ms() > destination->timeout) {
addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TX_SETTINGS); addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TX_SETTINGS);
uint8_t flag0 = 0; uint8_t flag0 = 0;
if (destination->state == PXX2_SETTINGS_WRITE) if (destination->state == PXX2_SETTINGS_WRITE)
@ -193,7 +200,7 @@ void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module)
Pxx2Transport::addByte(flag1); Pxx2Transport::addByte(flag1);
Pxx2Transport::addByte(destination->txPower); Pxx2Transport::addByte(destination->txPower);
} }
destination->retryTime = get_tmr10ms() + 200/*next try in 2s*/; destination->timeout = get_tmr10ms() + 200/*next try in 2s*/;
} }
else { else {
setupChannelsFrame(module); setupChannelsFrame(module);

View file

@ -542,7 +542,7 @@ uint8_t ModelsList::findNextUnusedModelId(uint8_t moduleIdx)
uint8_t new_id = 1; uint8_t new_id = 1;
uint8_t tst_mask = 1; uint8_t tst_mask = 1;
for (;new_id < MAX_RX_NUM(moduleIdx); new_id++) { for (;new_id < getMaxRxNum(moduleIdx); new_id++) {
if (!(usedModelIds[new_id >> 3] & tst_mask)) { if (!(usedModelIds[new_id >> 3] & tst_mask)) {
// found free ID // found free ID
return new_id; return new_id;

View file

@ -8,7 +8,7 @@ option(TRACE_FATFS "Traces FatFS enabled" OFF)
option(TRACE_AUDIO "Traces audio enabled" OFF) option(TRACE_AUDIO "Traces audio enabled" OFF)
option(DEBUG_TRACE_BUFFER "Debug Trace Screen" OFF) option(DEBUG_TRACE_BUFFER "Debug Trace Screen" OFF)
option(XJT "XJT TX Module" ON) option(XJT "XJT TX Module" ON)
option(R9M_SIZE_STD "R9M standard size TX Module" ON) option(MODULE_SIZE_STD "Standard size TX Module" ON)
option(PPM "PPM TX Module" ON) option(PPM "PPM TX Module" ON)
option(DSM2 "DSM2 TX Module" ON) option(DSM2 "DSM2 TX Module" ON)
option(SBUS "SBUS TX Module" ON) option(SBUS "SBUS TX Module" ON)
@ -143,8 +143,8 @@ if(XJT)
add_definitions(-DXJT) add_definitions(-DXJT)
endif() endif()
if(R9M_SIZE_STD) if(MODULE_SIZE_STD)
add_definitions(-DR9M_SIZE_STD) add_definitions(-DHARDWARE_EXTERNAL_MODULE_SIZE_STD)
endif() endif()
if(MULTIMODULE) if(MULTIMODULE)

View file

@ -53,12 +53,18 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame)
uint8_t index = frame[3]; uint8_t index = frame[3];
uint8_t modelId = frame[4]; uint8_t modelId = frame[4];
uint8_t length = min<uint8_t>(frame[0] - 3, sizeof(PXX2HardwareInformation));
if (index == PXX2_HW_INFO_TX_ID && modelId < DIM(PXX2modulesModels)) { if (index == PXX2_HW_INFO_TX_ID && modelId < DIM(PXX2modulesModels)) {
memcpy(&destination->information, &frame[4], sizeof(PXX2HardwareInformation)); memcpy(&destination->information, &frame[4], length);
if (destination->information.capabilities & ~((1 << RECEIVER_CAPABILITY_COUNT) - 1))
destination->information.capabilityNotSupported = true;
} }
else if (index < PXX2_MAX_RECEIVERS_PER_MODULE && modelId < DIM(PXX2receiversModels)) { else if (index < PXX2_MAX_RECEIVERS_PER_MODULE && modelId < DIM(PXX2receiversModels)) {
memcpy(&destination->receivers[index].information, &frame[4], sizeof(PXX2HardwareInformation)); memcpy(&destination->receivers[index].information, &frame[4], length);
destination->receivers[index].timestamp = get_tmr10ms(); destination->receivers[index].timestamp = get_tmr10ms();
if (destination->receivers[index].information.capabilities & ~((1 << MODULE_CAPABILITY_COUNT) - 1))
destination->information.capabilityNotSupported = true;
} }
} }
@ -78,7 +84,7 @@ void processModuleSettingsFrame(uint8_t module, uint8_t * frame)
destination->txPower = frame[5]; destination->txPower = frame[5];
destination->state = PXX2_SETTINGS_OK; destination->state = PXX2_SETTINGS_OK;
destination->retryTime = 0; destination->timeout = 0;
moduleState[module].mode = MODULE_MODE_NORMAL; moduleState[module].mode = MODULE_MODE_NORMAL;
} }
@ -88,23 +94,25 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame)
return; return;
} }
ReceiverSettings * destination = moduleState[module].receiverSettings;
if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FPORT) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FPORT)
reusableBuffer.hardwareAndSettings.receiverSettings.fport = 1; destination->fport = 1;
if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM)
reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = 1; destination->pwmRate = 1;
if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED)
reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = 1; destination->telemetryDisabled = 1;
uint8_t outputsCount = min<uint8_t>(16, frame[0] - 4); uint8_t outputsCount = min<uint8_t>(16, frame[0] - 4);
reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = outputsCount; destination->outputsCount = outputsCount;
for (uint8_t pin = 0; pin < outputsCount; pin++) { for (uint8_t pin = 0; pin < outputsCount; pin++) {
reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin] = frame[5 + pin]; destination->outputsMapping[pin] = frame[5 + pin];
} }
reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; destination->state = PXX2_SETTINGS_OK;
reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; destination->timeout = 0;
moduleState[module].mode = MODULE_MODE_NORMAL; moduleState[module].mode = MODULE_MODE_NORMAL;
} }

View file

@ -253,6 +253,9 @@ const char STR_MENUGLOBALVARS[] = TR_MENUGLOBALVARS;
const char STR_INTERNALRF[] = TR_INTERNALRF; const char STR_INTERNALRF[] = TR_INTERNALRF;
const char STR_INTERNAL_MODULE[] = TR_INTERNAL_MODULE; const char STR_INTERNAL_MODULE[] = TR_INTERNAL_MODULE;
const char STR_EXTERNAL_MODULE[] = TR_EXTERNAL_MODULE; const char STR_EXTERNAL_MODULE[] = TR_EXTERNAL_MODULE;
const char STR_OPENTX_UPGRADE_REQUIRED[] = TR_OPENTX_UPGRADE_REQUIRED;
const char STR_TELEMETRY_DISABLED[] = TR_TELEMETRY_DISABLED;
const char STR_MORE_OPTIONS_AVAILABLE[] = TR_MORE_OPTIONS_AVAILABLE;
const char STR_NO_MODULE_INFORMATION[] = TR_NO_MODULE_INFORMATION; const char STR_NO_MODULE_INFORMATION[] = TR_NO_MODULE_INFORMATION;
const char STR_EXTERNALRF[] = TR_EXTERNALRF; const char STR_EXTERNALRF[] = TR_EXTERNALRF;
const char STR_MODULE_TELEMETRY[] = TR_MODULE_TELEMETRY; const char STR_MODULE_TELEMETRY[] = TR_MODULE_TELEMETRY;

View file

@ -412,6 +412,9 @@ extern const char STR_BIND_OK[];
extern const char STR_INTERNALRF[]; extern const char STR_INTERNALRF[];
extern const char STR_INTERNAL_MODULE[]; extern const char STR_INTERNAL_MODULE[];
extern const char STR_EXTERNAL_MODULE[]; extern const char STR_EXTERNAL_MODULE[];
extern const char STR_OPENTX_UPGRADE_REQUIRED[];
extern const char STR_TELEMETRY_DISABLED[];
extern const char STR_MORE_OPTIONS_AVAILABLE[];
extern const char STR_NO_MODULE_INFORMATION[]; extern const char STR_NO_MODULE_INFORMATION[];
extern const char STR_EXTERNALRF[]; extern const char STR_EXTERNALRF[];
extern const char STR_MODULE_TELEMETRY[]; extern const char STR_MODULE_TELEMETRY[];

View file

@ -892,6 +892,9 @@
#define TR_INTERNALRF "Vnitřní RF modul" #define TR_INTERNALRF "Vnitřní RF modul"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Externí RF modul" #define TR_EXTERNALRF "Externí RF modul"
#define TR_FAILSAFE TR("Failsafe", "Mód Failsafe") #define TR_FAILSAFE TR("Failsafe", "Mód Failsafe")

View file

@ -903,6 +903,9 @@
#define TR_INTERNALRF "Internes HF-Modul" #define TR_INTERNALRF "Internes HF-Modul"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Externes HF-Modul" #define TR_EXTERNALRF "Externes HF-Modul"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode")

View file

@ -894,6 +894,9 @@
#define TR_INTERNALRF "Internal RF" #define TR_INTERNALRF "Internal RF"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "External RF" #define TR_EXTERNALRF "External RF"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode")

View file

@ -918,6 +918,9 @@
#define TR_INTERNALRF "Interna RF" #define TR_INTERNALRF "Interna RF"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Externa RF" #define TR_EXTERNALRF "Externa RF"
#define TR_FAILSAFE INDENT"Modo sgdad." #define TR_FAILSAFE INDENT"Modo sgdad."

View file

@ -911,6 +911,9 @@
#define TR_INTERNALRF "Internal RF" #define TR_INTERNALRF "Internal RF"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "External RF" #define TR_EXTERNALRF "External RF"
#define TR_FAILSAFE INDENT "Failsafe mode" #define TR_FAILSAFE INDENT "Failsafe mode"

View file

@ -913,6 +913,9 @@
#define TR_INTERNALRF "HF interne" #define TR_INTERNALRF "HF interne"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "HF externe" #define TR_EXTERNALRF "HF externe"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe")

View file

@ -912,6 +912,9 @@
#define TR_INTERNALRF "Modulo Interno" #define TR_INTERNALRF "Modulo Interno"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Modulo esterno" #define TR_EXTERNALRF "Modulo esterno"
#define TR_FAILSAFE "Modo failsafe" #define TR_FAILSAFE "Modo failsafe"

View file

@ -901,6 +901,9 @@ TR_GYR_VSRCRAW
#define TR_INTERNALRF "Interne RF" #define TR_INTERNALRF "Interne RF"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Externe RF" #define TR_EXTERNALRF "Externe RF"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus") #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus")

View file

@ -912,6 +912,9 @@
#define TR_INTERNALRF "Wewn.Moduł RF" #define TR_INTERNALRF "Wewn.Moduł RF"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Zewn.Moduł RF" #define TR_EXTERNALRF "Zewn.Moduł RF"
#define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe") #define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe")

View file

@ -902,6 +902,9 @@
#define TR_INTERNALRF "Internal RF" #define TR_INTERNALRF "Internal RF"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "External RF" #define TR_EXTERNALRF "External RF"
#define TR_FAILSAFE "Failsafe mode" #define TR_FAILSAFE "Failsafe mode"

View file

@ -912,6 +912,9 @@
#define TR_INTERNALRF "Intern Radio" #define TR_INTERNALRF "Intern Radio"
#define TR_INTERNAL_MODULE "Internal module" #define TR_INTERNAL_MODULE "Internal module"
#define TR_EXTERNAL_MODULE "External module" #define TR_EXTERNAL_MODULE "External module"
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required"
#define TR_TELEMETRY_DISABLED "Telem. disabled"
#define TR_MORE_OPTIONS_AVAILABLE "More options available"
#define TR_NO_MODULE_INFORMATION "No module information" #define TR_NO_MODULE_INFORMATION "No module information"
#define TR_EXTERNALRF "Extern Radiomodul" #define TR_EXTERNALRF "Extern Radiomodul"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge")

View file

@ -89,7 +89,7 @@
#endif #endif
#define LEN_EXTERNAL_MODULE_PROTOCOLS "\014" #define LEN_EXTERNAL_MODULE_PROTOCOLS "\014"
#define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULT\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""R9MLP\0 ""R9MLP ACCESS""SBUS" #define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULT\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""R9MLP\0 ""R9MLP ACCESS""SBUS\0 ""XJT Lite"
#define LEN_INTERNAL_MODULE_PROTOCOLS LEN_EXTERNAL_MODULE_PROTOCOLS #define LEN_INTERNAL_MODULE_PROTOCOLS LEN_EXTERNAL_MODULE_PROTOCOLS
#define TR_INTERNAL_MODULE_PROTOCOLS TR_EXTERNAL_MODULE_PROTOCOLS #define TR_INTERNAL_MODULE_PROTOCOLS TR_EXTERNAL_MODULE_PROTOCOLS
@ -102,7 +102,7 @@
#define TR_ISRM_PXX2_RF_PROTOCOLS "ACCESS""D16\0 ""LR12" #define TR_ISRM_PXX2_RF_PROTOCOLS "ACCESS""D16\0 ""LR12"
#else #else
#define LEN_ISRM_PXX2_RF_PROTOCOLS "\012" #define LEN_ISRM_PXX2_RF_PROTOCOLS "\012"
#define TR_ISRM_PXX2_RF_PROTOCOLS "OFF\0 ""ACCESS\0 ""ACCST D16\0""ACCST LR12" #define TR_ISRM_PXX2_RF_PROTOCOLS "OFF\0 ""ACCESS\0 ""ACCST D16\0""ACCST LR12""ACCST D8"
#endif #endif
#define LEN_R9M_PXX2_RF_PROTOCOLS "\006" #define LEN_R9M_PXX2_RF_PROTOCOLS "\006"
@ -112,10 +112,10 @@
#define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" #define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz"
#define LEN_R9M_LITE_FCC_POWER_VALUES "\010" #define LEN_R9M_LITE_FCC_POWER_VALUES "\010"
#define TR_R9M_LITE_FCC_POWER_VALUES "(100 mW)" #define TR_R9M_LITE_FCC_POWER_VALUES "(100mW)"
#define LEN_R9M_LITE_LBT_POWER_VALUES "\015" #define LEN_R9M_LITE_LBT_POWER_VALUES "\017"
#define TR_R9M_LITE_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0 ""100mW no tele" #define TR_R9M_LITE_LBT_POWER_VALUES "25mW 8CH Tel\0 ""100mW 8CH NoTel"
#define LEN_R9M_FCC_POWER_VALUES "\012" #define LEN_R9M_FCC_POWER_VALUES "\012"
#define TR_R9M_FCC_POWER_VALUES "10 mW\0 " "100 mW\0 " "500 mW\0 " "1 W (auto)" #define TR_R9M_FCC_POWER_VALUES "10 mW\0 " "100 mW\0 " "500 mW\0 " "1 W (auto)"

View file

@ -15,7 +15,7 @@ options = {
"AUTOUPDATE": "YES", "AUTOUPDATE": "YES",
"PXX1": "YES", "PXX1": "YES",
"XJT": "NO", "XJT": "NO",
"R9M_SIZE_STD": "NO", "MODULE_SIZE_STD": "NO",
"PPM": "NO", "PPM": "NO",
"DSM2": "NO", "DSM2": "NO",
"CROSSFIRE": "NO", "CROSSFIRE": "NO",
@ -27,7 +27,7 @@ options = {
"AUTOUPDATE": "YES", "AUTOUPDATE": "YES",
"PXX1": "YES", "PXX1": "YES",
"XJT": "NO", "XJT": "NO",
"R9M_SIZE_STD": "NO", "MODULE_SIZE_STD": "NO",
"PPM": "NO", "PPM": "NO",
"DSM2": "NO", "DSM2": "NO",
"CROSSFIRE": "NO", "CROSSFIRE": "NO",