diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 40d0da012..50713920c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -388,10 +388,10 @@ void menuModelSetup(event_t event) IF_PXX2(isDefaultModelRegistrationID() ? HIDDEN_ROW : READONLY_ROW), // Registration ID LABEL(InternalModule), - INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) - INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count + INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) + INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_PXX2(0), // RxNum + IF_PXX2(0), // RxNum ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) IF_PXX2(1), // Range check and Register buttons @@ -1099,7 +1099,7 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); break; case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart)); + CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), isInternalModuleChannelCountAvailable); if ((k == ITEM_MODEL_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM)) { SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); } diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index fffe0c5fc..92200d8ec 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -56,6 +56,7 @@ bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); bool isR9MMFlex(int module); +bool isInternalModuleChannelCountAvailable(int module); bool isExternalModuleAvailable(int module); bool isInternalModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); @@ -115,7 +116,7 @@ void runFatalErrorScreen(const char * message); void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); // model_setup Defines that are used in all uis in the same way -#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((isModuleXJT2(INTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1)) +#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1) #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleXJT2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index c72827ca6..8c38b03f2 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -515,6 +515,16 @@ bool isR9MMFlex(int module) return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; } +bool isInternalModuleChannelCountAvailable(int channels) +{ + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT2) { + if ( channels % 8 != 0) + return false; + } + + return true; +} + bool isInternalModuleAvailable(int module) { if (module == MODULE_TYPE_NONE) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 29cf31b5b..1d8fd157f 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -199,8 +199,8 @@ inline bool isModuleDSM2(uint8_t idx) } #endif -// order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, dsm, crossfire, multi, r9m, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, -2, 8, 4, 8, 8}; // relative to 8! +// order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) +static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; @@ -242,7 +242,7 @@ inline int8_t sentModuleChannels(uint8_t idx) { if (isModuleCrossfire(idx)) return CROSSFIRE_CHANNELS_COUNT; - else if ((isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) || isModuleXJT2(idx)) + else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) return 16; else return 8 + g_model.moduleData[idx].channelsCount;