diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 187f37b8f..dd9e86a98 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -530,7 +530,8 @@ PACK(struct ModuleData { } afhds3)); NOBACKUP(struct { uint8_t raw12bits:1; - uint8_t spare1:7 SKIP; + uint8_t telemetryBaudrate:3; + uint8_t spare1:4 SKIP; } ghost); NOBACKUP(struct { uint8_t telemetryBaudrate:3; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f0ee5d29c..330092f98 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -136,7 +136,7 @@ enum MenuModelSetupItems { #if defined(HARDWARE_EXTERNAL_MODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE, -#if defined(CROSSFIRE) +#if defined(CROSSFIRE) || defined(GHOST) ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE, #endif #if defined(MULTIMODULE) @@ -194,7 +194,11 @@ enum MenuModelSetupItems { #define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx)) #define IF_ACCESS_MODULE_RF(module, xxx) (isModuleRFAccess(module) ? (uint8_t)(xxx) : HIDDEN_ROW) #define IF_NOT_ACCESS_MODULE_RF(module, xxx) (isModuleRFAccess(module) ? HIDDEN_ROW : (uint8_t)(xxx)) -#define IF_CRSF_MODULE(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#if SPORT_MAX_BAUDRATE < 400000 +#define IF_MODULE_BAUDRATE_ADJUST(module, xxx) ((isModuleCrossfire(module) || isModuleGhost(module)) ? (uint8_t)(xxx) : HIDDEN_ROW) +#else +#define IF_MODULE_BAUDRATE_ADJUST(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#endif #if defined(PXX2) #define REGISTRATION_ID_ROWS uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), @@ -374,7 +378,7 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) #define EXTERNAL_MODULE_ROWS \ LABEL(ExternalModule), \ MODULE_TYPE_ROWS(EXTERNAL_MODULE), \ - IF_CRSF_MODULE(EXTERNAL_MODULE, 0), /* Baudrate */ \ + IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), /* Baudrate */ \ MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) /* PROTOCOL */ \ MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) /* SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) \ @@ -1056,18 +1060,32 @@ void menuModelSetup(event_t event) } break; -#if defined(CROSSFIRE) +#if defined(CROSSFIRE) || defined(GHOST) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE: { ModuleData & moduleData = g_model.moduleData[moduleIdx]; - lcdDrawText( INDENT_WIDTH, y, STR_BAUDRATE); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, EXT_CROSSFIRE_BAUDRATE,attr | LEFT); - if (attr) { - moduleData.crsf.telemetryBaudrate = CROSSFIRE_INDEX_TO_STORE(checkIncDecModel(event,CROSSFIRE_STORE_TO_INDEX(moduleData.crsf.telemetryBaudrate), 0,DIM(CROSSFIRE_BAUDRATES) - 1)); - if (checkIncDec_Ret) { - restartExternalModule(); + lcdDrawText(INDENT_WIDTH, y, STR_BAUDRATE); + if (isModuleCrossfire(EXTERNAL_MODULE)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, EXT_CROSSFIRE_BAUDRATE,attr | LEFT); + if (attr) { + moduleData.crsf.telemetryBaudrate =CROSSFIRE_INDEX_TO_STORE(checkIncDecModel(event,CROSSFIRE_STORE_TO_INDEX(moduleData.crsf.telemetryBaudrate),0, DIM(CROSSFIRE_BAUDRATES) - 1)); + if (checkIncDec_Ret) { + restartExternalModule(); + } } } break; +#if SPORT_MAX_BAUDRATE < 400000 + else { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, CROSSFIRE_BAUDRATES[CROSSFIRE_STORE_TO_INDEX(g_model.moduleData[EXTERNAL_MODULE].ghost.telemetryBaudrate)],attr | LEFT); + if (attr) { + moduleData.ghost.telemetryBaudrate = CROSSFIRE_INDEX_TO_STORE(checkIncDecModel(event,CROSSFIRE_STORE_TO_INDEX(moduleData.ghost.telemetryBaudrate),0, 1)); + if (checkIncDec_Ret) { + restartExternalModule(); + } + } + } + break; +#endif } #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index fd3232a56..434c97bc3 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -106,7 +106,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE, -#if defined(CROSSFIRE) +#if defined(CROSSFIRE) || defined(GHOST) ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE, #endif #if defined (MULTIMODULE) @@ -316,7 +316,11 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW() #define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx)) #define IF_ACCESS_MODULE_RF(module, xxx) (isModuleRFAccess(module) ? (uint8_t)(xxx) : HIDDEN_ROW) #define IF_NOT_ACCESS_MODULE_RF(module, xxx) (isModuleRFAccess(module) ? HIDDEN_ROW : (uint8_t)(xxx)) -#define IF_CRSF_MODULE(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#if SPORT_MAX_BAUDRATE < 400000 +#define IF_MODULE_BAUDRATE_ADJUST(module, xxx) ((isModuleCrossfire(module) || isModuleGhost(module)) ? (uint8_t)(xxx) : HIDDEN_ROW) +#else +#define IF_MODULE_BAUDRATE_ADJUST(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#endif #if defined(PXX2) #define REGISTRATION_ID_ROWS uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), @@ -411,7 +415,7 @@ void menuModelSetup(event_t event) LABEL(ExternalModule), EXTERNAL_MODULE_TYPE_ROW(), - IF_CRSF_MODULE(EXTERNAL_MODULE, 0), // Baudrate + IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), // Baudrate MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) AFHDS3_MODE_ROWS(EXTERNAL_MODULE) @@ -1021,18 +1025,32 @@ void menuModelSetup(event_t event) } break; -#if defined(CROSSFIRE) +#if defined(CROSSFIRE) || defined(GHOST) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE: { ModuleData &moduleData = g_model.moduleData[EXTERNAL_MODULE]; lcdDrawText(INDENT_WIDTH, y, STR_BAUDRATE); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, EXT_CROSSFIRE_BAUDRATE,attr | LEFT); - if (attr) { - moduleData.crsf.telemetryBaudrate = CROSSFIRE_INDEX_TO_STORE(checkIncDecModel(event,CROSSFIRE_STORE_TO_INDEX(moduleData.crsf.telemetryBaudrate),0, DIM(CROSSFIRE_BAUDRATES) - 1)); - if (checkIncDec_Ret) { - restartExternalModule(); + if (isModuleCrossfire(EXTERNAL_MODULE)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, EXT_CROSSFIRE_BAUDRATE,attr | LEFT); + if (attr) { + moduleData.crsf.telemetryBaudrate =CROSSFIRE_INDEX_TO_STORE(checkIncDecModel(event,CROSSFIRE_STORE_TO_INDEX(moduleData.crsf.telemetryBaudrate),0, DIM(CROSSFIRE_BAUDRATES) - 1)); + if (checkIncDec_Ret) { + restartExternalModule(); + } } } break; +#if SPORT_MAX_BAUDRATE < 400000 + else { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, CROSSFIRE_BAUDRATES[CROSSFIRE_STORE_TO_INDEX(g_model.moduleData[EXTERNAL_MODULE].ghost.telemetryBaudrate)],attr | LEFT); + if (attr) { + moduleData.ghost.telemetryBaudrate = CROSSFIRE_INDEX_TO_STORE(checkIncDecModel(event,CROSSFIRE_STORE_TO_INDEX(moduleData.ghost.telemetryBaudrate),0, 1)); + if (checkIncDec_Ret) { + restartExternalModule(); + } + } + } + break; +#endif } #endif diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 618b07873..2c7935d4f 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -267,7 +267,7 @@ void telemetryPortSetDirectionInput() { sportWaitTransmissionComplete(); #if defined(GHOST) && SPORT_MAX_BAUDRATE < 400000 - if (isModuleGhost(EXTERNAL_MODULE) && g_eeGeneral.telemetryBaudrate == GHST_TELEMETRY_RATE_115K) { + if (isModuleGhost(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate == GHST_TELEMETRY_RATE_115K) { TELEMETRY_USART->BRR = BRR_115K; } #endif diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index f634c5b21..ec33d6d4a 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -229,7 +229,7 @@ void telemetryPortSetDirectionInput() { sportWaitTransmissionComplete(); #if defined(GHOST) && SPORT_MAX_BAUDRATE < 400000 - if (isModuleGhost(EXTERNAL_MODULE) && g_eeGeneral.telemetryBaudrate == GHST_TELEMETRY_RATE_115K) { + if (isModuleGhost(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate == GHST_TELEMETRY_RATE_115K) { TELEMETRY_USART->BRR = BRR_115K; } #endif diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index d7034bcd3..94bc80955 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -141,7 +141,7 @@ const uint8_t CROSSFIRE_FRAME_PERIODS[] = { #define INT_CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.InternalModuleBaudrate)] #define EXT_CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[CROSSFIRE_STORE_TO_INDEX(g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate)] -#define CROSSFIRE_PERIOD (CROSSFIRE_FRAME_PERIODS[CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.telemetryBaudrate)] * 1000) +#define CROSSFIRE_PERIOD (CROSSFIRE_FRAME_PERIODS[CROSSFIRE_STORE_TO_INDEX(g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate)] * 1000) #define CROSSFIRE_TELEM_MIRROR_BAUDRATE 115200 diff --git a/radio/src/telemetry/ghost.cpp b/radio/src/telemetry/ghost.cpp index 5fcf48353..df17905a5 100755 --- a/radio/src/telemetry/ghost.cpp +++ b/radio/src/telemetry/ghost.cpp @@ -91,7 +91,7 @@ const GhostSensor ghostSensors[] = { uint8_t getGhostModuleAddr() { #if SPORT_MAX_BAUDRATE < 400000 - return g_eeGeneral.telemetryBaudrate == GHST_TELEMETRY_RATE_400K ? GHST_ADDR_MODULE_SYM : GHST_ADDR_MODULE_ASYM; + return g_model.moduleData[EXTERNAL_MODULE].crsf.telemetryBaudrate == GHST_TELEMETRY_RATE_400K ? GHST_ADDR_MODULE_SYM : GHST_ADDR_MODULE_ASYM; #else return GHST_ADDR_MODULE_SYM; #endif