diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index 404da76da..a87f31acc 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -149,6 +149,21 @@ class BluetoothConfigWindow : public FormGroup }; #endif +void restartExternalModule() +{ + if (!IS_EXTERNAL_MODULE_ON()) { + return; + } + pauseMixerCalculations(); + pausePulses(); + EXTERNAL_MODULE_OFF(); + RTOS_WAIT_MS(20); // 20ms so that the pulses interrupt will reinit the frame rate + telemetryProtocol = 255; // force telemetry port + module reinitialization + EXTERNAL_MODULE_ON(); + resumePulses(); + resumeMixerCalculations(); +} + void RadioHardwarePage::build(FormWindow * window) { FormGridLayout grid; @@ -259,10 +274,18 @@ void RadioHardwarePage::build(FormWindow * window) new CheckBox(window, grid.getFieldSlot(1,0), GET_SET_INVERTED(g_eeGeneral.disableRtcWarning )); grid.nextLine(); -#if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 +#if defined(CROSSFIRE) // Max baud for external modules new StaticText(window, grid.getLabelSlot(), STR_MAXBAUDRATE, 0, COLOR_THEME_PRIMARY1); - new Choice(window, grid.getFieldSlot(1,0), STR_CRSF_BAUDRATE, 0, 1, GET_SET_DEFAULT(g_eeGeneral.telemetryBaudrate)); + new Choice(window, grid.getFieldSlot(1,0), STR_CRSF_BAUDRATE, 0, DIM(CROSSFIRE_BAUDRATES) - 1, + [=]() -> int { + return DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate; + }, + [=](int newValue) { + g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - newValue; + SET_DIRTY(); + restartExternalModule(); + }); grid.nextLine(); #endif diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index 0ff93f0b4..c23739621 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -165,7 +165,7 @@ enum { ITEM_RADIO_HARDWARE_CAPACITY_CALIB, #endif -#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000 +#if (defined(CROSSFIRE) || defined(GHOST)) ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE, #endif @@ -287,7 +287,7 @@ enum { #define TX_CAPACITY_MEASUREMENT_ROWS #endif -#if (defined(CROSSFIRE) || defined(GHOST)) && (SPORT_MAX_BAUDRATE < 400000 || defined(DEBUG)) +#if (defined(CROSSFIRE) || defined(GHOST)) #define MAX_BAUD_ROWS 0, #else #define MAX_BAUD_ROWS @@ -575,7 +575,7 @@ void menuRadioHardware(event_t event) break; #endif -#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000 +#if (defined(CROSSFIRE) || defined(GHOST)) case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE); lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 165e65933..1beadee7b 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -65,11 +65,13 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure); telemetryInitDirPin(); + USART_OverSampling8Cmd(TELEMETRY_USART, ENABLE); + USART_InitStructure.USART_BaudRate = baudrate; if (mode & TELEMETRY_SERIAL_8E2) { USART_InitStructure.USART_WordLength = USART_WordLength_9b; diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 08b79b0c7..feb8e57bf 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -57,12 +57,15 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure); telemetryInitDirPin(); USART_DeInit(TELEMETRY_USART); + + USART_OverSampling8Cmd(TELEMETRY_USART, ENABLE); + USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = baudrate; if (mode & TELEMETRY_SERIAL_8E2) { diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index e2a1973c0..559f37b91 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -95,20 +95,21 @@ void crossfireSetDefault(int index, uint8_t id, uint8_t subId); uint8_t createCrossfireModelIDFrame(uint8_t * frame); const uint32_t CROSSFIRE_BAUDRATES[] = { + 3750000, + 1870000, + 921600, 400000, 115200, }; const uint8_t CROSSFIRE_FRAME_PERIODS[] = { + 4, + 4, + 4, 4, 16, }; -#if SPORT_MAX_BAUDRATE < 400000 || defined(DEBUG) #define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate] #define CROSSFIRE_PERIOD (CROSSFIRE_FRAME_PERIODS[g_eeGeneral.telemetryBaudrate] * 1000) -#else -#define CROSSFIRE_BAUDRATE 400000 -#define CROSSFIRE_PERIOD 4000 /* us; 250 Hz */ -#endif #define CROSSFIRE_TELEM_MIRROR_BAUDRATE 115200 diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index cb85b7825..4ae88d613 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -91,8 +91,8 @@ #define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_GYR_VSRCRAW "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW -#define LEN_CRSF_BAUDRATE "\004" -#define TR_CRSF_BAUDRATE "115k""400k" +#define LEN_CRSF_BAUDRATE "\005" +#define TR_CRSF_BAUDRATE "115k\0""400k\0""921k\0""1.87m""3.75m" #if defined(MODULE_PROTOCOL_FLEX) #define TR_MODULE_R9M_LITE "R9ML\0 "