diff --git a/companion/src/generaledit/calibration.ui b/companion/src/generaledit/calibration.ui index 44cef4ddd..a5b0cdece 100755 --- a/companion/src/generaledit/calibration.ui +++ b/companion/src/generaledit/calibration.ui @@ -6,8 +6,8 @@ 0 0 - 717 - 431 + 780 + 450 @@ -839,6 +839,16 @@ S-Port Mirror + + + Telemetry + + + + + SBUS Trainer + + Debug diff --git a/companion/src/modeledit/setup_module.ui b/companion/src/modeledit/setup_module.ui index 7815a75ca..91b5b9c84 100644 --- a/companion/src/modeledit/setup_module.ui +++ b/companion/src/modeledit/setup_module.ui @@ -67,12 +67,12 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - 0 - 6 + + 0 + @@ -245,20 +245,29 @@ 0 - - - 125 - 16777215 - - - Master + Master/Jack - Slave + Slave/Jack + + + + + Master/SBUS Module + + + + + Master/CPPM Module + + + + + Master/SBUS in battery compartment diff --git a/radio/src/gui/menu_general.cpp b/radio/src/gui/menu_general.cpp index 91865a966..ba0b94f12 100644 --- a/radio/src/gui/menu_general.cpp +++ b/radio/src/gui/menu_general.cpp @@ -1403,7 +1403,7 @@ void menuGeneralHardware(uint8_t event) } case ITEM_SETUP_HW_UART3_MODE: g_eeGeneral.uart3Mode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.uart3Mode, 0, UART_MODE_MAX, attr, event); - if (checkIncDec_Ret) { + if (attr && checkIncDec_Ret) { uart3Init(g_eeGeneral.uart3Mode, MODEL_TELEMETRY_PROTOCOL()); } break; diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index bc598a5b3..c659700e2 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -994,7 +994,7 @@ void menuModelSetup(uint8_t event) #if defined(PCBTARANIS) #define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x)) #define IF_EXTERNAL_MODULE_ON(x) (g_model.externalModule == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) - #define IF_TRAINER_ON(x) (g_model.trainerMode ? (uint8_t)(x) : HIDDEN_ROW) + #define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW) #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define INTERNAL_MODULE_CHANNELS_ROWS() IF_INTERNAL_MODULE_ON(1) @@ -1467,7 +1467,7 @@ void menuModelSetup(uint8_t event) break; case ITEM_MODEL_TRAINER_MODE: - g_model.trainerMode = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_MODE, STR_VTRAINERMODES, g_model.trainerMode, 0, 1, attr, event); + g_model.trainerMode = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_MODE, STR_VTRAINERMODES, g_model.trainerMode, 0, HAS_WIRELESS_TRAINER_HARDWARE() ? TRAINER_MODE_MASTER_BATTERY_COMPARTMENT : TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, attr, event); break; #endif diff --git a/radio/src/lcd_common.cpp b/radio/src/lcd_common.cpp index 8cb854bfc..972f0597b 100644 --- a/radio/src/lcd_common.cpp +++ b/radio/src/lcd_common.cpp @@ -136,11 +136,11 @@ void lcdPutPattern(coord_t x, coord_t y, const uint8_t * pattern, uint8_t width, void lcd_putcAtt(coord_t x, coord_t y, const unsigned char c, LcdFlags flags) { const pm_uchar * q; - uint32_t fontsize = FONTSIZE(flags); lcdNextPos = x-1; #if !defined(BOOT) + uint32_t fontsize = FONTSIZE(flags); unsigned char c_remapped = 0; if (fontsize == DBLSIZE || (flags&BOLD)) { diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 76a081911..619bad866 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -309,6 +309,7 @@ enum uartModes { UART_MODE_TELEMETRY_MIRROR, UART_MODE_TELEMETRY, UART_MODE_SBUS_TRAINER, + // UART_MODE_CPPM_TRAINER, #if defined(DEBUG) UART_MODE_DEBUG, #endif @@ -316,6 +317,7 @@ enum uartModes { UART_MODE_MAX = UART_MODE_COUNT-1 }; +#define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.uart3Mode==UART_MODE_SBUS_TRAINER/* || g_eeGeneral.uart3Mode==UART_MODE_CPPM_TRAINER*/) #define EXTRA_GENERAL_FIELDS \ EXTRA_GENERAL_FIELDS_ARM \ uint8_t uart3Mode; \ @@ -357,6 +359,14 @@ PACK(typedef struct { EXTERNAL_MODULE, TRAINER_MODULE }; + enum TrainerMode { + TRAINER_MODE_MASTER, + TRAINER_MODE_SLAVE, + TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, + TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, + TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, + }; + #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerMode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) #define MODELDATA_BITMAP char bitmap[LEN_BITMAP_NAME]; #define MODELDATA_EXTRA uint8_t externalModule; uint8_t trainerMode; ModuleData moduleData[NUM_MODULES+1]; char curveNames[MAX_CURVES][6]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t nPotsToWarn; int8_t potPosition[NUM_POTS]; uint8_t spare[2]; #define swstate_t uint16_t @@ -1759,6 +1769,8 @@ enum ModuleTypes { MODULE_TYPE_COUNT }; +#define IS_PULSES_EXTERNAL_MODULE() (g_model.externalModule != MODULE_TYPE_NONE) + enum FailsafeModes { FAILSAFE_HOLD, FAILSAFE_CUSTOM, diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3c82bc7fc..e78afb887 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -87,6 +87,56 @@ uint8_t g_tmr1Latency_min; uint16_t lastMixerDuration; #endif +#if defined(PCBTARANIS) +uint8_t currentTrainerMode = 0xff; + +void checkTrainerSettings() +{ + uint8_t requiredTrainerMode = g_model.trainerMode; + if (requiredTrainerMode != currentTrainerMode) { + switch (currentTrainerMode) { + case TRAINER_MODE_MASTER: + stop_trainer_capture(); + break; + case TRAINER_MODE_SLAVE: + stop_trainer_ppm(); + break; + case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: + stop_cppm_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: + stop_sbus_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: + uart3Stop(); + } + + currentTrainerMode = requiredTrainerMode; + switch (requiredTrainerMode) { + case TRAINER_MODE_SLAVE: + init_trainer_ppm(); + break; + case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: + init_cppm_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: + init_sbus_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: + if (g_eeGeneral.uart3Mode == UART_MODE_SBUS_TRAINER) { + uart3SbusInit(); + break; + } + // no break + default: + // master is default + init_trainer_capture(); + break; + } + } +} +#endif + uint8_t unexpectedShutdown = 0; /* AVR: mixer duration in 1/16ms */ @@ -2239,20 +2289,7 @@ void perMain() #endif #if defined(PCBTARANIS) - uint8_t requiredTrainerMode = g_model.trainerMode; - if (requiredTrainerMode != currentTrainerMode) { - currentTrainerMode = requiredTrainerMode; - if (requiredTrainerMode) { - // slave - stop_trainer_capture(); - init_trainer_ppm(); - } - else { - // master - stop_trainer_ppm(); - init_trainer_capture(); - } - } + checkTrainerSettings(); #endif #if defined(PCBTARANIS) && !defined(SIMU) @@ -2559,7 +2596,7 @@ ISR(TIMER3_CAPT_vect) // G: High frequency noise can cause stack overflo with IS else { if (ppmInState>0 && ppmInState<=8) { if (val>800 && val<2200) { // if valid pulse-width range - ppmInValid = 100; + ppmInValid = PPM_IN_VALID_TIMEOUT; g_ppmIns[ppmInState++ - 1] = (int16_t)(val - 1500) * (uint8_t)(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. } else { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 620357de3..d7af3bec1 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -923,7 +923,7 @@ extern uint16_t maxLuaDuration; #endif #if defined(PCBTARANIS) - static inline uint16_t getTmr2MHz() { return TIM3->CNT; } + static inline uint16_t getTmr2MHz() { return TIM7->CNT; } #elif defined(PCBSKY9X) static inline uint16_t getTmr2MHz() { return TC1->TC_CHANNEL[0].TC_CV; } #else @@ -1123,6 +1123,7 @@ extern uint8_t g_beepVal[5]; extern uint8_t ppmInState; //0=unsync 1..8= wait for value i-1 extern uint8_t ppmInValid; +#define PPM_IN_VALID_TIMEOUT 100 extern int16_t g_ppmIns[NUM_TRAINER]; extern int32_t chans[NUM_CHNOUT]; extern int16_t ex_chans[NUM_CHNOUT]; // Outputs (before LIMITS) of the last perMain diff --git a/radio/src/sbus.cpp b/radio/src/sbus.cpp index 086659833..2d8879f52 100755 --- a/radio/src/sbus.cpp +++ b/radio/src/sbus.cpp @@ -36,7 +36,7 @@ #include "opentx.h" -Fifo<28> sbusFifo; +Fifo<32> sbusFifo; uint8_t SbusFrame[28] ; uint16_t SbusTimer ; uint8_t SbusIndex = 0 ; @@ -59,6 +59,8 @@ void processSbusFrame(uint8_t *sbus, int16_t *pulses) inputbitsavailable -= 11; inputbits >>= 11; } + + ppmInValid = PPM_IN_VALID_TIMEOUT; } #define SBUS_DELAY 1000 // 500uS diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index f4c34239b..162fafef2 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -406,6 +406,7 @@ inline void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) { #define GPIO_ResetBits(GPIOx, pin) GPIOx->BSRRL &= ~pin #define GPIO_ReadInputDataBit(GPIOx, pin) (GPIOx->BSRRL & pin) #define RCC_AHB1PeriphClockCmd(...) +#define RCC_APB2PeriphClockCmd(...) #endif #define configure_pins(...) diff --git a/radio/src/targets/sky9x/board_sky9x.cpp b/radio/src/targets/sky9x/board_sky9x.cpp index 93d3fa4d7..42d283499 100644 --- a/radio/src/targets/sky9x/board_sky9x.cpp +++ b/radio/src/targets/sky9x/board_sky9x.cpp @@ -257,7 +257,7 @@ extern "C" void TC3_IRQHandler() //capture ppm in at 2MHz else { if (ppmInState>0 && ppmInState<=16) { if (val>800 && val<2200) { // if valid pulse-width range - ppmInValid = 100; + ppmInValid = PPM_IN_VALID_TIMEOUT; g_ppmIns[ppmInState++ - 1] = (int16_t)(val - 1500)*(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. } else { diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index 04ea0a4d3..57fc2dc25 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -54,6 +54,19 @@ void watchdogInit(unsigned int duration) IWDG->KR = 0xCCCC ; // start } +// Start TIMER7 at 2000000Hz +void init2MhzTimer() +{ + // Now for timer 7 + RCC->APB1ENR |= RCC_APB1ENR_TIM7EN ; // Enable clock + + TIM7->PSC = 0 ; // Max speed + TIM7->ARR = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1 ; // 0.5 uS, 2 MHz + TIM7->CR2 = 0 ; + TIM7->CR2 = 0x20 ; + TIM7->CR1 = TIM_CR1_CEN ; +} + // Starts TIMER at 200Hz, 5mS period void init5msTimer() { @@ -108,6 +121,7 @@ void boardInit() adcInit(); delaysInit(); audioInit(); + init2MhzTimer(); init5msTimer(); __enable_irq(); eepromInit(); diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 48c76479b..5d6f2d0bd 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -108,7 +108,7 @@ void configure_pins( uint32_t pins, uint16_t config ); extern uint16_t sessionTimer; -#define SLAVE_MODE() (g_model.trainerMode == 1) +#define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(GPIOTRNDET, PIN_TRNDET) == Bit_RESET) void delaysInit(void); @@ -156,6 +156,10 @@ void init_trainer_ppm(void); void stop_trainer_ppm(void); void init_trainer_capture(void); void stop_trainer_capture(void); +void init_cppm_on_heartbeat_capture(void); +void stop_cppm_on_heartbeat_capture(void); +void init_sbus_on_heartbeat_capture(void); +void stop_sbus_on_heartbeat_capture(void); // Keys driver void keysInit(void); @@ -197,8 +201,8 @@ void pwrOff(void); #define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown) #define INTERNAL_RF_ON() GPIO_SetBits(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) #define INTERNAL_RF_OFF() GPIO_ResetBits(GPIO_INT_RF_PWR, PIN_INT_RF_PWR) -#define EXTERNAL_RF_ON() GPIO_SetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) -#define EXTERNAL_RF_OFF() GPIO_ResetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) +#define EXTERNAL_MODULE_ON() GPIO_SetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) +#define EXTERNAL_MODULE_OFF() GPIO_ResetBits(GPIO_EXT_RF_PWR, PIN_EXT_RF_PWR) // Backlight driver #if defined(REVPLUS) @@ -259,7 +263,10 @@ void hapticOff(void); void uart3Init(unsigned int mode, unsigned int protocol); void uart3Putc(const char c); #define telemetrySecondPortInit(protocol) uart3Init(UART_MODE_TELEMETRY, protocol) +void uart3SbusInit(void); +void uart3Stop(void); + +#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) -extern uint8_t currentTrainerMode; #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 6ae6c2fda..c7c1c2e47 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -193,6 +193,7 @@ #define PIN_PER_3 0x0030 #define PIN_PER_5 0x0050 #define PIN_PER_6 0x0060 +#define PIN_PER_8 0x0080 // #define PIN_OS2 0x0000 #define PIN_OS25 0x2000 #define PIN_OS50 0x4000 diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index d91da6834..b3b51d56c 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -172,10 +172,11 @@ static void disable_pa10_none() static void init_pa7_none() { - EXTERNAL_RF_OFF(); + if (!IS_TRAINER_EXTERNAL_MODULE()) { + EXTERNAL_MODULE_OFF(); + } // Timer8 - GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO_EXTPPM, ENABLE); @@ -374,7 +375,7 @@ extern "C" void TIM1_UP_TIM10_IRQHandler() static void init_pa7_pxx() { - EXTERNAL_RF_ON(); + EXTERNAL_MODULE_ON(); // Timer8 setupPulsesPXX(EXTERNAL_MODULE); @@ -442,13 +443,15 @@ static void disable_pa7_pxx() NVIC_DisableIRQ(TIM8_CC_IRQn) ; TIM8->DIER &= ~TIM_DIER_CC2IE ; TIM8->CR1 &= ~TIM_CR1_CEN ; - EXTERNAL_RF_OFF(); + if (!IS_TRAINER_EXTERNAL_MODULE()) { + EXTERNAL_MODULE_OFF(); + } } #if defined(DSM2) static void init_pa7_dsm2() { - EXTERNAL_RF_ON(); + EXTERNAL_MODULE_ON(); // Timer8 setupPulsesDSM2(EXTERNAL_MODULE); @@ -516,7 +519,9 @@ static void disable_pa7_dsm2() NVIC_DisableIRQ(TIM8_CC_IRQn) ; TIM8->DIER &= ~TIM_DIER_CC2IE ; TIM8->CR1 &= ~TIM_CR1_CEN ; - EXTERNAL_RF_OFF(); + if (!IS_TRAINER_EXTERNAL_MODULE()) { + EXTERNAL_MODULE_OFF(); + } } #endif @@ -525,7 +530,8 @@ static void disable_pa7_dsm2() // Pin is AF1 function for timer 1 static void init_pa7_ppm() { - EXTERNAL_RF_ON(); + EXTERNAL_MODULE_ON(); + // Timer1 setupPulsesPPM(EXTERNAL_MODULE) ; ppmStreamPtr[EXTERNAL_MODULE] = ppmStream[EXTERNAL_MODULE]; @@ -573,7 +579,9 @@ static void disable_pa7_ppm() NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn) ; TIM8->DIER &= ~TIM_DIER_CC2IE & ~TIM_DIER_UIE ; TIM8->CR1 &= ~TIM_CR1_CEN ; - EXTERNAL_RF_OFF(); + if (!IS_TRAINER_EXTERNAL_MODULE()) { + EXTERNAL_MODULE_OFF(); + } } extern "C" void TIM8_CC_IRQHandler() diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 2a92fd74e..2167f636f 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -36,9 +36,9 @@ #include "../../opentx.h" -uint8_t currentTrainerMode; uint16_t * TrainerPulsePtr; extern uint16_t ppmStream[NUM_MODULES+1][20]; +extern Fifo<32> sbusFifo; #define setupTrainerPulses() setupPulsesPPM(TRAINER_MODULE) @@ -79,8 +79,7 @@ void stop_trainer_ppm() { configure_pins( PIN_TR_PPM_OUT, PIN_INPUT | PIN_PORTC ) ; // Pin as input TIM3->CR1 &= ~TIM_CR1_CEN ; // Stop counter - TIM3->DIER &= ~TIM_DIER_CC2IE ; // Stop Interrupt - TIM3->DIER &= ~TIM_DIER_UIE ; // Stop Interrupt + TIM3->DIER = 0 ; // Stop Interrupt NVIC_DisableIRQ(TIM3_IRQn) ; // Stop Interrupt } @@ -99,28 +98,38 @@ void init_trainer_capture() TIM3->SR &= ~TIM_SR_CC3IF & ~TIM_SR_CC2IF & ~TIM_SR_UIF ; // Clear flags TIM3->DIER |= TIM_DIER_CC3IE ; TIM3->CR1 = TIM_CR1_CEN ; - NVIC_EnableIRQ(TIM3_IRQn) ; NVIC_SetPriority(TIM3_IRQn, 7); + NVIC_EnableIRQ(TIM3_IRQn) ; } void stop_trainer_capture() { TIM3->CR1 &= ~TIM_CR1_CEN ; // Stop counter - TIM3->DIER &= ~TIM_DIER_CC3IE ; // Stop Interrupt + TIM3->DIER = 0; // Stop Interrupt NVIC_DisableIRQ(TIM3_IRQn) ; // Stop Interrupt } extern "C" void TIM3_IRQHandler() { - uint16_t capture ; + uint16_t capture = 0; static uint16_t lastCapt ; uint16_t val ; + bool doCapture = false ; // What mode? in or out? if ( (TIM3->DIER & TIM_DIER_CC3IE ) && ( TIM3->SR & TIM_SR_CC3IF ) ) { - // capture mode + // capture mode on trainer jack capture = TIM3->CCR3 ; + doCapture = true; + } + if ( (TIM3->DIER & TIM_DIER_CC2IE ) && ( TIM3->SR & TIM_SR_CC2IF ) ) { + // capture mode on heartbeat pin (external module) + capture = TIM3->CCR2 ; + doCapture = true ; + } + + if (doCapture) { val = (uint16_t)(capture - lastCapt) / 2 ; lastCapt = capture; @@ -132,7 +141,7 @@ extern "C" void TIM3_IRQHandler() else { if (ppmInState>0 && ppmInState<=16) { if (val>800 && val<2200) { - ppmInValid = 100; + ppmInValid = PPM_IN_VALID_TIMEOUT; g_ppmIns[ppmInState++ - 1] = (int16_t)(val - 1500)*(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. } else { @@ -168,3 +177,86 @@ extern "C" void TIM3_IRQHandler() } } +void init_cppm_on_heartbeat_capture(void) +{ + EXTERNAL_MODULE_ON(); + + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN ; // Enable portC clock + configure_pins( 0x0080, PIN_PERIPHERAL | PIN_PORTC | PIN_PER_2 ) ; + RCC->APB1ENR |= RCC_APB1ENR_TIM3EN ; // Enable clock + + TIM3->ARR = 0xFFFF ; + TIM3->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1 ; // 0.5uS + TIM3->CR2 = 0 ; + TIM3->CCMR1 = TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0 ; + TIM3->CCER = TIM_CCER_CC2E ; + TIM3->SR &= ~TIM_SR_CC2IF ; // Clear flag + TIM3->DIER |= TIM_DIER_CC2IE ; + TIM3->CR1 = TIM_CR1_CEN ; + NVIC_SetPriority(TIM3_IRQn, 7); + NVIC_EnableIRQ(TIM3_IRQn) ; +} + +void stop_cppm_on_heartbeat_capture(void) +{ + TIM3->DIER = 0 ; + TIM3->CR1 &= ~TIM_CR1_CEN ; // Stop counter + NVIC_DisableIRQ(TIM3_IRQn) ; // Stop Interrupt + + if (!IS_PULSES_EXTERNAL_MODULE()) { + EXTERNAL_MODULE_OFF(); + } +} + +void init_sbus_on_heartbeat_capture() +{ + EXTERNAL_MODULE_ON(); + + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); + + GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + 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_50MHz; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); + + USART_InitStructure.USART_BaudRate = 100000; + USART_InitStructure.USART_WordLength = USART_WordLength_9b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_Even; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx; + + USART_Init(USART6, &USART_InitStructure); + + USART_Cmd(USART6, ENABLE); + + USART_ITConfig(USART6, USART_IT_RXNE, ENABLE); + + NVIC_SetPriority(USART6_IRQn, 7); + NVIC_EnableIRQ(USART6_IRQn); +} + +void stop_sbus_on_heartbeat_capture(void) +{ + configure_pins( 0x0080, PIN_INPUT | PIN_PORTC ) ; + NVIC_DisableIRQ(USART6_IRQn) ; + + if (!IS_PULSES_EXTERNAL_MODULE()) { + EXTERNAL_MODULE_OFF(); + } +} + +extern "C" void USART6_IRQHandler() +{ + uint8_t data = USART6->DR; + sbusFifo.push(data); +} diff --git a/radio/src/targets/taranis/uart3_driver.cpp b/radio/src/targets/taranis/uart3_driver.cpp index 8100672cd..ca67d0760 100644 --- a/radio/src/targets/taranis/uart3_driver.cpp +++ b/radio/src/targets/taranis/uart3_driver.cpp @@ -39,7 +39,7 @@ uint8_t uart3Mode = UART_MODE_NONE; Fifo<512> uart3TxFifo; extern Fifo<512> telemetryFifo; -extern Fifo<28> sbusFifo; +extern Fifo<32> sbusFifo; void uart3Setup(unsigned int baudrate) { @@ -70,11 +70,11 @@ void uart3Setup(unsigned int baudrate) USART_Init(UART3, &USART_InitStructure); USART_Cmd(UART3, ENABLE); - USART_ITConfig(UART3, USART_IT_RXNE, DISABLE); + USART_ITConfig(UART3, USART_IT_RXNE, ENABLE); USART_ITConfig(UART3, USART_IT_TXE, DISABLE); - NVIC_EnableIRQ(USART3_IRQn); NVIC_SetPriority(USART3_IRQn, 7); + NVIC_EnableIRQ(USART3_IRQn); } void uart3Init(unsigned int mode, unsigned int protocol) @@ -97,10 +97,6 @@ void uart3Init(unsigned int mode, unsigned int protocol) uart3Setup(FRSKY_D_BAUDRATE); } break; - case UART_MODE_SBUS_TRAINER: - uart3Setup(100000); - USART3->CR1 |= USART_CR1_M | USART_CR1_PCE ; - break; } uart3Mode = mode; @@ -121,7 +117,16 @@ void debugPutc(const char c) } #endif -#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) +void uart3SbusInit() +{ + uart3Setup(100000); + USART3->CR1 |= USART_CR1_M | USART_CR1_PCE ; +} + +void uart3Stop() +{ + USART_DeInit(USART3); +} extern "C" void USART3_IRQHandler(void) { diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index f75792bbd..05ea176e9 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -79,12 +79,8 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" -<<<<<<< HEAD -#define TR_UART3MODES "VYP\0 ""S-Port Mirror\0 ""Telemetrie\0 ""Trainer\0 ""Debug\0 " -======= -#define TR_UART3MODES "VYP\0 ""S-Port Mirror\0 ""Telemetrie\0 ""Debug\0 " ->>>>>>> 2073a1f... CZ translations - Radio +#define LEN_UART3MODES "\015" +#define TR_UART3MODES "VYP\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Trainer\0""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "Není\0 ""Pot s aretací\0 ""Vícepol. přep.\0""Potenciometr\0" @@ -478,8 +474,8 @@ #define LEN_VTMRMODES "\004" #define TR_VTMRMODES "VYP\0""ABS\0""Pln>""Pln%""Pln*" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Učitel""Žák\0 " +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Učitel/Jack\0 ""Žák/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Držet\0 ""Vlastní\0 ""Bez pulzů""Přijímač" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 907993a6c..e67288a83 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -79,8 +79,8 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "AUS\0 ""S-Port DataOut\0""Telemetrie\0 ""Trainer\0 ""Debug\0 " +#define LEN_UART3MODES "\015" +#define TR_UART3MODES "AUS\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Trainer\0""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "Kein\0 ""Poti mit Raste ""Stufen-Schalter""Poti ohne Raste\0" @@ -481,8 +481,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "AUS""ABS""GSs""GS%""GSt" -#define LEN_VTRAINERMODES "\007" -#define TR_VTRAINERMODES "Lehrer\0""Schüler\0" // "Master""Slave\0" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Lehrer/Jack\0 ""Schüler/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\013" #define TR_VFAILSAFE "Halte Pos.\0""Angepasst\0 ""Kein Signal""Empfänger\0" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 2648ce22c..a3e3f0ff6 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -79,8 +79,8 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""Debug\0 " +#define LEN_UART3MODES "\015" +#define TR_UART3MODES "OFF\0 ""S-Port Mirror""Telemetry\0 ""SBUS Trainer\0""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot with detent""Multipos Switch""Pot\0" @@ -481,8 +481,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ON\0""THs""TH%""THt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Master""Slave\0" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Master/Jack\0 ""Slave/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Hold\0 ""Custom\0 ""No pulses""Receiver\0" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index f9365bb2c..ac0593ffa 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -79,8 +79,8 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""Trainer\0 ""Debug\0 " +#define LEN_UART3MODES "\015" +#define TR_UART3MODES "OFF\0 ""S-Port Mirror""Telemetry\0 ""SBUS Trainer\0""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot with detent""Multipos Switch""Pot\0" @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""THs""TH%""THt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Master""Esclav" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Master/Jack\0 ""Esclav/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Guardar\0 ""Adaptar\0 ""Sin pulso""Receiver\0" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 5c47bbe9f..1ebc39290 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -79,8 +79,8 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "POIS\0 ""S-Port Pelik\0 ""Telemetry\0 ""Trainer\0 ""Debug\0 " +#define LEN_UART3MODES "\015" +#define TR_UART3MODES "POIS\0 ""S-Port Pelik\0""Telemetry\0 ""SBUS Trainer\0""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot with detent""Monias. Kytkin\0""Potikka\0" @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""THs""TH%""THt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Master""Slave\0" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Master/Jack\0 ""Slave/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Hold\0 ""Custom\0 ""No pulses""Receiver\0" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 3cd8d2356..282bff46a 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -79,8 +79,8 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""Recopie S-Port\0""Telemetrie\0 ""Ecolage SBUS\0 ""Debug\0 " +#define LEN_UART3MODES "\016" +#define TR_UART3MODES "OFF\0 ""Recopie S-Port""Telemetrie\0 ""Ecolage SBUS\0 ""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "Rien\0 ""Pot avec centre""Inter multi-pos""Potentiomètre\0" @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""GZs""GZ%""GZt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Maître""Elève\0" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Maître/Jack\0 ""Elève/Jack\0 ""Maître/SBUS Module""Maître/CPPM Module""Maître/Batterie\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Maintien\0""Prédéfini""Pas d'imp""Récepteur" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index b80ae46c0..02f48cc54 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -78,10 +78,10 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "ch1ch2ch3ch4" - -#define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""Replica Porta-S""Telemetria\0 ""Trainer\0 ""Debug\0 " - + +#define LEN_UART3MODES "\016" +#define TR_UART3MODES "OFF\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""Debug\0" + #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot. con centro""Inter. Multipos""Potenziometro\0 " @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""MOs""MO%""MOt" -#define LEN_VTRAINERMODES "\007" -#define TR_VTRAINERMODES "Maestro""Allievo" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Maestro/Jack\0 ""Allievo/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\013" #define TR_VFAILSAFE "Mantieni\0 ""Personali\0 ""No impulsi\0""Ricevente\0 " diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 2a505f44b..cba0f34d0 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "KN1KN2KN3KN4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "Wyłącz\0 ""S-Port Mirror\0 ""Telemetry\0 ""Trainer\0 ""Debug\0 " +#define TR_UART3MODES "Wyłącz\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "Brak\0 ""Poten z zapadką""Przeł.Wielopoz.""Potencjometr\0" @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "WYŁ""ABS""THs""TH%""THt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Trener""Uczeń\0" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Trener/Jack\0 ""Uczeń/Jack\0 ""Trener/SBUS Module""Trener/CPPM Module""Trener/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Utrzymuj\0""Własne\0 ""0 sygnału""Odbiorn.\0" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 9519bfd21..1e6ac8d34 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""Trainer\0 ""Debug\0 " +#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""Debug\0" #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot with detent""Multipos Switch""Pot\0" @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""MTs""MT%""MTt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Master""Slave\0" +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Master/Jack\0 ""Slave/Jack\0 ""Master/SBUS Module""Master/CPPM Module""Master/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Hold\0 ""Custom\0 ""No pulses""Receiver\0" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index f30e151c9..de4190043 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "KN1KN2KN3KN4" #define LEN_UART3MODES "\022" -#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Telemetri\0 ""Trainer\0 ""Debug\0 " +#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""Debug\0" #define LEN_POTTYPES "\020" #define TR_POTTYPES "Ingen\0 ""Mittläges-pot\0 ""Flerlägesväljare""Potentiometer\0" @@ -474,8 +474,8 @@ #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "Av\0""ABS""GAs""GA%""GAt" -#define LEN_VTRAINERMODES "\006" -#define TR_VTRAINERMODES "Lärare""Elev\0." +#define LEN_VTRAINERMODES "\022" +#define TR_VTRAINERMODES "Lärare/Jack\0 ""Elev./Jack\0 ""Lärare/SBUS Module""Lärare/CPPM Module""Lärare/Battery\0" #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Lås Servo""Anpassat\0""Pulsfritt""Mottagare"