From e96578c857be82adddcc3c2dd68756f7cc15770d Mon Sep 17 00:00:00 2001 From: bsongis Date: Mon, 23 Jun 2014 15:41:50 +0200 Subject: [PATCH] [Taranis] Telemetry (only FrSky D) through serial port inside the battery compartment added --- radio/src/gui/menu_general.cpp | 2 +- radio/src/gui/menu_model.cpp | 2 +- radio/src/myeeprom.h | 9 +++-- radio/src/opentx.cpp | 2 +- radio/src/targets/taranis/board_taranis.h | 2 +- .../src/targets/taranis/telemetry_driver.cpp | 6 +++ radio/src/targets/taranis/uart3_driver.cpp | 37 ++++++++++++++++--- radio/src/telemetry/frsky.cpp | 20 +++++----- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 2 +- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 18 files changed, 68 insertions(+), 32 deletions(-) diff --git a/radio/src/gui/menu_general.cpp b/radio/src/gui/menu_general.cpp index a0bf92884..93a5e6e60 100644 --- a/radio/src/gui/menu_general.cpp +++ b/radio/src/gui/menu_general.cpp @@ -1388,7 +1388,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) { - uart3Init(g_eeGeneral.uart3Mode); + uart3Init(g_eeGeneral.uart3Mode, g_model.telemetryProtocol); } break; } diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index e0cc1fdfa..b6dfc580c 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -5589,7 +5589,7 @@ void menuModelTelemetry(uint8_t event) #if defined(CPUARM) case ITEM_TELEMETRY_PROTOCOL_TYPE: - g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\006S.PORTD\0 ", g_model.telemetryProtocol, PROTOCOL_FRSKY_SPORT, PROTOCOL_FRSKY_D, attr, event); + g_model.telemetryProtocol = selectMenuItem(TELEM_COL2, y, STR_TELEMETRY_TYPE, "\016FrSky S.PORT\0 FrSky D\0 FrSky D (batt)", g_model.telemetryProtocol, PROTOCOL_TELEMETRY_FIRST, PROTOCOL_TELEMETRY_LAST, attr, event); break; #endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index ef7a44fa3..70ef00193 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -287,8 +287,8 @@ enum BeeperMode { #if defined(PCBTARANIS) enum uartModes { UART_MODE_NONE, - UART_MODE_SPORT, -// UART_MODE_VIRTUAL_SP2UART, + UART_MODE_TELEMETRY_MIRROR, + UART_MODE_TELEMETRY, #if defined(DEBUG) UART_MODE_DEBUG, #endif @@ -1695,8 +1695,11 @@ enum ThrottleSources { enum TelemetryProtocol { - PROTOCOL_FRSKY_SPORT, + PROTOCOL_TELEMETRY_FIRST, + PROTOCOL_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, PROTOCOL_FRSKY_D, + PROTOCOL_FRSKY_D_SECONDARY, + PROTOCOL_TELEMETRY_LAST = PROTOCOL_FRSKY_D_SECONDARY }; PACK(typedef struct t_ModelData { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3718645aa..8f4c19a61 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -3362,7 +3362,7 @@ inline void opentxInit(OPENTX_INIT_ARGS) backlightOn(); #if defined(PCBTARANIS) - uart3Init(g_eeGeneral.uart3Mode); + uart3Init(g_eeGeneral.uart3Mode, g_model.telemetryProtocol); #endif #if defined(CPUARM) diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 9d3805b18..840b41f85 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -115,7 +115,7 @@ void delaysInit(void); #define DEBUG_BAUDRATE 115200 -void uart3Init(unsigned int mode); +void uart3Init(unsigned int mode, unsigned int protocol); void uart3Putc(const char c); void delaysInit(void); diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 9f93b81f5..a87cde3dd 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -40,6 +40,11 @@ extern Fifo<512> telemetryFifo; void telemetryPortInit(uint32_t baudrate) { + if (baudrate == 0) { + USART_DeInit(USART2); + return; + } + USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -77,6 +82,7 @@ void telemetryPortInit(uint32_t baudrate) USART_Cmd(SPORT, ENABLE); USART_ITConfig(SPORT, USART_IT_RXNE, ENABLE); + NVIC_EnableIRQ(USART2_IRQn); NVIC_SetPriority(USART2_IRQn, 6); } diff --git a/radio/src/targets/taranis/uart3_driver.cpp b/radio/src/targets/taranis/uart3_driver.cpp index 1776cfc6a..d1c7bae22 100644 --- a/radio/src/targets/taranis/uart3_driver.cpp +++ b/radio/src/targets/taranis/uart3_driver.cpp @@ -36,6 +36,10 @@ #include "../../opentx.h" +bool uart3Telemetry = false; +Fifo<512> uart3TxFifo; +extern Fifo<512> telemetryFifo; + void uart3Setup(unsigned int baudrate) { USART_InitTypeDef USART_InitStructure; @@ -60,7 +64,7 @@ void uart3Setup(unsigned int baudrate) USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(UART3, &USART_InitStructure); USART_Cmd(UART3, ENABLE); @@ -72,12 +76,13 @@ void uart3Setup(unsigned int baudrate) NVIC_SetPriority(USART3_IRQn, 7); } -void uart3Init(unsigned int mode) +void uart3Init(unsigned int mode, unsigned int protocol) { USART_DeInit(USART3); + uart3Telemetry = false; - switch(mode) { - case UART_MODE_SPORT: + switch (mode) { + case UART_MODE_TELEMETRY_MIRROR: uart3Setup(FRSKY_SPORT_BAUDRATE); break; #if defined(DEBUG) @@ -85,11 +90,15 @@ void uart3Init(unsigned int mode) uart3Setup(DEBUG_BAUDRATE); break; #endif + case UART_MODE_TELEMETRY: + if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + uart3Setup(FRSKY_D_BAUDRATE); + uart3Telemetry = true; + } + break; } } -Fifo<512> uart3TxFifo; - void uart3Putc(const char c) { uart3TxFifo.push(c); @@ -105,8 +114,11 @@ void debugPutc(const char c) } #endif +#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) + extern "C" void USART3_IRQHandler(void) { + // Send if (USART_GetITStatus(UART3, USART_IT_TXE) != RESET) { uint8_t txchar; if (uart3TxFifo.pop(txchar)) { @@ -117,4 +129,17 @@ extern "C" void USART3_IRQHandler(void) USART_ITConfig(UART3, USART_IT_TXE, DISABLE); } } + + // Receive + uint32_t status = SPORT->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = SPORT->DR; + + if (uart3Telemetry && !(status & USART_FLAG_ERRORS)) { + telemetryFifo.push(data); + } + + status = SPORT->SR; + } } + diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 3b59727ae..e4cfbd6d6 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -161,7 +161,7 @@ NOINLINE void processSerialData(uint8_t data) #endif #if defined(PCBTARANIS) - if (g_eeGeneral.uart3Mode == UART_MODE_SPORT) { + if (g_eeGeneral.uart3Mode == UART_MODE_TELEMETRY_MIRROR) { uart3Putc(data); } #endif @@ -572,17 +572,19 @@ void telemetryReset() void telemetryInit(void) { #if defined(CPUARM) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) - telemetryPortInit(FRSKY_SPORT_BAUDRATE); - else + if (telemetryProtocol == PROTOCOL_FRSKY_D) { telemetryPortInit(FRSKY_D_BAUDRATE); + } + else if (telemetryProtocol==PROTOCOL_FRSKY_D_SECONDARY) { + telemetryPortInit(0); + uart3Init(UART_MODE_TELEMETRY, PROTOCOL_FRSKY_D_SECONDARY); + } + else { + telemetryPortInit(FRSKY_SPORT_BAUDRATE); + } #elif !defined(SIMU) telemetryPortInit(); #endif -#if 0 - // if we call telemetryReset() here we also reset the consumption after model load - // right now I don't see why we call it here - telemetryReset(); -#endif + // we don't reset the telemetry here as we would also reset the consumption after model load } diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 6701215e9..82d20a493 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "VYP\0 ""S-Port Mirror\0 ""Debug\0 " +#define TR_UART3MODES "VYP\0 ""S-Port Mirror\0 ""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "Není\0 ""Potenciometr\0 ""Vícepol. přep.\0" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1c21fb9ef..7f49f0641 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "AUS\0 ""S-Port Data Out\0""Debug\0 " +#define TR_UART3MODES "AUS\0 ""S-Port Data Out\0""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "Kein\0 ""Poti\0 ""Stufen-Schalter " diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 5ea15a3de..69b36fecc 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 " +#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 561cfea40..b4e432aa6 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Debug\0 " +#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 885a97349..99b2955f9 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "POIS\0 ""S-Port Pelik\0 ""Debug\0 " +#define TR_UART3MODES "POIS\0 ""S-Port Pelik\0 ""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Potikka\0 ""Monias. Kytkin\0" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index a45f9d67b..c550151c7 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "CH1CH2CH3CH4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""Recopie S-Port\0""Debug\0 " +#define TR_UART3MODES "OFF\0 ""Recopie S-Port\0""Telemetrie\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "Rien\0 ""Potentiomètre\0 ""Inter multi-pos" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f1e54fca1..f32d6092a 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -80,7 +80,7 @@ #define TR_TRNCHN "ch1ch2ch3ch4" #define LEN_UART3MODES "\017" -#define TR_UART3MODES "OFF\0 ""Replica Porta-S""Debug\0 " +#define TR_UART3MODES "OFF\0 ""Replica Porta-S""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Potenziometro\0 ""Inter. Multipos" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a268bff91..f6438b81a 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 ""Debug\0 " +#define TR_UART3MODES "Wyłącz\0 ""S-Port Mirror\0 ""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "Brak\0 ""Potencjometr\0 ""Przeł.Wielopoz." diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 4bc8e5498..98415f766 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 ""Debug\0 " +#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\017" #define TR_POTTYPES "None\0 ""Pot\0 ""Multipos Switch" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 13ee6a012..76710b83b 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""Debug\0 " +#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Telemetry\0 ""Debug\0 " #define LEN_POTTYPES "\020" #define TR_POTTYPES "Ingen\0 ""Potentiometer\0 ""Flerlägesväljare"