From b376192b61a651ec881c939090eb3425fb491363 Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 15 May 2014 17:58:38 +0200 Subject: [PATCH 1/6] Telemetry refactoring --- .../opentx/opentxGruvin9xsimulator.cpp | 2 + .../firmwares/opentx/opentxM128simulator.cpp | 2 + .../firmwares/opentx/opentxSky9xsimulator.cpp | 2 + .../opentx/opentxTaranisSimulator.cpp | 3 + .../src/firmwares/opentx/opentxsimulator.cpp | 2 + radio/src/Makefile | 18 +- radio/src/eeprom_raw.cpp | 2 +- radio/src/eeprom_rlc.cpp | 2 +- radio/src/gtests.cpp | 22 +- radio/src/gui/view_main.cpp | 12 +- radio/src/gui/view_telemetry.cpp | 2 +- radio/src/myeeprom.h | 2 +- radio/src/opentx.cpp | 57 +- radio/src/opentx.h | 10 +- radio/src/protocols/pulses_avr.cpp | 2 +- radio/src/targets/common_avr/board_avr.h | 39 + .../targets/common_avr/telemetry_driver.cpp | 142 +++ radio/src/targets/gruvin9x/board_gruvin9x.h | 2 + radio/src/targets/mega2560/board_mega2560.h | 2 + radio/src/targets/sky9x/board_sky9x.cpp | 12 - radio/src/targets/sky9x/board_sky9x.h | 10 +- radio/src/targets/sky9x/telemetry_driver.cpp | 17 +- radio/src/targets/stock/board_stock.h | 2 + radio/src/targets/taranis/board_taranis.cpp | 1 - radio/src/targets/taranis/board_taranis.h | 6 +- ...{sport_driver.cpp => telemetry_driver.cpp} | 6 +- radio/src/targets/taranis/uart3_driver.cpp | 2 +- radio/src/telemetry/frsky.cpp | 1050 +++++------------ radio/src/telemetry/frsky.h | 709 ++++++----- radio/src/telemetry/frsky_d.cpp | 472 ++++++++ radio/src/telemetry/frsky_sport.cpp | 322 +---- radio/src/telemetry/frsky_sport.h | 227 ---- 32 files changed, 1526 insertions(+), 1635 deletions(-) create mode 100755 radio/src/targets/common_avr/board_avr.h create mode 100644 radio/src/targets/common_avr/telemetry_driver.cpp rename radio/src/targets/taranis/{sport_driver.cpp => telemetry_driver.cpp} (93%) create mode 100644 radio/src/telemetry/frsky_d.cpp delete mode 100644 radio/src/telemetry/frsky_sport.h diff --git a/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp index 0d677ccec..904aa2080 100644 --- a/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp @@ -58,6 +58,7 @@ namespace Open9xGruvin9x { #include "radio/src/targets/gruvin9x/board_gruvin9x.cpp" +#include "radio/src/targets/common_avr/telemetry_driver.cpp" #include "radio/src/eeprom_common.cpp" #include "radio/src/eeprom_rlc.cpp" #include "radio/src/opentx.cpp" @@ -84,6 +85,7 @@ namespace Open9xGruvin9x { #include "radio/src/buzzer.cpp" #include "radio/src/targets/gruvin9x/somo14d.cpp" #include "radio/src/telemetry/frsky.cpp" +#include "radio/src/telemetry/frsky_d.cpp" #include "radio/src/translations/tts_en.cpp" #include "radio/src/haptic.cpp" diff --git a/companion/src/firmwares/opentx/opentxM128simulator.cpp b/companion/src/firmwares/opentx/opentxM128simulator.cpp index 6500cd2db..9bd963ed7 100644 --- a/companion/src/firmwares/opentx/opentxM128simulator.cpp +++ b/companion/src/firmwares/opentx/opentxM128simulator.cpp @@ -57,6 +57,7 @@ namespace Open9xM128 { #include "radio/src/targets/stock/board_stock.cpp" +#include "radio/src/targets/common_avr/telemetry_driver.cpp" #include "radio/src/eeprom_common.cpp" #include "radio/src/eeprom_rlc.cpp" #include "radio/src/opentx.cpp" @@ -82,6 +83,7 @@ namespace Open9xM128 { #include "radio/src/audio_avr.cpp" #include "radio/src/targets/stock/voice.cpp" #include "radio/src/telemetry/frsky.cpp" +#include "radio/src/telemetry/frsky_d.cpp" #include "radio/src/translations/tts_en.cpp" #include "radio/src/haptic.cpp" diff --git a/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp b/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp index 02e94691d..1ef5c605d 100644 --- a/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp @@ -99,6 +99,8 @@ namespace Open9xSky9x { #include "radio/src/translations.cpp" #include "radio/src/fonts.cpp" #include "radio/src/telemetry/frsky.cpp" +#include "radio/src/telemetry/frsky_sport.cpp" +#include "radio/src/telemetry/frsky_d.cpp" #include "radio/src/targets/sky9x/audio_driver.cpp" #include "radio/src/audio_arm.cpp" #include "radio/src/buzzer.cpp" diff --git a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp index 292eea558..b4bcdd574 100644 --- a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp +++ b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp @@ -112,8 +112,11 @@ inline int geteepromsize() { #define SDCARD #include "radio/src/translations.cpp" #include "radio/src/fonts.cpp" +#include "radio/src/telemetry/frsky.cpp" #include "radio/src/telemetry/frsky_sport.cpp" +#include "radio/src/telemetry/frsky_d.cpp" #include "radio/src/targets/taranis/audio_driver.cpp" +#include "radio/src/targets/taranis/telemetry_driver.cpp" #include "radio/src/audio_arm.cpp" #include "radio/src/translations/tts_cz.cpp" #include "radio/src/translations/tts_de.cpp" diff --git a/companion/src/firmwares/opentx/opentxsimulator.cpp b/companion/src/firmwares/opentx/opentxsimulator.cpp index d05056a7a..09cf68930 100644 --- a/companion/src/firmwares/opentx/opentxsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxsimulator.cpp @@ -63,6 +63,7 @@ namespace Open9x { #include "radio/src/targets/stock/board_stock.cpp" +#include "radio/src/targets/common_avr/telemetry_driver.cpp" #include "radio/src/eeprom_common.cpp" #include "radio/src/eeprom_rlc.cpp" #include "radio/src/opentx.cpp" @@ -83,6 +84,7 @@ namespace Open9x { #include "radio/src/keys.cpp" #include "radio/src/simpgmspace.cpp" #include "radio/src/telemetry/frsky.cpp" +#include "radio/src/telemetry/frsky_d.cpp" #include "radio/src/templates.cpp" #include "radio/src/translations.cpp" #include "radio/src/fonts.cpp" diff --git a/radio/src/Makefile b/radio/src/Makefile index 6b528963b..25ae36ae9 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -310,7 +310,7 @@ ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) INCDIRS += targets/stock CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM64 -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) BOARDSRC = targets/stock/board_stock.cpp - EXTRABOARDSRC = targets/stock/lcd_driver.cpp + EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp PULSESSRC = protocols/pulses_avr.cpp @@ -373,7 +373,7 @@ ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128)) CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM128 -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) INCDIRS += targets/stock BOARDSRC = targets/stock/board_stock.cpp - EXTRABOARDSRC = targets/stock/lcd_driver.cpp + EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp PULSESSRC = protocols/pulses_avr.cpp @@ -432,7 +432,7 @@ ifeq ($(PCB), $(filter $(PCB), 9X2561)) CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM2561 -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) INCDIRS += targets/stock BOARDSRC = targets/stock/board_stock.cpp - EXTRABOARDSRC = targets/stock/lcd_driver.cpp + EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp PULSESSRC = protocols/pulses_avr.cpp @@ -492,7 +492,7 @@ ifeq ($(PCB), GRUVIN9X) THR_TRACE = YES INCDIRS += targets/gruvin9x targets/stock FatFs FatFs/option BOARDSRC = targets/gruvin9x/board_gruvin9x.cpp - EXTRABOARDSRC = targets/stock/lcd_driver.cpp + EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp PULSESSRC = protocols/pulses_avr.cpp CPPSRC += audio_avr.cpp haptic.cpp @@ -530,7 +530,7 @@ ifeq ($(PCB), MEGA2560) THR_TRACE = YES INCDIRS += targets/mega2560 targets/stock FatFs FatFs/option BOARDSRC = targets/mega2560/board_mega2560.cpp - EXTRABOARDSRC = targets/mega2560/lcd_driver_ST7565R.cpp + EXTRABOARDSRC = targets/mega2560/lcd_driver_ST7565R.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp PULSESSRC = protocols/pulses_avr.cpp CPPSRC += audio_avr.cpp @@ -660,7 +660,7 @@ ifeq ($(PCB), TARANIS) EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp PULSESSRC = protocols/pulses_arm.cpp protocols/ppm_arm.cpp protocols/pxx_arm.cpp CPPSRC += audio_arm.cpp - CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/uart3_driver.cpp targets/taranis/sport_driver.cpp + CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/uart3_driver.cpp targets/taranis/telemetry_driver.cpp CPPSRC += bmp.cpp gui/view_channels.cpp gui/view_about.cpp gui/view_text.cpp loadboot.cpp SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c @@ -928,11 +928,11 @@ endif ifeq ($(EXT), $(filter $(EXT), FRSKY TELEMETREZ)) CPPDEFS += -DFRSKY - ifeq ($(PCB), TARANIS) - CPPSRC += telemetry/frsky_sport.cpp + ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO TARANIS)) + CPPSRC += telemetry/frsky.cpp telemetry/frsky_sport.cpp telemetry/frsky_d.cpp CPPDEFS += -DFRSKY_SPORT else - CPPSRC += telemetry/frsky.cpp + CPPSRC += telemetry/frsky.cpp telemetry/frsky_d.cpp endif CPPSRC += gui/view_telemetry.cpp diff --git a/radio/src/eeprom_raw.cpp b/radio/src/eeprom_raw.cpp index a77d4ce6c..1b0189a82 100644 --- a/radio/src/eeprom_raw.cpp +++ b/radio/src/eeprom_raw.cpp @@ -385,7 +385,7 @@ void eeLoadModel(uint8_t id) read32_eeprom_data((File_system[id+1].block_no << 12) + sizeof(struct t_eeprom_header), (uint8_t *)&g_model, size) ; } - resetAll(); + flightReset(); if (pulsesStarted()) { checkAll(); diff --git a/radio/src/eeprom_rlc.cpp b/radio/src/eeprom_rlc.cpp index 55e048fa0..8b33da632 100644 --- a/radio/src/eeprom_rlc.cpp +++ b/radio/src/eeprom_rlc.cpp @@ -964,7 +964,7 @@ void eeLoadModel(uint8_t id) eeCheck(true); } - resetAll(); + flightReset(); if (pulsesStarted()) { checkAll(); diff --git a/radio/src/gtests.cpp b/radio/src/gtests.cpp index a9ef674c1..281ecc8e6 100644 --- a/radio/src/gtests.cpp +++ b/radio/src/gtests.cpp @@ -237,7 +237,7 @@ TEST(EEPROM, rm) } #if defined(FRSKY) && !defined(FRSKY_SPORT) -extern void processFrskyPacket(uint8_t *packet); +extern void frskyDProcessPacket(uint8_t *packet); TEST(FrSky, gpsNfuel) { g_model.frsky.usrProto = 1; @@ -250,13 +250,13 @@ TEST(FrSky, gpsNfuel) uint8_t pkt5[] = { 0xfd, 0x07, 0x00, 0x5e, 0x22, 0x45, 0x00, 0x5e, 0x11, 0x02 }; uint8_t pkt6[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x19, 0x93, 0x00, 0x5e, 0x04 }; uint8_t pkt7[] = { 0xfd, 0x03, 0x00, 0x64, 0x00, 0x5e }; - processFrskyPacket(pkt1); - processFrskyPacket(pkt2); - processFrskyPacket(pkt3); - processFrskyPacket(pkt4); - processFrskyPacket(pkt5); - processFrskyPacket(pkt6); - processFrskyPacket(pkt7); + frskyDProcessPacket(pkt1); + frskyDProcessPacket(pkt2); + frskyDProcessPacket(pkt3); + frskyDProcessPacket(pkt4); + frskyDProcessPacket(pkt5); + frskyDProcessPacket(pkt6); + frskyDProcessPacket(pkt7); EXPECT_EQ(frskyData.hub.gpsCourse_bp, 44); EXPECT_EQ(frskyData.hub.gpsCourse_ap, 03); EXPECT_EQ(frskyData.hub.gpsLongitude_bp / 100, 120); @@ -272,9 +272,9 @@ TEST(FrSky, dateNtime) uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x15, 0x0f, 0x07, 0x5e, 0x16, 0x0b }; uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x17, 0x06, 0x12, 0x5e, 0x18 }; uint8_t pkt3[] = { 0xfd, 0x03, 0x00, 0x32, 0x00, 0x5e }; - processFrskyPacket(pkt1); - processFrskyPacket(pkt2); - processFrskyPacket(pkt3); + frskyDProcessPacket(pkt1); + frskyDProcessPacket(pkt2); + frskyDProcessPacket(pkt3); EXPECT_EQ(frskyData.hub.day, 15); EXPECT_EQ(frskyData.hub.month, 07); EXPECT_EQ(frskyData.hub.year, 11); diff --git a/radio/src/gui/view_main.cpp b/radio/src/gui/view_main.cpp index cd77607f8..66ae9fbfe 100644 --- a/radio/src/gui/view_main.cpp +++ b/radio/src/gui/view_main.cpp @@ -446,10 +446,10 @@ void menuMainViewChannelsMonitor(uint8_t event) void onMainViewMenu(const char *result) { if (result == STR_RESET_TIMER1) { - resetTimer(0); + timerReset(0); } else if (result == STR_RESET_TIMER2) { - resetTimer(1); + timerReset(1); } #if defined(PCBTARANIS) else if (result == STR_VIEW_NOTES) { @@ -464,11 +464,11 @@ void onMainViewMenu(const char *result) #endif #if defined(FRSKY) else if (result == STR_RESET_TELEMETRY) { - resetTelemetry(); + telemetryReset(); } #endif else if (result == STR_RESET_FLIGHT) { - resetAll(); + flightReset(); } else if (result == STR_STATISTICS) { chainMenu(menuStatisticsView); @@ -630,7 +630,7 @@ void menuMainView(uint8_t event) #endif #if !defined(PCBTARANIS) if (view == VIEW_TIMER2) { - resetTimer(1); + timerReset(1); } #endif AUDIO_KEYPAD_UP(); @@ -638,7 +638,7 @@ void menuMainView(uint8_t event) #if !defined(NAVIGATION_MENUS) case EVT_KEY_LONG(KEY_EXIT): - resetAll(); + flightReset(); AUDIO_KEYPAD_UP(); break; #endif diff --git a/radio/src/gui/view_telemetry.cpp b/radio/src/gui/view_telemetry.cpp index bec74d1c1..cd3d09ed0 100644 --- a/radio/src/gui/view_telemetry.cpp +++ b/radio/src/gui/view_telemetry.cpp @@ -199,7 +199,7 @@ void menuTelemetryFrsky(uint8_t event) break; #else case EVT_KEY_FIRST(KEY_ENTER): - resetTelemetry(); + telemetryReset(); break; #endif } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index fe9791771..2546d0e10 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -856,7 +856,7 @@ enum Functions { enum ResetFunctionParam { FUNC_RESET_TIMER1, FUNC_RESET_TIMER2, - FUNC_RESET_ALL, + FUNC_RESET_FLIGHT, #if defined(FRSKY) FUNC_RESET_TELEMETRY, #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 29c6b1e2b..a8f07199d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1557,7 +1557,7 @@ uint16_t s_timeCum16ThrP; // THR% in 1/16 sec uint8_t trimsCheckTimer = 0; -void resetTimer(uint8_t idx) +void timerReset(uint8_t idx) { TimerState & timerState = timersStates[idx]; timerState.state = TMR_OFF; // is changed to RUNNING dep from mode @@ -1565,7 +1565,7 @@ void resetTimer(uint8_t idx) timerState.val_10ms = 0 ; } -void resetAll() +void flightReset() { static bool firstReset = true; if (firstReset) @@ -1573,10 +1573,10 @@ void resetAll() else AUDIO_RESET(); - resetTimer(0); - resetTimer(1); + timerReset(0); + timerReset(1); #if defined(FRSKY) - resetTelemetry(); + telemetryReset(); #endif for (uint8_t i=0; i 0 @@ -2483,7 +2483,7 @@ void opentxStart() void opentxClose() { #if defined(FRSKY) - FRSKY_End(); + // TODO needed? telemetryEnd(); #endif #if defined(SDCARD) @@ -3014,26 +3014,6 @@ ISR(TIMER3_CAPT_vect) // G: High frequency noise can cause stack overflo with IS } #endif -/* - USART0 Transmit Data Register Emtpy ISR - Used to transmit FrSky data packets and DSM2 protocol -*/ - -// TODO serial_arm and serial_avr - -#if defined(FRSKY) && !defined(CPUARM) -// TODO in frsky.cpp? -FORCEINLINE void FRSKY_USART0_vect() -{ - if (frskyTxBufferCount > 0) { - UDR0 = frskyTxBuffer[--frskyTxBufferCount]; - } - else { - UCSR0B &= ~(1 << UDRIE0); // disable UDRE0 interrupt - } -} -#endif - #if defined(DSM2_SERIAL) && !defined(CPUARM) FORCEINLINE void DSM2_USART0_vect() { @@ -3048,7 +3028,20 @@ FORCEINLINE void DSM2_USART0_vect() #endif #if !defined(SIMU) && !defined(CPUARM) + #if defined (FRSKY) || defined(DSM2_SERIAL) + +// USART0 Transmit Data Register Emtpy ISR +FORCEINLINE void FRSKY_USART0_vect() +{ + if (frskyTxBufferCount > 0) { + UDR0 = frskyTxBuffer[--frskyTxBufferCount]; + } + else { + UCSR0B &= ~(1 << UDRIE0); // disable UDRE0 interrupt + } +} + ISR(USART0_UDRE_vect) { #if defined(FRSKY) && defined(DSM2_SERIAL) @@ -3444,10 +3437,10 @@ int main(void) lcdSetRefVolt(25); - sei(); // interrupts needed for FRSKY_Init and eeReadAll. + sei(); // interrupts needed for telemetryInit and eeReadAll. #if defined(FRSKY) && !defined(DSM2_SERIAL) - FRSKY_Init(); + telemetryInit(); #endif #if defined(DSM2_SERIAL) && !defined(FRSKY) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index b84051bd7..1675c114c 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -490,6 +490,7 @@ enum PotType { #define MAX_TRAINER_CHANNELS() (8) #define MAX_CHANNELS(idx) (idx==0 ? MAX_PORT1_CHANNELS() : (idx==1 ? MAX_PORT2_CHANNELS() : MAX_TRAINER_CHANNELS())) #elif defined(PCBSKY9X) + #define IS_MODULE_XJT() (IS_PXX_PROTOCOL(g_model.protocol)) #define NUM_PORT1_CHANNELS() (IS_PXX_PROTOCOL(g_model.protocol) ? 8 : (IS_DSM2_PROTOCOL(g_model.protocol) ? 6 : (8+g_model.moduleData[0].channelsCount))) #define NUM_PORT2_CHANNELS() (8+g_model.moduleData[1].channelsCount) #define NUM_CHANNELS(idx) (idx==0 ? NUM_PORT1_CHANNELS() : (8+g_model.moduleData[idx].channelsCount)) @@ -813,8 +814,8 @@ extern int16_t csLastValue[NUM_LOGICAL_SWITCH]; #define TMR_RUNNING 1 #define TMR_NEGATIVE 2 #define TMR_STOPPED 3 -void resetTimer(uint8_t idx); -void resetAll(); +void timerReset(uint8_t idx); +void flightReset(); extern uint8_t unexpectedShutdown; extern uint8_t g_tmr1Latency_max; @@ -1231,10 +1232,7 @@ inline bool isFunctionActive(uint8_t func) extern volatile rotenc_t g_rotenc[1]; #endif -#if defined(FRSKY_SPORT) - // FrSky SPORT Telemetry - #include "telemetry/frsky_sport.h" -#elif defined (FRSKY) +#if defined (FRSKY) // FrSky Telemetry #include "telemetry/frsky.h" #elif defined(JETI) diff --git a/radio/src/protocols/pulses_avr.cpp b/radio/src/protocols/pulses_avr.cpp index 707eac8c9..666dcb82b 100644 --- a/radio/src/protocols/pulses_avr.cpp +++ b/radio/src/protocols/pulses_avr.cpp @@ -743,7 +743,7 @@ void setupPulses() #if defined(DSM2_SERIAL) && defined(FRSKY) if (s_current_protocol[0] == 255 || IS_DSM2_PROTOCOL(s_current_protocol[0])) { - FRSKY_Init(); + telemetryInit(); } #endif diff --git a/radio/src/targets/common_avr/board_avr.h b/radio/src/targets/common_avr/board_avr.h new file mode 100755 index 000000000..3edaddca8 --- /dev/null +++ b/radio/src/targets/common_avr/board_avr.h @@ -0,0 +1,39 @@ +/* + * Authors (alphabetical order) + * - Andre Bernet + * - Andreas Weitl + * - Bertrand Songis + * - Bryan J. Rentoul (Gruvin) + * - Cameron Weeks + * - Erez Raviv + * - Gabriel Birkus + * - Jean-Pierre Parisy + * - Karl Szmutny + * - Michael Blandford + * - Michal Hlavinka + * - Pat Mackenzie + * - Philip Moss + * - Rob Thomson + * - Romolo Manfredini + * - Thomas Husterer + * + * opentx is based on code named + * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, + * er9x by Erez Raviv: http://code.google.com/p/er9x/, + * and the original (and ongoing) project by + * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +// Telemetry driver +void telemetryPortInit(); +void telemetryTransmitBuffer(); diff --git a/radio/src/targets/common_avr/telemetry_driver.cpp b/radio/src/targets/common_avr/telemetry_driver.cpp new file mode 100644 index 000000000..9762ee55d --- /dev/null +++ b/radio/src/targets/common_avr/telemetry_driver.cpp @@ -0,0 +1,142 @@ +/* + * Authors (alphabetical order) + * - Andre Bernet + * - Andreas Weitl + * - Bertrand Songis + * - Bryan J. Rentoul (Gruvin) + * - Cameron Weeks + * - Erez Raviv + * - Gabriel Birkus + * - Jean-Pierre Parisy + * - Karl Szmutny + * - Michael Blandford + * - Michal Hlavinka + * - Pat Mackenzie + * - Philip Moss + * - Rob Thomson + * - Romolo Manfredini + * - Thomas Husterer + * + * opentx is based on code named + * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, + * er9x by Erez Raviv: http://code.google.com/p/er9x/, + * and the original (and ongoing) project by + * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include "../../opentx.h" + +#if defined(FRSKY) + +void telemetryEnableTx(void) +{ + UCSR0B |= (1 << TXEN0); // enable TX +} + +void telemetryEnableRx(void) +{ + UCSR0B |= (1 << RXEN0); // enable RX + UCSR0B |= (1 << RXCIE0); // enable Interrupt +} + +void processSerialData(uint8_t data); +extern uint8_t numPktBytes; // TODO not driver, change name + +ISR(USART0_RX_vect) +{ + uint8_t stat; + uint8_t data; + + UCSR0B &= ~(1 << RXCIE0); // disable Interrupt + sei(); + + stat = UCSR0A; // USART control and Status Register 0 A + + /* + bit 7 6 5 4 3 2 1 0 + RxC0 TxC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0 + + RxC0: Receive complete + TXC0: Transmit Complete + UDRE0: USART Data Register Empty + FE0: Frame Error + DOR0: Data OverRun + UPE0: USART Parity Error + U2X0: Double Tx Speed + PCM0: MultiProcessor Comms Mode + */ + // rh = UCSR0B; //USART control and Status Register 0 B + + /* + bit 7 6 5 4 3 2 1 0 + RXCIE0 TxCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80 + + RxCIE0: Receive Complete int enable + TXCIE0: Transmit Complete int enable + UDRIE0: USART Data Register Empty int enable + RXEN0: Rx Enable + TXEN0: Tx Enable + UCSZ02: Character Size bit 2 + RXB80: Rx data bit 8 + TXB80: Tx data bit 8 + */ + + data = UDR0; // USART data register 0 + + if (stat & ((1 << FE0) | (1 << DOR0) | (1 << UPE0))) { + // discard buffer and start fresh on any comms error + numPktBytes = 0; + } + else { + processSerialData(data); + } + + cli() ; + UCSR0B |= (1 << RXCIE0); // enable Interrupt +} + +void telemetryPortInit() +{ +#if !defined(SIMU) + DDRE &= ~(1 << DDE0); // set RXD0 pin as input + PORTE &= ~(1 << PORTE0); // disable pullup on RXD0 pin + + #undef BAUD + #define BAUD 9600 + #include + + UBRR0H = UBRRH_VALUE; + UBRR0L = UBRRL_VALUE; + UCSR0A &= ~(1 << U2X0); // disable double speed operation. + + // set 8N1 + UCSR0B = 0 | (0 << RXCIE0) | (0 << TXCIE0) | (0 << UDRIE0) | (0 << RXEN0) | (0 << TXEN0) | (0 << UCSZ02); + UCSR0C = 0 | (1 << UCSZ01) | (1 << UCSZ00); + + + while (UCSR0A & (1 << RXC0)) UDR0; // flush receive buffer + + // These should be running right from power up on a FrSky enabled '9X. + telemetryEnableTx(); // enable FrSky-Telemetry emission + frskyTxBufferCount = 0; // TODO not driver code + + telemetryEnableRx(); // enable FrSky-Telemetry reception +#endif +} + +void telemetryTransmitBuffer() +{ + UCSR0B |= (1 << UDRIE0); // enable UDRE0 interrupt +} + +#endif diff --git a/radio/src/targets/gruvin9x/board_gruvin9x.h b/radio/src/targets/gruvin9x/board_gruvin9x.h index f44ba4ba6..0a3aa2ba8 100644 --- a/radio/src/targets/gruvin9x/board_gruvin9x.h +++ b/radio/src/targets/gruvin9x/board_gruvin9x.h @@ -37,6 +37,8 @@ #ifndef board_gruvin9x_h #define board_gruvin9x_h +#include "../common_avr/board_avr.h" + #define GPIO_BUTTON_MENU pinl #define GPIO_BUTTON_EXIT pinl #define GPIO_BUTTON_RIGHT pinl diff --git a/radio/src/targets/mega2560/board_mega2560.h b/radio/src/targets/mega2560/board_mega2560.h index dcaf703de..f184143e8 100644 --- a/radio/src/targets/mega2560/board_mega2560.h +++ b/radio/src/targets/mega2560/board_mega2560.h @@ -37,6 +37,8 @@ #ifndef board_mega2560_h #define board_mega2560_h +#include "../common_avr/board_avr.h" + #define GPIO_BUTTON_MENU pinl #define GPIO_BUTTON_EXIT pinl #define GPIO_BUTTON_RIGHT pinl diff --git a/radio/src/targets/sky9x/board_sky9x.cpp b/radio/src/targets/sky9x/board_sky9x.cpp index ca9f34d69..cdd996404 100644 --- a/radio/src/targets/sky9x/board_sky9x.cpp +++ b/radio/src/targets/sky9x/board_sky9x.cpp @@ -59,15 +59,6 @@ volatile uint32_t lcdInputs; /** Pins description corresponding to Rxd,Txd, (UART pins) */ #define CONSOLE_PINS {PINS_UART} -/** Second serial baudrate 9600. */ -#define SECOND_BAUDRATE 9600 -/** Usart Hw interface used by the console (UART0). */ -#define SECOND_USART USART0 -/** Usart Hw ID used by the console (UART0). */ -#define SECOND_ID ID_USART0 -/** Pins description corresponding to Rxd,Txd, (UART pins) */ -#define SECOND_PINS {PINS_USART0} - extern "C" void sam_boot( void ) ; // Prototype @@ -619,9 +610,6 @@ void boardInit() #endif init_SDcard(); - - UART2_Configure(9600, Master_frequency); - startPdcUsartReceive(); } #endif diff --git a/radio/src/targets/sky9x/board_sky9x.h b/radio/src/targets/sky9x/board_sky9x.h index 3d78a920c..86387943d 100644 --- a/radio/src/targets/sky9x/board_sky9x.h +++ b/radio/src/targets/sky9x/board_sky9x.h @@ -147,6 +147,11 @@ void usbMassStorage(); #define PIN_LOW 0x000 #define PIN_HIGH 0x100 +// Telemetry port +#define SECOND_USART USART0 +#define SECOND_ID ID_USART0 +#define SECOND_PINS {PINS_USART0} + void configure_pins( uint32_t pins, uint16_t config ); uint16_t getCurrent(); @@ -285,7 +290,8 @@ void rotencEnd(); void debugPutc(const char c); // Telemetry driver -void UART2_Configure(uint32_t baudrate, uint32_t masterClock); -void startPdcUsartReceive(); +void telemetryPortInit(uint32_t baudrate); +uint32_t telemetryTransmitPending(); +void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size); #endif diff --git a/radio/src/targets/sky9x/telemetry_driver.cpp b/radio/src/targets/sky9x/telemetry_driver.cpp index e49fb3cb0..de1c8fd32 100755 --- a/radio/src/targets/sky9x/telemetry_driver.cpp +++ b/radio/src/targets/sky9x/telemetry_driver.cpp @@ -117,7 +117,7 @@ void startPdcUsartReceive() pUsart->US_RCR = RX_UART_BUFFER_SIZE ; pUsart->US_RNCR = RX_UART_BUFFER_SIZE ; pUsart->US_PTCR = US_PTCR_RXTEN ; - TelemetryActiveBuffer = 0 ; + TelemetryActiveBuffer = 0; } void rxPdcUsart( void (*pChProcess)(uint8_t x) ) @@ -158,7 +158,7 @@ void rxPdcUsart( void (*pChProcess)(uint8_t x) ) #endif } -uint32_t txPdcUsart( uint8_t *buffer, uint32_t size ) +uint32_t txPdcUsart(uint8_t *buffer, uint32_t size) { register Usart *pUsart = SECOND_USART; @@ -174,7 +174,7 @@ uint32_t txPdcUsart( uint8_t *buffer, uint32_t size ) return 0 ; } -uint32_t txPdcPending() +uint32_t telemetryTransmitPending() { register Usart *pUsart = SECOND_USART; uint32_t x ; @@ -188,3 +188,14 @@ uint32_t txPdcPending() return x ; } + +void telemetryPortInit(uint32_t baudrate) +{ + UART2_Configure(baudrate, Master_frequency); + startPdcUsartReceive(); +} + +void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size) +{ + txPdcUsart(buffer, size); +} diff --git a/radio/src/targets/stock/board_stock.h b/radio/src/targets/stock/board_stock.h index e0f7b33c7..3e988d43a 100644 --- a/radio/src/targets/stock/board_stock.h +++ b/radio/src/targets/stock/board_stock.h @@ -37,6 +37,8 @@ #ifndef board_stock_h #define board_stock_h +#include "../common_avr/board_avr.h" + #define GPIO_BUTTON_MENU pinb #define GPIO_BUTTON_EXIT pinb #define GPIO_BUTTON_RIGHT pinb diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index 5efac5549..60e24b8fa 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -157,7 +157,6 @@ void boardInit() init5msTimer(); __enable_irq(); eepromInit(); - sportInit(); usbInit(); #if defined(HAPTIC) diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 3f071e8c3..0bbe2c79c 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -114,13 +114,10 @@ extern uint16_t sessionTimer; void delaysInit(void); #define DEBUG_BAUDRATE 115200 -#define SPORT_BAUDRATE 57600 void uart3Init(unsigned int mode); void uart3Putc(const char c); -void sportInit(void); - void delaysInit(void); void delay_01us(uint16_t nb); @@ -246,6 +243,9 @@ void eeWriteBlockCmp(const void *pointer_ram, uint16_t pointer_eeprom, size_t si // Debug driver void debugPutc(const char c); +// Telemetry driver +void telemetryPortInit(uint32_t baudrate); + // Haptic driver void hapticInit(void); void hapticOff(void); diff --git a/radio/src/targets/taranis/sport_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp similarity index 93% rename from radio/src/targets/taranis/sport_driver.cpp rename to radio/src/targets/taranis/telemetry_driver.cpp index 414a01ed8..9f93b81f5 100644 --- a/radio/src/targets/taranis/sport_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -38,7 +38,7 @@ extern Fifo<512> telemetryFifo; -void sportInit(void) +void telemetryPortInit(uint32_t baudrate) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -66,7 +66,7 @@ void sportInit(void) RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPORT, ENABLE); - USART_InitStructure.USART_BaudRate = SPORT_BAUDRATE; + 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; @@ -81,7 +81,7 @@ void sportInit(void) NVIC_SetPriority(USART2_IRQn, 6); } -void sportPutc(const char c) +void telemetryPutc(const char c) { GPIO_SetBits(GPIO_PIN_SPORT_ON, PIN_SPORT_ON); USART_SendData(SPORT, c); diff --git a/radio/src/targets/taranis/uart3_driver.cpp b/radio/src/targets/taranis/uart3_driver.cpp index 00a0d8891..1776cfc6a 100644 --- a/radio/src/targets/taranis/uart3_driver.cpp +++ b/radio/src/targets/taranis/uart3_driver.cpp @@ -78,7 +78,7 @@ void uart3Init(unsigned int mode) switch(mode) { case UART_MODE_SPORT: - uart3Setup(SPORT_BAUDRATE); + uart3Setup(FRSKY_SPORT_BAUDRATE); break; #if defined(DEBUG) case UART_MODE_DEBUG: diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 19b5069a8..d8af13ca5 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -36,359 +36,98 @@ #include "../opentx.h" -// Enumerate FrSky packet codes -#define LINKPKT 0xfe -#define USRPKT 0xfd -#define A11PKT 0xfc -#define A12PKT 0xfb -#define A21PKT 0xfa -#define A22PKT 0xf9 -#define ALRM_REQUEST 0xf8 -#define RSSI1PKT 0xf7 -#define RSSI2PKT 0xf6 -#define RSSI_REQUEST 0xf1 - -#define START_STOP 0x7e -#define BYTESTUFF 0x7d -#define STUFF_MASK 0x20 - -#if defined(TELEMETREZ) -#define PRIVATE 0x1B -#endif - -uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) -uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; // Ditto for transmit buffer -#if !defined(CPUARM) -uint8_t frskyTxBufferCount = 0; -#endif uint8_t frskyStreaming = 0; + #if defined(WS_HOW_HIGH) uint8_t frskyUsrStreaming = 0; #endif + uint8_t link_counter = 0; + +#define FRSKY_RX_PACKET_SIZE 19 +uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) + +#if !defined(PCBTARANIS) +uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; +#endif + +#if !defined(CPUARM) +uint8_t frskyTxBufferCount = 0; +#endif + +#if defined(CPUARM) +uint8_t telemetryState = TELEMETRY_INIT; +#endif + +#if defined(PCBTARANIS) +Fifo<512> telemetryFifo; // TODO should be in the driver +#endif + +uint8_t numPktBytes = 0; // TODO rename + FrskyData frskyData; -#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) -void checkMinMaxAltitude() +void FrskyValueWithMin::set(uint8_t value) { - if (TELEMETRY_RELATIVE_BARO_ALT_BP > frskyData.hub.maxAltitude) - frskyData.hub.maxAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; - if (TELEMETRY_RELATIVE_BARO_ALT_BP < frskyData.hub.minAltitude) - frskyData.hub.minAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; -} -#endif - -#if defined(VARIO) && !defined(FRSKY_SPORT) && (defined(FRSKY_HUB) || defined(WS_HOW_HIGH)) -void evalVario(int16_t altitude_bp, uint16_t altitude_ap) -{ - int32_t varioAltitude_cm = (int32_t)altitude_bp * 100 + (altitude_bp > 0 ? altitude_ap : -altitude_ap); - uint8_t varioAltitudeQueuePointer = frskyData.hub.varioAltitudeQueuePointer + 1; - if (varioAltitudeQueuePointer >= VARIO_QUEUE_LENGTH) - varioAltitudeQueuePointer = 0; - frskyData.hub.varioAltitudeQueuePointer = varioAltitudeQueuePointer; - frskyData.hub.varioSpeed -= frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ; - frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.hub.varioAltitude_cm; - frskyData.hub.varioAltitude_cm = varioAltitude_cm; - frskyData.hub.varioSpeed += frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ; -} -#else -#define evalVario(...) -#endif - -#if defined(FRSKY_HUB) -typedef enum { - TS_IDLE = 0, // waiting for 0x5e frame marker - TS_DATA_ID, // waiting for dataID - TS_DATA_LOW, // waiting for data low byte - TS_DATA_HIGH, // waiting for data high byte - TS_XOR = 0x80 // decode stuffed byte -} TS_STATE; - -void parseTelemHubByte(uint8_t byte) -{ - static int8_t structPos; - static uint8_t lowByte; - static TS_STATE state = TS_IDLE; - - if (byte == 0x5e) { - state = TS_DATA_ID; - return; - } - if (state == TS_IDLE) { - return; - } - if (state & TS_XOR) { - byte = byte ^ 0x60; - state = (TS_STATE)(state - TS_XOR); - } - if (byte == 0x5d) { - state = (TS_STATE)(state | TS_XOR); - return; - } - if (state == TS_DATA_ID) { - if (byte > 0x3f) { - state = TS_IDLE; - } - else { - structPos = byte*2; - state = TS_DATA_LOW; - } - return; - } - if (state == TS_DATA_LOW) { - lowByte = byte; - state = TS_DATA_HIGH; - return; - } - - state = TS_IDLE; - -#if defined(GPS) - if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLatitude_bp)) { - if (lowByte || byte) - frskyData.hub.gpsFix = 1; - else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLatitude_bp > 1) - frskyData.hub.gpsFix = 0; - } - else if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLongitude_bp)) { - if (lowByte || byte) - frskyData.hub.gpsFix = 1; - else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLongitude_bp > 1) - frskyData.hub.gpsFix = 0; - } - - if ((uint8_t)structPos == offsetof(FrskySerialData, gpsAltitude_bp) || - ((uint8_t)structPos >= offsetof(FrskySerialData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskySerialData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_ap))) { - // If we don't have a fix, we may discard the value - if (frskyData.hub.gpsFix <= 0) - return; - } -#endif - -#if 0 - uint16_t previousValue = *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)); -#endif - - ((uint8_t*)&frskyData.hub)[structPos] = lowByte; - ((uint8_t*)&frskyData.hub)[structPos+1] = byte; - - switch ((uint8_t)structPos) { - - case offsetof(FrskySerialData, rpm): - frskyData.hub.rpm *= (uint8_t)60/(g_model.frsky.blades+2); - if (frskyData.hub.rpm > frskyData.hub.maxRpm) - frskyData.hub.maxRpm = frskyData.hub.rpm; - break; - - case offsetof(FrskySerialData, temperature1): - if (frskyData.hub.temperature1 > frskyData.hub.maxTemperature1) - frskyData.hub.maxTemperature1 = frskyData.hub.temperature1; - break; - - case offsetof(FrskySerialData, temperature2): - if (frskyData.hub.temperature2 > frskyData.hub.maxTemperature2) - frskyData.hub.maxTemperature2 = frskyData.hub.temperature2; - break; - - case offsetof(FrskySerialData, current): -#if defined(FAS_OFFSET) || !defined(CPUM64) - if ((int16_t)frskyData.hub.current > 0 && ((int16_t)frskyData.hub.current + g_model.frsky.fasOffset) > 0) - frskyData.hub.current += g_model.frsky.fasOffset; - else - frskyData.hub.current = 0; -#endif - if (frskyData.hub.current > frskyData.hub.maxCurrent) - frskyData.hub.maxCurrent = frskyData.hub.current; - break; - - case offsetof(FrskySerialData, currentConsumption): - // we receive data from openXsensor. stops the calculation of consumption and power - frskyData.hub.openXsensor = 1; - break; - - case offsetof(FrskySerialData, volts_ap): -#if defined(FAS_BSS) - frskyData.hub.vfas = (frskyData.hub.volts_bp * 10 + frskyData.hub.volts_ap); -#else - frskyData.hub.vfas = ((frskyData.hub.volts_bp * 100 + frskyData.hub.volts_ap * 10) * 21) / 110; -#endif - /* TODO later if (!frskyData.hub.minVfas || frskyData.hub.minVfas > frskyData.hub.vfas) - frskyData.hub.minVfas = frskyData.hub.vfas; */ - break; - - case offsetof(FrskySerialData, baroAltitude_bp): - // First received barometer altitude => Altitude offset - if (!frskyData.hub.baroAltitudeOffset) - frskyData.hub.baroAltitudeOffset = -frskyData.hub.baroAltitude_bp; - if (g_model.frsky.varioSource == VARIO_SOURCE_ALTI) { - evalVario(frskyData.hub.baroAltitude_bp, 0); - } - frskyData.hub.baroAltitude_bp += frskyData.hub.baroAltitudeOffset; - checkMinMaxAltitude(); - break; - - case offsetof(FrskySerialData, baroAltitude_ap): - if (g_model.frsky.varioSource == VARIO_SOURCE_ALTI_PLUS) { - evalVario(frskyData.hub.baroAltitude_bp-frskyData.hub.baroAltitudeOffset, frskyData.hub.baroAltitude_ap); - } - break; - -#if defined(GPS) - case offsetof(FrskySerialData, gpsAltitude_ap): - if (!frskyData.hub.gpsAltitudeOffset) - frskyData.hub.gpsAltitudeOffset = -frskyData.hub.gpsAltitude_bp; - frskyData.hub.gpsAltitude_bp += frskyData.hub.gpsAltitudeOffset; - if (!frskyData.hub.baroAltitudeOffset) { - if (frskyData.hub.gpsAltitude_bp > frskyData.hub.maxAltitude) - frskyData.hub.maxAltitude = frskyData.hub.gpsAltitude_bp; - if (frskyData.hub.gpsAltitude_bp < frskyData.hub.minAltitude) - frskyData.hub.minAltitude = frskyData.hub.gpsAltitude_bp; - } - if (!frskyData.hub.pilotLatitude && !frskyData.hub.pilotLongitude) { - // First received GPS position => Pilot GPS position - getGpsPilotPosition(); - } - else if (frskyData.hub.gpsDistNeeded || g_menuStack[g_menuStackPtr] == menuTelemetryFrsky) { - getGpsDistance(); - } - break; - - case offsetof(FrskySerialData, gpsSpeed_bp): - // Speed => Max speed - if (frskyData.hub.gpsSpeed_bp > frskyData.hub.maxGpsSpeed) - frskyData.hub.maxGpsSpeed = frskyData.hub.gpsSpeed_bp; - break; -#endif - - case offsetof(FrskySerialData, volts): - // Voltage => Cell number + Cell voltage - { - uint8_t battnumber = ((frskyData.hub.volts & 0x00F0) >> 4); - if (battnumber < 12) { - if (frskyData.hub.cellsCount < battnumber+1) { - frskyData.hub.cellsCount = battnumber+1; - } - uint8_t cellVolts = (uint8_t)(((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8)))/10); - frskyData.hub.cellVolts[battnumber] = cellVolts; - if (!frskyData.hub.minCellVolts || cellVolts < frskyData.hub.minCellVolts || battnumber==frskyData.hub.minCellIdx) { - frskyData.hub.minCellIdx = battnumber; - frskyData.hub.minCellVolts = cellVolts; - } - } - break; - } - -#if defined(GPS) - case offsetof(FrskySerialData, hour): - frskyData.hub.hour = ((uint8_t)(frskyData.hub.hour + g_eeGeneral.timezone + 24)) % 24; - break; -#endif - - case offsetof(FrskySerialData, accelX): - case offsetof(FrskySerialData, accelY): - case offsetof(FrskySerialData, accelZ): - *(int16_t*)(&((uint8_t*)&frskyData.hub)[structPos]) /= 10; - break; - -#if 0 - case offsetof(FrskySerialData, gpsAltitude_bp): - case offsetof(FrskySerialData, fuelLevel): - case offsetof(FrskySerialData, gpsLongitude_bp): - case offsetof(FrskySerialData, gpsLatitude_bp): - case offsetof(FrskySerialData, gpsCourse_bp): - case offsetof(FrskySerialData, day): - case offsetof(FrskySerialData, year): - case offsetof(FrskySerialData, sec): - case offsetof(FrskySerialData, gpsSpeed_ap): - case offsetof(FrskySerialData, gpsLongitude_ap): - case offsetof(FrskySerialData, gpsLatitude_ap): - case offsetof(FrskySerialData, gpsCourse_ap): - case offsetof(FrskySerialData, gpsLongitudeEW): - case offsetof(FrskySerialData, gpsLatitudeNS): - case offsetof(FrskySerialData, varioSpeed): - case offsetof(FrskySerialData, power): /* because sent by openXsensor */ - case offsetof(FrskySerialData, vfas): - case offsetof(FrskySerialData, volts_bp): - break; - - default: - *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)) = previousValue; - break; -#endif - } -} -#endif - -#if defined(WS_HOW_HIGH) -void parseTelemWSHowHighByte(uint8_t byte) -{ - if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) { - ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)] = byte; - checkMinMaxAltitude(); - if (g_model.frsky.varioSource == VARIO_SOURCE_ALTI) { - evalVario(frskyData.hub.baroAltitude_bp, 0); - } + if (this->value == 0) { + this->value = value; } else { - // At least 100mS passed since last data received - ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)+1] = byte; - } - // baroAltitude_bp unit here is feet! - frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter -} -#endif - -void processFrskyPacket(uint8_t *packet) -{ - // What type of packet? - switch (packet[0]) - { - case LINKPKT: // A1/A2/RSSI values - { - link_counter += 32; - frskyData.analog[0].set(packet[1], g_model.frsky.channels[0].type); - frskyData.analog[1].set(packet[2], g_model.frsky.channels[1].type); - frskyData.rssi[0].set(packet[3]); - frskyData.rssi[1].set(packet[4] / 2); - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected -#if defined(VARIO) - uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1; - if (varioSource < 2) - frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value); -#endif - break; + sum += value; + if (link_counter == 0) { + this->value = sum / 8; + sum = 0; } -#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH) - case USRPKT: // User Data packet - uint8_t numBytes = 3 + (packet[1] & 0x07); // sanitize in case of data corruption leading to buffer overflow - for (uint8_t i=3; ivalue = value; + } + if (!max || value > max) { + max = value; + } +} + +#if defined(CPUARM) +enum TelemetryProtocol +{ + PROTOCOL_NONE, + PROTOCOL_FRSKY_D, + PROTOCOL_FRSKY_SPORT, }; +TelemetryProtocol telemetryProtocol = PROTOCOL_NONE; + +TelemetryProtocol getTelemetryProtocol() +{ +#if defined(PCBTARANIS) + if (IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) + return PROTOCOL_FRSKY_SPORT; +#elif defined(PCBSKY9X) + if (IS_MODULE_XJT()) + return PROTOCOL_FRSKY_SPORT; +#endif + return PROTOCOL_FRSKY_D; +} +#endif + +#if defined(CPUARM) +inline bool alarmRaised(uint8_t channel, uint8_t idx) +{ + return g_model.frsky.channels[channel].ratio > 0 && g_model.frsky.channels[channel].alarms_value[idx] > 0 && frskyData.analog[channel].value < g_model.frsky.channels[channel].alarms_value[idx]; +} +#endif + #if defined(TELEMETREZ) +#define PRIVATE 0x1B uint8_t privateDataLen; uint8_t privateDataPos; #endif @@ -398,27 +137,8 @@ extern uint8_t TrotCount; extern uint8_t TezRotary; #endif -/* - Receive serial (RS-232) characters, detecting and storing each Fr-Sky - 0x7e-framed packet as it arrives. When a complete packet has been - received, process its data into storage variables. NOTE: This is an - interrupt routine and should not get too lengthy. I originally had - the buffer being checked in the perMain function (because per10ms - isn't quite often enough for data streaming at 9600baud) but alas - that scheme lost packets also. So each packet is parsed as it arrives, - directly at the ISR function (through a call to frskyProcessPacket). - - If this proves a problem in the future, then I'll just have to implement - a second buffer to receive data while one buffer is being processed (slowly). -*/ - -#if defined(CPUARM) -void processSerialData(uint8_t data) -#else -NOINLINE void processSerialData(uint8_t stat, uint8_t data) -#endif +NOINLINE void processSerialData(uint8_t data) { - static uint8_t numPktBytes = 0; static uint8_t dataState = STATE_DATA_IDLE; #if defined(BLUETOOTH) @@ -426,270 +146,242 @@ NOINLINE void processSerialData(uint8_t stat, uint8_t data) btPushByte(data); #endif -#if !defined(CPUARM) - if (stat & ((1 << FE0) | (1 << DOR0) | (1 << UPE0))) { - // discard buffer and start fresh on any comms error - numPktBytes = 0; - } - else -#endif + switch (dataState) { - switch (dataState) - { - case STATE_DATA_START: - if (data == START_STOP) break; // Remain in userDataStart if possible 0x7e,0x7e doublet found. - - if (numPktBytes < FRSKY_RX_PACKET_SIZE) - frskyRxBuffer[numPktBytes++] = data; - dataState = STATE_DATA_IN_FRAME; - break; - - case STATE_DATA_IN_FRAME: - if (data == BYTESTUFF) - { - dataState = STATE_DATA_XOR; // XOR next byte - break; - } - if (data == START_STOP) // end of frame detected - { - processFrskyPacket(frskyRxBuffer); - dataState = STATE_DATA_IDLE; - break; - } - if (numPktBytes < FRSKY_RX_PACKET_SIZE) - frskyRxBuffer[numPktBytes++] = data; - break; - - case STATE_DATA_XOR: - if (numPktBytes < FRSKY_RX_PACKET_SIZE) - frskyRxBuffer[numPktBytes++] = data ^ STUFF_MASK; - dataState = STATE_DATA_IN_FRAME; - break; - - case STATE_DATA_IDLE: - if (data == START_STOP) { + case STATE_DATA_START: + if (data == START_STOP) { +#if defined(FRSKY_SPORT) + if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + dataState = STATE_DATA_IN_FRAME ; numPktBytes = 0; - dataState = STATE_DATA_START; - } -#if defined(TELEMETREZ) - if (data == PRIVATE) { - dataState = STATE_DATA_PRIVATE_LEN; } #endif - break; + } + else { + if (numPktBytes < FRSKY_RX_PACKET_SIZE) { + frskyRxBuffer[numPktBytes++] = data; + } + dataState = STATE_DATA_IN_FRAME; + } + break; -#if defined(TELEMETREZ) - case STATE_DATA_PRIVATE_LEN: - dataState = STATE_DATA_PRIVATE_VALUE; - privateDataLen = data; // Count of bytes to receive - privateDataPos = 0; - break; - - case STATE_DATA_PRIVATE_VALUE : - if (privateDataPos == 0) { - // Process first private data byte - // PC6, PC7 - if ((data & 0x3F) == 0) {// Check byte is valid - DDRC |= 0xC0; // Set as outputs - PORTC = ( PORTC & 0x3F ) | ( data & 0xC0 ); // update outputs - } + case STATE_DATA_IN_FRAME: + if (data == BYTESTUFF) { + dataState = STATE_DATA_XOR; // XOR next byte + } + else if (data == START_STOP) { +#if defined(FRSKY_SPORT) + if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + dataState = STATE_DATA_IN_FRAME ; + numPktBytes = 0; } -#if defined(ROTARY_ENCODER_NAVIGATION) - if (privateDataPos == 1) { - TrotCount = data; - } - if (privateDataPos == 2) { // rotary encoder switch - RotEncoder = data; - } -#endif - if (++privateDataPos == privateDataLen) { + else { + // end of frame detected + frskyDProcessPacket(frskyRxBuffer); dataState = STATE_DATA_IDLE; } +#else + // end of frame detected + frskyDProcessPacket(frskyRxBuffer); + dataState = STATE_DATA_IDLE; +#endif break; + } + else if (numPktBytes < FRSKY_RX_PACKET_SIZE) { + frskyRxBuffer[numPktBytes++] = data; + } + break; + + case STATE_DATA_XOR: + if (numPktBytes < FRSKY_RX_PACKET_SIZE) { + frskyRxBuffer[numPktBytes++] = data ^ STUFF_MASK; + } + dataState = STATE_DATA_IN_FRAME; + break; + + case STATE_DATA_IDLE: + if (data == START_STOP) { + numPktBytes = 0; + dataState = STATE_DATA_START; + } +#if defined(TELEMETREZ) + if (data == PRIVATE) { + dataState = STATE_DATA_PRIVATE_LEN; + } #endif - } // switch + break; + +#if defined(TELEMETREZ) + case STATE_DATA_PRIVATE_LEN: + dataState = STATE_DATA_PRIVATE_VALUE; + privateDataLen = data; // Count of bytes to receive + privateDataPos = 0; + break; + + case STATE_DATA_PRIVATE_VALUE : + if (privateDataPos == 0) { + // Process first private data byte + // PC6, PC7 + if ((data & 0x3F) == 0) {// Check byte is valid + DDRC |= 0xC0; // Set as outputs + PORTC = ( PORTC & 0x3F ) | ( data & 0xC0 ); // update outputs + } + } +#if defined(ROTARY_ENCODER_NAVIGATION) + if (privateDataPos == 1) { + TrotCount = data; + } + if (privateDataPos == 2) { // rotary encoder switch + RotEncoder = data; + } +#endif + if (++privateDataPos == privateDataLen) { + dataState = STATE_DATA_IDLE; + } + break; +#endif + } // switch + +#if defined(FRSKY_SPORT) + if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && numPktBytes >= FRSKY_SPORT_PACKET_SIZE) { + frskySportProcessPacket(frskyRxBuffer); + dataState = STATE_DATA_IDLE; } +#endif } -#if !defined(CPUARM) && !defined(SIMU) -ISR(USART0_RX_vect) +void telemetryWakeup() { - uint8_t stat; +#if defined(CPUARM) + if (telemetryProtocol != getTelemetryProtocol()) { + telemetryInit(); + } +#endif + +#if defined(PCBTARANIS) uint8_t data; - - UCSR0B &= ~(1 << RXCIE0); // disable Interrupt - sei(); - - stat = UCSR0A; // USART control and Status Register 0 A - - /* - bit 7 6 5 4 3 2 1 0 - RxC0 TxC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0 - - RxC0: Receive complete - TXC0: Transmit Complete - UDRE0: USART Data Register Empty - FE0: Frame Error - DOR0: Data OverRun - UPE0: USART Parity Error - U2X0: Double Tx Speed - PCM0: MultiProcessor Comms Mode - */ - // rh = UCSR0B; //USART control and Status Register 0 B - - /* - bit 7 6 5 4 3 2 1 0 - RXCIE0 TxCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80 - - RxCIE0: Receive Complete int enable - TXCIE0: Transmit Complete int enable - UDRIE0: USART Data Register Empty int enable - RXEN0: Rx Enable - TXEN0: Tx Enable - UCSZ02: Character Size bit 2 - RXB80: Rx data bit 8 - TXB80: Tx data bit 8 - */ - - data = UDR0; // USART data register 0 - - processSerialData(stat, data); - - cli() ; - UCSR0B |= (1 << RXCIE0); // enable Interrupt -} +#if defined(DEBUG) && !defined(SIMU) + static tmr10ms_t lastTime = 0; + tmr10ms_t newTime = get_tmr10ms(); + struct gtm utm; + gettime(&utm); +#endif + while (telemetryFifo.pop(data)) { + processSerialData(data); +#if defined(DEBUG) && !defined(SIMU) + extern FIL g_telemetryFile; + if (lastTime != newTime) { + f_printf(&g_telemetryFile, "\r\n%4d-%02d-%02d,%02d:%02d:%02d.%02d0: %02X", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100, data); + lastTime = newTime; + } + else { + f_printf(&g_telemetryFile, " %02X", data); + } +#endif + } +#elif defined(PCBSKY9X) + rxPdcUsart(processSerialData); // Receive serial data here #endif -/******************************************/ -#if defined(CPUARM) -void frskyTransmitBuffer( uint32_t size ) -{ -#if defined(PCBSKY9X) - txPdcUsart( frskyTxBuffer, size ) ; -#endif -} -#else -void frskyTransmitBuffer() -{ - UCSR0B |= (1 << UDRIE0); // enable UDRE0 interrupt -} +#if !defined(PCBTARANIS) + // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) + static uint8_t frskyTxDelay = 5; + if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { + frskyTxDelay = 5; // 50ms + frskyDSendNextAlarm(); + } #endif -uint8_t frskyAlarmsSendState = 0 ; +#if !defined(SIMU) +#if defined(WS_HOW_HIGH) + if (frskyUsrStreaming > 0) { + frskyUsrStreaming--; + } +#endif + + if (frskyStreaming > 0) { + frskyStreaming--; + } + else { + frskyData.rssi[0].set(0); + frskyData.rssi[1].set(0); + } +#endif + +#if defined(VARIO) + if (TELEMETRY_STREAMING() && !IS_FAI_ENABLED()) { + varioWakeup(); + } +#endif #if defined(CPUARM) -void frskyPushValue(uint8_t *&ptr, uint8_t value) -{ - // byte stuff the only byte than might need it - if (value == START_STOP) { - *ptr++ = BYTESTUFF; - *ptr++ = 0x5e; - } - else if (value == BYTESTUFF) { - *ptr++ = BYTESTUFF; - *ptr++ = 0x5d; - } - else { - *ptr++ = value; - } -} + static tmr10ms_t alarmsCheckTime = 0; + static uint8_t alarmsCheckStep = 0; -inline void frskySendNextAlarm(void) -{ -#if defined(PCBSKY9X) - if (txPdcPending()) - return; // we only have one buffer. If it's in use, then we can't send yet. + if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { + + alarmsCheckTime = get_tmr10ms() + 100; /* next check in 1second */ + + if (alarmsCheckStep == 0) { +#if defined(PCBTARANIS) + // TODO not only Taranis! + if ((IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) && frskyData.swr.value > 0x33) { + AUDIO_SWR_RED(); + POPUP_WARNING(STR_ANTENNAPROBLEM); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } #endif + } + else if (TELEMETRY_STREAMING()) { + if (alarmsCheckStep == 1) { + if (getRssiAlarmValue(1) && frskyData.rssi[0].value < getRssiAlarmValue(1)) { + AUDIO_RSSI_RED(); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } + else if (getRssiAlarmValue(0) && frskyData.rssi[0].value < getRssiAlarmValue(0)) { + AUDIO_RSSI_ORANGE(); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } + } + else if (alarmsCheckStep == 2) { + if (alarmRaised(1, 1)) { + AUDIO_A2_RED(); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } + else if (alarmRaised(1, 0)) { + AUDIO_A2_ORANGE(); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } + } + else if (alarmsCheckStep == 3) { + if (alarmRaised(0, 1)) { + AUDIO_A1_RED(); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } + else if (alarmRaised(0, 0)) { + AUDIO_A1_ORANGE(); + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + } + } + } - uint8_t *ptr = &frskyTxBuffer[0]; - - *ptr++ = START_STOP; // Start of packet - - // Now send a packet - frskyAlarmsSendState -= 1; - uint8_t alarm = 1 - (frskyAlarmsSendState % 2); - if (frskyAlarmsSendState < SEND_MODEL_ALARMS) { - uint8_t channel = 1 - (frskyAlarmsSendState / 2); - *ptr++ = (A22PKT + frskyAlarmsSendState); // fc - fb - fa - f9 - frskyPushValue(ptr, g_model.frsky.channels[channel].alarms_value[alarm]); - *ptr++ = ALARM_GREATER(channel, alarm); - *ptr++ = (IS_SOUND_OFF() ? alarm_off : ALARM_LEVEL(channel, alarm)); - } - else { - *ptr++ = (RSSI1PKT-alarm); // f7 - f6 - frskyPushValue(ptr, getRssiAlarmValue(alarm)); - *ptr++ = 0x00; - *ptr++ = (IS_SOUND_OFF() ? alarm_off : ((2+alarm+g_model.frsky.rssiAlarms[alarm].level) % 4)); + if (++alarmsCheckStep == 4) { + alarmsCheckStep = 0; + } } - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = START_STOP; // End of packet - - frskyTransmitBuffer(ptr - &frskyTxBuffer[0]); -} - -#else - -void frskyPushValue(uint8_t *&ptr, uint8_t value) -{ - // byte stuff the only byte than might need it - bool bytestuff = false; - - if (value == START_STOP) { - bytestuff = true; - value = 0x5e; + if (TELEMETRY_STREAMING()) { + if (telemetryState == TELEMETRY_KO) { + AUDIO_TELEMETRY_BACK(); + } + telemetryState = TELEMETRY_OK; } - else if (value == BYTESTUFF) { - bytestuff = true; - value = 0x5d; + else if (telemetryState == TELEMETRY_OK) { + telemetryState = TELEMETRY_KO; + AUDIO_TELEMETRY_LOST(); } - - *ptr++ = value; - if (bytestuff) - *ptr = BYTESTUFF; -} - -void frskySendPacket(uint8_t type, uint8_t value, uint8_t p1, uint8_t p2) -{ - uint8_t *ptr = &frskyTxBuffer[0]; - - *ptr++ = START_STOP; // End of packet - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = (IS_SOUND_OFF() ? alarm_off : p2); - *ptr++ = p1; - frskyPushValue(ptr, value); - *ptr++ = type; - *ptr++ = START_STOP; // Start of packet - - frskyTxBufferCount = ptr - &frskyTxBuffer[0]; - frskyTransmitBuffer(); -} - -inline void frskySendNextAlarm(void) -{ - if (frskyTxBufferCount) - return; // we only have one buffer. If it's in use, then we can't send yet. - - // Now send a packet - frskyAlarmsSendState -= 1; - uint8_t alarm = 1 - (frskyAlarmsSendState % 2); - if (frskyAlarmsSendState < SEND_MODEL_ALARMS) { - uint8_t channel = 1 - (frskyAlarmsSendState / 2); - frskySendPacket(A22PKT + frskyAlarmsSendState, g_model.frsky.channels[channel].alarms_value[alarm], ALARM_GREATER(channel, alarm), ALARM_LEVEL(channel, alarm)); - } - else { - frskySendPacket(RSSI1PKT-alarm, getRssiAlarmValue(alarm), 0, (2+alarm+g_model.frsky.rssiAlarms[alarm].level) % 4); - } -} #endif +} void telemetryInterrupt10ms() { @@ -698,7 +390,7 @@ void telemetryInterrupt10ms() #if defined(FRSKY_HUB) for (uint8_t i=0; i frskyData.hub.maxPower) + if (frskyData.hub.power > frskyData.hub.maxPower) { frskyData.hub.maxPower = frskyData.hub.power; - } -} - -void telemetryWakeup() -{ -#if defined(PCBSKY9X) - rxPdcUsart(processSerialData); // Receive serial data here -#endif - - // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) - static uint8_t frskyTxDelay = 5; - if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { - frskyTxDelay = 5; // 50ms - frskySendNextAlarm(); - } - -#ifndef SIMU -#if defined(WS_HOW_HIGH) - if (frskyUsrStreaming > 0) { - frskyUsrStreaming--; - } -#endif - - if (frskyStreaming > 0) { - frskyStreaming--; - } - else { - frskyData.rssi[0].set(0); - frskyData.rssi[1].set(0); - } -#endif - -#if defined(VARIO) - if (TELEMETRY_STREAMING() && !IS_FAI_ENABLED()) - varioWakeup(); -#endif -} - -#if 0 -// not used any more -bool FRSKY_alarmRaised(uint8_t idx) -{ - for (int i=0; i<2; i++) { - if (ALARM_LEVEL(idx, i) != alarm_off) { - if (ALARM_GREATER(idx, i)) { - if (frskyData.analog[idx].value > g_model.frsky.channels[idx].alarms_value[i]) - return true; - } - else { - if (frskyData.analog[idx].value < g_model.frsky.channels[idx].alarms_value[i]) - return true; - } } } - return false; -} -#endif - -#if !defined(CPUARM) -inline void FRSKY_EnableTXD(void) -{ - frskyTxBufferCount = 0; - UCSR0B |= (1 << TXEN0); // enable TX } -inline void FRSKY_EnableRXD(void) -{ - UCSR0B |= (1 << RXEN0); // enable RX - UCSR0B |= (1 << RXCIE0); // enable Interrupt -} -#endif - -void FRSKY_Init(void) -{ - // clear frsky variables - resetTelemetry(); - -#if !defined(CPUARM) && !defined(SIMU) - - DDRE &= ~(1 << DDE0); // set RXD0 pin as input - PORTE &= ~(1 << PORTE0); // disable pullup on RXD0 pin - -#undef BAUD -#define BAUD 9600 -#include - - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - UCSR0A &= ~(1 << U2X0); // disable double speed operation. - - // set 8N1 - UCSR0B = 0 | (0 << RXCIE0) | (0 << TXCIE0) | (0 << UDRIE0) | (0 << RXEN0) | (0 << TXEN0) | (0 << UCSZ02); - UCSR0C = 0 | (1 << UCSZ01) | (1 << UCSZ00); - - - while (UCSR0A & (1 << RXC0)) UDR0; // flush receive buffer - - // These should be running right from power up on a FrSky enabled '9X. - FRSKY_EnableTXD(); // enable FrSky-Telemetry reception - FRSKY_EnableRXD(); // enable FrSky-Telemetry reception -#endif -} - -void FrskyValueWithMin::set(uint8_t value) -{ - if (this->value == 0) { - this->value = value; - } - else { - sum += value; - if (link_counter == 0) { - this->value = sum / 8; - sum = 0; - } - } - - if (value && (!min || value < min)) - min = value; -} - -void FrskyValueWithMinMax::set(uint8_t value, uint8_t unit) -{ - FrskyValueWithMin::set(value); - if (unit != UNIT_VOLTS) { - this->value = value; - } - if (!max || value > max) - max = value; -} - -void resetTelemetry() +void telemetryReset() { memclear(&frskyData, sizeof(frskyData)); +#if defined(CPUARM) + telemetryState = TELEMETRY_INIT; +#endif + #if defined(FRSKY_HUB) frskyData.hub.gpsLatitude_bp = 2; frskyData.hub.gpsLongitude_bp = 2; frskyData.hub.gpsFix = -1; #endif -#ifdef SIMU - frskyData.analog[0].set(120, UNIT_VOLTS); - frskyData.analog[1].set(240, UNIT_VOLTS); +#if defined(SIMU) + +#if defined(CPUARM) + frskyData.swr.value = 30; +#endif frskyData.rssi[0].value = 75; frskyData.rssi[1].value = 75; + frskyData.analog[0].set(120, UNIT_VOLTS); + frskyData.analog[1].set(240, UNIT_VOLTS); frskyData.hub.fuelLevel = 75; frskyData.hub.rpm = 12000; + frskyData.hub.vfas = 100; + frskyData.hub.minVfas = 90; #if defined(GPS) frskyData.hub.gpsFix = 1; @@ -907,6 +484,11 @@ void resetTelemetry() getGpsDistance(); #endif + frskyData.hub.gpsSpeed_bp = 100; + frskyData.hub.gpsSpeed_ap = 50; + + frskyData.hub.airSpeed = 100; + frskyData.hub.cellsCount = 6; frskyData.hub.gpsAltitude_bp = 50; @@ -917,8 +499,28 @@ void resetTelemetry() frskyData.hub.accelY = 100; frskyData.hub.temperature1 = -30; frskyData.hub.maxTemperature1 = 100; - + frskyData.hub.current = 5; frskyData.hub.maxCurrent = 56; #endif } + +void telemetryInit(void) +{ +#if defined(PCBTARANIS) + if (IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) + telemetryPortInit(FRSKY_SPORT_BAUDRATE); + else + telemetryPortInit(FRSKY_D_BAUDRATE); +#elif defined(PCBSKY9X) + if (IS_MODULE_XJT()) + telemetryPortInit(FRSKY_SPORT_BAUDRATE); + else + telemetryPortInit(FRSKY_D_BAUDRATE); +#elif !defined(SIMU) + telemetryPortInit(); +#endif + + // clear telemetry context + telemetryReset(); +} diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 4275ffb77..6c041e2b4 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -1,274 +1,435 @@ -/* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer - * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef TELEMETRY_FRSKY_H -#define TELEMETRY_FRSKY_H - -#define FRSKY_RX_PACKET_SIZE 19 -#define FRSKY_TX_PACKET_SIZE 12 - -#include - -// .20 seconds -#define FRSKY_TIMEOUT10ms 20 - -enum AlarmLevel { - alarm_off = 0, - alarm_yellow = 1, - alarm_orange = 2, - alarm_red = 3 -}; - -#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) -#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) - -class FrskyValueWithMin { - public: - uint8_t value; - uint8_t min; - uint16_t sum; - void set(uint8_t value); -}; - -class FrskyValueWithMinMax: public FrskyValueWithMin { - public: - uint8_t max; - void set(uint8_t value, uint8_t unit); -}; - -#define VARIO_QUEUE_LENGTH 5 - -#if defined(FRSKY_HUB) -PACK(struct FrskySerialData { - int16_t baroAltitudeOffset;// spare reused - int16_t gpsAltitude_bp; // 0x01 before punct - int16_t temperature1; // 0x02 -20 .. 250 deg. celcius - uint16_t rpm; // 0x03 0..60,000 revs. per minute - uint16_t fuelLevel; // 0x04 0, 25, 50, 75, 100 percent - int16_t temperature2; // 0x05 -20 .. 250 deg. celcius - uint16_t volts; // 0x06 1/500V increments (0..4.2V) - uint32_t distFromEarthAxis;// 2 spares reused - int16_t gpsAltitude_ap; // 0x01+8 after punct - uint8_t cellVolts[12]; // 6 spares reused - int16_t baroAltitude_bp; // 0x10 0..9,999 meters - uint16_t gpsSpeed_bp; // 0x11 before punct - uint16_t gpsLongitude_bp; // 0x12 before punct - uint16_t gpsLatitude_bp; // 0x13 before punct - uint16_t gpsCourse_bp; // 0x14 before punct (0..359.99 deg. -- seemingly 2-decimal precision) - uint8_t day; // 0x15 - uint8_t month; // 0x15 - uint16_t year; // 0x16 - uint8_t hour; // 0x17 - uint8_t min; // 0x17 - uint16_t sec; // 0x18 - uint16_t gpsSpeed_ap; // 0x11+8 - uint16_t gpsLongitude_ap; // 0x12+8 - uint16_t gpsLatitude_ap; // 0x13+8 - uint16_t gpsCourse_ap; // 0x14+8 - uint32_t pilotLatitude; // 2 spares reused - uint32_t pilotLongitude; // 2 spares reused - uint16_t baroAltitude_ap; // 0x21 after punct - uint16_t gpsLongitudeEW; // 0x1A+8 East/West - uint16_t gpsLatitudeNS; // 0x1B+8 North/South - int16_t accelX; // 0x24 1/256th gram (-8g ~ +8g) - int16_t accelY; // 0x25 1/256th gram (-8g ~ +8g) - int16_t accelZ; // 0x26 1/256th gram (-8g ~ +8g) - uint8_t gpsDistNeeded:1; // 1bits out of 16bits spare reused - int8_t gpsFix:2; // 2bits out of 16bits spare reused: -1=never fixed, 0=not fixed now, 1=fixed - uint8_t openXsensor:1; // 1bits out of 16bits spare reused: we receive data from the openXsensor - uint8_t cellsCount:4; // 4bits out of 16bits spare reused - uint8_t minCellVolts; // 8bits out of 16bits spare reused - uint16_t current; // 0x28 Current - int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer - int32_t varioAltitude_cm; - int16_t varioSpeed; // 0x30 Vertical speed in cm/s - - uint16_t gpsDistance; - int16_t gpsAltitudeOffset; - uint8_t varioAltitudeQueuePointer; // circular-buffer pointer - uint8_t minCellIdx; - int16_t cellsSum; - uint16_t currentConsumption; // 0x35 openXsensor only! Otherwise calculated by the Tx from current - uint16_t currentPrescale; - uint16_t power; // 0x37 openXsensor only! Otherwise calculated by the Tx from current and voltage - int16_t airSpeed; - - uint16_t vfas; // 0x39 Added to FrSky protocol for home made sensors with a better precision - uint16_t volts_bp; // 0x3A - uint16_t volts_ap; // 0x3B - // end of FrSky Hub data - - /* next fields must keep this order! */ - int16_t minAltitude; - int16_t maxAltitude; - uint16_t maxRpm; - int16_t maxTemperature1; - int16_t maxTemperature2; - uint16_t maxGpsSpeed; - uint16_t maxGpsDistance; - uint16_t maxAirSpeed; - int16_t minCell; - int16_t minCells; - int16_t minVfas; - uint16_t maxCurrent; - uint16_t maxPower; - /* end */ - - int16_t dTE; -}); -#elif defined(WS_HOW_HIGH) -PACK(struct FrskySerialData { - int16_t baroAltitude_bp; // 0..9,999 meters - int16_t baroAltitudeOffset; - int16_t minAltitude; - int16_t maxAltitude; - uint16_t currentConsumption; - uint16_t currentPrescale; - uint16_t power; - uint16_t maxPower; -#if defined(VARIO) - int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer - uint8_t varioAltitudeQueuePointer; // circular-buffer pointer - int32_t varioAltitude_cm; - int16_t varioSpeed; // Vertical speed in cm/s -#endif -}); -#elif defined(VARIO) -PACK(struct FrskySerialData { - int16_t varioAltitudeQueue[VARIO_QUEUE_LENGTH]; //circular buffer - uint8_t varioAltitudeQueuePointer; // circular-buffer pointer - int32_t varioAltitude_cm; - int16_t varioSpeed; // Vertical speed in cm/s - uint16_t currentConsumption; - uint16_t currentPrescale; - uint16_t power; - uint16_t maxPower; -}); -#else -PACK(struct FrskySerialData { - uint16_t currentConsumption; - uint16_t currentPrescale; - uint16_t power; - uint16_t maxPower; -}); -#endif - -struct FrskyData { - FrskyValueWithMinMax analog[2]; - FrskyValueWithMin rssi[2]; -#if defined(CPUARM) - FrskyValueWithMinMax swr; -#endif - FrskySerialData hub; -}; - -// Global Fr-Sky telemetry data variables -extern uint8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time - -#if defined(WS_HOW_HIGH) -extern uint8_t frskyUsrStreaming; -#endif - -#define SEND_RSSI_ALARMS 6 -#define SEND_MODEL_ALARMS 4 -extern uint8_t frskyAlarmsSendState; - -extern FrskyData frskyData; - -extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; -extern uint8_t frskyTxBufferCount; - -void FRSKY_Init(void); -#define FRSKY_End() - -void telemetryWakeup(void); -void telemetryInterrupt10ms(void); - -inline void frskySendAlarms(void) -{ - frskyAlarmsSendState = SEND_RSSI_ALARMS; -} - -bool FRSKY_alarmRaised(uint8_t idx); - -void resetTelemetry(); - -#define TELEMETRY_STREAMING() (frskyStreaming > 0) - -#define TELEMETRY_CELL_VOLTAGE(k) (frskyData.hub.cellVolts[k] * 2) -#define TELEMETRY_MIN_CELL_VOLTAGE (frskyData.hub.minCellVolts * 2) - -#define TELEMETRY_BARO_ALT_AVAILABLE() (frskyData.hub.baroAltitudeOffset) -#define TELEMETRY_BARO_ALT_UNIT (IS_IMPERIAL_ENABLE() ? LENGTH_UNIT_IMP : LENGTH_UNIT_METR) - -#define TELEMETRY_RELATIVE_BARO_ALT_BP frskyData.hub.baroAltitude_bp -#define TELEMETRY_RELATIVE_BARO_ALT_AP frskyData.hub.baroAltitude_ap -#define TELEMETRY_RELATIVE_GPS_ALT_BP frskyData.hub.gpsAltitude_bp -#define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp -#define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap - -#define TELEMETRY_BARO_ALT_PREPARE() -#define TELEMETRY_BARO_ALT_FORMAT "%d," -#define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude_bp, -#define TELEMETRY_GPS_ALT_FORMAT "%d," -#define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude_bp, -#define TELEMETRY_GPS_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) -#define TELEMETRY_GPS_SPEED_FORMAT "%d," -#define TELEMETRY_GPS_SPEED_ARGS getConvertedTelemetryValue(frskyData.hub.gpsSpeed_bp, UNIT_KTS), -#if defined(CPUARM) - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, frskyData.hub.cellVolts[6]*2/100, frskyData.hub.cellVolts[6]*2%100, frskyData.hub.cellVolts[7]*2/100, frskyData.hub.cellVolts[7]*2%100, frskyData.hub.cellVolts[8]*2/100, frskyData.hub.cellVolts[8]*2%100, frskyData.hub.cellVolts[9]*2/100, frskyData.hub.cellVolts[9]*2%100, frskyData.hub.cellVolts[10]*2/100, frskyData.hub.cellVolts[10]*2%100, frskyData.hub.cellVolts[11]*2/100, frskyData.hub.cellVolts[11]*2%100, - #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," - #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," -#else - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, - #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," - #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," -#endif -#define TELEMETRY_CURRENT_FORMAT "%d.%02d," -#define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 100, frskyData.hub.current % 100, -#define TELEMETRY_VFAS_FORMAT "%d.%d," -#define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, -#define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," -#define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100, - -#if defined(FRSKY_HUB) - #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) -#else - #define TELEMETRY_OPENXSENSOR() (0) -#endif - -#endif - +/* + * Authors (alphabetical order) + * - Andre Bernet + * - Andreas Weitl + * - Bertrand Songis + * - Bryan J. Rentoul (Gruvin) + * - Cameron Weeks + * - Erez Raviv + * - Gabriel Birkus + * - Jean-Pierre Parisy + * - Karl Szmutny + * - Michael Blandford + * - Michal Hlavinka + * - Pat Mackenzie + * - Philip Moss + * - Rob Thomson + * - Romolo Manfredini + * - Thomas Husterer + * + * opentx is based on code named + * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, + * er9x by Erez Raviv: http://code.google.com/p/er9x/, + * and the original (and ongoing) project by + * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef FRSKY_H +#define FRSKY_H + +#include + +#define FRSKY_SPORT_BAUDRATE 57600 +#define FRSKY_D_BAUDRATE 9600 + +#define FRSKY_SPORT_PACKET_SIZE 9 + +// 20 seconds +#define FRSKY_TIMEOUT10ms 20 + +// Global Fr-Sky telemetry data variables +extern uint8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time + +#if defined(WS_HOW_HIGH) +extern uint8_t frskyUsrStreaming; +#endif + +extern uint8_t link_counter; + +#if defined(CPUARM) +enum TelemetryStates { + TELEMETRY_INIT, + TELEMETRY_OK, + TELEMETRY_KO +}; + +extern uint8_t telemetryState; +#endif + +class FrskyValueWithMin { + public: + uint8_t value; + uint8_t min; + uint16_t sum; + void set(uint8_t value); +}; + +class FrskyValueWithMinMax: public FrskyValueWithMin { + public: + uint8_t max; + void set(uint8_t value, uint8_t unit); +}; + +#if defined(CPUARM) +PACK(struct FrskySerialData { + int16_t spare1; + int16_t gpsAltitude_bp; // 0x01 before punct + int16_t temperature1; // 0x02 -20 .. 250 deg. celcius + uint16_t rpm; // 0x03 0..60,000 revs. per minute + uint16_t fuelLevel; // 0x04 0, 25, 50, 75, 100 percent + int16_t temperature2; // 0x05 -20 .. 250 deg. celcius + uint16_t volts; // 0x06 1/500V increments (0..4.2V) + uint32_t distFromEarthAxis;// 2 spares reused + int16_t gpsAltitude_ap; // 0x01+8 after punct + uint16_t spare2[6]; + int16_t baroAltitude_bp; // 0x10 0..9,999 meters + uint16_t gpsSpeed_bp; // 0x11 before punct + uint16_t gpsLongitude_bp; // 0x12 before punct + uint16_t gpsLatitude_bp; // 0x13 before punct + uint16_t gpsCourse_bp; // 0x14 before punct (0..359.99 deg. -- seemingly 2-decimal precision) + uint8_t day; // 0x15 + uint8_t month; // 0x15 + uint16_t year; // 0x16 + uint8_t hour; // 0x17 + uint8_t min; // 0x17 + uint16_t sec; // 0x18 + uint16_t gpsSpeed_ap; // 0x11+8 + uint16_t gpsLongitude_ap; // 0x12+8 + uint16_t gpsLatitude_ap; // 0x13+8 + uint16_t gpsCourse_ap; // 0x14+8 + uint32_t pilotLatitude; // 2 spares reused + uint32_t pilotLongitude; // 2 spares reused + uint16_t baroAltitude_ap; // 0x21 after punct + uint16_t gpsLongitudeEW; // 0x1A+8 East/West + uint16_t gpsLatitudeNS; // 0x1B+8 North/South + int16_t accelX; // 0x24 1/256th gram (-8g ~ +8g) + int16_t accelY; // 0x25 1/256th gram (-8g ~ +8g) + int16_t accelZ; // 0x26 1/256th gram (-8g ~ +8g) + int16_t spare3; + uint16_t current; // 0x28 Current + int16_t spare4[7]; + int16_t varioSpeed; // 0x30 Vertical speed in cm/s + + int32_t baroAltitudeOffset; + int32_t baroAltitude; + int32_t gpsAltitudeOffset; + uint32_t gpsDistance; + + uint16_t vfas; // 0x39 Added to FrSky protocol for home made sensors with a better precision + uint16_t volts_bp; // 0x3A + uint16_t volts_ap; // 0x3B + uint16_t spare5[4]; + // end of FrSky Hub data + + /* these fields must keep this order! */ + int16_t minAltitude; + int16_t maxAltitude; + uint16_t maxRpm; + int16_t maxTemperature1; + int16_t maxTemperature2; + uint16_t maxGpsSpeed; + uint16_t maxGpsDistance; + uint16_t maxAirSpeed; + int16_t minCell; + int16_t minCells; + int16_t minVfas; + uint16_t maxCurrent; + uint16_t maxPower; + /* end */ + + uint8_t gpsDistNeeded:1; // 1bits out of 16bits spare reused + int8_t gpsFix:2; // 2bits out of 16bits spare reused: -1=never fixed, 0=not fixed now, 1=fixed + uint8_t openXsensor:1; // 1bits out of 16bits spare reused: we receive data from the openXsensor + uint8_t cellsCount:4; // 4bits out of 16bits spare reused + + int32_t gpsAltitude; + + uint16_t currentConsumption; + uint16_t currentPrescale; + uint16_t power; + + uint16_t cellVolts[12]; + int16_t cellsSum; + uint8_t minCellIdx; + uint16_t minCellVolts; + + bool varioHighPrecision; + uint16_t airSpeed; + uint16_t dTE; +}); + +#elif defined(FRSKY_HUB) + +PACK(struct FrskySerialData { + int16_t baroAltitudeOffset;// spare reused + int16_t gpsAltitude_bp; // 0x01 before punct + int16_t temperature1; // 0x02 -20 .. 250 deg. celcius + uint16_t rpm; // 0x03 0..60,000 revs. per minute + uint16_t fuelLevel; // 0x04 0, 25, 50, 75, 100 percent + int16_t temperature2; // 0x05 -20 .. 250 deg. celcius + uint16_t volts; // 0x06 1/500V increments (0..4.2V) + uint32_t distFromEarthAxis;// 2 spares reused + int16_t gpsAltitude_ap; // 0x01+8 after punct + uint8_t cellVolts[12]; // 6 spares reused + int16_t baroAltitude_bp; // 0x10 0..9,999 meters + uint16_t gpsSpeed_bp; // 0x11 before punct + uint16_t gpsLongitude_bp; // 0x12 before punct + uint16_t gpsLatitude_bp; // 0x13 before punct + uint16_t gpsCourse_bp; // 0x14 before punct (0..359.99 deg. -- seemingly 2-decimal precision) + uint8_t day; // 0x15 + uint8_t month; // 0x15 + uint16_t year; // 0x16 + uint8_t hour; // 0x17 + uint8_t min; // 0x17 + uint16_t sec; // 0x18 + uint16_t gpsSpeed_ap; // 0x11+8 + uint16_t gpsLongitude_ap; // 0x12+8 + uint16_t gpsLatitude_ap; // 0x13+8 + uint16_t gpsCourse_ap; // 0x14+8 + uint32_t pilotLatitude; // 2 spares reused + uint32_t pilotLongitude; // 2 spares reused + uint16_t baroAltitude_ap; // 0x21 after punct + uint16_t gpsLongitudeEW; // 0x1A+8 East/West + uint16_t gpsLatitudeNS; // 0x1B+8 North/South + int16_t accelX; // 0x24 1/256th gram (-8g ~ +8g) + int16_t accelY; // 0x25 1/256th gram (-8g ~ +8g) + int16_t accelZ; // 0x26 1/256th gram (-8g ~ +8g) + uint8_t gpsDistNeeded:1; // 1bits out of 16bits spare reused + int8_t gpsFix:2; // 2bits out of 16bits spare reused: -1=never fixed, 0=not fixed now, 1=fixed + uint8_t openXsensor:1; // 1bits out of 16bits spare reused: we receive data from the openXsensor + uint8_t cellsCount:4; // 4bits out of 16bits spare reused + uint8_t minCellVolts; // 8bits out of 16bits spare reused + uint16_t current; // 0x28 Current + int16_t spare[5]; + int32_t varioAltitude_cm; + int16_t varioSpeed; // 0x30 Vertical speed in cm/s + + uint16_t gpsDistance; + int16_t gpsAltitudeOffset; + uint8_t varioAltitudeQueuePointer; // circular-buffer pointer + uint8_t minCellIdx; + int16_t cellsSum; + uint16_t currentConsumption; // 0x35 openXsensor only! Otherwise calculated by the Tx from current + uint16_t currentPrescale; + uint16_t power; // 0x37 openXsensor only! Otherwise calculated by the Tx from current and voltage + int16_t airSpeed; + + uint16_t vfas; // 0x39 Added to FrSky protocol for home made sensors with a better precision + uint16_t volts_bp; // 0x3A + uint16_t volts_ap; // 0x3B + // end of FrSky Hub data + + /* next fields must keep this order! */ + int16_t minAltitude; + int16_t maxAltitude; + uint16_t maxRpm; + int16_t maxTemperature1; + int16_t maxTemperature2; + uint16_t maxGpsSpeed; + uint16_t maxGpsDistance; + uint16_t maxAirSpeed; + int16_t minCell; + int16_t minCells; + int16_t minVfas; + uint16_t maxCurrent; + uint16_t maxPower; + /* end */ + + int16_t dTE; +}); +#elif defined(WS_HOW_HIGH) +PACK(struct FrskySerialData { + int16_t baroAltitude_bp; // 0..9,999 meters + int16_t baroAltitudeOffset; + int16_t minAltitude; + int16_t maxAltitude; + uint16_t currentConsumption; + uint16_t currentPrescale; + uint16_t power; + uint16_t maxPower; +#if defined(VARIO) + int16_t varioSpeed; // Vertical speed in cm/s +#endif +}); +#elif defined(VARIO) +PACK(struct FrskySerialData { + int16_t varioSpeed; // Vertical speed in cm/s + uint16_t currentConsumption; + uint16_t currentPrescale; + uint16_t power; + uint16_t maxPower; +}); +#else +PACK(struct FrskySerialData { + uint16_t currentConsumption; + uint16_t currentPrescale; + uint16_t power; + uint16_t maxPower; +}); +#endif + +struct FrskyData { + FrskyValueWithMinMax analog[2]; + FrskyValueWithMin rssi[2]; +#if defined(CPUARM) + FrskyValueWithMin swr; +#endif + FrskySerialData hub; +}; + +enum AlarmLevel { + alarm_off = 0, + alarm_yellow = 1, + alarm_orange = 2, + alarm_red = 3 +}; + +#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) +#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) + +#if defined(CPUARM) + #define TELEMETRY_STREAMING() (frskyData.rssi[0].value > 0) + + #define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 1 + + #define TELEMETRY_BARO_ALT_AVAILABLE() (frskyData.hub.baroAltitudeOffset) + #define TELEMETRY_BARO_ALT_UNIT (IS_IMPERIAL_ENABLE() ? LENGTH_UNIT_IMP : LENGTH_UNIT_METR) + + #define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp + #define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap + + #define TELEMETRY_ABSOLUTE_GPS_ALT (frskyData.hub.gpsAltitude) + #define TELEMETRY_RELATIVE_GPS_ALT (frskyData.hub.gpsAltitude + frskyData.hub.gpsAltitudeOffset) + #define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100) + + #define TELEMETRY_RELATIVE_BARO_ALT_BP (frskyData.hub.baroAltitude / 100) + #define TELEMETRY_RELATIVE_BARO_ALT_AP (frskyData.hub.baroAltitude % 100) + + #define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(frskyData.hub.baroAltitude, UNIT_DIST), 100) + #define TELEMETRY_BARO_ALT_FORMAT "%c%d.%02d," + #define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), + #define TELEMETRY_GPS_ALT_FORMAT "%c%d.%02d," + #define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude < 0 ? '-' : ' ', abs(frskyData.hub.gpsAltitude / 100), abs(frskyData.hub.gpsAltitude % 100), + #define TELEMETRY_GPS_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) + #define TELEMETRY_GPS_SPEED_FORMAT "%d," + #define TELEMETRY_GPS_SPEED_ARGS getConvertedTelemetryValue(frskyData.hub.gpsSpeed_bp, UNIT_KTS), + #if defined(CPUARM) + #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, + #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," + #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," + #else + #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, + #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," + #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," + #endif + #define TELEMETRY_CURRENT_FORMAT "%d.%d," + #define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 10, frskyData.hub.current % 10, + #define TELEMETRY_VFAS_FORMAT "%d.%d," + #define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, + #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," + #define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', abs(frskyData.hub.varioSpeed / 100), abs(frskyData.hub.varioSpeed % 100), + #define TELEMETRY_OPENXSENSOR() (0) +#else + #define TELEMETRY_STREAMING() (frskyStreaming > 0) + + #define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 2 + + #define TELEMETRY_BARO_ALT_AVAILABLE() (frskyData.hub.baroAltitudeOffset) + #define TELEMETRY_BARO_ALT_UNIT (IS_IMPERIAL_ENABLE() ? LENGTH_UNIT_IMP : LENGTH_UNIT_METR) + + #define TELEMETRY_RELATIVE_BARO_ALT_BP frskyData.hub.baroAltitude_bp + #define TELEMETRY_RELATIVE_BARO_ALT_AP frskyData.hub.baroAltitude_ap + #define TELEMETRY_RELATIVE_GPS_ALT_BP frskyData.hub.gpsAltitude_bp + #define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp + #define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap + + #define TELEMETRY_BARO_ALT_PREPARE() + #define TELEMETRY_BARO_ALT_FORMAT "%d," + #define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude_bp, + #define TELEMETRY_GPS_ALT_FORMAT "%d," + #define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude_bp, + #define TELEMETRY_GPS_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) + #define TELEMETRY_GPS_SPEED_FORMAT "%d," + #define TELEMETRY_GPS_SPEED_ARGS getConvertedTelemetryValue(frskyData.hub.gpsSpeed_bp, UNIT_KTS), + #if defined(CPUARM) + #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, frskyData.hub.cellVolts[6]*2/100, frskyData.hub.cellVolts[6]*2%100, frskyData.hub.cellVolts[7]*2/100, frskyData.hub.cellVolts[7]*2%100, frskyData.hub.cellVolts[8]*2/100, frskyData.hub.cellVolts[8]*2%100, frskyData.hub.cellVolts[9]*2/100, frskyData.hub.cellVolts[9]*2%100, frskyData.hub.cellVolts[10]*2/100, frskyData.hub.cellVolts[10]*2%100, frskyData.hub.cellVolts[11]*2/100, frskyData.hub.cellVolts[11]*2%100, + #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," + #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," + #else + #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, + #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," + #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," + #endif + #define TELEMETRY_CURRENT_FORMAT "%d.%02d," + #define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 100, frskyData.hub.current % 100, + #define TELEMETRY_VFAS_FORMAT "%d.%d," + #define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, + #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," + #define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100, + + #if defined(FRSKY_HUB) + #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) + #else + #define TELEMETRY_OPENXSENSOR() (0) + #endif +#endif + +#define TELEMETRY_CELL_VOLTAGE(k) (frskyData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) +#define TELEMETRY_MIN_CELL_VOLTAGE (frskyData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) + +extern FrskyData frskyData; + +#define START_STOP 0x7e +#define BYTESTUFF 0x7d +#define STUFF_MASK 0x20 + +// Receive buffer state machine state enum +enum FrSkyDataState { + STATE_DATA_IDLE, + STATE_DATA_START, + STATE_DATA_IN_FRAME, + STATE_DATA_XOR, +#if defined(TELEMETREZ) + STATE_DATA_PRIVATE_LEN, + STATE_DATA_PRIVATE_VALUE +#endif +}; + +#if defined(PCBTARANIS) + #define frskySendAlarms() +#else + #define SEND_RSSI_ALARMS 6 + #define SEND_MODEL_ALARMS 4 + extern uint8_t frskyAlarmsSendState; + #define FRSKY_TX_PACKET_SIZE 12 + extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; + extern uint8_t frskyTxBufferCount; + inline void frskySendAlarms(void) + { + frskyAlarmsSendState = SEND_RSSI_ALARMS; + } +#endif + +// FrSky D Protocol +void frskyDSendNextAlarm(void); +void frskyDProcessPacket(uint8_t *packet); + +// FrSky S.PORT Protocol +void frskySportProcessPacket(uint8_t *packet); + +void telemetryWakeup(void); +void telemetryReset(); +void telemetryInit(void); +void telemetryInterrupt10ms(void); + +#endif diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp new file mode 100644 index 000000000..15f5728b0 --- /dev/null +++ b/radio/src/telemetry/frsky_d.cpp @@ -0,0 +1,472 @@ +/* + * Authors (alphabetical order) + * - Andre Bernet + * - Andreas Weitl + * - Bertrand Songis + * - Bryan J. Rentoul (Gruvin) + * - Cameron Weeks + * - Erez Raviv + * - Gabriel Birkus + * - Jean-Pierre Parisy + * - Karl Szmutny + * - Michael Blandford + * - Michal Hlavinka + * - Pat Mackenzie + * - Philip Moss + * - Rob Thomson + * - Romolo Manfredini + * - Thomas Husterer + * + * opentx is based on code named + * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, + * er9x by Erez Raviv: http://code.google.com/p/er9x/, + * and the original (and ongoing) project by + * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include "../opentx.h" + +// Enumerate FrSky packet codes +#define LINKPKT 0xfe +#define USRPKT 0xfd +#define A11PKT 0xfc +#define A12PKT 0xfb +#define A21PKT 0xfa +#define A22PKT 0xf9 +#define ALRM_REQUEST 0xf8 +#define RSSI1PKT 0xf7 +#define RSSI2PKT 0xf6 +#define RSSI_REQUEST 0xf1 + +#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) +void checkMinMaxAltitude() +{ + if (TELEMETRY_RELATIVE_BARO_ALT_BP > frskyData.hub.maxAltitude) + frskyData.hub.maxAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; + if (TELEMETRY_RELATIVE_BARO_ALT_BP < frskyData.hub.minAltitude) + frskyData.hub.minAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; +} +#endif + +#if defined(FRSKY_HUB) +typedef enum { + TS_IDLE = 0, // waiting for 0x5e frame marker + TS_DATA_ID, // waiting for dataID + TS_DATA_LOW, // waiting for data low byte + TS_DATA_HIGH, // waiting for data high byte + TS_XOR = 0x80 // decode stuffed byte +} TS_STATE; + +void parseTelemHubByte(uint8_t byte) +{ + static int8_t structPos; + static uint8_t lowByte; + static TS_STATE state = TS_IDLE; + + if (byte == 0x5e) { + state = TS_DATA_ID; + return; + } + if (state == TS_IDLE) { + return; + } + if (state & TS_XOR) { + byte = byte ^ 0x60; + state = (TS_STATE)(state - TS_XOR); + } + if (byte == 0x5d) { + state = (TS_STATE)(state | TS_XOR); + return; + } + if (state == TS_DATA_ID) { + if (byte > 0x3f) { + state = TS_IDLE; + } + else { + structPos = byte*2; + state = TS_DATA_LOW; + } + return; + } + if (state == TS_DATA_LOW) { + lowByte = byte; + state = TS_DATA_HIGH; + return; + } + + state = TS_IDLE; + +#if defined(GPS) + if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLatitude_bp)) { + if (lowByte || byte) + frskyData.hub.gpsFix = 1; + else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLatitude_bp > 1) + frskyData.hub.gpsFix = 0; + } + else if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLongitude_bp)) { + if (lowByte || byte) + frskyData.hub.gpsFix = 1; + else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLongitude_bp > 1) + frskyData.hub.gpsFix = 0; + } + + if ((uint8_t)structPos == offsetof(FrskySerialData, gpsAltitude_bp) || + ((uint8_t)structPos >= offsetof(FrskySerialData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskySerialData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_ap))) { + // If we don't have a fix, we may discard the value + if (frskyData.hub.gpsFix <= 0) + return; + } +#endif + +#if 0 + uint16_t previousValue = *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)); +#endif + + ((uint8_t*)&frskyData.hub)[structPos] = lowByte; + ((uint8_t*)&frskyData.hub)[structPos+1] = byte; + + switch ((uint8_t)structPos) { + + case offsetof(FrskySerialData, rpm): + frskyData.hub.rpm *= (uint8_t)60/(g_model.frsky.blades+2); + if (frskyData.hub.rpm > frskyData.hub.maxRpm) + frskyData.hub.maxRpm = frskyData.hub.rpm; + break; + + case offsetof(FrskySerialData, temperature1): + if (frskyData.hub.temperature1 > frskyData.hub.maxTemperature1) + frskyData.hub.maxTemperature1 = frskyData.hub.temperature1; + break; + + case offsetof(FrskySerialData, temperature2): + if (frskyData.hub.temperature2 > frskyData.hub.maxTemperature2) + frskyData.hub.maxTemperature2 = frskyData.hub.temperature2; + break; + + case offsetof(FrskySerialData, current): +#if defined(FAS_OFFSET) || !defined(CPUM64) + if ((int16_t)frskyData.hub.current > 0 && ((int16_t)frskyData.hub.current + g_model.frsky.fasOffset) > 0) + frskyData.hub.current += g_model.frsky.fasOffset; + else + frskyData.hub.current = 0; +#endif + if (frskyData.hub.current > frskyData.hub.maxCurrent) + frskyData.hub.maxCurrent = frskyData.hub.current; + break; + + case offsetof(FrskySerialData, currentConsumption): + // we receive data from openXsensor. stops the calculation of consumption and power + frskyData.hub.openXsensor = 1; + break; + + case offsetof(FrskySerialData, volts_ap): +#if defined(FAS_BSS) + frskyData.hub.vfas = (frskyData.hub.volts_bp * 10 + frskyData.hub.volts_ap); +#else + frskyData.hub.vfas = ((frskyData.hub.volts_bp * 100 + frskyData.hub.volts_ap * 10) * 21) / 110; +#endif + /* TODO later if (!frskyData.hub.minVfas || frskyData.hub.minVfas > frskyData.hub.vfas) + frskyData.hub.minVfas = frskyData.hub.vfas; */ + break; + + case offsetof(FrskySerialData, baroAltitude_bp): + // First received barometer altitude => Altitude offset + if (!frskyData.hub.baroAltitudeOffset) + frskyData.hub.baroAltitudeOffset = -frskyData.hub.baroAltitude_bp; + frskyData.hub.baroAltitude_bp += frskyData.hub.baroAltitudeOffset; + checkMinMaxAltitude(); + break; + +#if defined(GPS) + case offsetof(FrskySerialData, gpsAltitude_ap): + if (!frskyData.hub.gpsAltitudeOffset) + frskyData.hub.gpsAltitudeOffset = -frskyData.hub.gpsAltitude_bp; + frskyData.hub.gpsAltitude_bp += frskyData.hub.gpsAltitudeOffset; + if (!frskyData.hub.baroAltitudeOffset) { + if (frskyData.hub.gpsAltitude_bp > frskyData.hub.maxAltitude) + frskyData.hub.maxAltitude = frskyData.hub.gpsAltitude_bp; + if (frskyData.hub.gpsAltitude_bp < frskyData.hub.minAltitude) + frskyData.hub.minAltitude = frskyData.hub.gpsAltitude_bp; + } + if (!frskyData.hub.pilotLatitude && !frskyData.hub.pilotLongitude) { + // First received GPS position => Pilot GPS position + getGpsPilotPosition(); + } + else if (frskyData.hub.gpsDistNeeded || g_menuStack[g_menuStackPtr] == menuTelemetryFrsky) { + getGpsDistance(); + } + break; + + case offsetof(FrskySerialData, gpsSpeed_bp): + // Speed => Max speed + if (frskyData.hub.gpsSpeed_bp > frskyData.hub.maxGpsSpeed) + frskyData.hub.maxGpsSpeed = frskyData.hub.gpsSpeed_bp; + break; +#endif + + case offsetof(FrskySerialData, volts): + // Voltage => Cell number + Cell voltage + { + uint8_t battnumber = ((frskyData.hub.volts & 0x00F0) >> 4); + if (battnumber < 12) { + if (frskyData.hub.cellsCount < battnumber+1) { + frskyData.hub.cellsCount = battnumber+1; + } + uint8_t cellVolts = (uint8_t)(((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8)))/10); + frskyData.hub.cellVolts[battnumber] = cellVolts; + if (!frskyData.hub.minCellVolts || cellVolts < frskyData.hub.minCellVolts || battnumber==frskyData.hub.minCellIdx) { + frskyData.hub.minCellIdx = battnumber; + frskyData.hub.minCellVolts = cellVolts; + } + } + break; + } + +#if defined(GPS) + case offsetof(FrskySerialData, hour): + frskyData.hub.hour = ((uint8_t)(frskyData.hub.hour + g_eeGeneral.timezone + 24)) % 24; + break; +#endif + + case offsetof(FrskySerialData, accelX): + case offsetof(FrskySerialData, accelY): + case offsetof(FrskySerialData, accelZ): + *(int16_t*)(&((uint8_t*)&frskyData.hub)[structPos]) /= 10; + break; + +#if 0 + case offsetof(FrskySerialData, gpsAltitude_bp): + case offsetof(FrskySerialData, fuelLevel): + case offsetof(FrskySerialData, gpsLongitude_bp): + case offsetof(FrskySerialData, gpsLatitude_bp): + case offsetof(FrskySerialData, gpsCourse_bp): + case offsetof(FrskySerialData, day): + case offsetof(FrskySerialData, year): + case offsetof(FrskySerialData, sec): + case offsetof(FrskySerialData, gpsSpeed_ap): + case offsetof(FrskySerialData, gpsLongitude_ap): + case offsetof(FrskySerialData, gpsLatitude_ap): + case offsetof(FrskySerialData, gpsCourse_ap): + case offsetof(FrskySerialData, gpsLongitudeEW): + case offsetof(FrskySerialData, gpsLatitudeNS): + case offsetof(FrskySerialData, varioSpeed): + case offsetof(FrskySerialData, power): /* because sent by openXsensor */ + case offsetof(FrskySerialData, vfas): + case offsetof(FrskySerialData, volts_bp): + break; + + default: + *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)) = previousValue; + break; +#endif + } +} +#endif + +#if defined(WS_HOW_HIGH) +void parseTelemWSHowHighByte(uint8_t byte) +{ + if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) { + ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)] = byte; + checkMinMaxAltitude(); + } + else { + // At least 100mS passed since last data received + ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)+1] = byte; + } + // baroAltitude_bp unit here is feet! + frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter +} +#endif + +void frskyDProcessPacket(uint8_t *packet) +{ + // What type of packet? + switch (packet[0]) + { + case LINKPKT: // A1/A2/RSSI values + { + link_counter += 32; + frskyData.analog[0].set(packet[1], g_model.frsky.channels[0].type); + frskyData.analog[1].set(packet[2], g_model.frsky.channels[1].type); + frskyData.rssi[0].set(packet[3]); + frskyData.rssi[1].set(packet[4] / 2); + frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected +#if defined(VARIO) + uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1; + if (varioSource < 2) + frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value); +#endif + break; + } +#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH) + case USRPKT: // User Data packet + uint8_t numBytes = 3 + (packet[1] & 0x07); // sanitize in case of data corruption leading to buffer overflow + for (uint8_t i=3; i g_model.frsky.channels[idx].alarms_value[i]) + return true; + } + else { + if (frskyData.analog[idx].value < g_model.frsky.channels[idx].alarms_value[i]) + return true; + } + } + } + return false; +} +#endif + + diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index f0e3c655a..8c907577a 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -36,10 +36,6 @@ #include "../opentx.h" -#define START_STOP 0x7e -#define BYTESTUFF 0x7d -#define STUFF_MASK 0x20 - // FrSky PRIM IDs (1 byte) #define DATA_FRAME 0x10 @@ -126,22 +122,6 @@ #define BETA_VARIO_ID 0x8030 #define BETA_BARO_ALT_ID 0x8010 -uint8_t telemetryState = TELEMETRY_INIT; - -uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) -uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; // Ditto for transmit buffer -#if !defined(CPUARM) -uint8_t frskyTxBufferCount = 0; -#endif -uint8_t link_counter = 0; -FrskyData frskyData; - -#if defined(DEBUG) && !defined(SIMU) -extern FIL g_telemetryFile; -#endif - -Fifo<512> telemetryFifo; - void setBaroAltitude(int32_t baroAltitude) { // First received barometer altitude => Altitude offset @@ -294,7 +274,7 @@ void processHubPacket(uint8_t id, uint16_t value) bool checkSportPacket(uint8_t *packet) { short crc = 0; - for (int i=1; i> 8; //0-100 crc &= 0x00ff; @@ -309,7 +289,7 @@ bool checkSportPacket(uint8_t *packet) #define SPORT_DATA_U32(packet) (*((uint32_t *)(packet+4))) #define HUB_DATA_U16(packet) (*((uint16_t *)(packet+4))) -void processSportPacket(uint8_t *packet) +void frskySportProcessPacket(uint8_t *packet) { /* uint8_t dataId = packet[0]; */ uint8_t prim = packet[1]; @@ -324,6 +304,7 @@ void processSportPacket(uint8_t *packet) case DATA_FRAME: if (appId == RSSI_ID) { + link_counter += 32; frskyData.rssi[0].set(SPORT_DATA_U8(packet)); } if (appId == SWR_ID) { @@ -331,7 +312,8 @@ void processSportPacket(uint8_t *packet) } else if (appId == ADC1_ID || appId == ADC2_ID) { // A1/A2 of DxR receivers - frskyData.analog[appId-ADC1_ID].set(SPORT_DATA_U8(packet)); + uint8_t idx = appId - ADC1_ID; + frskyData.analog[idx].set(SPORT_DATA_U8(packet), g_model.frsky.channels[idx].type); #if defined(VARIO) uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1; if (varioSource == appId-ADC1_ID) { @@ -340,7 +322,7 @@ void processSportPacket(uint8_t *packet) #endif } else if (appId == BATT_ID) { - frskyData.analog[0].set(SPORT_DATA_U8(packet)); + frskyData.analog[0].set(SPORT_DATA_U8(packet), g_model.frsky.channels[0].type); } else if ((appId >> 8) == 0) { // The old FrSky IDs @@ -523,295 +505,3 @@ void processSportPacket(uint8_t *packet) } } - -// Receive buffer state machine state enum -enum FrSkyDataState { - STATE_DATA_IDLE, - STATE_DATA_IN_FRAME, - STATE_DATA_XOR, -}; - -void processSerialData(uint8_t data) -{ - static uint8_t numPktBytes = 0; - static uint8_t dataState = STATE_DATA_IDLE; - -#if defined(BLUETOOTH) - // TODO if (g_model.bt_telemetry) - btPushByte(data); -#endif - -#if defined(PCBTARANIS) - if (g_eeGeneral.uart3Mode == UART_MODE_SPORT) { - uart3Putc(data); - } -#endif - - if (data == START_STOP) { - dataState = STATE_DATA_IN_FRAME; - numPktBytes = 0; - } - else { - switch (dataState) { - case STATE_DATA_XOR: - frskyRxBuffer[numPktBytes++] = data ^ STUFF_MASK; - dataState = STATE_DATA_IN_FRAME; - break; - - case STATE_DATA_IN_FRAME: - if (data == BYTESTUFF) - dataState = STATE_DATA_XOR; // XOR next byte - else - frskyRxBuffer[numPktBytes++] = data; - break; - } - } - - if (numPktBytes == FRSKY_RX_PACKET_SIZE) { - processSportPacket(frskyRxBuffer); - dataState = STATE_DATA_IDLE; - } -} - -uint8_t frskyAlarmsSendState = 0 ; - - -void telemetryInterrupt10ms() -{ - uint16_t voltage = 0; /* unit: 1/10 volts */ - -#if defined(FRSKY_HUB) - for (uint8_t i=0; i frskyData.hub.maxPower) - frskyData.hub.maxPower = frskyData.hub.power; - - frskyData.hub.currentPrescale += current; - if (frskyData.hub.currentPrescale >= 3600) { - frskyData.hub.currentConsumption += 1; - frskyData.hub.currentPrescale -= 3600; - } - } -} - -inline bool alarmRaised(uint8_t channel, uint8_t idx) -{ - return g_model.frsky.channels[channel].ratio > 0 && g_model.frsky.channels[channel].alarms_value[idx] > 0 && frskyData.analog[channel].value < g_model.frsky.channels[channel].alarms_value[idx]; -} - -void telemetryWakeup() -{ -#if defined(PCBTARANIS) - uint8_t data; -#if defined(DEBUG) && !defined(SIMU) - static tmr10ms_t lastTime = 0; - tmr10ms_t newTime = get_tmr10ms(); - struct gtm utm; - gettime(&utm); -#endif - while (telemetryFifo.pop(data)) { - processSerialData(data); -#if defined(DEBUG) && !defined(SIMU) - if (lastTime != newTime) { - f_printf(&g_telemetryFile, "\r\n%4d-%02d-%02d,%02d:%02d:%02d.%02d0: %02X", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100, data); - lastTime = newTime; - } - else { - f_printf(&g_telemetryFile, " %02X", data); - } -#endif - } -#elif defined(PCBSKY9X) - rxPdcUsart(processSerialData); // Receive serial data here -#endif - -#if 0 - // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) - static uint8_t frskyTxDelay = 5; - if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { - frskyTxDelay = 5; // 50ms - // frskySendNextAlarm(); - } -#endif - -#if defined(VARIO) - if (TELEMETRY_STREAMING() && !IS_FAI_ENABLED()) { - varioWakeup(); - } -#endif - - static tmr10ms_t alarmsCheckTime = 0; - static uint8_t alarmsCheckStep = 0; - - if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { - - alarmsCheckTime = get_tmr10ms() + 100; /* next check in 1second */ - - if (alarmsCheckStep == 0) { -#if defined(PCBTARANIS) - // TODO not only Taranis! - if ((IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) && frskyData.swr.value > 0x33) { - AUDIO_SWR_RED(); - POPUP_WARNING(STR_ANTENNAPROBLEM); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } -#endif - } - else if (TELEMETRY_STREAMING()) { - if (alarmsCheckStep == 1) { - if (getRssiAlarmValue(1) && frskyData.rssi[0].value < getRssiAlarmValue(1)) { - AUDIO_RSSI_RED(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } - else if (getRssiAlarmValue(0) && frskyData.rssi[0].value < getRssiAlarmValue(0)) { - AUDIO_RSSI_ORANGE(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } - } - else if (alarmsCheckStep == 2) { - if (alarmRaised(1, 1)) { - AUDIO_A2_RED(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } - else if (alarmRaised(1, 0)) { - AUDIO_A2_ORANGE(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } - } - else if (alarmsCheckStep == 3) { - if (alarmRaised(0, 1)) { - AUDIO_A1_RED(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } - else if (alarmRaised(0, 0)) { - AUDIO_A1_ORANGE(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ - } - } - } - - if (++alarmsCheckStep == 4) { - alarmsCheckStep = 0; - } - } - - if (TELEMETRY_STREAMING()) { - if (telemetryState == TELEMETRY_KO) { - AUDIO_TELEMETRY_BACK(); - } - telemetryState = TELEMETRY_OK; - } - else if (telemetryState == TELEMETRY_OK) { - telemetryState = TELEMETRY_KO; - AUDIO_TELEMETRY_LOST(); - } -} - -void FRSKY_Init(void) -{ - // clear frsky variables - resetTelemetry(); -} - -void FRSKY_End(void) -{ -} - -void FrskyValueWithMinMax::set(uint8_t value) -{ - this->value = value; - - if (value) { - if (!max || value > max) - max = value; - if (!min || value < min) - min = value; - } -} - -void resetTelemetry() -{ - memclear(&frskyData, sizeof(frskyData)); - telemetryState = TELEMETRY_INIT; - -#if defined(FRSKY_HUB) - frskyData.hub.gpsLatitude_bp = 2; - frskyData.hub.gpsLongitude_bp = 2; - frskyData.hub.gpsFix = -1; -#endif - -#if defined(SIMU) - frskyData.analog[0].set(120); - frskyData.analog[1].set(240); - frskyData.rssi[0].value = 75; - frskyData.swr.value = 30; - frskyData.hub.fuelLevel = 75; - frskyData.hub.rpm = 12000; - frskyData.hub.vfas = 100; - frskyData.hub.minVfas = 90; - - frskyData.hub.gpsFix = 1; - frskyData.hub.gpsLatitude_bp = 4401; - frskyData.hub.gpsLatitude_ap = 7710; - frskyData.hub.gpsLongitude_bp = 1006; - frskyData.hub.gpsLongitude_ap = 8872; - getGpsPilotPosition(); - - frskyData.hub.gpsLatitude_bp = 4401; - frskyData.hub.gpsLatitude_ap = 7455; - frskyData.hub.gpsLongitude_bp = 1006; - frskyData.hub.gpsLongitude_ap = 9533; - getGpsDistance(); - - frskyData.hub.gpsSpeed_bp = 100; - frskyData.hub.gpsSpeed_ap = 50; - - frskyData.hub.airSpeed = 100; - - frskyData.hub.cellsCount = 6; - - frskyData.hub.baroAltitudeOffset = 500 * 100; - frskyData.hub.baroAltitude = 50 * 100; - frskyData.hub.gpsAltitude_bp = 50; - - frskyData.hub.minAltitude = 10; - frskyData.hub.maxAltitude = 500; - - frskyData.hub.accelY = 100; - frskyData.hub.temperature1 = -30; - frskyData.hub.maxTemperature1 = 100; - - frskyData.hub.current = 5; - frskyData.hub.maxCurrent = 56; -#endif -} diff --git a/radio/src/telemetry/frsky_sport.h b/radio/src/telemetry/frsky_sport.h deleted file mode 100644 index ade8934bf..000000000 --- a/radio/src/telemetry/frsky_sport.h +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer - * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef TELEMETRY_SPORT_H -#define TELEMETRY_SPORT_H - -#include - -#define FRSKY_RX_PACKET_SIZE 9 -#define FRSKY_TX_PACKET_SIZE 12 - -#define TELEMETRY_INIT 0 -#define TELEMETRY_OK 1 -#define TELEMETRY_KO 2 -extern uint8_t telemetryState; - -enum AlarmLevel { - alarm_off = 0, - alarm_yellow = 1, - alarm_orange = 2, - alarm_red = 3 -}; - -#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) -#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) - -class FrskyValueWithMinMax { - public: - uint8_t value; - uint8_t min; - uint8_t max; - void set(uint8_t value); -}; - -PACK(struct FrskySerialData { - int16_t spare1; - int16_t gpsAltitude_bp; // 0x01 before punct - int16_t temperature1; // 0x02 -20 .. 250 deg. celcius - uint16_t rpm; // 0x03 0..60,000 revs. per minute - uint16_t fuelLevel; // 0x04 0, 25, 50, 75, 100 percent - int16_t temperature2; // 0x05 -20 .. 250 deg. celcius - uint16_t volts; // 0x06 1/500V increments (0..4.2V) - uint32_t distFromEarthAxis;// 2 spares reused - int16_t gpsAltitude_ap; // 0x01+8 after punct - uint16_t spare2[6]; - int16_t baroAltitude_bp; // 0x10 0..9,999 meters - uint16_t gpsSpeed_bp; // 0x11 before punct - uint16_t gpsLongitude_bp; // 0x12 before punct - uint16_t gpsLatitude_bp; // 0x13 before punct - uint16_t gpsCourse_bp; // 0x14 before punct (0..359.99 deg. -- seemingly 2-decimal precision) - uint8_t day; // 0x15 - uint8_t month; // 0x15 - uint16_t year; // 0x16 - uint8_t hour; // 0x17 - uint8_t min; // 0x17 - uint16_t sec; // 0x18 - uint16_t gpsSpeed_ap; // 0x11+8 - uint16_t gpsLongitude_ap; // 0x12+8 - uint16_t gpsLatitude_ap; // 0x13+8 - uint16_t gpsCourse_ap; // 0x14+8 - uint32_t pilotLatitude; // 2 spares reused - uint32_t pilotLongitude; // 2 spares reused - uint16_t baroAltitude_ap; // 0x21 after punct - uint16_t gpsLongitudeEW; // 0x1A+8 East/West - uint16_t gpsLatitudeNS; // 0x1B+8 North/South - int16_t accelX; // 0x24 1/256th gram (-8g ~ +8g) - int16_t accelY; // 0x25 1/256th gram (-8g ~ +8g) - int16_t accelZ; // 0x26 1/256th gram (-8g ~ +8g) - int16_t spare3; - uint16_t current; // 0x28 Current - int16_t spare4[7]; - int16_t varioSpeed; // 0x30 Vertical speed in cm/s - - int32_t baroAltitudeOffset; - int32_t baroAltitude; - int32_t gpsAltitudeOffset; - uint32_t gpsDistance; - - uint16_t vfas; // 0x39 Added to FrSky protocol for home made sensors with a better precision - uint16_t volts_bp; // 0x3A - uint16_t volts_ap; // 0x3B - uint16_t spare5[4]; - // end of FrSky Hub data - - /* these fields must keep this order! */ - int16_t minAltitude; - int16_t maxAltitude; - uint16_t maxRpm; - int16_t maxTemperature1; - int16_t maxTemperature2; - uint16_t maxGpsSpeed; - uint16_t maxGpsDistance; - uint16_t maxAirSpeed; - int16_t minCell; - int16_t minCells; - int16_t minVfas; - uint16_t maxCurrent; - uint16_t maxPower; - /* end */ - - int32_t gpsAltitude; - uint8_t gpsDistNeeded; - int8_t gpsFix; // -1=never fixed, 0=fix lost, 1=fixed - - uint16_t currentConsumption; - uint16_t currentPrescale; - uint16_t power; - - uint8_t cellsCount; - uint16_t cellVolts[12]; - int16_t cellsSum; - uint8_t minCellIdx; - uint16_t minCellVolts; - - bool varioHighPrecision; - uint16_t airSpeed; - uint16_t dTE; -}); - -struct FrskyData { - FrskyValueWithMinMax analog[2]; - FrskyValueWithMinMax rssi[2]; - FrskyValueWithMinMax swr; - FrskySerialData hub; -}; - -#define SEND_RSSI_ALARMS 6 -#define SEND_MODEL_ALARMS 4 -extern uint8_t frskyAlarmsSendState; - -extern FrskyData frskyData; - -extern uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; -extern uint8_t frskyTxBufferCount; - -void FRSKY_Init(void); -void FRSKY_End(void); - -void telemetryWakeup(); -void telemetryInterrupt10ms(void); - -inline void frskySendAlarms(void) -{ - frskyAlarmsSendState = SEND_RSSI_ALARMS; -} - -bool FRSKY_alarmRaised(uint8_t idx); - -void resetTelemetry(); - -#define TELEMETRY_STREAMING() (frskyData.rssi[0].value > 0) - -#define TELEMETRY_CELL_VOLTAGE(k) frskyData.hub.cellVolts[k] -#define TELEMETRY_MIN_CELL_VOLTAGE frskyData.hub.minCellVolts - -#define TELEMETRY_BARO_ALT_AVAILABLE() (frskyData.hub.baroAltitudeOffset) -#define TELEMETRY_BARO_ALT_UNIT (IS_IMPERIAL_ENABLE() ? LENGTH_UNIT_IMP : LENGTH_UNIT_METR) - -#define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp -#define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap - -#define TELEMETRY_ABSOLUTE_GPS_ALT (frskyData.hub.gpsAltitude) -#define TELEMETRY_RELATIVE_GPS_ALT (frskyData.hub.gpsAltitude + frskyData.hub.gpsAltitudeOffset) -#define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100) - -#define TELEMETRY_RELATIVE_BARO_ALT_BP (frskyData.hub.baroAltitude / 100) -#define TELEMETRY_RELATIVE_BARO_ALT_AP (frskyData.hub.baroAltitude % 100) - -#define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(frskyData.hub.baroAltitude, UNIT_DIST), 100) -#define TELEMETRY_BARO_ALT_FORMAT "%c%d.%02d," -#define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), -#define TELEMETRY_GPS_ALT_FORMAT "%c%d.%02d," -#define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude < 0 ? '-' : ' ', abs(frskyData.hub.gpsAltitude / 100), abs(frskyData.hub.gpsAltitude % 100), -#define TELEMETRY_GPS_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) -#define TELEMETRY_GPS_SPEED_FORMAT "%d," -#define TELEMETRY_GPS_SPEED_ARGS getConvertedTelemetryValue(frskyData.hub.gpsSpeed_bp, UNIT_KTS), -#if defined(CPUARM) - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, - #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," - #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," -#else - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, - #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," - #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," -#endif -#define TELEMETRY_CURRENT_FORMAT "%d.%d," -#define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 10, frskyData.hub.current % 10, -#define TELEMETRY_VFAS_FORMAT "%d.%d," -#define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, -#define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," -#define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', abs(frskyData.hub.varioSpeed / 100), abs(frskyData.hub.varioSpeed % 100), - -#endif - From 6b3c4c8cfe5ac2865a5792cc26aeff3bc44c75f0 Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 15 May 2014 21:08:04 +0200 Subject: [PATCH 2/6] Telemetry bugfixes --- .../targets/common_avr/telemetry_driver.cpp | 4 +- radio/src/telemetry/frsky.cpp | 157 +++++++++--------- radio/src/telemetry/frsky.h | 13 +- radio/src/telemetry/frsky_d.cpp | 6 +- radio/src/telemetry/frsky_sport.cpp | 4 +- 5 files changed, 94 insertions(+), 90 deletions(-) diff --git a/radio/src/targets/common_avr/telemetry_driver.cpp b/radio/src/targets/common_avr/telemetry_driver.cpp index 9762ee55d..622473fca 100644 --- a/radio/src/targets/common_avr/telemetry_driver.cpp +++ b/radio/src/targets/common_avr/telemetry_driver.cpp @@ -50,7 +50,7 @@ void telemetryEnableRx(void) } void processSerialData(uint8_t data); -extern uint8_t numPktBytes; // TODO not driver, change name +extern uint8_t frskyRxBufferCount; // TODO not driver, change name ISR(USART0_RX_vect) { @@ -95,7 +95,7 @@ ISR(USART0_RX_vect) if (stat & ((1 << FE0) | (1 << DOR0) | (1 << UPE0))) { // discard buffer and start fresh on any comms error - numPktBytes = 0; + frskyRxBufferCount = 0; } else { processSerialData(data); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index d8af13ca5..f1c5aa9f6 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -63,10 +63,39 @@ uint8_t telemetryState = TELEMETRY_INIT; Fifo<512> telemetryFifo; // TODO should be in the driver #endif -uint8_t numPktBytes = 0; // TODO rename +uint8_t frskyRxBufferCount = 0; FrskyData frskyData; +#if defined(CPUARM) +enum TelemetryProtocol +{ + PROTOCOL_NONE, + PROTOCOL_FRSKY_D, + PROTOCOL_FRSKY_SPORT, +}; + +#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) +#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT) + +TelemetryProtocol telemetryProtocol = PROTOCOL_NONE; + +TelemetryProtocol getTelemetryProtocol() +{ +#if defined(PCBTARANIS) + if (IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) + return PROTOCOL_FRSKY_SPORT; +#elif defined(PCBSKY9X) + if (IS_MODULE_XJT()) + return PROTOCOL_FRSKY_SPORT; +#endif + return PROTOCOL_FRSKY_D; +} +#else +#define IS_FRSKY_D_PROTOCOL() (true) +#define IS_FRSKY_SPORT_PROTOCOL() (false) +#endif + void FrskyValueWithMin::set(uint8_t value) { if (this->value == 0) { @@ -75,7 +104,7 @@ void FrskyValueWithMin::set(uint8_t value) else { sum += value; if (link_counter == 0) { - this->value = sum / 8; + this->value = sum / (IS_FRSKY_D_PROTOCOL() ? FRSKY_D_AVERAGING : FRSKY_SPORT_AVERAGING); sum = 0; } } @@ -96,29 +125,6 @@ void FrskyValueWithMinMax::set(uint8_t value, uint8_t unit) } } -#if defined(CPUARM) -enum TelemetryProtocol -{ - PROTOCOL_NONE, - PROTOCOL_FRSKY_D, - PROTOCOL_FRSKY_SPORT, -}; - -TelemetryProtocol telemetryProtocol = PROTOCOL_NONE; - -TelemetryProtocol getTelemetryProtocol() -{ -#if defined(PCBTARANIS) - if (IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) - return PROTOCOL_FRSKY_SPORT; -#elif defined(PCBSKY9X) - if (IS_MODULE_XJT()) - return PROTOCOL_FRSKY_SPORT; -#endif - return PROTOCOL_FRSKY_D; -} -#endif - #if defined(CPUARM) inline bool alarmRaised(uint8_t channel, uint8_t idx) { @@ -150,16 +156,14 @@ NOINLINE void processSerialData(uint8_t data) { case STATE_DATA_START: if (data == START_STOP) { -#if defined(FRSKY_SPORT) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (IS_FRSKY_SPORT_PROTOCOL()) { dataState = STATE_DATA_IN_FRAME ; - numPktBytes = 0; + frskyRxBufferCount = 0; } -#endif } else { - if (numPktBytes < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[numPktBytes++] = data; + if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { + frskyRxBuffer[frskyRxBufferCount++] = data; } dataState = STATE_DATA_IN_FRAME; } @@ -170,38 +174,32 @@ NOINLINE void processSerialData(uint8_t data) dataState = STATE_DATA_XOR; // XOR next byte } else if (data == START_STOP) { -#if defined(FRSKY_SPORT) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (IS_FRSKY_SPORT_PROTOCOL()) { dataState = STATE_DATA_IN_FRAME ; - numPktBytes = 0; + frskyRxBufferCount = 0; } else { // end of frame detected frskyDProcessPacket(frskyRxBuffer); dataState = STATE_DATA_IDLE; } -#else - // end of frame detected - frskyDProcessPacket(frskyRxBuffer); - dataState = STATE_DATA_IDLE; -#endif break; } - else if (numPktBytes < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[numPktBytes++] = data; + else if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { + frskyRxBuffer[frskyRxBufferCount++] = data; } break; case STATE_DATA_XOR: - if (numPktBytes < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[numPktBytes++] = data ^ STUFF_MASK; + if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { + frskyRxBuffer[frskyRxBufferCount++] = data ^ STUFF_MASK; } dataState = STATE_DATA_IN_FRAME; break; case STATE_DATA_IDLE: if (data == START_STOP) { - numPktBytes = 0; + frskyRxBufferCount = 0; dataState = STATE_DATA_START; } #if defined(TELEMETREZ) @@ -242,18 +240,18 @@ NOINLINE void processSerialData(uint8_t data) #endif } // switch -#if defined(FRSKY_SPORT) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && numPktBytes >= FRSKY_SPORT_PACKET_SIZE) { + if (IS_FRSKY_SPORT_PROTOCOL() && frskyRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { frskySportProcessPacket(frskyRxBuffer); dataState = STATE_DATA_IDLE; } -#endif } void telemetryWakeup() { #if defined(CPUARM) - if (telemetryProtocol != getTelemetryProtocol()) { + TelemetryProtocol currentProtocol = getTelemetryProtocol(); + if (telemetryProtocol != currentProtocol) { + telemetryProtocol = currentProtocol; telemetryInit(); } #endif @@ -284,29 +282,16 @@ void telemetryWakeup() #endif #if !defined(PCBTARANIS) - // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) - static uint8_t frskyTxDelay = 5; - if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { - frskyTxDelay = 5; // 50ms - frskyDSendNextAlarm(); + if (IS_FRSKY_D_PROTOCOL()) { + // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) + static uint8_t frskyTxDelay = 5; + if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { + frskyTxDelay = 5; // 50ms + frskyDSendNextAlarm(); + } } #endif -#if !defined(SIMU) -#if defined(WS_HOW_HIGH) - if (frskyUsrStreaming > 0) { - frskyUsrStreaming--; - } -#endif - - if (frskyStreaming > 0) { - frskyStreaming--; - } - else { - frskyData.rssi[0].set(0); - frskyData.rssi[1].set(0); - } -#endif #if defined(VARIO) if (TELEMETRY_STREAMING() && !IS_FAI_ENABLED()) { @@ -320,15 +305,14 @@ void telemetryWakeup() if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { - alarmsCheckTime = get_tmr10ms() + 100; /* next check in 1second */ + alarmsCheckTime = get_tmr10ms() + 100; /* next check in 1 second */ if (alarmsCheckStep == 0) { #if defined(PCBTARANIS) - // TODO not only Taranis! - if ((IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) && frskyData.swr.value > 0x33) { + if (IS_FRSKY_SPORT_PROTOCOL() && frskyData.swr.value > 0x33) { AUDIO_SWR_RED(); POPUP_WARNING(STR_ANTENNAPROBLEM); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } #endif } @@ -336,31 +320,31 @@ void telemetryWakeup() if (alarmsCheckStep == 1) { if (getRssiAlarmValue(1) && frskyData.rssi[0].value < getRssiAlarmValue(1)) { AUDIO_RSSI_RED(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } else if (getRssiAlarmValue(0) && frskyData.rssi[0].value < getRssiAlarmValue(0)) { AUDIO_RSSI_ORANGE(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } } else if (alarmsCheckStep == 2) { if (alarmRaised(1, 1)) { AUDIO_A2_RED(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } else if (alarmRaised(1, 0)) { AUDIO_A2_ORANGE(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } } else if (alarmsCheckStep == 3) { if (alarmRaised(0, 1)) { AUDIO_A1_RED(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } else if (alarmRaised(0, 0)) { AUDIO_A1_ORANGE(); - alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ + alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3 seconds */ } } } @@ -438,12 +422,29 @@ void telemetryInterrupt10ms() frskyData.hub.maxPower = frskyData.hub.power; } } + +#if defined(WS_HOW_HIGH) + if (frskyUsrStreaming > 0) { + frskyUsrStreaming--; + } +#endif + + if (frskyStreaming > 0) { + frskyStreaming--; + } + else { + frskyData.rssi[0].set(0); + frskyData.rssi[1].set(0); + } } void telemetryReset() { memclear(&frskyData, sizeof(frskyData)); + frskyStreaming = 0; // reset counter only if valid frsky packets are being detected + link_counter = 0; + #if defined(CPUARM) telemetryState = TELEMETRY_INIT; #endif diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 6c041e2b4..aeab32fc2 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -39,13 +39,16 @@ #include -#define FRSKY_SPORT_BAUDRATE 57600 -#define FRSKY_D_BAUDRATE 9600 +#define FRSKY_SPORT_BAUDRATE 57600 +#define FRSKY_D_BAUDRATE 9600 -#define FRSKY_SPORT_PACKET_SIZE 9 +#define FRSKY_SPORT_PACKET_SIZE 9 -// 20 seconds -#define FRSKY_TIMEOUT10ms 20 +#define FRSKY_TIMEOUT10ms 100 // 1 second +#define WSHH_TIMEOUT10ms 60 // 600ms + +#define FRSKY_SPORT_AVERAGING 4 +#define FRSKY_D_AVERAGING 8 // Global Fr-Sky telemetry data variables extern uint8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp index 15f5728b0..85fd5a9fa 100644 --- a/radio/src/telemetry/frsky_d.cpp +++ b/radio/src/telemetry/frsky_d.cpp @@ -276,7 +276,7 @@ void parseTelemHubByte(uint8_t byte) #if defined(WS_HOW_HIGH) void parseTelemWSHowHighByte(uint8_t byte) { - if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) { + if (frskyUsrStreaming < (WSHH_TIMEOUT10ms - 10)) { ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)] = byte; checkMinMaxAltitude(); } @@ -285,7 +285,7 @@ void parseTelemWSHowHighByte(uint8_t byte) ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)+1] = byte; } // baroAltitude_bp unit here is feet! - frskyUsrStreaming = FRSKY_TIMEOUT10ms*3; // reset counter + frskyUsrStreaming = WSHH_TIMEOUT10ms; // reset counter } #endif @@ -296,12 +296,12 @@ void frskyDProcessPacket(uint8_t *packet) { case LINKPKT: // A1/A2/RSSI values { - link_counter += 32; frskyData.analog[0].set(packet[1], g_model.frsky.channels[0].type); frskyData.analog[1].set(packet[2], g_model.frsky.channels[1].type); frskyData.rssi[0].set(packet[3]); frskyData.rssi[1].set(packet[4] / 2); frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + link_counter += 256 / FRSKY_D_AVERAGING; #if defined(VARIO) uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1; if (varioSource < 2) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 8c907577a..4f336d317 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -304,7 +304,8 @@ void frskySportProcessPacket(uint8_t *packet) case DATA_FRAME: if (appId == RSSI_ID) { - link_counter += 32; + frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + link_counter += 256 / FRSKY_SPORT_AVERAGING; frskyData.rssi[0].set(SPORT_DATA_U8(packet)); } if (appId == SWR_ID) { @@ -502,6 +503,5 @@ void frskySportProcessPacket(uint8_t *packet) } } break; - } } From d6977a130b3f3112fa6880cf2e3812e6ee4a9b1c Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 16 May 2014 14:43:32 +0200 Subject: [PATCH 3/6] Chars [ and ] use now one less pixel in weight --- radio/src/fonts/std/font_05x07.png | Bin 638 -> 685 bytes radio/src/lcd.cpp | 27 ++++++++++----------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/radio/src/fonts/std/font_05x07.png b/radio/src/fonts/std/font_05x07.png index 71a4d36ebf4dad393b0142d8f1badd6fbadbe918..ee51e7b03e95988d7d592bb55f8057b997fcbc0f 100644 GIT binary patch delta 626 zcmV-&0*(Ft1g!;-90dW(EMFp#Ar+BB9DfB63?MPFS<>tP00KHmL_t(2&n=8yNKpDW5cWFjo!p560?DsVZu@yEtVgs%at1(+s-tMVB(3wxtfW@z}9T0 zE!%XtNIFI1P&Z0Z&V*c$(_y$1$3^7>47x7KIFp0B=A`Y6LR70adG7WcyfTsaP~^Vz6K+$F_V1JYlipiUFUk2}J)S z&>dt!!~}MhCD7q5-qL`M_<@uTwWEIA0b`U6HbOJAmTJVOtm*1HXqKmh_h?WSce-$F z|LWTeX-=Q4gL13iejRlFiCimeZ+~uCIM{mJZ5(<}yRUM%8F|#s;o`n7bqa3VyYxMH z*xi^ehgK1jn)>o;bq#uj$&wt*2;Pzkd^{6T)IeE0ERi#7gQd0L{2iWJ#AvZo1}kYV zB^cHWsjp!%5mE2Lw^Lsvo67Mq{yX1rpQC@KV&#}SN59pL*LII>D4n` zViZDXg`N}oI1+`v`GswlC1peMgeZzg-PuvzuOt>7g??5Nn< z=a#&t4R0tW0n+|=%%7)W%v}%gk0&U@4Oj<$sysg5{8{?Hmn_iaFC1?m?8wrTkpKVy M07*qoM6N<$f@=UM!~g&Q delta 604 zcmV-i0;Bz{1^xt(90dTpD{r)sAr*fCVoOIv0Eh)0NB{r;32;bRa{vGf6951U69E94 zoEQKA00(qQO+^RZ0SO5+FZAQmBLDya{z*hZR4C75IKcU1UP9vjZx!LF;|8p7A)*dLFmJSq+W=NZR&Tv{U-a3 z9RCj#brx(8EHHR(d66M`&a;2L?}~O^7d!`Kez$#Jv}?P@Ife;L-&r)6c9m=TF?;p1EYG+-yJjd|4S+Ma#f!YJ03E%$%!SDV5>;E(GI15;wD{hcKT*pv6=k3mO z#e2#>?E^CZ?mV}8SM|qx4BXAKJI~!MtNr|sp=$cuou}5ls{=Btquzh+T2*$hzW5(Q z&0N{zrDX@?4?ke|4+j7K|Nh5de*b^HebtVKKr6!U|F64Hz2_;AnG!7N_ReF&QBgyN z@}6%Nc}6>y0-atW^PTBK(T-Hjb3luq+x;t=u@vau5@rdvj|D0RfbJ~^yLaz%pb0=4 z#Cc$iU`AIn@Jtp2I=xKsLH2frVxHeXr|)(sXkp-ym)?2qj@bgBX#M=xMyuAZe-K>F qP(M%RbZLp>1MUA%_x^uW{T~3G`W;@1J_1?*0000LCD_W-6) break; + else if (!c) { + break; + } else if (c >= 0x20) { lcd_putcAtt(x, y, c, mode); x = lcdNextPos; @@ -421,19 +423,18 @@ void lcd_putsiAtt(xcoord_t x, uint8_t y,const pm_char * s,uint8_t idx, LcdFlags { uint8_t length; length = pgm_read_byte(s++); - lcd_putsnAtt(x,y,s+length*idx,length,flags & ~(BSS|ZCHAR)); + lcd_putsnAtt(x, y, s+length*idx, length, flags & ~(BSS|ZCHAR)); } void lcd_outhex4(xcoord_t x, uint8_t y, uint16_t val) { - x+=FWNUM*4+1; - for(int i=0; i<4; i++) - { - x-=FWNUM; + x += FWNUM*4+1; + for(int i=0; i<4; i++) { + x -= FWNUM; char c = val & 0xf; c = c>9 ? c+'A'-10 : c+'0'; - lcd_putcAtt(x,y,c,c>='A'?CONDENSED:0); - val>>=4; + lcd_putcAtt(x, y, c, c>='A' ? CONDENSED : 0); + val >>= 4; } } @@ -1163,15 +1164,7 @@ void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags at #if ROTARY_ENCODERS > 0 void putsRotaryEncoderMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att) { -#if ROTARY_ENCODERS > 2 - int16_t v; - if(idx < (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) - v = phaseAddress(phase)->rotaryEncoders[idx]; - else - v = g_model.rotaryEncodersExtra[phase][idx - (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)]; -#else int16_t v = phaseAddress(phase)->rotaryEncoders[idx]; -#endif if (v > ROTARY_ENCODER_MAX) { uint8_t p = v - ROTARY_ENCODER_MAX - 1; From fec39c42224cbc5ed7eb2ee3959daec31e9b3aa7 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 16 May 2014 15:15:57 +0200 Subject: [PATCH 4/6] Numbers like "5.1" were badly displayed in DBLSIZE (the point was near the 1). Small code saving (10 bytes) --- radio/src/lcd.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index a92bc790a..a72ea8422 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -529,11 +529,16 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t flags &= ~PREC2; // TODO not needed but removes 20bytes, could be improved for sure, check asm if (dblsize) { xn = x - 2; - if (c>='1' && c<='3') ln++; - uint8_t tn = (qr.quot) % 10; + if (c>='2' && c<='3') ln++; + uint8_t tn = (qr.quot % 10); if (tn==2 || tn==4) { - if (c=='4') { xn++; } - else { xn--; ln++; } + if (c=='4') { + xn++; + } + else { + xn--; + ln++; + } } } else if (midsize) { @@ -558,7 +563,7 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t if (dblsize && (uint16_t)val >= 1000 && (uint16_t)val < 10000) x-=2; #endif val = qr.quot; - x-=fw; + x -= fw; #if defined(BOLD_FONT) && !defined(CPUM64) || defined(EXTSTD) if (i==len && (flags & BOLD)) x += 1; #endif @@ -575,8 +580,7 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t } else { y &= ~0x07; - lcd_hline(xn, (y & ~0x07)+2*FH-3, ln); - lcd_hline(xn, y+2*FH-2, ln); + lcd_filled_rect(xn, y+2*FH-3, ln, 2); } } if (neg) lcd_putcAtt(x, y, '-', flags); From 40783acc36590d8c4e90793ec3ae2901b1096e18 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 16 May 2014 15:48:57 +0200 Subject: [PATCH 5/6] Small display bug on SMLSIZE numbers with PREC1 (used in Failsafe menu on Taranis) --- radio/src/lcd.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index a72ea8422..1cb35c1f1 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -458,13 +458,18 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t bool midsize = flags & MIDSIZE; bool tinsize = flags & TINSIZE; #else -#define midsize 0 -#define tinsize 0 + #define midsize 0 + #define tinsize 0 #endif bool neg = false; - if (flags & UNSIGN) { flags -= UNSIGN; } - else if (val < 0) { neg=true; val=-val; } + if (flags & UNSIGN) { + flags -= UNSIGN; + } + else if (val < 0) { + neg = true; + val = -val; + } xcoord_t xn = 0; uint8_t ln = 2; @@ -480,8 +485,9 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t len++; tmp /= 10; } - if (len <= mode) + if (len <= mode) { len = mode + 1; + } } @@ -525,7 +531,7 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t } #endif lcd_putcAtt(x, y, c, f); - if (mode==i) { + if (mode == i) { flags &= ~PREC2; // TODO not needed but removes 20bytes, could be improved for sure, check asm if (dblsize) { xn = x - 2; @@ -550,7 +556,6 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t lcd_plot(x-1, y+4); if ((flags&INVERS) && ((~flags & BLINK) || BLINK_ON_PHASE)) { lcd_vline(x-1, y, 6); - lcd_vline(x, y, 6); } x--; } From bfbee05b254553337df59b6103b3fc8678f32b5e Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 16 May 2014 16:46:04 +0200 Subject: [PATCH 6/6] Telemetry refactoring continued --- .../opentx/opentxGruvin9xsimulator.cpp | 2 +- .../firmwares/opentx/opentxM128simulator.cpp | 2 +- .../firmwares/opentx/opentxSky9xsimulator.cpp | 8 +- .../opentx/opentxTaranisSimulator.cpp | 8 +- .../src/firmwares/opentx/opentxsimulator.cpp | 2 +- radio/src/Makefile | 18 +- radio/src/eeprom_conversions.cpp | 3 - radio/src/gui/menu_model.cpp | 313 +++++++++--------- radio/src/gui/view_main.cpp | 4 +- radio/src/gui/view_statistics.cpp | 57 ++-- radio/src/myeeprom.h | 45 +-- radio/src/opentx.cpp | 20 -- radio/src/opentx.h | 49 ++- radio/src/{protocols => pulses}/dsm2_arm.cpp | 0 radio/src/{protocols => pulses}/ppm_arm.cpp | 0 .../src/{protocols => pulses}/pulses_arm.cpp | 84 ++--- radio/src/{protocols => pulses}/pulses_arm.h | 0 .../src/{protocols => pulses}/pulses_avr.cpp | 0 radio/src/{protocols => pulses}/pulses_avr.h | 0 radio/src/{protocols => pulses}/pxx_arm.cpp | 0 radio/src/simpgmspace.h | 2 +- radio/src/simu.cpp | 2 +- radio/src/targets/sky9x/board_sky9x.cpp | 2 +- radio/src/telemetry/frsky.cpp | 13 +- radio/src/translations.cpp | 13 +- radio/src/translations.h | 15 +- radio/src/translations/en.h.txt | 26 +- radio/src/translations/fr.h.txt | 16 +- 28 files changed, 346 insertions(+), 358 deletions(-) rename radio/src/{protocols => pulses}/dsm2_arm.cpp (100%) rename radio/src/{protocols => pulses}/ppm_arm.cpp (100%) rename radio/src/{protocols => pulses}/pulses_arm.cpp (69%) rename radio/src/{protocols => pulses}/pulses_arm.h (100%) rename radio/src/{protocols => pulses}/pulses_avr.cpp (100%) rename radio/src/{protocols => pulses}/pulses_avr.h (100%) rename radio/src/{protocols => pulses}/pxx_arm.cpp (100%) diff --git a/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp index 904aa2080..e7e037d1f 100644 --- a/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxGruvin9xsimulator.cpp @@ -66,7 +66,7 @@ namespace Open9xGruvin9x { #include "radio/src/switches.cpp" #include "radio/src/curves.cpp" #include "radio/src/mixer.cpp" -#include "radio/src/protocols/pulses_avr.cpp" +#include "radio/src/pulses/pulses_avr.cpp" #include "radio/src/stamp.cpp" #include "radio/src/maths.cpp" #include "radio/src/gui/menus.cpp" diff --git a/companion/src/firmwares/opentx/opentxM128simulator.cpp b/companion/src/firmwares/opentx/opentxM128simulator.cpp index 9bd963ed7..c577f5b6f 100644 --- a/companion/src/firmwares/opentx/opentxM128simulator.cpp +++ b/companion/src/firmwares/opentx/opentxM128simulator.cpp @@ -65,7 +65,7 @@ namespace Open9xM128 { #include "radio/src/switches.cpp" #include "radio/src/curves.cpp" #include "radio/src/mixer.cpp" -#include "radio/src/protocols/pulses_avr.cpp" +#include "radio/src/pulses/pulses_avr.cpp" #include "radio/src/stamp.cpp" #include "radio/src/maths.cpp" #include "radio/src/gui/menus.cpp" diff --git a/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp b/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp index 1ef5c605d..8cfc845cb 100644 --- a/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxSky9xsimulator.cpp @@ -65,9 +65,9 @@ namespace Open9xSky9x { #include "radio/src/targets/sky9x/board_sky9x.cpp" -#include "radio/src/protocols/ppm_arm.cpp" -#include "radio/src/protocols/pxx_arm.cpp" -#include "radio/src/protocols/dsm2_arm.cpp" +#include "radio/src/pulses/ppm_arm.cpp" +#include "radio/src/pulses/pxx_arm.cpp" +#include "radio/src/pulses/dsm2_arm.cpp" #include "radio/src/targets/sky9x/telemetry_driver.cpp" #include "radio/src/targets/sky9x/pwr_driver.cpp" #include "radio/src/targets/sky9x/eeprom_driver.cpp" @@ -80,7 +80,7 @@ namespace Open9xSky9x { #include "radio/src/mixer.cpp" #include "radio/src/curves.cpp" #include "radio/src/targets/sky9x/pulses_driver.cpp" -#include "radio/src/protocols/pulses_arm.cpp" +#include "radio/src/pulses/pulses_arm.cpp" #include "radio/src/stamp.cpp" #include "radio/src/maths.cpp" #include "radio/src/gui/menus.cpp" diff --git a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp index b4bcdd574..09b5ef719 100644 --- a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp +++ b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp @@ -71,9 +71,9 @@ inline int geteepromsize() { #define EESIZE geteepromsize() #include "radio/src/targets/taranis/board_taranis.cpp" -#include "radio/src/protocols/ppm_arm.cpp" -#include "radio/src/protocols/pxx_arm.cpp" -#include "radio/src/protocols/dsm2_arm.cpp" +#include "radio/src/pulses/ppm_arm.cpp" +#include "radio/src/pulses/pxx_arm.cpp" +#include "radio/src/pulses/dsm2_arm.cpp" #include "radio/src/eeprom_common.cpp" #include "radio/src/eeprom_conversions.cpp" #include "radio/src/eeprom_rlc.cpp" @@ -86,7 +86,7 @@ inline int geteepromsize() { #include "radio/src/targets/taranis/rtc_driver.cpp" #include "radio/src/targets/taranis/trainer_driver.cpp" #include "radio/src/targets/taranis/uart3_driver.cpp" -#include "radio/src/protocols/pulses_arm.cpp" +#include "radio/src/pulses/pulses_arm.cpp" #include "radio/src/stamp.cpp" #include "radio/src/maths.cpp" #include "radio/src/gui/menus.cpp" diff --git a/companion/src/firmwares/opentx/opentxsimulator.cpp b/companion/src/firmwares/opentx/opentxsimulator.cpp index 09cf68930..4dfe60bd1 100644 --- a/companion/src/firmwares/opentx/opentxsimulator.cpp +++ b/companion/src/firmwares/opentx/opentxsimulator.cpp @@ -71,7 +71,7 @@ namespace Open9x { #include "radio/src/switches.cpp" #include "radio/src/curves.cpp" #include "radio/src/mixer.cpp" -#include "radio/src/protocols/pulses_avr.cpp" +#include "radio/src/pulses/pulses_avr.cpp" #include "radio/src/stamp.cpp" #include "radio/src/maths.cpp" #include "radio/src/gui/menus.cpp" diff --git a/radio/src/Makefile b/radio/src/Makefile index 25ae36ae9..3bab858e6 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -312,7 +312,7 @@ ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) BOARDSRC = targets/stock/board_stock.cpp EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp - PULSESSRC = protocols/pulses_avr.cpp + PULSESSRC = pulses/pulses_avr.cpp ifeq ($(PCB), 9XR) CPPDEFS += -DPCB9XR @@ -375,7 +375,7 @@ ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128)) BOARDSRC = targets/stock/board_stock.cpp EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp - PULSESSRC = protocols/pulses_avr.cpp + PULSESSRC = pulses/pulses_avr.cpp ifeq ($(PCB), 9XR128) CPPDEFS += -DPCB9XR128 @@ -434,7 +434,7 @@ ifeq ($(PCB), $(filter $(PCB), 9X2561)) BOARDSRC = targets/stock/board_stock.cpp EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp - PULSESSRC = protocols/pulses_avr.cpp + PULSESSRC = pulses/pulses_avr.cpp ifeq ($(PCB), 9XR2561) CPPDEFS += -DPCB9XR2561 @@ -494,7 +494,7 @@ ifeq ($(PCB), GRUVIN9X) BOARDSRC = targets/gruvin9x/board_gruvin9x.cpp EXTRABOARDSRC = targets/stock/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp - PULSESSRC = protocols/pulses_avr.cpp + PULSESSRC = pulses/pulses_avr.cpp CPPSRC += audio_avr.cpp haptic.cpp ifeq ($(SDCARD), YES) @@ -532,7 +532,7 @@ ifeq ($(PCB), MEGA2560) BOARDSRC = targets/mega2560/board_mega2560.cpp EXTRABOARDSRC = targets/mega2560/lcd_driver_ST7565R.cpp targets/common_avr/telemetry_driver.cpp EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp - PULSESSRC = protocols/pulses_avr.cpp + PULSESSRC = pulses/pulses_avr.cpp CPPSRC += audio_avr.cpp ifeq ($(SDCARD), YES) @@ -588,7 +588,7 @@ ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO)) SRC += targets/sky9x/usb/common/core/USBEndpointDescriptor.c targets/sky9x/usb/common/core/USBGenericRequest.c targets/sky9x/usb/common/core/USBFeatureRequest.c targets/sky9x/usb/common/core/USBInterfaceRequest.c targets/sky9x/usb/common/core/USBGetDescriptorRequest.c targets/sky9x/usb/common/core/USBSetAddressRequest.c targets/sky9x/usb/common/core/USBSetConfigurationRequest.c targets/sky9x/usb/common/core/USBConfigurationDescriptor.c targets/sky9x/usb/common/core/USBGenericDescriptor.c SRC += targets/sky9x/MEDSdcard.c EEPROMSRC = eeprom_common.cpp eeprom_raw.cpp eeprom_conversions.cpp - PULSESSRC = protocols/pulses_arm.cpp protocols/ppm_arm.cpp protocols/pxx_arm.cpp protocols/dsm2_arm.cpp + PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/dsm2_arm.cpp CPPSRC += audio_arm.cpp haptic.cpp gui/view_about.cpp CPPSRC += targets/sky9x/telemetry_driver.cpp targets/sky9x/pwr_driver.cpp targets/sky9x/adc_driver.cpp targets/sky9x/eeprom_driver.cpp targets/sky9x/pulses_driver.cpp targets/sky9x/keys_driver.cpp targets/sky9x/audio_driver.cpp targets/sky9x/buzzer_driver.cpp targets/sky9x/haptic_driver.cpp targets/sky9x/sdcard_driver.cpp targets/sky9x/massstorage.cpp CPPSRC += loadboot.cpp @@ -658,7 +658,7 @@ ifeq ($(PCB), TARANIS) SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/flag.c CoOS/kernel/mutex.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp - PULSESSRC = protocols/pulses_arm.cpp protocols/ppm_arm.cpp protocols/pxx_arm.cpp + PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp CPPSRC += audio_arm.cpp CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/uart3_driver.cpp targets/taranis/telemetry_driver.cpp CPPSRC += bmp.cpp gui/view_channels.cpp gui/view_about.cpp gui/view_text.cpp loadboot.cpp @@ -713,12 +713,12 @@ ifeq ($(PCB), TARANIS) endif ifeq ($(DSM2), PPM) - CPPSRC += protocols/dsm2_arm.cpp + CPPSRC += pulses/dsm2_arm.cpp endif ifeq ($(HUBSAN), YES) CPPDEFS += -DHUBSAN - CPPSRC += protocols/hubsan.cpp + CPPSRC += pulses/hubsan.cpp CPPSRC += targets/taranis/a7105_driver.cpp endif diff --git a/radio/src/eeprom_conversions.cpp b/radio/src/eeprom_conversions.cpp index c611ad166..25dda97cb 100644 --- a/radio/src/eeprom_conversions.cpp +++ b/radio/src/eeprom_conversions.cpp @@ -236,8 +236,6 @@ PACK(typedef struct { FrSkyData_v215 frsky; - ROTARY_ENCODER_ARRAY_EXTRA - MODELDATA_EXTRA }) ModelData_v215; @@ -484,7 +482,6 @@ void ConvertModel_215_to_216(ModelData &model) timer.countdownBeep = oldModel.timers[i].countdownBeep; timer.value = oldModel.timers[i].value; } - g_model.protocol = oldModel.protocol; g_model.thrTrim = oldModel.thrTrim; g_model.trimInc = oldModel.trimInc - 2; g_model.disableThrottleWarning = oldModel.disableThrottleWarning; diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index c79743249..a775b3c08 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -660,13 +660,13 @@ void menuModelSelect(uint8_t event) #endif } -#if defined(PCBTARANIS) +#if defined(CPUARM) uint8_t g_moduleIdx; void menuModelFailsafe(uint8_t event) { static bool longNames = false; bool newLongNames = false; - uint8_t ch; + uint8_t ch = 0; if (event == EVT_KEY_LONG(KEY_ENTER) && s_editMode) { s_noHi = NO_HI_LEN; @@ -676,24 +676,35 @@ void menuModelFailsafe(uint8_t event) SEND_FAILSAFE_NOW(g_moduleIdx); } - SIMPLE_SUBMENU_NOTITLE(32); + SIMPLE_SUBMENU_NOTITLE(NUM_CHNOUT); SET_SCROLLBAR_X(0); - if (m_posVert >= 16) +#if LCD_W >= 212 + #define COL_W (LCD_W/2) + #define BAR_W 64 + // Column separator + lcd_vline(LCD_W/2, FH, LCD_H-FH); + + if (m_posVert >= 16) { ch = 16; - else - ch = 0; + } +#else + #define COL_W (LCD_W) + #define BAR_W 90 + ch = 8 * (m_posVert / 8); +#endif lcd_putsCenter(0*FH, FAILSAFESET); lcd_invert_line(0); - // Column separator - lcd_vline(LCD_W/2, FH, LCD_H-FH); - - for (uint8_t col=0; col<2; col++) { - - uint8_t x = col*LCD_W/2+1; +#if LCD_W >= 212 + for (uint8_t col=0; col<2; col++) +#else + uint8_t col = 0; +#endif + { + uint8_t x = col*COL_W+1; // Channels for (uint8_t line=0; line<8; line++) { @@ -708,6 +719,7 @@ void menuModelFailsafe(uint8_t event) else val = g_model.moduleData[g_moduleIdx].failsafeChannels[8*col+line]; +#if defined(PCBTARANIS) // Channel name if present, number if not uint8_t lenLabel = ZLEN(g_model.limitData[ch].name); if (lenLabel > 4) { @@ -718,6 +730,9 @@ void menuModelFailsafe(uint8_t event) lcd_putsnAtt(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE); else putsChn(x+1-ofs, y, ch+1, SMLSIZE); +#else + putsChn(x+1-ofs, y, ch+1, SMLSIZE); +#endif // Value LcdFlags flags = TINSIZE; @@ -727,21 +742,21 @@ void menuModelFailsafe(uint8_t event) flags |= BLINK; } #if defined(PPM_UNIT_US) - uint8_t wbar = (longNames ? 54 : 64); - lcd_outdezAtt(x+LCD_W/2-4-wbar-ofs, y, PPM_CH_CENTER(ch)+val/2, flags); + uint8_t wbar = (longNames ? BAR_W-10 : BAR_W); + lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, PPM_CH_CENTER(ch)+val/2, flags); #elif defined(PPM_UNIT_PERCENT_PREC1) - uint8_t wbar = (longNames ? 48 : 58); - lcd_outdezAtt(x+LCD_W/2-4-wbar-ofs, y, calcRESXto1000(val), PREC1|flags); + uint8_t wbar = (longNames ? BAR_W-16 : BAR_W-6); + lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, calcRESXto1000(val), PREC1|flags); #else - uint8_t wbar = (longNames ? 54 : 64); - lcd_outdezAtt(x+LCD_W/2-4-wbar-ofs, y, calcRESXto1000(val)/10, flags); + uint8_t wbar = (longNames ? BAR_W-10 : BAR_W); + lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, calcRESXto1000(val)/10, flags); #endif // Gauge - lcd_rect(x+LCD_W/2-3-wbar-ofs, y, wbar+1, 6); + lcd_rect(x+COL_W-3-wbar-ofs, y, wbar+1, 6); uint16_t lim = g_model.extendedLimits ? 640*2 : 512*2; uint8_t len = limit((uint8_t)1, uint8_t((abs(val) * wbar/2 + lim/2) / lim), uint8_t(wbar/2)); - uint8_t x0 = (val>0) ? x+LCD_W/2-ofs-3-wbar/2 : x+LCD_W/2-ofs-2-wbar/2-len; + uint8_t x0 = (val>0) ? x+COL_W-ofs-3-wbar/2 : x+COL_W-ofs-2-wbar/2-len; lcd_hline(x0, y+1, len); lcd_hline(x0, y+2, len); lcd_hline(x0, y+3, len); @@ -896,11 +911,20 @@ enum menuModelSetupItems { ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_CHANNELS, ITEM_MODEL_TRAINER_SETTINGS, -#elif defined(PCBSKY9X) && !defined(REVX) - ITEM_MODEL_PPM1_PROTOCOL, - ITEM_MODEL_PPM1_PARAMS, - ITEM_MODEL_PPM2_PROTOCOL, - ITEM_MODEL_PPM2_PARAMS, +#elif defined(CPUARM) + ITEM_MODEL_EXTERNAL_MODULE_LABEL, + ITEM_MODEL_EXTERNAL_MODULE_MODE, + ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, + ITEM_MODEL_EXTERNAL_MODULE_BIND, + ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, +#if defined(PCBSKY9X) && !defined(REVX) + ITEM_MODEL_EXTRA_MODULE_LABEL, + ITEM_MODEL_EXTRA_MODULE_CHANNELS, + ITEM_MODEL_EXTRA_MODULE_BIND, +#endif + ITEM_MODEL_TRAINER_LABEL, + ITEM_MODEL_TRAINER_CHANNELS, + ITEM_MODEL_TRAINER_SETTINGS, #else ITEM_MODEL_PPM1_PROTOCOL, ITEM_MODEL_PPM1_PARAMS, @@ -915,9 +939,15 @@ enum menuModelSetupItems { #endif #if LCD_W >= 212 -#define MODEL_SETUP_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH) + #define MODEL_SETUP_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH) + #define MODEL_SETUP_BIND_OFS 3*FW + #define MODEL_SETUP_RANGE_OFS 7*FW + #define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW #else -#define MODEL_SETUP_2ND_COLUMN (LCD_W-11*FW-MENUS_SCROLLBAR_WIDTH) + #define MODEL_SETUP_2ND_COLUMN (LCD_W-11*FW-MENUS_SCROLLBAR_WIDTH) + #define MODEL_SETUP_BIND_OFS 2*FW+1 + #define MODEL_SETUP_RANGE_OFS 4*FW+3 + #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 #endif #if defined(PCBTARANIS) && defined(SDCARD) @@ -947,35 +977,56 @@ void onModelSetupBitmapMenu(const char *result) } #endif +#if defined(PCBTARANIS) + #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) +#elif defined(PCBSKY9X) && defined(REVX) + #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : EXTERNAL_MODULE) +#else + #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)) +#endif + void menuModelSetup(uint8_t event) { #if defined(PCBTARANIS) - #define IF_PORT1_ON(x) (g_model.moduleData[0].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x)) - #define IF_PORT2_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_PORT_ON(idx, x) (idx==0 ? IS_PORT1_ON(x) : (idx==1 ? IS_PORT2_ON(x) : IS_TRAINER_ON())) - #define IF_PORT2_XJT(x) (IS_MODULE_XJT(1) ? (uint8_t)x : HIDDEN_ROW) - #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) - #define PORT1_CHANNELS_ROWS() IF_PORT1_ON(1) - #define PORT2_CHANNELS_ROWS() IF_PORT2_ON(IS_MODULE_DSM2(1) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) - #define PORT_CHANNELS_ROWS(x) (x==0 ? PORT1_CHANNELS_ROWS() : (x==1 ? PORT2_CHANNELS_ROWS() : TRAINER_CHANNELS_ROWS())) - #define FAILSAFE_ROWS(x) ((g_model.moduleData[x].rfProtocol==RF_PROTO_X16 || g_model.moduleData[x].rfProtocol==RF_PROTO_LR12) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW) - #define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX) - #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) - + #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_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) + #define EXTERNAL_MODULE_CHANNELS_ROWS() IF_EXTERNAL_MODULE_ON(IS_MODULE_DSM2(EXTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1) + #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) + #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS() : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS() : TRAINER_CHANNELS_ROWS())) + #define FAILSAFE_ROWS(x) ((g_model.moduleData[x].rfProtocol==RF_PROTO_X16 || g_model.moduleData[x].rfProtocol==RF_PROTO_LR12) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW) + #define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX) + #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) bool CURSOR_ON_CELL = (m_posHorz >= 0); - MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0,CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0,CASE_PCBTARANIS(LABEL(PreflightCheck)) CASE_PCBTARANIS(0) 0, 7, POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_PORT1_ON(FAILSAFE_ROWS(0)), LABEL(ExternalModule), (g_model.externalModule==MODULE_TYPE_XJT || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_XJT(1) && IS_D8_RX(1)) ? (uint8_t)1 : (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) || IS_MODULE_DSM2(1)) ? (uint8_t)2 : HIDDEN_ROW, IF_PORT2_XJT(FAILSAFE_ROWS(1)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); + MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0,CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0,CASE_PCBTARANIS(LABEL(PreflightCheck)) CASE_PCBTARANIS(0) 0, 7, POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_INTERNAL_MODULE_ON(1), IF_INTERNAL_MODULE_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); +#elif defined(CPUARM) + #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) + #define IF_EXTERNAL_MODULE_ON(x) (g_model.externalModule == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) + #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) + #define EXTERNAL_MODULE_CHANNELS_ROWS() IF_EXTERNAL_MODULE_ON(IS_MODULE_DSM2(EXTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1) + #define TRAINER_CHANNELS_ROWS() (1) + #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS() : TRAINER_CHANNELS_ROWS()) + #define FAILSAFE_ROWS(x) ((g_model.moduleData[x].rfProtocol==RF_PROTO_X16 || g_model.moduleData[x].rfProtocol==RF_PROTO_LR12) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW) + #define CURSOR_ON_CELL (true) + #define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX) + #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) +#if defined(REVX) + #define EXTRA_MODULE_ROWS +#else + #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, +#endif + MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0,CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0,CASE_PCBTARANIS(LABEL(PreflightCheck)) CASE_PCBTARANIS(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), EXTRA_MODULE_ROWS LABEL(Trainer), TRAINER_CHANNELS_ROWS(), 2}); #elif defined(CPUM64) - #define CURSOR_ON_CELL (true) - #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) - + #define CURSOR_ON_CELL (true) + #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) uint8_t protocol = g_model.protocol; MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2 }); #else - #define CURSOR_ON_CELL (true) - #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) - + #define CURSOR_ON_CELL (true) + #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) uint8_t protocol = g_model.protocol; MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2, CASE_PCBSKY9X(1) CASE_PCBSKY9X(2) }); #endif @@ -986,6 +1037,8 @@ void menuModelSetup(uint8_t event) #endif #if defined(PCBTARANIS) pxxFlag[INTERNAL_MODULE] = 0; +#endif +#if defined(CPUARM) pxxFlag[EXTERNAL_MODULE] = 0; #endif return; @@ -1301,15 +1354,17 @@ void menuModelSetup(uint8_t event) } break; +#if defined(PCBSKY9X) && !defined(REVX) + case ITEM_MODEL_EXTRA_MODULE_LABEL: + lcd_putsLeft(y, "RF Port 2 (PPM)"); + break; +#endif + #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_LABEL: lcd_putsLeft(y, TR_INTERNALRF); break; - case ITEM_MODEL_EXTERNAL_MODULE_LABEL: - lcd_putsLeft(y, TR_EXTERNALRF); - break; - case ITEM_MODEL_INTERNAL_MODULE_MODE: lcd_putsLeft(y, STR_MODE); lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[0].rfProtocol, attr); @@ -1322,6 +1377,16 @@ 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); + break; +#endif + +#if defined(CPUARM) + case ITEM_MODEL_EXTERNAL_MODULE_LABEL: + lcd_putsLeft(y, TR_EXTERNALRF); + break; + case ITEM_MODEL_EXTERNAL_MODULE_MODE: lcd_putsLeft(y, STR_MODE); lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.externalModule, m_posHorz==0 ? attr : 0); @@ -1354,11 +1419,22 @@ void menuModelSetup(uint8_t event) } break; + case ITEM_MODEL_TRAINER_LABEL: + lcd_putsLeft(y, STR_TRAINER); + break; + +#endif + +#if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: +#elif defined(PCBSKY9X) && !defined(REVX) + case ITEM_MODEL_EXTRA_MODULE_CHANNELS: +#endif +#if defined(CPUARM) case ITEM_MODEL_EXTERNAL_MODULE_CHANNELS: case ITEM_MODEL_TRAINER_CHANNELS: { - uint8_t moduleIdx = (k>=ITEM_MODEL_TRAINER_LABEL ? 2 : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0)); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; lcd_putsLeft(y, STR_CHANNELRANGE); if ((int8_t)PORT_CHANNELS_ROWS(moduleIdx) >= 0) { @@ -1381,12 +1457,18 @@ void menuModelSetup(uint8_t event) } break; } +#endif +#if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_BIND: +#elif defined(PCBSKY9X) && !defined(REVX) + case ITEM_MODEL_EXTRA_MODULE_BIND: +#endif +#if defined(CPUARM) case ITEM_MODEL_EXTERNAL_MODULE_BIND: case ITEM_MODEL_TRAINER_SETTINGS: { - uint8_t moduleIdx = (k>=ITEM_MODEL_TRAINER_LABEL ? 2 : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0)); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; if (IS_MODULE_PPM(moduleIdx)) { lcd_putsLeft(y, STR_PPMFRAME); @@ -1412,7 +1494,7 @@ void menuModelSetup(uint8_t event) } else { horzpos_t l_posHorz = m_posHorz; - uint8_t xOffsetBind = 3*FW; + uint8_t xOffsetBind = MODEL_SETUP_BIND_OFS; if (IS_MODULE_XJT(moduleIdx) && IS_D8_RX(moduleIdx)) { xOffsetBind = 0; lcd_putsLeft(y, INDENT "Receiver"); @@ -1435,7 +1517,7 @@ void menuModelSetup(uint8_t event) } } lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+7*FW+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); if (IS_MODULE_XJT(moduleIdx)) { uint8_t newFlag = 0; if (attr && l_posHorz>0 && s_editMode>0) { @@ -1464,16 +1546,20 @@ void menuModelSetup(uint8_t event) } break; } +#endif +#if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_FAILSAFE: +#endif +#if defined(CPUARM) case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: { - uint8_t moduleIdx = (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; lcd_putsLeft(y, TR_FAILSAFE); if (IS_MODULE_XJT(moduleIdx)) { lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, m_posHorz==0 ? attr : 0); - if (moduleData.failsafeMode == FAILSAFE_CUSTOM) lcd_putsAtt(MODEL_SETUP_2ND_COLUMN + 10*FW, y, STR_SET, m_posHorz==1 ? attr : 0); + if (moduleData.failsafeMode == FAILSAFE_CUSTOM) lcd_putsAtt(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_SET, m_posHorz==1 ? attr : 0); if (attr) { if (moduleData.failsafeMode != FAILSAFE_CUSTOM) m_posHorz = 0; @@ -1497,74 +1583,33 @@ void menuModelSetup(uint8_t event) } break; } - - case ITEM_MODEL_TRAINER_LABEL: - lcd_putsLeft(y, STR_TRAINER); - 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); - break; - -#else - - case ITEM_MODEL_PPM1_PROTOCOL: -#if defined(PCBSKY9X) && !defined(REVX) - lcd_putsLeft(y, PSTR("Port1")); -#else - lcd_putsLeft(y, NO_INDENT(STR_PROTO)); #endif +#if !defined(CPUARM) + case ITEM_MODEL_PPM1_PROTOCOL: + lcd_putsLeft(y, NO_INDENT(STR_PROTO)); lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, protocol, m_posHorz<=0 ? attr : 0); - -#if defined(PCBSKY9X) - lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW+3, y, STR_CH, m_posHorz==1 ? attr : 0); - lcd_outdezAtt(lcdLastPos, y, g_model.moduleData[0].channelsStart+1, LEFT | (m_posHorz==1 ? attr : 0)); - lcd_putc(lcdLastPos, y, '-'); - lcd_outdezAtt(lcdLastPos + FW+1, y, g_model.moduleData[0].channelsStart+NUM_PORT1_CHANNELS(), LEFT | (m_posHorz==2 ? attr : 0)); -#else if (IS_PPM_PROTOCOL(protocol)) { lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN+7*FW, y, STR_NCHANNELS, g_model.ppmNCH+2, m_posHorz!=0 ? attr : 0); } else if (attr) { MOVE_CURSOR_FROM_HERE(); } -#endif - - if (attr && (editMode>0 || p1valdiff -#if !defined(PCBSKY9X) - || (!IS_PPM_PROTOCOL(protocol) && !IS_DSM2_PROTOCOL(protocol)) -#endif - )) { + if (attr && (editMode>0 || p1valdiff || (!IS_PPM_PROTOCOL(protocol) && !IS_DSM2_PROTOCOL(protocol)))) { switch (m_posHorz) { case 0: CHECK_INCDEC_MODELVAR_ZERO(event, g_model.protocol, PROTO_MAX-1); break; case 1: -#if defined(PCBSKY9X) - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[0].channelsStart, 32-8-g_model.moduleData[0].channelsCount); - g_model.moduleData[0].ppmFrameLength = max((int8_t)0, g_model.moduleData[0].channelsCount) * 4; - SET_DEFAULT_PPM_FRAME_LENGTH(0); -#else CHECK_INCDEC_MODELVAR(event, g_model.ppmNCH, -2, 4); g_model.ppmFrameLength = g_model.ppmNCH * 8; -#endif break; -#if defined(PCBSKY9X) - case 2: - if (IS_PPM_PROTOCOL(protocol)) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[0].channelsCount, -4, min(8, 32-8-g_model.moduleData[0].channelsStart)); - SET_DEFAULT_PPM_FRAME_LENGTH(0); - } - else - REPEAT_LAST_CURSOR_MOVE(); - break; -#endif } } break; +#endif -#if defined(PCBSKY9X) && !defined(REVX) +#if 0 case ITEM_MODEL_PPM2_PROTOCOL: lcd_putsLeft(y, PSTR("Port2")); lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, 0, 0); @@ -1609,30 +1654,8 @@ void menuModelSetup(uint8_t event) break; #endif +#if !defined(CPUARM) case ITEM_MODEL_PPM1_PARAMS: -#if defined(PCBSKY9X) - if (IS_PPM_PROTOCOL(protocol)) { - lcd_putsLeft(y, STR_PPMFRAME); - lcd_puts(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); - lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.moduleData[0].ppmFrameLength*5 + 225, (m_posHorz<=0 ? attr : 0) | PREC1|LEFT); - lcd_putc(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); - lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.moduleData[0].ppmDelay*50)+300, (m_posHorz < 0 || m_posHorz==1) ? attr : 0); - lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.moduleData[0].ppmPulsePol ? '+' : '-', (m_posHorz < 0 || m_posHorz==2) ? attr : 0); - if (attr && (editMode>0 || p1valdiff)) { - switch (m_posHorz) { - case 0: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[0].ppmFrameLength, -20, 35); - break; - case 1: - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[0].ppmDelay, -4, 10); - break; - case 2: - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[0].ppmPulsePol, 1); - break; - } - } - } -#else if (IS_PPM_PROTOCOL(protocol)) { lcd_putsLeft(y, STR_PPMFRAME); lcd_puts(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); @@ -1654,7 +1677,6 @@ void menuModelSetup(uint8_t event) } } } -#endif #if defined(DSM2) || defined(PXX) else if (IS_DSM2_PROTOCOL(protocol) || IS_PXX_PROTOCOL(protocol)) { if (attr && m_posHorz > 1) { @@ -1665,21 +1687,10 @@ void menuModelSetup(uint8_t event) lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId, (m_posHorz<=0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && (m_posHorz==0 && (editMode>0 || p1valdiff))) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId, 99); -#if defined(CPUARM) - if (checkIncDec_Ret) - modelHeaders[g_eeGeneral.currModel].modelId = g_model.header.modelId; -#endif } - #if defined(PXX) if (protocol == PROTO_PXX) { -#if defined(CPUARM) - if (attr && m_posHorz==0 && editMode==0 && event==EVT_KEY_BREAK(KEY_ENTER)) - checkModelIdUnique(g_eeGeneral.currModel); -#endif - lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW, y, STR_SYNCMENU, m_posHorz!=0 ? attr : 0); - uint8_t newFlag = 0; if (attr && m_posHorz>0 && editMode>0) { // send reset code @@ -1688,7 +1699,6 @@ void menuModelSetup(uint8_t event) pxxFlag[0] = newFlag; } #endif - #if defined(DSM2) if (IS_DSM2_PROTOCOL(protocol)) { lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+4*FW, y, STR_MODULE_RANGE, m_posHorz!=0 ? attr : 0); @@ -1698,12 +1708,12 @@ void menuModelSetup(uint8_t event) } #endif break; -#endif // defined(PCBTARANIS) +#endif } } -#if defined(PCBTARANIS) - if (pxxFlag[INTERNAL_MODULE] == PXX_SEND_RANGECHECK || pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK) { +#if defined(CPUARM) && defined(FRSKY) + if (IS_PXX_RANGE_CHECK_ENABLE()) { displayPopup("RSSI: "); lcd_outdezAtt(16+4*FW, 5*FH, frskyData.rssi[0].value, BOLD); } @@ -2003,27 +2013,12 @@ void menuModelPhaseOne(uint8_t event) for (uint8_t t=0; t0) || p1valdiff)) { -#if ROTARY_ENCODERS > 2 - int16_t v; - if(t < (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) - v = phaseAddress(s_currIdx)->rotaryEncoders[t]; - else - v = g_model.rotaryEncodersExtra[s_currIdx][t-(NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)]; -#else int16_t v = phaseAddress(s_currIdx)->rotaryEncoders[t]; -#endif if (v < ROTARY_ENCODER_MAX) v = ROTARY_ENCODER_MAX; v = checkIncDec(event, v, ROTARY_ENCODER_MAX, ROTARY_ENCODER_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); if (checkIncDec_Ret) { if (v == ROTARY_ENCODER_MAX) v = 0; -#if ROTARY_ENCODERS > 2 - if (t < (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) - phaseAddress(s_currIdx)->rotaryEncoders[t] = v; - else - g_model.rotaryEncodersExtra[s_currIdx][t-(NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)] = v; -#else phaseAddress(s_currIdx)->rotaryEncoders[t] = v; -#endif } } } diff --git a/radio/src/gui/view_main.cpp b/radio/src/gui/view_main.cpp index 66ae9fbfe..15740b6ba 100644 --- a/radio/src/gui/view_main.cpp +++ b/radio/src/gui/view_main.cpp @@ -402,10 +402,10 @@ void displayBattVoltage() void displayVoltageOrAlarm() { if (g_vbat100mV > g_eeGeneral.vBatWarn && g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { - putsTelemetryValue(6*FW-1, 3*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE); + putsTelemetryValue(6*FW-1, 2*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE); } else if (g_vbat100mV > g_eeGeneral.vBatWarn && g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.currentCalib)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { - putsTelemetryValue(7*FW-1, 3*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.currentCalib)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE); + putsTelemetryValue(7*FW-1, 2*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.currentCalib)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE); } else { displayBattVoltage(); diff --git a/radio/src/gui/view_statistics.cpp b/radio/src/gui/view_statistics.cpp index e81c12df7..f722ddd3f 100644 --- a/radio/src/gui/view_statistics.cpp +++ b/radio/src/gui/view_statistics.cpp @@ -89,10 +89,13 @@ void menuStatisticsView(uint8_t event) #endif } -#if defined(CPUARM) - #define MENU_DEBUG_COL_OFS (11*FW-2) +#if defined(PCBTARANIS) + #define MENU_DEBUG_COL1_OFS (11*FW-2) +#elif defined(PCBSKY9X) + #define MENU_DEBUG_COL1_OFS (11*FW-3) + #define MENU_DEBUG_COL2_OFS (17*FW) #else - #define MENU_DEBUG_COL_OFS (14*FW) + #define MENU_DEBUG_COL1_OFS (14*FW) #endif void menuStatisticsDebug(uint8_t event) @@ -140,74 +143,76 @@ void menuStatisticsDebug(uint8_t event) #endif #if defined(PCBSKY9X) && !defined(REVA) + // current lcd_putsLeft(1*FH, STR_CPU_CURRENT); - putsTelemetryValue(MENU_DEBUG_COL_OFS, 1*FH, getCurrent(), UNIT_MILLIAMPS, 0); + putsTelemetryValue(MENU_DEBUG_COL1_OFS, 1*FH, getCurrent(), UNIT_MILLIAMPS, LEFT); uint32_t current_scale = 488 + g_eeGeneral.currentCalib; - putsTelemetryValue(20*FW+2, 1*FH, Current_max*10*current_scale/8192, UNIT_RAW, 0); - + lcd_putc(MENU_DEBUG_COL2_OFS, 1*FH, '>'); + putsTelemetryValue(MENU_DEBUG_COL2_OFS+FW+1, 1*FH, Current_max*10*current_scale/8192, UNIT_RAW, LEFT); + // consumption lcd_putsLeft(2*FH, STR_CPU_MAH); - putsTelemetryValue(MENU_DEBUG_COL_OFS, 2*FH, g_eeGeneral.mAhUsed + Current_used*current_scale/8192/36, UNIT_MAH, PREC1); - putsTimer(17*FW+5*FWNUM+1, 2*FH, g_eeGeneral.globalTimer + sessionTimer, 0, 0); + putsTelemetryValue(MENU_DEBUG_COL1_OFS, 2*FH, g_eeGeneral.mAhUsed + Current_used*current_scale/8192/36, UNIT_MAH, LEFT|PREC1); + putsTimer(MENU_DEBUG_COL2_OFS, 2*FH, g_eeGeneral.globalTimer + sessionTimer, LEFT, 0); #endif #if defined(PCBSKY9X) lcd_putsLeft(3*FH, STR_CPU_TEMP); - putsTelemetryValue(MENU_DEBUG_COL_OFS, 3*FH, getTemperature(), UNIT_TEMPERATURE, 0); - putsTelemetryValue(20*FW+2, 3*FH, maxTemperature+g_eeGeneral.temperatureCalib, UNIT_TEMPERATURE, 0); + putsTelemetryValue(MENU_DEBUG_COL1_OFS, 3*FH, getTemperature(), UNIT_TEMPERATURE, LEFT); + lcd_putc(MENU_DEBUG_COL2_OFS, 3*FH, '>'); + putsTelemetryValue(MENU_DEBUG_COL2_OFS+FW+1, 3*FH, maxTemperature+g_eeGeneral.temperatureCalib, UNIT_TEMPERATURE, LEFT); #endif #if defined(COPROCESSOR) lcd_putsLeft(4*FH, STR_COPROC_TEMP); if (Coproc_read==0) { - lcd_putsAtt(9*FW+2, 4*FH, PSTR("Co Proc NACK"),INVERS); + lcd_putsAtt(MENU_DEBUG_COL1_OFS, 4*FH, PSTR("Co Proc NACK"),INVERS); } else if (Coproc_read==0x81) { - lcd_putsAtt(9*FW+2, 4*FH, PSTR("Inst.TinyApp"),INVERS); + lcd_putsAtt(MENU_DEBUG_COL1_OFS, 4*FH, PSTR("Inst.TinyApp"),INVERS); } else if (Coproc_read<3) { - lcd_putsAtt(9*FW+2, 4*FH, PSTR("Upgr.TinyApp"),INVERS); + lcd_putsAtt(MENU_DEBUG_COL1_OFS, 4*FH, PSTR("Upgr.TinyApp"),INVERS); } else { - putsTelemetryValue(MENU_DEBUG_COL_OFS, 4*FH, Coproc_temp, UNIT_TEMPERATURE, 0); - putsTelemetryValue(20*FW+2, 4*FH, Coproc_maxtemp, UNIT_TEMPERATURE, 0); + putsTelemetryValue(MENU_DEBUG_COL1_OFS, 4*FH, Coproc_temp, UNIT_TEMPERATURE, LEFT); + putsTelemetryValue(MENU_DEBUG_COL2_OFS, 4*FH, Coproc_maxtemp, UNIT_TEMPERATURE, LEFT); } #elif defined(PCBTARANIS) && !defined(SIMU) lcd_putsLeft(4*FH, "Free Mem"); - lcd_outdezAtt(MENU_DEBUG_COL_OFS, 4*FH, 0x20020000 - (unsigned int)heap, LEFT); + lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 4*FH, 0x20020000 - (unsigned int)heap, LEFT); #endif #if defined(CPUARM) lcd_putsLeft(5*FH, STR_TMIXMAXMS); - lcd_outdezAtt(MENU_DEBUG_COL_OFS, 5*FH, (maxMixerDuration)/20, PREC2|LEFT); + lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 5*FH, (maxMixerDuration)/20, PREC2|LEFT); lcd_puts(lcdLastPos, 5*FH, "ms"); lcd_putsLeft(6*FH, STR_FREESTACKMINB); #if LCD_W >= 212 - lcd_putsAtt(MENU_DEBUG_COL_OFS-1, 6*FH+1, "[Main]", SMLSIZE); + lcd_putsAtt(MENU_DEBUG_COL1_OFS-1, 6*FH+1, "[Main]", SMLSIZE); lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(0), UNSIGN|LEFT); lcd_putsAtt(lcdLastPos+2, 6*FH+1, "[Mix]", SMLSIZE); lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(1), UNSIGN|LEFT); lcd_putsAtt(lcdLastPos+2, 6*FH+1, "[Audio]", SMLSIZE); lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(2), UNSIGN|LEFT); #else - lcdLastPos = MENU_DEBUG_COL_OFS; - lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(0), UNSIGN|LEFT); - lcdLastPos += FW/2; + lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 6*FH, stack_free(0), UNSIGN|LEFT); + lcd_puts(lcdLastPos, 6*FH, "/"); lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(1), UNSIGN|LEFT); - lcdLastPos += FW/2; + lcd_puts(lcdLastPos, 6*FH, "/"); lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(2), UNSIGN|LEFT); #endif #else lcd_putsLeft(1*FH, STR_TMR1LATMAXUS); - lcd_outdez8(MENU_DEBUG_COL_OFS , 1*FH, g_tmr1Latency_max/2 ); + lcd_outdez8(MENU_DEBUG_COL1_OFS , 1*FH, g_tmr1Latency_max/2 ); lcd_putsLeft(2*FH, STR_TMR1LATMINUS); - lcd_outdez8(MENU_DEBUG_COL_OFS , 2*FH, g_tmr1Latency_min/2 ); + lcd_outdez8(MENU_DEBUG_COL1_OFS , 2*FH, g_tmr1Latency_min/2 ); lcd_putsLeft(3*FH, STR_TMR1JITTERUS); - lcd_outdez8(MENU_DEBUG_COL_OFS , 3*FH, (g_tmr1Latency_max - g_tmr1Latency_min) /2 ); + lcd_outdez8(MENU_DEBUG_COL1_OFS , 3*FH, (g_tmr1Latency_max - g_tmr1Latency_min) /2 ); lcd_putsLeft(4*FH, STR_TMIXMAXMS); - lcd_outdezAtt(MENU_DEBUG_COL_OFS, 4*FH, (maxMixerDuration*100)/16, PREC2); + lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 4*FH, (maxMixerDuration*100)/16, PREC2); lcd_putsLeft(5*FH, STR_FREESTACKMINB); lcd_outdezAtt(14*FW, 5*FH, stack_free(), UNSIGN) ; #endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 2546d0e10..f2b85a254 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -322,8 +322,13 @@ PACK(typedef struct t_ScriptData { #define LIMITDATA_EXTRA char name[LEN_CHANNEL_NAME]; int8_t curve; #define swstate_t uint16_t #elif defined(PCBSKY9X) + enum ModuleIndex { + EXTERNAL_MODULE, + EXTRA_MODULE, + TRAINER_MODULE + }; #define MODELDATA_BITMAP - #define MODELDATA_EXTRA ModuleData moduleData[NUM_MODULES]; uint8_t nPotsToWarn; int8_t potPosition[NUM_POTS]; + #define MODELDATA_EXTRA uint8_t externalModule; uint8_t trainerMode; ModuleData moduleData[NUM_MODULES+1]; uint8_t nPotsToWarn; int8_t potPosition[NUM_POTS]; #define LIMITDATA_EXTRA #define swstate_t uint8_t #else @@ -1242,31 +1247,18 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data #define ROTARY_ENCODER_MAX 1024 -#if defined(PCBTARANIS) -#define NUM_ROTARY_ENCODERS 0 -#define NUM_ROTARY_ENCODERS_EXTRA 0 -#define ROTARY_ENCODER_ARRAY_EXTRA -#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1]; +#if defined(PCBTARANIS) || defined(REVX) + #define NUM_ROTARY_ENCODERS 0 + #define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1]; #elif defined(PCBSKY9X) -#define NUM_ROTARY_ENCODERS_EXTRA 0 -#define NUM_ROTARY_ENCODERS 1 -#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1]; -#define ROTARY_ENCODER_ARRAY_EXTRA -#elif defined(PCBGRUVIN9X) && ROTARY_ENCODERS > 2 -#define NUM_ROTARY_ENCODERS_EXTRA 2 -#define NUM_ROTARY_ENCODERS (2+NUM_ROTARY_ENCODERS_EXTRA) -#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[2]; -#define ROTARY_ENCODER_ARRAY_EXTRA int16_t rotaryEncodersExtra[MAX_FLIGHT_MODES][NUM_ROTARY_ENCODERS_EXTRA]; -#elif defined(CPUM2560) && ROTARY_ENCODERS <= 2 -#define NUM_ROTARY_ENCODERS_EXTRA 0 -#define NUM_ROTARY_ENCODERS 2 -#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[2]; -#define ROTARY_ENCODER_ARRAY_EXTRA + #define NUM_ROTARY_ENCODERS 1 + #define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1]; +#elif defined(CPUM2560) + #define NUM_ROTARY_ENCODERS 2 + #define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[2]; #else -#define NUM_ROTARY_ENCODERS_EXTRA 0 -#define NUM_ROTARY_ENCODERS 0 -#define ROTARY_ENCODER_ARRAY -#define ROTARY_ENCODER_ARRAY_EXTRA + #define NUM_ROTARY_ENCODERS 0 + #define ROTARY_ENCODER_ARRAY #endif #if defined(PCBSTD) @@ -1680,7 +1672,8 @@ enum ThrottleSources { PACK(typedef struct t_ModelData { ModelHeader header; TimerData timers[MAX_TIMERS]; - uint8_t protocol:3; // not used on Taranis + AVR_FIELD(uint8_t protocol:3); + ARM_FIELD(uint8_t spare:3); uint8_t thrTrim:1; // Enable Throttle Trim AVR_FIELD(int8_t ppmNCH:4) ARM_FIELD(int8_t spare2:4) @@ -1715,8 +1708,6 @@ PACK(typedef struct t_ModelData { TELEMETRY_DATA - ROTARY_ENCODER_ARRAY_EXTRA - MODELDATA_EXTRA }) ModelData; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index a8f07199d..e1056b844 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -577,15 +577,7 @@ uint8_t getRotaryEncoderFlightPhase(uint8_t idx) uint8_t phase = s_current_mixer_flight_mode; for (uint8_t i=0; i 2 - int16_t value; - if(idx<(NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) - value = phaseAddress(phase)->rotaryEncoders[idx]; - else - value = g_model.rotaryEncodersExtra[phase][idx-(NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)]; -#else int16_t value = phaseAddress(phase)->rotaryEncoders[idx]; -#endif if (value <= ROTARY_ENCODER_MAX) return phase; uint8_t result = value-ROTARY_ENCODER_MAX-1; if (result >= phase) result++; @@ -596,25 +588,13 @@ uint8_t getRotaryEncoderFlightPhase(uint8_t idx) int16_t getRotaryEncoder(uint8_t idx) { -#if ROTARY_ENCODERS > 2 - if(idx >= (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) - return g_model.rotaryEncodersExtra[getRotaryEncoderFlightPhase(idx)][idx-(NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)]; -#endif return phaseAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx]; } void incRotaryEncoder(uint8_t idx, int8_t inc) { g_rotenc[idx] += inc; -#if ROTARY_ENCODERS > 2 - int16_t *value; - if (idx < (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) - value = &(phaseAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx]); - else - value = &(g_model.rotaryEncodersExtra[getRotaryEncoderFlightPhase(idx)][idx-(NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)]); -#else int16_t *value = &(phaseAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx]); -#endif *value = limit((int16_t)-1024, (int16_t)(*value + (inc * 8)), (int16_t)+1024); eeDirty(EE_MODEL); } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 1675c114c..581c7e6b5 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -417,9 +417,9 @@ enum PotType { #endif #if defined(CPUARM) - #include "protocols/pulses_arm.h" + #include "pulses/pulses_arm.h" #else - #include "protocols/pulses_avr.h" + #include "pulses/pulses_avr.h" #endif #if defined(PCBTARANIS) @@ -474,26 +474,39 @@ enum PotType { #define IS_DSM2_SERIAL_PROTOCOL(protocol) (0) #endif +#if defined(CPUARM) + static const int8_t maxChannelsModules[] = { 0, 8, 8, 0, -2 }; // relative to 8! + static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! + #define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount) + #define MAX_TRAINER_CHANNELS() (8) + #define MAX_CHANNELS(idx) (idx==0 ? MAX_PORT1_CHANNELS() : (idx==1 ? MAX_PORT2_CHANNELS() : MAX_TRAINER_CHANNELS())) +#endif + #if defined(PCBTARANIS) - static const int8_t maxChannelsModules[] = { 0, 8, 8, 0, -2 }; - static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; - #define IS_MODULE_XJT(idx) ((idx==0 || g_model.externalModule == MODULE_TYPE_XJT) && (g_model.moduleData[idx].rfProtocol != RF_PROTO_OFF)) - #define IS_MODULE_PPM(idx) (idx==2 || (idx==1 && g_model.externalModule == MODULE_TYPE_PPM)) + #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_PPM)) + #define IS_MODULE_XJT(idx) ((idx==INTERNAL_MODULE || g_model.externalModule==MODULE_TYPE_XJT) && (g_model.moduleData[idx].rfProtocol != RF_PROTO_OFF)) #if defined(DSM2) - #define IS_MODULE_DSM2(idx) (idx==1 && g_model.externalModule == MODULE_TYPE_DSM2) + #define IS_MODULE_DSM2(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_DSM2) #else - #define IS_MODULE_DSM2(idx) false + #define IS_MODULE_DSM2(idx) (false) #endif - #define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount) - #define MAX_PORT1_CHANNELS() (maxChannelsXJT[1+g_model.moduleData[0].rfProtocol]) - #define MAX_PORT2_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.externalModule]) - #define MAX_TRAINER_CHANNELS() (8) - #define MAX_CHANNELS(idx) (idx==0 ? MAX_PORT1_CHANNELS() : (idx==1 ? MAX_PORT2_CHANNELS() : MAX_TRAINER_CHANNELS())) + #define MAX_PORT1_CHANNELS() (maxChannelsXJT[1+g_model.moduleData[INTERNAL_MODULE].rfProtocol]) + #define MAX_PORT2_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.externalModule]) + #define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[INTERNAL_MODULE] == PXX_SEND_RANGECHECK || pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK) +#elif defined(PCBSKY9X) && defined(REVX) + #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_PPM)) + #define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_XJT) + #define IS_MODULE_DSM2(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_DSM2) + #define MAX_PORT1_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol] : maxChannelsModules[g_model.externalModule]) + #define MAX_PORT2_CHANNELS() (8) // Only PPM + #define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK) #elif defined(PCBSKY9X) - #define IS_MODULE_XJT() (IS_PXX_PROTOCOL(g_model.protocol)) - #define NUM_PORT1_CHANNELS() (IS_PXX_PROTOCOL(g_model.protocol) ? 8 : (IS_DSM2_PROTOCOL(g_model.protocol) ? 6 : (8+g_model.moduleData[0].channelsCount))) - #define NUM_PORT2_CHANNELS() (8+g_model.moduleData[1].channelsCount) - #define NUM_CHANNELS(idx) (idx==0 ? NUM_PORT1_CHANNELS() : (8+g_model.moduleData[idx].channelsCount)) + #define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || idx==EXTRA_MODULE || (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_PPM)) + #define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_XJT) + #define IS_MODULE_DSM2(idx) (idx==EXTERNAL_MODULE && g_model.externalModule==MODULE_TYPE_DSM2) + #define MAX_PORT1_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[0].rfProtocol] : maxChannelsModules[g_model.externalModule]) + #define MAX_PORT2_CHANNELS() (0) // Only PPM + #define IS_PXX_RANGE_CHECK_ENABLE() (pxxFlag[EXTERNAL_MODULE] == PXX_SEND_RANGECHECK) #endif #include "lcd.h" @@ -540,6 +553,8 @@ enum BaseCurves { #if defined(PCBTARANIS) #define SPLASH_NEEDED() (g_eeGeneral.splashMode != 3) +#elif defined(CPUARM) + #define SPLASH_NEEDED() (g_model.externalModule != MODULE_TYPE_DSM2 && !g_eeGeneral.splashMode) #else #define SPLASH_NEEDED() (!IS_DSM2_PROTOCOL(g_model.protocol) && !g_eeGeneral.splashMode) #endif diff --git a/radio/src/protocols/dsm2_arm.cpp b/radio/src/pulses/dsm2_arm.cpp similarity index 100% rename from radio/src/protocols/dsm2_arm.cpp rename to radio/src/pulses/dsm2_arm.cpp diff --git a/radio/src/protocols/ppm_arm.cpp b/radio/src/pulses/ppm_arm.cpp similarity index 100% rename from radio/src/protocols/ppm_arm.cpp rename to radio/src/pulses/ppm_arm.cpp diff --git a/radio/src/protocols/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp similarity index 69% rename from radio/src/protocols/pulses_arm.cpp rename to radio/src/pulses/pulses_arm.cpp index d89466209..7b5d8c2d2 100644 --- a/radio/src/protocols/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -42,53 +42,55 @@ uint32_t failsafeCounter[NUM_MODULES] = { MODULES_INIT(100) }; void setupPulses(unsigned int port) { + uint8_t required_protocol; + heartbeat |= (HEART_TIMER_PULSES << port); + switch (port) { #if defined(PCBTARANIS) - uint8_t required_protocol; - - if (port == INTERNAL_MODULE) { - required_protocol = g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? PROTO_NONE : PROTO_PXX; - } - else { - port = EXTERNAL_MODULE; // ensure it's external module only - switch (g_model.externalModule) { - case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; - break; - case MODULE_TYPE_XJT: - required_protocol = PROTO_PXX; - break; -#if defined(DSM2) - case MODULE_TYPE_DSM2: - required_protocol = limit(PROTO_DSM2_LP45, PROTO_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTO_DSM2_DSMX); - // The module is set to OFF during one second before BIND start - { - static tmr10ms_t bindStartTime = 0; - if (dsm2Flag == DSM2_BIND_FLAG) { - if (bindStartTime == 0) bindStartTime = get_tmr10ms(); - if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { - required_protocol = PROTO_NONE; - break; - } - } - else { - bindStartTime = 0; - } - } - break; -#endif - default: - required_protocol = PROTO_NONE; - break; - } - } -#else - uint8_t required_protocol = g_model.protocol; + case INTERNAL_MODULE: + required_protocol = g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? PROTO_NONE : PROTO_PXX; + break; #endif - if (s_pulses_paused) + default: + port = EXTERNAL_MODULE; // ensure it's external module only + switch (g_model.externalModule) { + case MODULE_TYPE_PPM: + required_protocol = PROTO_PPM; + break; + case MODULE_TYPE_XJT: + required_protocol = PROTO_PXX; + break; +#if defined(DSM2) + case MODULE_TYPE_DSM2: + required_protocol = limit(PROTO_DSM2_LP45, PROTO_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTO_DSM2_DSMX); + // The module is set to OFF during one second before BIND start + { + static tmr10ms_t bindStartTime = 0; + if (dsm2Flag == DSM2_BIND_FLAG) { + if (bindStartTime == 0) bindStartTime = get_tmr10ms(); + if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { + required_protocol = PROTO_NONE; + break; + } + } + else { + bindStartTime = 0; + } + } + break; +#endif + default: + required_protocol = PROTO_NONE; + break; + } + break; + } + + if (s_pulses_paused) { required_protocol = PROTO_NONE; + } if (s_current_protocol[port] != required_protocol) { diff --git a/radio/src/protocols/pulses_arm.h b/radio/src/pulses/pulses_arm.h similarity index 100% rename from radio/src/protocols/pulses_arm.h rename to radio/src/pulses/pulses_arm.h diff --git a/radio/src/protocols/pulses_avr.cpp b/radio/src/pulses/pulses_avr.cpp similarity index 100% rename from radio/src/protocols/pulses_avr.cpp rename to radio/src/pulses/pulses_avr.cpp diff --git a/radio/src/protocols/pulses_avr.h b/radio/src/pulses/pulses_avr.h similarity index 100% rename from radio/src/protocols/pulses_avr.h rename to radio/src/pulses/pulses_avr.h diff --git a/radio/src/protocols/pxx_arm.cpp b/radio/src/pulses/pxx_arm.cpp similarity index 100% rename from radio/src/protocols/pxx_arm.cpp rename to radio/src/pulses/pxx_arm.cpp diff --git a/radio/src/simpgmspace.h b/radio/src/simpgmspace.h index 9c12e4ae5..bae53a4ec 100644 --- a/radio/src/simpgmspace.h +++ b/radio/src/simpgmspace.h @@ -382,7 +382,7 @@ extern OS_MutexID audioMutex; #define CoLeaveMutexSection(m) pthread_mutex_unlock(&(m)) #define CoTickDelay(...) #define CoCreateFlag(...) 0 -#define UART3_Configure(...) +inline void UART3_Configure(uint32_t baudrate, uint32_t masterClock) { } #define UART_Stop(...) #define UART3_Stop(...) #define USART_GetITStatus(...) 0 diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index a4be16054..b2c044abc 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -411,7 +411,7 @@ uint16_t anaIn(uint8_t chan) return 1000; #elif defined(PCBSKY9X) else if (chan == TX_VOLTAGE) - return 1500; + return 5.1*1500/11.3; else if (chan == TX_CURRENT) return 100; #elif defined(PCBGRUVIN9X) diff --git a/radio/src/targets/sky9x/board_sky9x.cpp b/radio/src/targets/sky9x/board_sky9x.cpp index cdd996404..244447c56 100644 --- a/radio/src/targets/sky9x/board_sky9x.cpp +++ b/radio/src/targets/sky9x/board_sky9x.cpp @@ -122,7 +122,7 @@ inline void setup_switches() #define sam_boot() #else -inline void UART3_Configure( uint32_t baudrate, uint32_t masterClock) +inline void UART3_Configure(uint32_t baudrate, uint32_t masterClock) { // const Pin pPins[] = CONSOLE_PINS; register Uart *pUart = BT_USART; diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index f1c5aa9f6..12349bba4 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -82,13 +82,14 @@ TelemetryProtocol telemetryProtocol = PROTOCOL_NONE; TelemetryProtocol getTelemetryProtocol() { + if (IS_MODULE_XJT(EXTERNAL_MODULE)) + return PROTOCOL_FRSKY_SPORT; + #if defined(PCBTARANIS) - if (IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) + if (IS_MODULE_XJT(INTERNAL_MODULE)) return PROTOCOL_FRSKY_SPORT; -#elif defined(PCBSKY9X) - if (IS_MODULE_XJT()) - return PROTOCOL_FRSKY_SPORT; #endif + return PROTOCOL_FRSKY_D; } #else @@ -509,12 +510,12 @@ void telemetryReset() void telemetryInit(void) { #if defined(PCBTARANIS) - if (IS_MODULE_XJT(0) || IS_MODULE_XJT(1)) + if (IS_MODULE_XJT(INTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE)) telemetryPortInit(FRSKY_SPORT_BAUDRATE); else telemetryPortInit(FRSKY_D_BAUDRATE); #elif defined(PCBSKY9X) - if (IS_MODULE_XJT()) + if (IS_MODULE_XJT(EXTERNAL_MODULE)) telemetryPortInit(FRSKY_SPORT_BAUDRATE); else telemetryPortInit(FRSKY_D_BAUDRATE); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 09e3794c5..50368a789 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -110,7 +110,7 @@ const pm_char STR_OPEN9X[] PROGMEM = ISTR(COUNTRYCODES) ISTR(VFAILSAFE) #endif -#if defined(PCBTARANIS) +#if defined(CPUARM) ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) ISTR(XJT_PROTOCOLS) @@ -485,14 +485,17 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR; const char * STR_CSW_HEADERS[] = TR_CSW_HEADERS; #endif +#if defined(CPUARM) + const pm_char STR_TRAINER[] PROGMEM = TR_TRAINER; + const pm_char STR_MODULE_BIND[] PROGMEM = TR_MODULE_BIND; + const pm_char STR_CHANNELRANGE[] PROGMEM = TR_CHANNELRANGE; + const pm_char STR_SET[] PROGMEM = TR_SET; +#endif + #if defined(PCBTARANIS) const pm_char STR_BYTES[] PROGMEM = TR_BYTES; - const pm_char STR_MODULE_BIND[] PROGMEM = TR_MODULE_BIND; - const pm_char STR_SET[] PROGMEM = TR_SET; - const pm_char STR_TRAINER[] PROGMEM = TR_TRAINER; const pm_char STR_ANTENNAPROBLEM[] PROGMEM = TR_ANTENNAPROBLEM; const pm_char STR_MODULE[] PROGMEM = TR_MODULE; - const pm_char STR_CHANNELRANGE[] PROGMEM = TR_CHANNELRANGE; const pm_char STR_LOWALARM[] PROGMEM = TR_LOWALARM; const pm_char STR_CRITICALALARM[] PROGMEM = TR_CRITICALALARM; const pm_char STR_ENABLE_POPUP[] PROGMEM = TR_ENABLE_POPUP; diff --git a/radio/src/translations.h b/radio/src/translations.h index 7b1d68638..ca9aecbe3 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -177,7 +177,7 @@ extern const pm_char STR_OPEN9X[]; #else #define OFS_VTRAINERMODES (OFS_VFAILSAFE) #endif -#if defined(PCBTARANIS) +#if defined(CPUARM) #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) #define OFS_XJT_PROTOCOLS (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) #define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS)) @@ -274,7 +274,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_VFAILSAFE (STR_OPEN9X + OFS_VFAILSAFE) #endif -#if defined(PCBTARANIS) +#if defined(CPUARM) #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) #define STR_XJT_PROTOCOLS (STR_OPEN9X + OFS_XJT_PROTOCOLS) @@ -665,14 +665,17 @@ extern const pm_char STR_BLCOLOR[]; extern const char * STR_CSW_HEADERS[]; #endif +#if defined(CPUARM) + extern const pm_char STR_TRAINER[]; + extern const pm_char STR_MODULE_BIND[]; + extern const pm_char STR_CHANNELRANGE[]; + extern const pm_char STR_SET[]; +#endif + #if defined(PCBTARANIS) extern const pm_char STR_BYTES[]; - extern const pm_char STR_MODULE_BIND[]; - extern const pm_char STR_SET[]; - extern const pm_char STR_TRAINER[]; extern const pm_char STR_ANTENNAPROBLEM[]; extern const pm_char STR_MODULE[]; - extern const pm_char STR_CHANNELRANGE[]; extern const pm_char STR_LOWALARM[]; extern const pm_char STR_CRITICALALARM[]; extern const pm_char STR_ENABLE_POPUP[]; diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index e85418116..b7d1bc817 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -104,14 +104,12 @@ #define LEN_RETA123 "\001" -#if defined(PCBGRUVIN9X) - #if ROTARY_ENCODERS > 2 - #define TR_RETA123 "RETA123abcd" - #else - #define TR_RETA123 "RETA123ab" - #endif -#elif defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(REVX) #define TR_RETA123 "RETA123LR" +#elif defined(PCBSKY9X) + #define TR_RETA123 "RETA123a" +#elif defined(CPUM2560) + #define TR_RETA123 "RETA123ab" #else #define TR_RETA123 "RETA123" #endif @@ -678,11 +676,11 @@ #define TR_SPEAKER_VOLUME INDENT "Volume" // TODO could be TR_VOLUME ? #define TR_LCD "LCD" #define TR_BRIGHTNESS INDENT "Brightness" -#define TR_CPU_TEMP "CPU Temp.\016>" -#define TR_CPU_CURRENT "Current\022>" +#define TR_CPU_TEMP "CPU Temp." +#define TR_CPU_CURRENT "Current" #define TR_CPU_MAH "Consumpt." #define TR_COPROC "CoProc." -#define TR_COPROC_TEMP "MB Temp. \016>" +#define TR_COPROC_TEMP "MB Temp." #define TR_CAPAWARNING INDENT "Capacity Low" #define TR_TEMPWARNING INDENT "Overheat" #define TR_FUNC "Func" @@ -732,7 +730,7 @@ #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" #define TR_EXTERNALRF "External RF" -#define TR_FAILSAFE INDENT "Failsafe mode" +#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFESET "FAILSAFE SETTINGS" #define TR_COUNTRYCODE "Country Code" #define TR_VOICELANG "Voice Language" @@ -756,15 +754,15 @@ #define TR_SPEAKER INDENT "Speaker" #define TR_BUZZER INDENT "Buzzer" #define TR_BYTES "bytes" -#define TR_MODULE_BIND "[Bind]" -#define TR_MODULE_RANGE "[Range]" +#define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_MODULE_RANGE TR("[Rng]", "[Range]") #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" #define TR_TRAINER "Trainer Port" #define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" #define TR_MODELIDUSED TR("ID already used","Model ID already used") #define TR_MODULE INDENT "Module" -#define TR_CHANNELRANGE INDENT "Channel Range" +#define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "Channel Range") #define TR_LOWALARM INDENT "Low Alarm" #define TR_CRITICALALARM INDENT "Critical Alarm" #define TR_ENABLE_POPUP "Enable Popup" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index b4e65e4dd..6ce5983cb 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -104,14 +104,12 @@ #define LEN_RETA123 "\001" -#if defined(PCBGRUVIN9X) - #if ROTARY_ENCODERS > 2 - #define TR_RETA123 "DPGA123abcd" - #else - #define TR_RETA123 "DPGA123ab" - #endif -#elif defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(REVX) #define TR_RETA123 "DPGA123LR" +#elif defined(PCBSKY9X) + #define TR_RETA123 "DPGA123a" +#elif defined(CPUM2560) + #define TR_RETA123 "DPGA123ab" #else #define TR_RETA123 "DPGA123" #endif @@ -726,7 +724,7 @@ #define TR_CONFIRM_FORMAT "Confirmer Formatage?" #define TR_INTERNALRF "HF interne" #define TR_EXTERNALRF "HF externe" -#define TR_FAILSAFE INDENT "Type failsafe" +#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFESET "REGLAGES FAILSAFE" #define TR_COUNTRYCODE TR("Zone géo.","Zone géographique") #define TR_VOICELANG TR("Langue voix", "Langue annonces vocales") @@ -758,7 +756,7 @@ #define TR_ANTENNAPROBLEM CENTER "Antenne radio défectueuse!" #define TR_MODELIDUSED TR("ID déjà affecté", "No de modèle déjà utilisé") #define TR_MODULE INDENT "Type de module" -#define TR_CHANNELRANGE INDENT "Plage de canaux" +#define TR_CHANNELRANGE TR(INDENT "Canaux", INDENT "Plage de canaux") #define TR_LOWALARM INDENT "Alarme basse" #define TR_CRITICALALARM INDENT "Alarme critique" #define TR_ENABLE_POPUP "Activer Popup"