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"