feat: Support for MPM DSM clone mode (#3974)

This commit is contained in:
3djc
2023-10-10 13:04:52 +10:00
committed by GitHub
parent 2295148ed9
commit f4f04c1827
11 changed files with 150 additions and 75 deletions
+73 -65
View File
@@ -126,6 +126,7 @@ enum MenuModelSetupItems {
#endif
#if defined (MULTIMODULE)
ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS,
#endif
@@ -509,72 +510,73 @@ void menuModelSetup(event_t event)
MENU_TAB({
HEADER_LINE_COLUMNS
0, // Model name
0, // Model image
0, // ITEM_MODEL_SETUP_NAME
0, // ITEM_MODEL_SETUP_BITMAP
TIMERS_ROWS,
TOPLCD_ROWS
0, // Extended limits
1, // Extended trims
0, // Show trims
0, // Trims step
0, // ITEM_MODEL_SETUP_EXTENDED_LIMITS
1, // ITEM_MODEL_SETUP_EXTENDED_TRIMS
0, // ITEM_MODEL_SETUP_DISPLAY_TRIMS
0, // ITEM_MODEL_SETUP_TRIM_INC
0, // Throttle section
THROTTLE_ROW(0), // Throttle reverse
THROTTLE_ROW(0), // Throttle trace source
THROTTLE_ROW(0), // Throttle trim
THROTTLE_ROW(0), // Throttle trim switch
0, // ITEM_MODEL_SETUP_THROTTLE_LABEL
THROTTLE_ROW(0), // ITEM_MODEL_SETUP_THROTTLE_REVERSED
THROTTLE_ROW(0), // ITEM_MODEL_SETUP_THROTTLE_TRACE
THROTTLE_ROW(0), // ITEM_MODEL_SETUP_THROTTLE_TRIM
THROTTLE_ROW(0), // ITEM_MODEL_SETUP_THROTTLE_TRIM_SWITCH
0, // Preflight section
PREFLIGHT_ROW(0), // Checklist
PREFLIGHT_ROW(0), // Checklist interactive
PREFLIGHT_ROW(0), // Throttle warning
PREFLIGHT_ROW(0), // Custom position for throttle warning enable
PREFLIGHT_ROW(0), // Custom position for throttle warning value
SW_WARN_ROWS, // Switch warning
POT_WARN_ROWS, // Pot warning
0, // ITEM_MODEL_SETUP_PREFLIGHT_LABEL
PREFLIGHT_ROW(0), // ITEM_MODEL_SETUP_CHECKLIST_DISPLAY
PREFLIGHT_ROW(0), // ITEM_MODEL_SETUP_CHECKLIST_INTERACTIVE
PREFLIGHT_ROW(0), // ITEM_MODEL_SETUP_THROTTLE_WARNING
PREFLIGHT_ROW(0), // ITEM_MODEL_SETUP_CUSTOM_THROTTLE_WARNING
PREFLIGHT_ROW(0), // ITEM_MODEL_SETUP_CUSTOM_THROTTLE_WARNING_VALUE
SW_WARN_ROWS, // ITEM_MODEL_SETUP_SWITCHES_WARNING1
POT_WARN_ROWS, // ITEM_MODEL_SETUP_POTS_WARNING
uint8_t(NAVIGATION_LINE_BY_LINE | (adcGetInputOffset(ADC_INPUT_POT + 1) - 1)), // Center beeps
uint8_t(NAVIGATION_LINE_BY_LINE | (adcGetInputOffset(ADC_INPUT_POT + 1) - 1)), // ITEM_MODEL_SETUP_BEEP_CENTER
0, // ADC Jitter filter
0, // ITEM_MODEL_SETUP_USE_JITTER_FILTER
REGISTRATION_ID_ROWS
REGISTRATION_ID_ROWS // ITEM_MODEL_SETUP_REGISTRATION_ID
LABEL(InternalModule),
INTERNAL_MODULE_TYPE_ROWS,
MODULE_CHANNELS_ROWS(INTERNAL_MODULE),
IF_ALLOW_RACING_MODE(INTERNAL_MODULE),
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, MODULE_BIND_ROWS(INTERNAL_MODULE)), // RxNum, [Bind] and [Range] buttons
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // [Range] and [Register] buttons
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 1
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 2
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 3
LABEL(InternalModule), // ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL
INTERNAL_MODULE_TYPE_ROWS, // ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE
MODULE_CHANNELS_ROWS(INTERNAL_MODULE), // ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS
IF_ALLOW_RACING_MODE(INTERNAL_MODULE), // ITEM_MODEL_SETUP_INTERNAL_MODULE_RACING_MODE
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, MODULE_BIND_ROWS(INTERNAL_MODULE)), // ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM
IF_INTERNAL_MODULE_ON(FAILSAFE_ROW(INTERNAL_MODULE)), // ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3
LABEL(ExternalModule),
EXTERNAL_MODULE_TYPE_ROW(),
IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), // Baudrate
IF_MODULE_SYNCED(EXTERNAL_MODULE, 0), // Sync rate + errors
MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE)
MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE)
AFHDS3_MODE_ROWS(EXTERNAL_MODULE)
MODULE_CHANNELS_ROWS(EXTERNAL_MODULE),
IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)),
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum for ACCESS
IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)),
MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE)
AFHDS3_MODULE_ROWS(EXTERNAL_MODULE)
MODULE_POWER_ROW(EXTERNAL_MODULE),
FAILSAFE_ROWS(EXTERNAL_MODULE),
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 1
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 3
LABEL(ExternalModule), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL - 37
EXTERNAL_MODULE_TYPE_ROW(), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE
IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE
IF_MODULE_SYNCED(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS
MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL
MULTIMODULE_DSM_CLONED_RAW(EXTERNAL_MODULE), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED
MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS + ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS
AFHDS3_MODE_ROWS(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS
MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS
IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM
IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS
MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND + (ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING
AFHDS3_MODULE_ROWS(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER
MODULE_POWER_ROW(EXTERNAL_MODULE), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER
FAILSAFE_ROW(EXTERNAL_MODULE), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE
IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_OPTIONS
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_2
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_3
TRAINER_ROWS,
@@ -1203,17 +1205,6 @@ void menuModelSetup(event_t event)
pulsesModuleSettingsUpdate(EXTERNAL_MODULE);
}
break;
#if defined(MULTIMODULE)
case 2:
CHECK_INCDEC_MODELVAR(
event, g_model.moduleData[EXTERNAL_MODULE].subType, 0,
getMaxMultiSubtype(EXTERNAL_MODULE));
if (checkIncDec_Ret) {
resetMultiProtocolsOptions(EXTERNAL_MODULE);
}
break;
#endif
}
}
#if POPUP_LEVEL > 1
@@ -1243,6 +1234,23 @@ void menuModelSetup(event_t event)
}
break;
#if defined(MULTIMODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED: {
int8_t optionValue =
(g_model.moduleData[EXTERNAL_MODULE].multi.optionValue & 0x04) >> 2;
lcdDrawText(INDENT_WIDTH / 2, y, STR_SUBTYPE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_CLONE, optionValue, attr | LEFT);
if (attr && s_editMode > 0) {
CHECK_INCDEC_MODELVAR(event, optionValue, 0, 1);
if (checkIncDec_Ret) {
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = (g_model.moduleData[EXTERNAL_MODULE].multi.optionValue & 0xFB) + (optionValue << 2);
}
}
break;
}
#endif
#if defined(CROSSFIRE) || defined(GHOST)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE: {
ModuleData &moduleData = g_model.moduleData[EXTERNAL_MODULE];