1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-26 17:55:19 +03:00

Tx16s sbus in (#7787)

Enable SBUS trainer input
This commit is contained in:
3djc 2020-07-07 15:56:18 +02:00 committed by GitHub
parent 94ba22a74d
commit 0eb203e827
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 96 additions and 19 deletions

View file

@ -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());
}

View file

@ -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);

View file

@ -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);

View file

@ -21,12 +21,16 @@
#include "opentx.h"
#include "targets/horus/board.h"
#if defined(SBUS)
extern Fifo<uint8_t, 32> trainerSbusFifo;
#endif
#if defined(AUX_SERIAL)
uint8_t auxSerialMode = 0;
Fifo<uint8_t, 512> 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<uint8_t, 512> 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;

View file

@ -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}

View file

@ -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
{

View file

@ -20,6 +20,10 @@
#include "opentx.h"
#if defined(SBUS)
Fifo<uint8_t, 32> 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;
}
}

View file

@ -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

View file

@ -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