diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 3ba908ad9..8020bf983 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -372,7 +372,7 @@ bool menuRadioHardware(event_t event) #if defined(RADIO_TX16S) lcdDrawText(lcdNextPos, y, " (TTL)"); #endif - g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); + g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event, isAux1ModeAvailable); if (attr && checkIncDec_Ret) { auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); } @@ -385,7 +385,7 @@ bool menuRadioHardware(event_t event) #if defined(RADIO_TX16S) lcdDrawText(lcdNextPos, y, " (TTL)"); #endif - g_eeGeneral.aux2SerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.aux2SerialMode, 0, UART_MODE_MAX, attr, event); + g_eeGeneral.aux2SerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.aux2SerialMode, 0, UART_MODE_MAX, attr, event, isAux2ModeAvailable); if (attr && checkIncDec_Ret) { aux2SerialInit(g_eeGeneral.aux2SerialMode, modelTelemetryProtocol()); } diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 6cbc287d2..b491d84b4 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -385,6 +385,24 @@ bool isSwitchAvailable(int swtch, SwitchContext context) return true; } +bool isAux1ModeAvailable(int mode) +{ +#if defined(AUX2_SERIAL) + if (mode == UART_MODE_SBUS_TRAINER) + return g_eeGeneral.aux2SerialMode != UART_MODE_SBUS_TRAINER; +#endif + return true; +} + +bool isAux2ModeAvailable(int mode) +{ +#if defined(AUX_SERIAL) + if (mode == UART_MODE_SBUS_TRAINER) + return g_eeGeneral.auxSerialMode != UART_MODE_SBUS_TRAINER; +#endif + return true; +} + bool isSwitchAvailableInLogicalSwitches(int swtch) { return isSwitchAvailable(swtch, LogicalSwitchesContext); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index c7229f5c7..d1fdb8fa1 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -70,6 +70,8 @@ bool isSourceAvailableInGlobalFunctions(int source); bool isSourceAvailableInCustomSwitches(int source); bool isSourceAvailableInResetSpecialFunction(int index); bool isSourceAvailableInGlobalResetSpecialFunction(int index); +bool isAux1ModeAvailable(int mode); +bool isAux2ModeAvailable(int mode); bool isSwitchAvailableInLogicalSwitches(int swtch); bool isSwitchAvailableInCustomFunctions(int swtch); bool isSwitchAvailableInMixes(int swtch); diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 88fc32cb8..e646c30d9 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -21,12 +21,16 @@ #include "opentx.h" #include "targets/horus/board.h" +#if defined(SBUS) +extern Fifo trainerSbusFifo; +#endif + #if defined(AUX_SERIAL) uint8_t auxSerialMode = 0; Fifo auxSerialTxFifo; AuxSerialRxFifo auxSerialRxFifo __DMA (AUX_SERIAL_DMA_Stream_RX); -void auxSerialSetup(unsigned int baudrate, bool dma) +void auxSerialSetup(unsigned int baudrate, bool dma, uint16_t lenght = USART_WordLength_8b, uint16_t parity = USART_Parity_No, uint16_t stop = USART_StopBits_1) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -49,9 +53,9 @@ void auxSerialSetup(unsigned int baudrate, bool dma) #endif USART_InitStructure.USART_BaudRate = baudrate; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_WordLength = lenght; + USART_InitStructure.USART_StopBits = stop; + USART_InitStructure.USART_Parity = parity; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(AUX_SERIAL_USART, &USART_InitStructure); @@ -123,6 +127,11 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) } break; + case UART_MODE_SBUS_TRAINER: + auxSerialSetup(SBUS_BAUDRATE, false, USART_WordLength_9b, USART_Parity_Even, USART_StopBits_2); // 2 stop bits requires USART_WordLength_9b + AUX_SERIAL_POWER_ON(); + break; + case UART_MODE_LUA: auxSerialSetup(DEBUG_BAUDRATE, false); AUX_SERIAL_POWER_ON(); @@ -144,9 +153,7 @@ void auxSerialPutc(char c) void auxSerialSbusInit() { - auxSerialSetup(SBUS_BAUDRATE, true); - AUX_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; - AUX_SERIAL_POWER_ON(); + auxSerialInit(UART_MODE_SBUS_TRAINER, 0); } void auxSerialStop() @@ -201,10 +208,15 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) uint32_t status = AUX_SERIAL_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = AUX_SERIAL_USART->DR; + UNUSED(data); if (!(status & USART_FLAG_ERRORS)) { #if defined(LUA) & !defined(CLI) if (luaRxFifo && auxSerialMode == UART_MODE_LUA) luaRxFifo->push(data); +#endif +#if !defined(BOOT) + if (auxSerialMode == UART_MODE_SBUS_TRAINER) + trainerSbusFifo.push(data); #endif } status = AUX_SERIAL_USART->SR; @@ -218,7 +230,7 @@ uint8_t aux2SerialMode = 0; Fifo aux2SerialTxFifo; AuxSerialRxFifo aux2SerialRxFifo __DMA (AUX2_SERIAL_DMA_Stream_RX); -void aux2SerialSetup(unsigned int baudrate, bool dma) +void aux2SerialSetup(unsigned int baudrate, bool dma, uint16_t lenght = USART_WordLength_8b, uint16_t parity = USART_Parity_No, uint16_t stop = USART_StopBits_1) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -241,9 +253,9 @@ void aux2SerialSetup(unsigned int baudrate, bool dma) #endif USART_InitStructure.USART_BaudRate = baudrate; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_WordLength = lenght; + USART_InitStructure.USART_StopBits = stop; + USART_InitStructure.USART_Parity = parity; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(AUX2_SERIAL_USART, &USART_InitStructure); @@ -315,6 +327,11 @@ void aux2SerialInit(unsigned int mode, unsigned int protocol) } break; + case UART_MODE_SBUS_TRAINER: + aux2SerialSetup(SBUS_BAUDRATE, false, USART_WordLength_9b, USART_Parity_Even, USART_StopBits_2); // 2 stop bits requires USART_WordLength_9b + AUX2_SERIAL_POWER_ON(); + break; + case UART_MODE_LUA: aux2SerialSetup(DEBUG_BAUDRATE, false); AUX2_SERIAL_POWER_ON(); @@ -336,9 +353,7 @@ void aux2SerialPutc(char c) void aux2SerialSbusInit() { - aux2SerialSetup(SBUS_BAUDRATE, true); - AUX2_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; - AUX2_SERIAL_POWER_ON(); + aux2SerialInit(UART_MODE_SBUS_TRAINER, 0); } void aux2SerialStop() @@ -394,10 +409,17 @@ extern "C" void AUX2_SERIAL_USART_IRQHandler(void) uint32_t status = AUX2_SERIAL_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = AUX2_SERIAL_USART->DR; + UNUSED(data); if (!(status & USART_FLAG_ERRORS)) { -#if defined(LUA) - if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) +#if defined(LUA) & !defined(CLI) + if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) { luaRxFifo->push(data); + } +#endif +#if !defined(BOOT) + if (aux2SerialMode == UART_MODE_SBUS_TRAINER) { + trainerSbusFifo.push(data); + } #endif } status = AUX2_SERIAL_USART->SR; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 20348968f..220bb5b9e 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -66,6 +66,7 @@ if (PCB STREQUAL X10) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) set(DEFAULT_THEME "DARKBLUE") + set(SBUS ON) set(AUX_SERIAL ON) if (NOT BLUETOOTH AND NOT INTERNAL_GPS) set(AUX2_SERIAL ON) @@ -254,6 +255,14 @@ if (AUX2_SERIAL) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) endif() +if (SBUS) + add_definitions(-DSBUS) + set(SRC + ${SRC} + sbus.cpp + ) +endif() + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 0364e938f..e4e99d40f 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -197,6 +197,9 @@ void stop_trainer_ppm(); void init_trainer_capture(); void stop_trainer_capture(); +// SBUS +int sbusGetByte(uint8_t * byte); + // Keys driver enum EnumKeys { diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index d5b34cc1e..f039536ff 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -20,6 +20,10 @@ #include "opentx.h" +#if defined(SBUS) +Fifo trainerSbusFifo; +#endif + void trainerSendNextFrame(); void init_trainer_ppm() @@ -152,3 +156,15 @@ extern "C" void TRAINER_TIMER_IRQHandler() trainerSendNextFrame(); } } + +int sbusGetByte(uint8_t * byte) +{ + switch (currentTrainerMode) { +#if defined(AUX_SERIAL) + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: + return trainerSbusFifo.pop(*byte); +#endif + default: + return false; + } +} \ No newline at end of file diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 0e7bd7a09..533d1bb33 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -107,7 +107,7 @@ TASK_FUNCTION(mixerTask) s_pulses_paused = true; while (true) { -#if defined(PCBTARANIS) && defined(SBUS) +#if defined(SBUS) && !defined(PCBSKY9X) // SBUS trainer processSbusInput(); #endif diff --git a/radio/src/trainer.cpp b/radio/src/trainer.cpp index 0af1901b7..27a237b54 100644 --- a/radio/src/trainer.cpp +++ b/radio/src/trainer.cpp @@ -115,9 +115,16 @@ void checkTrainerSettings() #if defined(TRAINER_BATTERY_COMPARTMENT) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: +#if defined(AUX_SERIAL) if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) auxSerialSbusInit(); else +#endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_SBUS_TRAINER) + aux2SerialSbusInit(); + else +#endif init_trainer_capture(); break; #endif