From 5233fc85b8924102c976d35c02e0678ab48c44bf Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 5 Nov 2018 16:22:56 +0100 Subject: [PATCH 01/46] Fix pxx1 --- radio/src/pulses/pxx.h | 16 ++++++++++++++++ radio/src/pulses/pxx1.h | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 02296bbe5..31e7e16fc 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -150,6 +150,17 @@ class StandardPxxTransport: public BitTransport, public PxxCrcMixin { addByteWithoutCrc(byte); }; + void addRawByteWithoutCrc(uint8_t byte) + { + for (uint8_t i = 0; i < 8; i++) { + if (byte & 0x80) + BitTransport::addPart(1); + else + BitTransport::addPart(0); + byte <<= 1; + } + } + void addByteWithoutCrc(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { @@ -187,6 +198,11 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { addWithByteStuffing(byte); } + void addRawByteWithoutCrc(uint8_t byte) + { + addByteWithoutCrc(byte); + } + void addByteWithoutCrc(uint8_t byte) { *ptr++ = byte; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 444202d26..d7d958b45 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -33,7 +33,7 @@ class Pxx1Pulses: public PxxPulses void addHead() { // send 7E, do not CRC - PxxTransport::addByteWithoutCrc(0x7E); + PxxTransport::addRawByteWithoutCrc(0x7E); } void addCrc() From c8676783d1f0802bad0f35075c42faed1f9f5c9e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 10 Nov 2018 09:10:30 +0100 Subject: [PATCH 02/46] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 93a63aff1..a64012080 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1451,3 +1451,5 @@ Jaroslav Gazik Philippe Desrichard Vincent Heron Marcel Schäfer +Stefano Pascucci +Frédéric Bourgois From 48070764e03f3025c5fc28ff6244476aceba0df3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 10 Nov 2018 10:03:32 +0100 Subject: [PATCH 03/46] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a64012080..84f9e7951 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1453,3 +1453,4 @@ Vincent Heron Marcel Schäfer Stefano Pascucci Frédéric Bourgois +Stefan Hufnagl From 861bb78be57b29e14ee3e01dc17e5ed5389af480 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 11 Nov 2018 15:08:38 +0100 Subject: [PATCH 04/46] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 84f9e7951..8903bc837 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1454,3 +1454,4 @@ Marcel Schäfer Stefano Pascucci Frédéric Bourgois Stefan Hufnagl +Jean Philippe Bonacci From ef94cf1dc1b4f6eb26d9fcb7cb6ea3da8204615f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 16 Nov 2018 07:51:57 +0800 Subject: [PATCH 05/46] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 8903bc837..a7473c3ba 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1455,3 +1455,4 @@ Stefano Pascucci Frédéric Bourgois Stefan Hufnagl Jean Philippe Bonacci +Jack Mitchell From 8c336d52fa90aa34fa2ec5242caed89247572b6f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 08:35:01 +0100 Subject: [PATCH 06/46] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a7473c3ba..414023ed6 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1456,3 +1456,4 @@ Frédéric Bourgois Stefan Hufnagl Jean Philippe Bonacci Jack Mitchell +Santiago Iglesias Garcia From 609a2a7d02f58739787366550f3be88a3d38b2bd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 16:50:47 +0100 Subject: [PATCH 07/46] Remove unused variable --- radio/src/telemetry/telemetry.cpp | 5 ----- radio/src/telemetry/telemetry.h | 2 -- 2 files changed, 7 deletions(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index d16782993..95af31711 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -28,8 +28,6 @@ uint8_t telemetryRxBufferCount = 0; uint8_t wshhStreaming = 0; #endif -uint8_t link_counter = 0; - uint8_t telemetryState = TELEMETRY_INIT; TelemetryData telemetryData; @@ -216,11 +214,8 @@ void telemetryReset() } telemetryStreaming = 0; // reset counter only if valid frsky packets are being detected - link_counter = 0; telemetryState = TELEMETRY_INIT; - - } // we don't reset the telemetry here as we would also reset the consumption after model load diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 21c4067df..a35d6b3b0 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -41,8 +41,6 @@ extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no extern uint8_t wshhStreaming; #endif -extern uint8_t link_counter; - enum TelemetryStates { TELEMETRY_INIT, TELEMETRY_OK, From 550f1130d6aec966c6e7009d39c8445f74478577 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 02:08:10 +0100 Subject: [PATCH 08/46] Cosmetics --- radio/src/pulses/pxx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 19a547ac7..f63ee0580 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -166,7 +166,7 @@ void PxxPulses::addExtraFlags(uint8_t port) extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); if (isModuleR9M(port)) { extra_flags |= (min(g_model.moduleData[port].pxx.power, isModuleR9M_FCC_VARIANT(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); - if(isModuleR9M_EUPLUS(port)) + if (isModuleR9M_EUPLUS(port)) extra_flags |= (1 << 6); } From 37d9d26008e87fffacd2b30b05a06674babe48ab Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 02:09:06 +0100 Subject: [PATCH 09/46] Updated according to latest spec --- radio/src/pulses/pxx2.cpp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index d7d32b588..e3791b2ed 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -38,22 +38,14 @@ void Pxx2Pulses::setupFrame(uint8_t port) // Flag1 uint8_t flag1 = addFlag1(port); - // Flag2 - addByte(0); + // Extra flags + addExtraFlags(port); // Channels addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); - // Extra flags - addExtraFlags(port); - - // Flag3, reserved - addByte(0); - #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - // CMD/Resp - addByte(1); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); @@ -61,13 +53,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } - else { - // CMD/Resp - addByte(0); - } -#else - // CMD/Resp - addByte(0); #endif // CRC From ab643602323cc189f048460ae8714ffadeacbc9d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 02:34:07 +0100 Subject: [PATCH 10/46] Cosmetics --- radio/src/pulses/pxx2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e3791b2ed..b57f052f3 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -38,7 +38,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) // Flag1 uint8_t flag1 = addFlag1(port); - // Extra flags + // Flag2 = Extra flags addExtraFlags(port); // Channels From 3605109d256ef6dfd8f495ec51e2f24486483696 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 03:41:51 +0100 Subject: [PATCH 11/46] HEAD and TAIL missing in PXX2 frames --- radio/src/pulses/pxx2.cpp | 4 +--- radio/src/pulses/pxx2.h | 43 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index b57f052f3..2ae1adfd8 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -24,7 +24,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) { initFrame(); - initCrc(); static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; uint8_t sendUpperChannels = 0; @@ -55,6 +54,5 @@ void Pxx2Pulses::setupFrame(uint8_t port) } #endif - // CRC - addByte(crc); // TODO need to check the CRC chosen algorithm + endFrame(); } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 939d0204d..1ba2bc045 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -41,11 +41,16 @@ class SportCrcMixin { }; -class Pxx2Transport: public DataBuffer, public SportCrcMixin { +class Pxx2Transport: public DataBuffer, public PxxCrcMixin { protected: void addByte(uint8_t byte) { - SportCrcMixin::addToCrc(byte); + PxxCrcMixin::addToCrc(byte); + addByteWithoutCrc(byte); + }; + + void addByteWithoutCrc(uint8_t byte) + { *ptr++ = byte; } @@ -63,9 +68,43 @@ class Pxx2Pulses: public PxxPulses { uint8_t data[64]; uint8_t * ptr; + void addHead() + { + // send 7E, do not CRC + Pxx2Transport::addByteWithoutCrc(0x7E); + + // reserve 1 byte for LEN + Pxx2Transport::addByteWithoutCrc(0x00); + + // TYPE_C + TYPE_ID + Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + } + + void addCrc() + { + Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); + Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc); + } + void initFrame() { + // init the CRC counter + initCrc(); + + // reset the frame pointer Pxx2Transport::initBuffer(); + + // add the frame head + addHead(); + } + + void endFrame() + { + // update the frame LEN = frame length minus the 2 first bytes + data[1] = getSize() - 2; + + // now add the CRC + addCrc(); } }; From 7a681bcb2cae71784e28e4ed8dcc5978a2d16938 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 03:47:33 +0100 Subject: [PATCH 12/46] Unused code removed --- radio/src/pulses/pxx2.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 1ba2bc045..3e0852167 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -53,11 +53,6 @@ class Pxx2Transport: public DataBuffer, public PxxCrcMixin { { *ptr++ = byte; } - - void addTail() - { - // nothing - } }; class Pxx2Pulses: public PxxPulses { From e71fc23a925005bb2559d757672f9276146a9fab Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 11:53:17 +0100 Subject: [PATCH 13/46] Stupid mistake... --- radio/src/pulses/pxx2.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 3e0852167..5893ef975 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -23,6 +23,7 @@ #include "./pxx.h" +// should not be used anymore class SportCrcMixin { protected: void initCrc() @@ -59,10 +60,6 @@ class Pxx2Pulses: public PxxPulses { public: void setupFrame(uint8_t port); - protected: - uint8_t data[64]; - uint8_t * ptr; - void addHead() { // send 7E, do not CRC From b30c9b63cde1d10c96dd1ae528a6477770395987 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 26 Nov 2018 00:08:01 +0100 Subject: [PATCH 14/46] PXX2 S.PORT started --- radio/src/telemetry/frsky.cpp | 38 ++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 02622bfeb..e1ee9fa20 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -20,6 +20,42 @@ #include "opentx.h" +#if defined(PXX2) +void processFrskyTelemetryData(uint8_t data) +{ + static uint8_t dataState = STATE_DATA_IDLE; + + switch (dataState) { + case STATE_DATA_IDLE: + if (data == START_STOP) { + telemetryRxBufferCount = 0; + dataState = STATE_DATA_START; + } + break; + + case STATE_DATA_START: + if (telemetryRxBufferCount == 0 && data > 0x0C) { + // wrong length + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; + if (telemetryRxBuffer[0] + 2 == telemetryRxBufferCount) { + sportProcessPacket(telemetryRxBuffer + 2); + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + } + else { + // overflow guard + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + break; + } +} +#else void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -101,4 +137,4 @@ void processFrskyTelemetryData(uint8_t data) } #endif } - +#endif From b72ccb483617fb77c808ff3d6b68319f2b161485 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:02:14 +0100 Subject: [PATCH 15/46] PXX2 always defined. PROTOCOL enums renamed. IRPROTOS removed --- radio/src/CMakeLists.txt | 5 - radio/src/dataconstants.h | 4 +- radio/src/functions.cpp | 3 +- radio/src/gui/128x64/model_telemetry.cpp | 2 +- radio/src/gui/gui_common_arm.cpp | 8 +- radio/src/io/frsky_sport.cpp | 4 +- radio/src/myeeprom.h | 125 ++++++------------ radio/src/pulses/dsm2_arm.cpp | 4 +- radio/src/pulses/pulses.h | 6 +- radio/src/pulses/pulses_arm.cpp | 98 +++++++------- radio/src/pulses/pulses_arm.h | 2 - radio/src/targets/common/arm/CMakeLists.txt | 8 +- .../arm/stm32/intmodule_serial_driver.cpp | 2 +- .../common/arm/stm32/serial2_driver.cpp | 2 +- radio/src/targets/horus/extmodule_driver.cpp | 4 +- radio/src/targets/horus/telemetry_driver.cpp | 4 +- .../src/targets/taranis/extmodule_driver.cpp | 4 +- .../taranis/intmodule_pulses_driver.cpp | 4 +- .../src/targets/taranis/telemetry_driver.cpp | 6 +- radio/src/telemetry/frsky.h | 6 +- radio/src/telemetry/telemetry.cpp | 39 +++--- radio/src/telemetry/telemetry.h | 18 ++- radio/src/telemetry/telemetry_sensors.cpp | 6 +- radio/src/translations/cz.h.txt | 14 +- radio/src/translations/de.h.txt | 14 +- radio/src/translations/en.h.txt | 15 +-- radio/src/translations/es.h.txt | 14 +- radio/src/translations/fi.h.txt | 14 +- radio/src/translations/fr.h.txt | 14 +- radio/src/translations/it.h.txt | 14 +- radio/src/translations/nl.h.txt | 14 +- radio/src/translations/pl.h.txt | 14 +- radio/src/translations/pt.h.txt | 14 +- radio/src/translations/se.h.txt | 12 +- 34 files changed, 174 insertions(+), 343 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 713655f44..e6c42e288 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -47,7 +47,6 @@ option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) option(MODULE_R9M_FLEX_FW "Add R9M options for non certified firmwwares" OFF) -option(PXX2 "Enable PXX v2 support" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -317,10 +316,6 @@ if(MODULE_R9M_FLEX_FW) add_definitions(-DMODULE_R9M_FLEX_FW) endif() -if(PXX2) - add_definitions(-DPXX2) -endif() - set(SRC ${SRC} opentx.cpp diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index a82ecb289..6bfed571e 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -224,12 +224,12 @@ enum BeeperMode { #endif #if defined(PCBTARANIS) || defined(PCBHORUS) -#define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) + #define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) #elif defined(PCBSKY9X) #define IS_INTERNAL_MODULE_ENABLED() (false) #endif -#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) +#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) enum UartModes { #if defined(CLI) || defined(DEBUG) diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 5142df59c..2422e0dc0 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -155,8 +155,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext active &= (bool)CFN_ACTIVE(cfn); } - if (active || IS_PLAY_BOTH_FUNC(CFN_FUNC(cfn))) { - + if (active) { switch (CFN_FUNC(cfn)) { #if defined(OVERRIDE_CHANNEL_FUNCTION) diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 5e763fd5c..1e322f8d0 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -543,7 +543,7 @@ void menuModelTelemetryFrsky(event_t event) case ITEM_TELEMETRY_RSSI_LABEL: #if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_MULTIMODULE && + if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FS_AFHDS2A) lcdDrawTextAlignedLeft(y, "RSNR"); else diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 2b22783e0..0fad2f4c4 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -537,23 +537,23 @@ bool isRfProtocolAvailable(int protocol) bool isTelemetryProtocolAvailable(int protocol) { #if defined(PCBTARANIS) - if (protocol == PROTOCOL_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) { return false; } #endif - if (protocol== PROTOCOL_PULSES_CROSSFIRE) { + if (protocol== PROTOCOL_TELEMETRY_CROSSFIRE) { return false; } #if !defined(MULTIMODULE) - if (protocol == PROTOCOL_SPEKTRUM || protocol == PROTOCOL_FLYSKY_IBUS || protocol == PROTOCOL_MULTIMODULE) { + if (protocol == PROTOCOL_TELEMETRY_SPEKTRUM || protocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS || protocol == PROTOCOL_TELEMETRY_MULTIMODULE) { return false; } #endif #if defined(PCBHORUS) - if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { return false; } #endif diff --git a/radio/src/io/frsky_sport.cpp b/radio/src/io/frsky_sport.cpp index a65de6159..1cd8de569 100644 --- a/radio/src/io/frsky_sport.cpp +++ b/radio/src/io/frsky_sport.cpp @@ -176,7 +176,7 @@ const char * sportUpdatePowerOn(ModuleIndex module) sportUpdateState = SPORT_POWERUP_REQ; sportWaitState(SPORT_IDLE, 500); // Clear the fifo - telemetryInit(PROTOCOL_FRSKY_SPORT); + telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); #if defined(PCBTARANIS) || defined(PCBHORUS) if (module == INTERNAL_MODULE) @@ -199,7 +199,7 @@ const char * sportUpdatePowerOn(ModuleIndex module) return NULL; } - if (telemetryProtocol != PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol != PROTOCOL_TELEMETRY_FRSKY_SPORT) { return TR("Not responding", "Not S.Port 1"); } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 3024536b5..ba58a329d 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -23,20 +23,8 @@ #include "datastructs.h" -#define WARN_THR_BIT 0x01 -#define WARN_BEP_BIT 0x80 -#define WARN_SW_BIT 0x02 -#define WARN_MEM_BIT 0x04 -#define WARN_BVAL_BIT 0x38 - -#define WARN_THR (!(g_eeGeneral.warnOpts & WARN_THR_BIT)) -#define WARN_BEP (!(g_eeGeneral.warnOpts & WARN_BEP_BIT)) -#define WARN_SW (!(g_eeGeneral.warnOpts & WARN_SW_BIT)) -#define WARN_MEM (!(g_eeGeneral.warnOpts & WARN_MEM_BIT)) -#define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 ) - - #define EEPROM_VER 218 - #define FIRST_CONV_EEPROM_VER 216 +#define EEPROM_VER 218 +#define FIRST_CONV_EEPROM_VER 216 #define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol #define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted @@ -53,10 +41,7 @@ #define IS_TRAINER_EXTERNAL_MODULE() false #endif - #define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) - - #define IS_PLAY_BOTH_FUNC(func) (0) - #define IS_VOLUME_FUNC(func) ((func) == FUNC_VOLUME) +#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) #if defined(GVARS) #define IS_ADJUST_GV_FUNC(func) ((func) == FUNC_ADJUST_GVAR) @@ -141,21 +126,20 @@ enum CurveRefType { CURVE_REF_CUSTOM }; - #define MIN_EXPO_WEIGHT -100 #define EXPO_VALID(ed) ((ed)->mode) #define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) - #define limit_min_max_t int16_t - #define LIMIT_EXT_PERCENT 150 - #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) - #define PPM_CENTER_MAX 500 - #define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000) - #define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000) - #define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset) - #define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) - #define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) - #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) +#define limit_min_max_t int16_t +#define LIMIT_EXT_PERCENT 150 +#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) +#define PPM_CENTER_MAX 500 +#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000) +#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000) +#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset) +#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) +#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) +#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) #define TRIM_OFF (1) #define TRIM_ON (0) @@ -191,8 +175,6 @@ enum CurveRefType { #define MD_OFFSET(md) (md->offset) #define MD_OFFSET_TO_UNION(md, var) var.word = md->offset #define MD_UNION_TO_OFFSET(var, md) md->offset = var.word -// #define MD_SETOFFSET(md, val) md->offset = val - enum LogicalSwitchesFunctions { LS_FUNC_NONE, @@ -222,14 +204,6 @@ enum LogicalSwitchesFunctions { #define MAX_LS_DELAY 250 /*25s*/ #define MAX_LS_ANDSW SWSRC_LAST -//#define TELEM_FLAG_TIMEOUT 0x01 -#define TELEM_FLAG_LOG 0x02 -//#define TELEM_FLAG_PERSISTENT 0x04 -//#define TELEM_FLAG_SCALE 0x08 -#define TELEM_FLAG_AUTO_OFFSET 0x10 -#define TELEM_FLAG_FILTER 0x20 -#define TELEM_FLAG_LOSS_ALARM 0x40 - enum TelemetrySensorType { TELEM_TYPE_CUSTOM, @@ -251,16 +225,10 @@ enum TelemetrySensorFormula }; enum VarioSource { -#if !defined(TELEMETRY_FRSKY_SPORT) - VARIO_SOURCE_ALTI, - VARIO_SOURCE_ALTI_PLUS, -#endif VARIO_SOURCE_VSPEED, VARIO_SOURCE_A1, VARIO_SOURCE_A2, -#if defined(TELEMETRY_FRSKY_SPORT) VARIO_SOURCE_DTE, -#endif VARIO_SOURCE_COUNT, VARIO_SOURCE_LAST = VARIO_SOURCE_COUNT-1 }; @@ -292,8 +260,6 @@ enum FrskyVoltsSource { FRSKY_VOLTS_SOURCE_LAST=FRSKY_VOLTS_SOURCE_CELLS }; - - enum SwashType { SWASH_TYPE_NONE, SWASH_TYPE_120, @@ -310,8 +276,8 @@ enum SwashType { #define ROTARY_ENCODER_MAX 1024 - #define TRIMS_ARRAY_SIZE 8 - #define TRIM_MODE_NONE 0x1F // 0b11111 +#define TRIMS_ARRAY_SIZE 8 +#define TRIM_MODE_NONE 0x1F // 0b11111 #define IS_MANUAL_RESET_TIMER(idx) (g_model.timers[idx].persistent == 2) @@ -321,37 +287,23 @@ enum SwashType { #define TIMER_COUNTDOWN_START(x) 10 #endif -enum Protocols { - PROTO_PPM, -#if defined(PXX) || defined(DSM2) || defined(IRPROTOS) - PROTO_PXX, +enum ChannelsProtocols { + PROTOCOL_CHANNELS_PPM, +#if defined(PXX) || defined(DSM2) + PROTOCOL_CHANNELS_PXX, #endif -#if defined(DSM2) || defined(IRPROTOS) - PROTO_DSM2_LP45, - PROTO_DSM2_DSM2, - PROTO_DSM2_DSMX, +#if defined(DSM2) + PROTOCOL_CHANNELS_DSM2_LP45, + PROTOCOL_CHANNELS_DSM2_DSM2, + PROTOCOL_CHANNELS_DSM2_DSMX, #endif - PROTO_CROSSFIRE, -#if defined(IRPROTOS) - // only used on AVR - // we will need 4 bits for proto :( - PROTO_SILV, - PROTO_TRAC09, - PROTO_PICZ, - PROTO_SWIFT, -#endif - PROTO_MULTIMODULE, - PROTO_SBUS, - PROTO_PXX2, - PROTO_NONE + PROTOCOL_CHANNELS_CROSSFIRE, + PROTOCOL_CHANNELS_MULTIMODULE, + PROTOCOL_CHANNELS_SBUS, + PROTOCOL_CHANNELS_PXX2, + PROTOCOL_CHANNELS_NONE }; -#if defined(PXX2) -#define PROTO_PXX_EXTERNAL_MODULE PROTO_PXX2 -#else -#define PROTO_PXX_EXTERNAL_MODULE PROTO_PXX -#endif - enum XJTRFProtocols { RF_PROTO_OFF = -1, RF_PROTO_X16, @@ -492,17 +444,18 @@ enum ThrottleSources { THROTTLE_SOURCE_CH1, }; -enum TelemetryType +enum TelemetryProtocols { PROTOCOL_TELEMETRY_FIRST, - PROTOCOL_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, - PROTOCOL_FRSKY_D, - PROTOCOL_FRSKY_D_SECONDARY, - PROTOCOL_PULSES_CROSSFIRE, - PROTOCOL_SPEKTRUM, - PROTOCOL_FLYSKY_IBUS, - PROTOCOL_MULTIMODULE, - PROTOCOL_TELEMETRY_LAST=PROTOCOL_MULTIMODULE + PROTOCOL_TELEMETRY_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, + PROTOCOL_TELEMETRY_FRSKY_D, + PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY, + PROTOCOL_TELEMETRY_CROSSFIRE, + PROTOCOL_TELEMETRY_SPEKTRUM, + PROTOCOL_TELEMETRY_FLYSKY_IBUS, + PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_PXX2, }; enum DisplayTrims @@ -512,8 +465,6 @@ enum DisplayTrims DISPLAY_TRIMS_ALWAYS }; -#define TOTAL_EEPROM_USAGE (sizeof(ModelData)*MAX_MODELS + sizeof(RadioData)) - extern RadioData g_eeGeneral; extern ModelData g_model; diff --git a/radio/src/pulses/dsm2_arm.cpp b/radio/src/pulses/dsm2_arm.cpp index 99b6506b0..97a4a4818 100644 --- a/radio/src/pulses/dsm2_arm.cpp +++ b/radio/src/pulses/dsm2_arm.cpp @@ -125,10 +125,10 @@ void setupPulsesDSM2(uint8_t port) modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; switch (s_current_protocol[port]) { - case PROTO_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_LP45: dsmDat[0] = 0x00; break; - case PROTO_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSM2: dsmDat[0] = 0x10; break; default: // DSMX diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 6a0739149..3fe9977cf 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -51,7 +51,7 @@ enum ModuleFlag #endif #if defined(DSM2) - #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTO_DSM2_LP45 && protocol<=PROTO_DSM2_DSMX) + #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTOCOL_CHANNELS_DSM2_LP45 && protocol<=PROTOCOL_CHANNELS_DSM2_DSMX) #else #define IS_DSM2_PROTOCOL(protocol) (0) #endif @@ -63,7 +63,7 @@ enum ModuleFlag #endif #if defined(MULTIMODULE) - #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTO_MULTIMODULE) + #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTOCOL_CHANNELS_MULTIMODULE) #if !defined(DSM2) #error You need to enable DSM2 = PPM for MULTIMODULE support #endif @@ -71,7 +71,7 @@ enum ModuleFlag #define IS_MULTIMODULE_PROTOCOL(protocol) (0) #endif - #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTO_SBUS) + #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) #include "pulses_arm.h" diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index f91a36194..4cd7ab383 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -19,11 +19,8 @@ */ #include "opentx.h" - -#if defined(PXX2) #include "io/pxx2.h" #include "pulses/pxx2.h" -#endif uint8_t s_pulses_paused = 0; uint8_t s_current_protocol[NUM_MODULES] = { MODULES_INIT(255) }; @@ -47,14 +44,14 @@ uint8_t getRequiredProtocol(uint8_t port) switch (g_model.moduleData[INTERNAL_MODULE].type) { #if defined(TARANIS_INTERNAL_PPM) case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; + required_protocol = PROTOCOL_CHANNELS_PPM; break; #endif case MODULE_TYPE_XJT: - required_protocol = PROTO_PXX; + required_protocol = PROTOCOL_CHANNELS_PXX; break; default: - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } break; @@ -63,30 +60,32 @@ uint8_t getRequiredProtocol(uint8_t port) default: switch (g_model.moduleData[EXTERNAL_MODULE].type) { case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; + required_protocol = PROTOCOL_CHANNELS_PPM; break; case MODULE_TYPE_XJT: + required_protocol = PROTOCOL_CHANNELS_PXX; + break; case MODULE_TYPE_R9M: - required_protocol = PROTO_PXX_EXTERNAL_MODULE; // either PXX or PXX2 depending on compilation options + required_protocol = PROTOCOL_CHANNELS_PXX2; break; case MODULE_TYPE_SBUS: - required_protocol = PROTO_SBUS; + required_protocol = PROTOCOL_CHANNELS_SBUS; break; #if defined(MULTIMODULE) case MODULE_TYPE_MULTIMODULE: - required_protocol = PROTO_MULTIMODULE; + required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; break; #endif #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); + required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); // The module is set to OFF during one second before BIND start { static tmr10ms_t bindStartTime = 0; if (moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) { if (bindStartTime == 0) bindStartTime = get_tmr10ms(); if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } } @@ -98,24 +97,24 @@ uint8_t getRequiredProtocol(uint8_t port) #endif #if defined(CROSSFIRE) case MODULE_TYPE_CROSSFIRE: - required_protocol = PROTO_CROSSFIRE; + required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; break; #endif default: - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } break; } if (s_pulses_paused) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; } #if 0 // will need an EEPROM conversion if (moduleFlag[port] == MODULE_OFF) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; } #endif @@ -146,38 +145,36 @@ void setupPulses(uint8_t port) if (s_current_protocol[port] != required_protocol) { init_needed = true; switch (s_current_protocol[port]) { // stop existing protocol hardware - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: disable_pxx(port); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: disable_serial(port); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: + case PROTOCOL_CHANNELS_CROSSFIRE: disable_module_timer(port); break; #endif -#if defined(PXX2) - case PROTO_PXX2: + case PROTOCOL_CHANNELS_PXX2: disable_module_timer(port); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: disable_serial(port); break; - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: disable_ppm(port); break; @@ -190,28 +187,28 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: setupPulsesPXX(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: setupPulsesSbus(port); scheduleNextMixerCalculation(port, SBUS_PERIOD); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: setupPulsesDSM2(port); scheduleNextMixerCalculation(port, DSM2_PERIOD); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: - if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE && !init_needed) { + case PROTOCOL_CHANNELS_CROSSFIRE: + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE && !init_needed) { uint8_t * crossfire = modulePulsesData[port].crossfire.pulses; uint8_t len; #if defined(LUA) @@ -232,26 +229,25 @@ void setupPulses(uint8_t port) break; #endif -#if defined(PXX2) - case PROTO_PXX2: - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && !init_needed) { + case PROTOCOL_CHANNELS_PXX2: + // here we have to wait that telemetryInit() is called, hence this test + if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2 && !init_needed) { modulePulsesData[port].pxx2.setupFrame(port); sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); } scheduleNextMixerCalculation(port, PXX2_PERIOD); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: setupPulsesMultimodule(port); scheduleNextMixerCalculation(port, MULTIMODULE_PERIOD); break; #endif - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: #if defined(PCBSKY9X) - case PROTO_NONE: + case PROTOCOL_CHANNELS_NONE: #endif setupPulsesPPMModule(port); scheduleNextMixerCalculation(port, PPM_PERIOD(port)); @@ -263,41 +259,39 @@ void setupPulses(uint8_t port) if (init_needed) { switch (required_protocol) { // Start new protocol hardware here - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: init_pxx(port); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: init_serial(port, DSM2_BAUDRATE, DSM2_PERIOD * 2000); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: + case PROTOCOL_CHANNELS_CROSSFIRE: init_module_timer(port, CROSSFIRE_PERIOD, true); break; #endif -#if defined(PXX2) - case PROTO_PXX2: + case PROTOCOL_CHANNELS_PXX2: init_module_timer(port, PXX2_PERIOD, true); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: init_serial(port, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); break; #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: init_serial(port, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); break; - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: init_ppm(port); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 744abb07b..3c7311988 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -82,9 +82,7 @@ union ModulePulsesData { PwmPxxPulses pxx; #endif -#if defined(PXX2) Pxx2Pulses pxx2; -#endif #if defined(PPM_PIN_SERIAL) Dsm2SerialPulsesData dsm2; diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 51110e88b..3acf9aaa1 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -132,13 +132,7 @@ set(PULSES_SRC ppm_arm.cpp pxx.cpp pxx1.cpp + pxx2.cpp dsm2_arm.cpp sbus_arm.cpp ) - -if(PXX2) - set(PULSES_SRC - ${PULSES_SRC} - pxx2.cpp - ) -endif() diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index a930fd227..b372d8744 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -124,7 +124,7 @@ extern "C" void INTMODULE_DMA_STREAM_IRQHandler(void) void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; diff --git a/radio/src/targets/common/arm/stm32/serial2_driver.cpp b/radio/src/targets/common/arm/stm32/serial2_driver.cpp index 049f09374..cb39d4173 100644 --- a/radio/src/targets/common/arm/stm32/serial2_driver.cpp +++ b/radio/src/targets/common/arm/stm32/serial2_driver.cpp @@ -97,7 +97,7 @@ void serial2Init(unsigned int mode, unsigned int protocol) break; #endif case UART_MODE_TELEMETRY: - if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { uart3Setup(FRSKY_D_BAUDRATE, true); } break; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 724c16837..630db99c1 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -215,7 +215,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { + if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCR3 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); @@ -234,7 +234,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { + else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 8541c0742..b7df7b3ef 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -175,7 +175,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } @@ -205,7 +205,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) else { telemetryNoDMAFifo.push(data); #if defined(LUA) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 522ae7ba0..2e15ba244 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -238,7 +238,7 @@ void extmodulePxxStart() void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { + if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance @@ -249,7 +249,7 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { + else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { #if defined(EXTMODULE_USART) DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 1999dc796..4610474a6 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -60,7 +60,7 @@ void intmoduleNoneStart() void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -70,7 +70,7 @@ void intmoduleSendNextFrame() INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) - else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) { + else if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2; INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index f3b58159e..56ce4fe58 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -127,7 +127,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } @@ -157,7 +157,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) else { telemetryFifo.push(data); #if defined(LUA) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); @@ -174,7 +174,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) uint8_t telemetryGetByte(uint8_t * byte) { #if defined(SERIAL2) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { if (serial2Mode == UART_MODE_TELEMETRY) return serial2RxFifo.pop(*byte); else diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index e138dcf62..4ab190259 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,6 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" +#include "io/pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { @@ -32,12 +33,7 @@ enum FrSkyDataState { STATE_DATA_XOR, }; -#if defined(PXX2) -#include "io/pxx2.h" -#define FRSKY_SPORT_BAUDRATE PXX2_BAUDRATE -#else #define FRSKY_SPORT_BAUDRATE 57600 -#endif #define FRSKY_D_BAUDRATE 9600 diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 95af31711..cfa7cb7ec 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -42,21 +42,21 @@ uint8_t serialInversion = 0; void processTelemetryData(uint8_t data) { #if defined(CROSSFIRE) - if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { processCrossfireTelemetryData(data); return; } #endif #if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_SPEKTRUM) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) { processSpektrumTelemetryData(data); return; } - if (telemetryProtocol == PROTOCOL_FLYSKY_IBUS) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS) { processFlySkyTelemetryData(data); return; } - if (telemetryProtocol == PROTOCOL_MULTIMODULE) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE) { processMultiTelemetryData(data); return; } @@ -67,15 +67,18 @@ void processTelemetryData(uint8_t data) void telemetryWakeup() { uint8_t requiredTelemetryProtocol = modelTelemetryProtocol(); + #if defined(REVX) uint8_t requiredSerialInversion = g_model.moduleData[EXTERNAL_MODULE].invertedSerial; if (telemetryProtocol != requiredTelemetryProtocol || serialInversion != requiredSerialInversion) { serialInversion = requiredSerialInversion; -#else - if (telemetryProtocol != requiredTelemetryProtocol) { -#endif telemetryInit(requiredTelemetryProtocol); } +#else + if (telemetryProtocol != requiredTelemetryProtocol) { + telemetryInit(requiredTelemetryProtocol); + } +#endif #if defined(STM32) uint8_t data; @@ -87,7 +90,7 @@ void telemetryWakeup() } while (telemetryGetByte(&data)); } #elif defined(PCBSKY9X) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { uint8_t data; while (telemetrySecondPortReceive(data)) { processTelemetryData(data); @@ -99,7 +102,6 @@ void telemetryWakeup() } #endif - for (int i=0; iid == RSSI_ID) { return false; } @@ -42,7 +42,7 @@ bool isFaiForbidden(source_t idx) } break; - case PROTOCOL_FRSKY_D: + case PROTOCOL_TELEMETRY_FRSKY_D: if (sensor->id == D_RSSI_ID) { return false; } @@ -52,7 +52,7 @@ bool isFaiForbidden(source_t idx) break; #if defined(CROSSFIRE) - case PROTOCOL_PULSES_CROSSFIRE: + case PROTOCOL_TELEMETRY_CROSSFIRE: if (sensor->id == RX_RSSI1_INDEX) { return false; } diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 20b40cd90..6afecd4cf 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -149,7 +149,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -157,21 +157,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POZ""NEG" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 94520161b..375b90271 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -152,7 +152,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -160,21 +160,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 920dce585..1a146c9c2 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,22 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9526692a3..9ad62dbfe 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 2b29e1140..edef72c5c 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index b6b62a7e5..a3e02c61c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SLV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 4cc640c15..ab43b7d9f 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 1091d3ae1..c5f7d83fb 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -153,7 +153,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -161,21 +161,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f24c2846e..a2ae231d9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -152,7 +152,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -160,21 +160,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POZ""NEG" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 61de3d069..bfebabbd3 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -150,7 +150,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -158,21 +158,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 7bc236511..df237ea5a 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -149,7 +149,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -157,19 +157,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "Pos""Neg" From 659144e093b071c493bc7650cff1a9d325a04c86 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:16:36 +0100 Subject: [PATCH 16/46] Compilation fixes --- radio/src/targets/sky9x/pulses_driver.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 02f8d5cf5..34f24f2cf 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -261,7 +261,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID3) { // Use the current protocol, don't switch until set_up_pulses switch (s_current_protocol[EXTERNAL_MODULE]) { - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: // Alternate periods of 6.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -284,9 +284,9 @@ extern "C" void PWM_IRQHandler(void) } break; - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: // Alternate periods of 19.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -309,9 +309,9 @@ extern "C" void PWM_IRQHandler(void) break; #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: // Todo: how to do inverted polarity on this platform? // Alternate periods of 5.5mS and 3.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; From ae91903d57c9c91c3e65a42321df46cce7994fea Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:17:47 +0100 Subject: [PATCH 17/46] Compilation fixes --- radio/src/telemetry/frsky.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 4ab190259..05bd3e14f 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,7 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" -#include "io/pxx2.h" +#include "../io/pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { From 9c096b76b35e05136128526fee4f29f083f37e00 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:53:44 +0100 Subject: [PATCH 18/46] Compilation fixes --- radio/src/targets/sky9x/board.h | 8 +++++++- radio/src/targets/sky9x/pulses_driver.cpp | 16 ++++++++++++++++ radio/src/targets/sky9x/telemetry_driver.cpp | 9 ++++----- radio/src/telemetry/telemetry.cpp | 1 - radio/src/telemetry/telemetry.h | 3 +-- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index c49fd1119..07861eb69 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -261,6 +261,8 @@ void init_pxx(uint32_t port); void disable_pxx(uint32_t port); void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t port); +void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); +void disable_module_timer( uint32_t module_index); // SD driver #if defined(SIMU) @@ -405,8 +407,12 @@ void debugPutc(const char c); // Telemetry driver void telemetryPortInit(uint32_t baudrate, uint8_t mode); uint32_t telemetryTransmitPending(); -void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size); +void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size); void rxPdcUsart( void (*pChProcess)(uint8_t x) ); +inline void sportSendBuffer(const uint8_t * buffer, uint32_t size) +{ + telemetryTransmitBuffer(buffer, size); +} // Second UART driver void serial2TelemetryInit(unsigned int protocol); diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 34f24f2cf..4764b1c43 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -129,6 +129,22 @@ void init_no_pulses(uint32_t port) } } +void init_module_timer(uint32_t port, uint32_t period, uint8_t state) +{ + if (port == EXTERNAL_MODULE) { + // TODO use period here + init_main_ppm(3000, 0); + } +} + +void disable_module_timer(uint32_t port) +{ + if (port == EXTERNAL_MODULE) { + disable_ppm(EXTERNAL_MODULE); + } +} + + void disable_no_pulses(uint32_t port) { if (port == EXTERNAL_MODULE) { diff --git a/radio/src/targets/sky9x/telemetry_driver.cpp b/radio/src/targets/sky9x/telemetry_driver.cpp index e9dc3edaa..e26a63be6 100644 --- a/radio/src/targets/sky9x/telemetry_driver.cpp +++ b/radio/src/targets/sky9x/telemetry_driver.cpp @@ -135,12 +135,11 @@ void rxPdcUsart( void (*pChProcess)(uint8_t x) ) #endif } -uint32_t txPdcUsart(uint8_t *buffer, uint32_t size) +uint32_t txPdcUsart(const uint8_t * buffer, uint32_t size) { - Usart *pUsart = SECOND_USART; + Usart * pUsart = SECOND_USART; - if ( pUsart->US_TNCR == 0 ) - { + if (pUsart->US_TNCR == 0) { #ifndef SIMU pUsart->US_TNPR = (uint32_t)buffer ; #endif @@ -174,7 +173,7 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) #endif } -void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size) +void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size) { txPdcUsart(buffer, size); } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index cfa7cb7ec..b40033783 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -38,7 +38,6 @@ uint8_t telemetryProtocol = 255; uint8_t serialInversion = 0; #endif - void processTelemetryData(uint8_t data) { #if defined(CROSSFIRE) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 1b97a850e..3170bae7f 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -97,7 +97,6 @@ void delTelemetryIndex(uint8_t index); int availableTelemetryIndex(); int lastUsedTelemetryIndex(); -int32_t getTelemetryValue(uint8_t index, uint8_t & prec); int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec); void frskySportSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance); @@ -107,7 +106,7 @@ void frskyDSetDefault(int index, uint16_t id); #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH) extern uint8_t telemetryProtocol; -#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) + #if defined (MULTIMODULE) #define IS_D16_MULTI() ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FRSKY) && (g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH)) #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && IS_D16_MULTI())) From 6568752559c343a0875476fb18e0330ceabce9fb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 19:39:12 +0100 Subject: [PATCH 19/46] PXX2 Rx side should be OK now --- radio/src/telemetry/frsky.cpp | 22 ++++++++++++++++------ radio/src/telemetry/frsky.h | 25 ++----------------------- radio/src/telemetry/frsky_sport.cpp | 17 +++++++++++------ radio/src/telemetry/telemetry.cpp | 6 ++++++ 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index e1ee9fa20..e2c072e2d 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -20,8 +20,16 @@ #include "opentx.h" -#if defined(PXX2) -void processFrskyTelemetryData(uint8_t data) +bool checkPXX2PacketCRC(const uint8_t * packet) +{ + // TODO ... + + return true; + // TRACE("checkPXX2PacketCRC(): checksum error "); + // DUMP(packet, FRSKY_SPORT_PACKET_SIZE); +} + +void processFrskyPXX2Data(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -41,8 +49,10 @@ void processFrskyTelemetryData(uint8_t data) } else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { telemetryRxBuffer[telemetryRxBufferCount++] = data; - if (telemetryRxBuffer[0] + 2 == telemetryRxBufferCount) { - sportProcessPacket(telemetryRxBuffer + 2); + if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { + if (checkPXX2PacketCRC(telemetryRxBuffer)) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + } telemetryRxBufferCount = 0; dataState = STATE_DATA_IDLE; } @@ -55,7 +65,7 @@ void processFrskyTelemetryData(uint8_t data) break; } } -#else + void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -137,4 +147,4 @@ void processFrskyTelemetryData(uint8_t data) } #endif } -#endif + diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 05bd3e14f..c2a99d802 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -202,7 +202,6 @@ enum FrSkyDataState { #define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UR 0xC6 // 6 - #if defined(NO_RAS) #define IS_RAS_VALUE_VALID() (false) #elif defined(PCBX10) @@ -215,13 +214,6 @@ enum FrSkyDataState { #define IS_HIDDEN_TELEMETRY_VALUE(id) ((id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID)) -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) @@ -283,11 +275,11 @@ typedef enum { // FrSky D Telemetry Protocol void processHubPacket(uint8_t id, int16_t value); -void frskyDSendNextAlarm(); void frskyDProcessPacket(const uint8_t *packet); // FrSky S.PORT Telemetry Protocol void sportProcessTelemetryPacket(const uint8_t * packet); +void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet); void telemetryWakeup(); void telemetryReset(); @@ -307,14 +299,6 @@ enum TelemetryProtocol TELEM_PROTO_FLYSKY_IBUS, }; -enum TelemAnas { - TELEM_ANA_A1, - TELEM_ANA_A2, - TELEM_ANA_A3, - TELEM_ANA_A4, - TELEM_ANA_COUNT -}; - struct TelemetryData { TelemetryValueWithMin swr; // TODO Min not needed TelemetryValueWithMin rssi; // TODO Min not needed @@ -324,12 +308,7 @@ struct TelemetryData { extern TelemetryData telemetryData; - typedef uint16_t frskyCellVoltage_t; - -void frskySetCellsCount(uint8_t cellscount); -void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts); -void frskyUpdateCells(); - void processFrskyTelemetryData(uint8_t data); +void processFrskyPXX2Data(uint8_t data); #endif // _FRSKY_H_ diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 9369c3024..a0b8fc33f 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -92,7 +92,7 @@ const FrSkySportSensor * getFrSkySportSensor(uint16_t id, uint8_t subId=0) return result; } -bool checkSportPacket(const uint8_t *packet) +bool checkSportPacket(const uint8_t * packet) { short crc = 0; for (int i=1; i Date: Thu, 29 Nov 2018 07:42:30 +0100 Subject: [PATCH 20/46] Stupip bug, missing return! --- radio/src/telemetry/telemetry.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 667376e30..96124792c 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -64,6 +64,7 @@ void processTelemetryData(uint8_t data) if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { processFrskyPXX2Data(data); + return; } processFrskyTelemetryData(data); From a830a968eca8cf106f3ca30d2bb9a610c783e61d Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 29 Nov 2018 15:42:42 +0100 Subject: [PATCH 21/46] Compilation fix --- radio/src/targets/sky9x/board.h | 9 +++------ radio/src/targets/sky9x/telemetry_driver.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index 07861eb69..d12b6b046 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -60,7 +60,7 @@ enum EnumKeys KEY_PLUS = KEY_UP, KEY_RIGHT, KEY_LEFT, - + TRM_BASE, TRM_LH_DWN = TRM_BASE, TRM_LH_UP, @@ -409,10 +409,7 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode); uint32_t telemetryTransmitPending(); void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size); void rxPdcUsart( void (*pChProcess)(uint8_t x) ); -inline void sportSendBuffer(const uint8_t * buffer, uint32_t size) -{ - telemetryTransmitBuffer(buffer, size); -} +void sportSendBuffer(const uint8_t * buffer, uint32_t size); // Second UART driver void serial2TelemetryInit(unsigned int protocol); diff --git a/radio/src/targets/sky9x/telemetry_driver.cpp b/radio/src/targets/sky9x/telemetry_driver.cpp index e26a63be6..4875c5d35 100644 --- a/radio/src/targets/sky9x/telemetry_driver.cpp +++ b/radio/src/targets/sky9x/telemetry_driver.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -173,6 +173,11 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) #endif } +void sportSendBuffer(const uint8_t * buffer, uint32_t size) +{ + telemetryTransmitBuffer(buffer, size); +} + void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size) { txPdcUsart(buffer, size); From 1e448b09a9c249b6b0ad363f1c7a587cf9c62b75 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 09:10:08 +0100 Subject: [PATCH 22/46] RSSI handling --- radio/src/telemetry/frsky.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index e2c072e2d..94349eaed 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -51,6 +51,12 @@ void processFrskyPXX2Data(uint8_t data) telemetryRxBuffer[telemetryRxBufferCount++] = data; if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { if (checkPXX2PacketCRC(telemetryRxBuffer)) { + if (telemetryRxBuffer[2] & 0x80) { + telemetryData.rssi.set(telemetryRxBuffer[2] & 0x7f); + } + else { + // TODO : vbat handling + } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } telemetryRxBufferCount = 0; From ddcb104372309b543e9d7706548444cb8900beb5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 10:30:43 +0100 Subject: [PATCH 23/46] Create RSSI and VBAT sensor from pxx1.5 data stream --- radio/src/telemetry/frsky.cpp | 12 ++++++++++-- radio/src/telemetry/frsky_sport.cpp | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 94349eaed..c863e2ee2 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -29,6 +29,14 @@ bool checkPXX2PacketCRC(const uint8_t * packet) // DUMP(packet, FRSKY_SPORT_PACKET_SIZE); } +void createFrSkyPXX2Sensor(uint16_t type, uint8_t value){ + uint8_t buffer[5] = {0x18, 0x10, 0, 0, 0}; + buffer[2] = type & 0xF; + buffer[3] = type >> 8; + buffer[4] = value; + sportProcessTelemetryPacketWithoutCrc(buffer); +} + void processFrskyPXX2Data(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -52,10 +60,10 @@ void processFrskyPXX2Data(uint8_t data) if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { if (checkPXX2PacketCRC(telemetryRxBuffer)) { if (telemetryRxBuffer[2] & 0x80) { - telemetryData.rssi.set(telemetryRxBuffer[2] & 0x7f); + createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); } else { - // TODO : vbat handling + createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index a0b8fc33f..0b5224de5 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -154,6 +154,8 @@ void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet) uint16_t id = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); + TRACE("%x %x %x %x\n", physicalId, primId, id,SPORT_DATA_U8(packet) ); + if (primId == DATA_FRAME) { uint8_t instance = physicalId + 1; if (id == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) { From 6e84afe436baa003c77453f3f681445beaa5cde0 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 11:24:13 +0100 Subject: [PATCH 24/46] Add R9M dynamic power sensor --- radio/src/telemetry/frsky.cpp | 3 +++ radio/src/telemetry/frsky.h | 2 ++ radio/src/telemetry/frsky_sport.cpp | 7 +++++-- radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 21 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index c863e2ee2..2dc8578f7 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -65,6 +65,9 @@ void processFrskyPXX2Data(uint8_t data) else { createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); } + if((telemetryRxBuffer[3] & 0x04) == 0) { + createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03); + } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } telemetryRxBufferCount = 0; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index c2a99d802..7b789edeb 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -192,6 +192,8 @@ enum FrSkyDataState { #define XJT_VERSION_ID 0xf106 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f +#define R9_PWR_ID 0xf107 // TODO: *CRITICAL* agree on ID with FrSky, this value is just a placeholder + // Default sensor data IDs (Physical IDs + CRC) #define DATA_ID_VARIO 0x00 // 0 diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 0b5224de5..7cc80ff36 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -36,6 +36,7 @@ const FrSkySportSensor sportSensors[] = { { A3_FIRST_ID, A3_LAST_ID, 0, ZSTR_A3, UNIT_VOLTS, 2 }, { A4_FIRST_ID, A4_LAST_ID, 0, ZSTR_A4, UNIT_VOLTS, 2 }, { BATT_ID, BATT_ID, 0, ZSTR_BATT, UNIT_VOLTS, 1 }, + { R9_PWR_ID, R9_PWR_ID, 0, ZSTR_R9PW, UNIT_MILLIWATTS, 0 }, { T1_FIRST_ID, T1_LAST_ID, 0, ZSTR_TEMP1, UNIT_CELSIUS, 0 }, { T2_FIRST_ID, T2_LAST_ID, 0, ZSTR_TEMP2, UNIT_CELSIUS, 0 }, { RPM_FIRST_ID, RPM_LAST_ID, 0, ZSTR_RPM, UNIT_RPMS, 0 }, @@ -154,8 +155,6 @@ void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet) uint16_t id = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); - TRACE("%x %x %x %x\n", physicalId, primId, id,SPORT_DATA_U8(packet) ); - if (primId == DATA_FRAME) { uint8_t instance = physicalId + 1; if (id == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) { @@ -166,6 +165,10 @@ void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet) else telemetryData.rssi.set(data); } + else if (id == R9_PWR_ID) { + uint32_t r9pwr[] = {100, 200, 500, 1000}; + data = r9pwr[SPORT_DATA_U8(packet) & 0x03]; + } else if (id == XJT_VERSION_ID) { telemetryData.xjtVersion = HUB_DATA_U16(packet); if (!IS_RAS_VALUE_VALID()) { diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 6afecd4cf..232c8042f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1182,6 +1182,7 @@ #define TR_JITTER_FILTER "ADC Filtr" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 375b90271..99f732b24 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1180,6 +1180,7 @@ #define TR_JITTER_FILTER "ADC Filter" // ---------------------------------------------------------------- #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 1a146c9c2..d83e74e5e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1190,6 +1190,7 @@ #define TR_JITTER_FILTER "ADC filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9ad62dbfe..95ea1e70d 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1186,6 +1186,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index edef72c5c..713f76875 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1172,6 +1172,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index a3e02c61c..e3856eb73 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1198,6 +1198,7 @@ #define TR_JITTER_FILTER "Filtre ADC" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index ab43b7d9f..8440f38c3 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1181,6 +1181,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index c5f7d83fb..47cfbf8ea 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1188,6 +1188,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a2ae231d9..a560a2b90 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1182,6 +1182,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index bfebabbd3..6cedfde68 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1185,6 +1185,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index df237ea5a..e8ae0b8ec 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1195,6 +1195,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" From e6349ab68210ec2aa71e51a8b3fff78dafa64e88 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 11:50:57 +0100 Subject: [PATCH 25/46] Compile fix --- radio/src/telemetry/frsky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 2dc8578f7..249776c17 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -66,7 +66,7 @@ void processFrskyPXX2Data(uint8_t data) createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); } if((telemetryRxBuffer[3] & 0x04) == 0) { - createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03); + createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } From edc3d7372e274b3b6ec7fd85871249439a27e1e5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 09:29:36 +0100 Subject: [PATCH 26/46] POC X7 --- radio/src/CMakeLists.txt | 5 --- radio/src/bitfield.h | 51 ++++++++++++++++++++++++++++ radio/src/gui/128x64/model_setup.cpp | 12 ++----- radio/src/gui/gui_common.h | 5 +-- radio/src/gui/gui_common_arm.cpp | 22 +++++++++--- radio/src/opentx.h | 1 + radio/src/pulses/pulses_arm.h | 6 ++-- radio/src/pulses/pxx2.cpp | 1 + radio/src/telemetry/frsky.cpp | 11 +++++- radio/src/telemetry/frsky.h | 3 +- radio/src/telemetry/telemetry.cpp | 7 ++-- radio/src/telemetry/telemetry.h | 3 +- radio/src/translations.h | 8 +++-- radio/util/fwoptions.py | 6 ---- 14 files changed, 104 insertions(+), 37 deletions(-) create mode 100644 radio/src/bitfield.h diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index e6c42e288..35b9922fd 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -46,7 +46,6 @@ option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) -option(MODULE_R9M_FLEX_FW "Add R9M options for non certified firmwwares" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -312,10 +311,6 @@ if(NIGHTLY_BUILD_WARNING) add_definitions(-DNIGHTLY_BUILD_WARNING) endif(NIGHTLY_BUILD_WARNING) -if(MODULE_R9M_FLEX_FW) - add_definitions(-DMODULE_R9M_FLEX_FW) -endif() - set(SRC ${SRC} opentx.cpp diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h new file mode 100644 index 000000000..84b3632b5 --- /dev/null +++ b/radio/src/bitfield.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * 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 BITFIELD_H +#define BITFIELD_H + +// A set of bitfield handling macros +#define BF_BIT(n) ( 1<<(n) ) +#define BF_BIT_GET(y, mask) ( y & (mask) ) +#define BF_BIT_SET(y, mask) ( y |= (mask) ) +#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) +#define BF_BIT_FLIP(y, mask) ( y ^= (mask) ) +#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i)) +#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) + +//! Create a bitmask of length 'len'. +#define BF_BITMASK(len) ( BF_BIT(len)-1 ) + +//! Create a bitfield mask of length 'len' starting at bit 'start'. +#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) + +//! Prepare a bitmask for insertion or combining. +#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) + +//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. +#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) + +//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. +#define BF_SET(y, x, start, len) \ + ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) + +#endif //BITFIELD_H \ No newline at end of file diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6b2298f09..7db9f56ea 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -161,7 +161,7 @@ enum MenuModelSetupItems { #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) - #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) @@ -727,7 +727,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) + else if (isR9ModuleRunning(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { @@ -1192,13 +1192,7 @@ void menuModelSetup(event_t event) } #endif if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, TR_R9MFLEX_FREQ, BF_GET(g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1), attr); } else if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index c48ee4463..5959484da 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -54,6 +54,7 @@ bool isSwitchAvailableInCustomFunctions(int swtch); bool isSwitchAvailableInMixes(int swtch); bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); +bool isR9ModuleRunning(int module); bool isModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); @@ -155,12 +156,12 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define FAILSAFE_ROWS(x) ((isModuleXJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW -#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) #if defined(PCBXLITE) && !defined(MODULE_R9M_FULLSIZE) #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW #else -#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW +#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #endif void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 0fad2f4c4..343103bd6 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -486,13 +486,18 @@ bool isSourceAvailableInResetSpecialFunction(int index) } } +bool isR9ModuleRunning(int module) +{ +#if defined(SIMU) + return g_model.moduleData[module].type == MODULE_TYPE_R9M && TELEMETRY_STREAMING(); // Simu uses telemetry simu to activate/desactivate R9 +#else + return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; +#endif +} + bool isR9MModeAvailable(int mode) { -#if defined(MODULE_R9M_FLEX_FW) - return mode >= MODULE_SUBTYPE_R9M_EUPLUS; -#else - return mode <= MODULE_SUBTYPE_R9M_EU; -#endif + return mode <= MODULE_SUBTYPE_R9M_EUPLUS; } bool isModuleAvailable(int module) @@ -516,6 +521,9 @@ bool isModuleAvailable(int module) return false; } #endif + if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + return false; + } return true; } @@ -531,6 +539,10 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif + if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { + return false; + } + return true; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index daf616120..0039e0a3f 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -27,6 +27,7 @@ #include #include "definitions.h" #include "opentx_types.h" +#include "bitfield.h" #if defined(STM32) #include "usbd_conf.h" #endif diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 3c7311988..8b7e047a2 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -184,8 +184,10 @@ enum R9MLBTPowerValues { #else -#define LEN_R9M_REGION "\006" -#define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" +#define LEN_R9M_REGION "\004" +#define TR_R9M_REGION "FCC\0""EU\0 ""FLEX" +#define LEN_R9MFLEX_FREQ "\006" +#define TR_R9MFLEX_FREQ "868Mhz""915Mhz" #define LEN_R9M_FCC_POWER_VALUES "\006" #define LEN_R9M_LBT_POWER_VALUES "\013" #define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0" diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 2ae1adfd8..7cce0f298 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -45,6 +45,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { + TRACE("SENDING TELEM"); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 249776c17..e5eb12ff9 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -59,6 +59,11 @@ void processFrskyPXX2Data(uint8_t data) telemetryRxBuffer[telemetryRxBufferCount++] = data; if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { if (checkPXX2PacketCRC(telemetryRxBuffer)) { + R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected + uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; + if (R9Region != 0x04) { + BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 1, 2); // heading bit holds flex frequency + } if (telemetryRxBuffer[2] & 0x80) { createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); } @@ -68,7 +73,11 @@ void processFrskyPXX2Data(uint8_t data) if((telemetryRxBuffer[3] & 0x04) == 0) { createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); } - sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + + if (telemetryRxBuffer[0] == 0x0c) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + TRACE("Got TELEM data"); + } } telemetryRxBufferCount = 0; dataState = STATE_DATA_IDLE; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 7b789edeb..2e88e4843 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -190,9 +190,10 @@ enum FrSkyDataState { #define BATT_ID 0xf104 #define RAS_ID 0xf105 #define XJT_VERSION_ID 0xf106 +#define R9_PWR_ID 0xf107 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f -#define R9_PWR_ID 0xf107 // TODO: *CRITICAL* agree on ID with FrSky, this value is just a placeholder + // Default sensor data IDs (Physical IDs + CRC) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 96124792c..8fabe7692 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -21,6 +21,7 @@ #include "opentx.h" uint8_t telemetryStreaming = 0; +uint8_t R9ModuleStreaming = 0; uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) uint8_t telemetryRxBufferCount = 0; @@ -120,7 +121,7 @@ void telemetryWakeup() varioWakeup(); } #endif - + #define FRSKY_BAD_ANTENNA() (IS_RAS_VALUE_VALID() && telemetryData.swr.value > 0x33) static tmr10ms_t alarmsCheckTime = 0; @@ -202,7 +203,9 @@ void telemetryInterrupt10ms() wshhStreaming--; } #endif - + if (R9ModuleStreaming > 0) { + R9ModuleStreaming--; + } if (telemetryStreaming > 0) { telemetryStreaming--; } diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 3170bae7f..400a27ed6 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -36,6 +36,7 @@ #endif extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time +extern uint8_t R9ModuleStreaming; // >0 (true) == R9 module is connected and sending data 0 = no data detected for some time #if defined(WS_HOW_HIGH) extern uint8_t wshhStreaming; @@ -130,7 +131,7 @@ inline uint8_t modelTelemetryProtocol() if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return PROTOCOL_TELEMETRY_PXX2; } - + #if defined(MULTIMODULE) if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { return PROTOCOL_TELEMETRY_MULTIMODULE; diff --git a/radio/src/translations.h b/radio/src/translations.h index 2ec3981dd..4e2191070 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -188,8 +188,9 @@ extern const char STR_OPEN9X[]; #define OFS_VFAILSAFE (OFS_USBMODES + sizeof(TR_USBMODES)) #define OFS_VTRAINERMODES (OFS_VFAILSAFE + sizeof(TR_VFAILSAFE)) #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) - #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) - #define OFS_R9M_FCC_POWER_VALUES (OFS_R9M_REGION + sizeof(TR_R9M_REGION)) + #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) + #define OFS_R9MFLEX_FREQ (OFS_R9M_REGION + sizeof(TR_R9M_REGION)) + #define OFS_R9M_FCC_POWER_VALUES (OFS_R9MFLEX_FREQ + sizeof(TR_R9MFLEX_FREQ)) #define OFS_R9M_LBT_POWER_VALUES (OFS_R9M_FCC_POWER_VALUES + sizeof(TR_R9M_FCC_POWER_VALUES)) #define OFS_TELEMETRY_PROTOCOLS (OFS_R9M_LBT_POWER_VALUES + sizeof(TR_R9M_LBT_POWER_VALUES)) #define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS)) @@ -294,7 +295,8 @@ extern const char STR_OPEN9X[]; #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) - #define STR_R9M_REGION (STR_OPEN9X + OFS_R9M_REGION) + #define STR_R9M_REGION (STR_OPEN9X + OFS_R9M_REGION) + #define STR_R9MFLEX_FREQ (STR_OPEN9X + OFS_R9MFLEX_FREQ) #define STR_R9M_FCC_POWER_VALUES (STR_OPEN9X + OFS_R9M_FCC_POWER_VALUES) #define STR_R9M_LBT_POWER_VALUES (STR_OPEN9X + OFS_R9M_LBT_POWER_VALUES) #define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS) diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 3e16c3b4f..50b61319e 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -79,7 +79,6 @@ options_taranis = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranisplus = { @@ -97,7 +96,6 @@ options_taranisplus = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_xlite = { @@ -114,7 +112,6 @@ options_xlite = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "stdr9m": ("MODULE_R9M_FULLSIZE", "YES", None), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranisx9e = { @@ -132,7 +129,6 @@ options_taranisx9e = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "horussticks": ("STICKS", "HORUS", "STANDARD"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_x12s = { @@ -147,7 +143,6 @@ options_x12s = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "pcbdev": ("PCBREV", "10", None), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_x10 = { @@ -161,5 +156,4 @@ options_x10 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } From baf5ec147e8effb94966cbc207592a3aedf54075 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 09:33:19 +0100 Subject: [PATCH 27/46] Fix sensors telem --- radio/src/telemetry/frsky.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 249776c17..91930819a 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -68,7 +68,9 @@ void processFrskyPXX2Data(uint8_t data) if((telemetryRxBuffer[3] & 0x04) == 0) { createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); } - sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + if (telemetryRxBuffer[0] == 0x0C) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + } } telemetryRxBufferCount = 0; dataState = STATE_DATA_IDLE; From bd2f80b05bc242533b777f788af8aa466e621dd4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 17:27:44 +0100 Subject: [PATCH 28/46] Fix Radio -> TX telemetry sending --- radio/src/pulses/pxx2.cpp | 1 + radio/src/targets/taranis/telemetry_driver.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 2ae1adfd8..500cfc2fd 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -46,6 +46,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) + addByte(outputTelemetryBufferTrigger); for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); } diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 56ce4fe58..c805f56e8 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -127,7 +127,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } From b791c0ab1a061f2035b4f8772e3b376bb1796f4e Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 17:52:57 +0100 Subject: [PATCH 29/46] FrSky confirmed usage of 0xf107 --- radio/src/telemetry/frsky.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 7b789edeb..2e88e4843 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -190,9 +190,10 @@ enum FrSkyDataState { #define BATT_ID 0xf104 #define RAS_ID 0xf105 #define XJT_VERSION_ID 0xf106 +#define R9_PWR_ID 0xf107 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f -#define R9_PWR_ID 0xf107 // TODO: *CRITICAL* agree on ID with FrSky, this value is just a placeholder + // Default sensor data IDs (Physical IDs + CRC) From f48c6a9cfaecce9f2ef203e1e6f59f64073b7545 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 7 Dec 2018 09:00:26 +0100 Subject: [PATCH 30/46] Fix potential sport out corruption --- radio/src/pulses/pxx2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 500cfc2fd..0f613074b 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -44,7 +44,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); #if defined(LUA) - if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { + if (outputTelemetryBufferTrigger != 0x7E && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) addByte(outputTelemetryBufferTrigger); for (uint8_t i=0; i<7; i++) { From 22c1d5895abd262890e8836b4c17fab4ddf56ef9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 12 Dec 2018 13:27:11 +0100 Subject: [PATCH 31/46] X7 POC for R9 region sensing --- radio/src/gui/128x64/model_setup.cpp | 35 ++++++++++++++-------------- radio/src/gui/gui_common.h | 1 + radio/src/gui/gui_common_arm.cpp | 13 ++++++++++- radio/src/pulses/pulses_arm.h | 2 ++ radio/src/telemetry/frsky.cpp | 2 +- radio/src/translations.cpp | 2 ++ radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 18 files changed, 48 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7db9f56ea..67fa85ef6 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -97,6 +97,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -170,7 +171,7 @@ enum MenuModelSetupItems { #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, #else - #define EXTRA_MODULE_ROWS + #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW #endif #if defined(PCBX7) @@ -273,7 +274,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - EXTRA_MODULE_ROWS + EXTRA_MODULE_ROWS, FAILSAFE_ROWS(EXTERNAL_MODULE), TRAINER_ROWS }); #else @@ -728,7 +729,7 @@ void menuModelSetup(event_t event) else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isR9ModuleRunning(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType & 0x03, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -755,16 +756,6 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } - #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1191,10 +1182,7 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, TR_R9MFLEX_FREQ, BF_GET(g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1), attr); - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1241,6 +1229,19 @@ void menuModelSetup(event_t event) } break; + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].subType, 2, 1); + lcdDrawTextAlignedLeft(y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, frequency, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, frequency, 1); + BF_SET(g_model.moduleData[moduleIdx].subType, frequency, 2, 1); + } + } + #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 5959484da..91711344e 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -55,6 +55,7 @@ bool isSwitchAvailableInMixes(int swtch); bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); +bool isR9MMFlex(int module); bool isModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 343103bd6..86545034a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -490,7 +490,7 @@ bool isR9ModuleRunning(int module) { #if defined(SIMU) return g_model.moduleData[module].type == MODULE_TYPE_R9M && TELEMETRY_STREAMING(); // Simu uses telemetry simu to activate/desactivate R9 -#else +#else return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; #endif } @@ -500,6 +500,11 @@ bool isR9MModeAvailable(int mode) return mode <= MODULE_SUBTYPE_R9M_EUPLUS; } +bool isR9MMFlex(int module) +{ + return g_model.moduleData[module].subType >= MODULE_SUBTYPE_R9M_EUPLUS; +} + bool isModuleAvailable(int module) { #if defined(CROSSFIRE) @@ -521,10 +526,14 @@ bool isModuleAvailable(int module) return false; } #endif +#if !defined(PCBSKY9X) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } +#endif + return true; + } bool isRfProtocolAvailable(int protocol) @@ -539,9 +548,11 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif +#if defined(pxx) if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return false; } +#endif return true; } diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 8b7e047a2..79a2347e1 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -166,6 +166,8 @@ void setCustomFailsafe(uint8_t moduleIndex); #define LEN_R9M_LBT_POWER_VALUES "\015" #define TR_R9M_FCC_POWER_VALUES "(100 mW)" #define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0 ""100mW no tele" +#define LEN_R9MFLEX_FREQ "\006" +#define TR_R9MFLEX_FREQ "868Mhz""915Mhz" enum R9MFCCPowerValues { R9M_FCC_POWER_100 = 0, diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index e5eb12ff9..9ddf55d09 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -62,7 +62,7 @@ void processFrskyPXX2Data(uint8_t data) R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; if (R9Region != 0x04) { - BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 1, 2); // heading bit holds flex frequency + BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 0, 2); // heading bit holds flex frequency } if (telemetryRxBuffer[2] & 0x80) { createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 6684816da..c49b8d83f 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -92,6 +92,7 @@ const char STR_OPEN9X[] = ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) ISTR(R9M_REGION) + ISTR(R9MFLEX_FREQ) ISTR(R9M_FCC_POWER_VALUES) ISTR(R9M_LBT_POWER_VALUES) ISTR(TELEMETRY_PROTOCOLS) @@ -144,6 +145,7 @@ const char STR_PPMFRAME[] = TR_PPMFRAME; const char STR_REFRESHRATE[] = TR_REFRESHRATE; const char SSTR_WARN_BATTVOLTAGE[] = STR_WARN_BATTVOLTAGE; const char STR_MS[] = TR_MS; +const char STR_FREQUENCY[] = TR_FREQUENCY; const char STR_SWITCH[] = TR_SWITCH; const char STR_TRIMS[] = TR_TRIMS; const char STR_FADEIN[] = TR_FADEIN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 4e2191070..bca41eb21 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -363,6 +363,7 @@ extern const char STR_PPMFRAME[]; extern const char STR_REFRESHRATE[]; extern const char SSTR_WARN_BATTVOLTAGE[]; extern const char STR_MS[]; +extern const char STR_FREQUENCY[]; extern const char STR_SWITCH[]; extern const char STR_TRIMS[]; extern const char STR_FADEIN[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 232c8042f..b4c6dcad8 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -563,6 +563,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Spínač" #define TR_TRIMS "Trimy" #define TR_FADEIN "Přechod Zap" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 99f732b24..61acde6a7 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -568,6 +568,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schalt.", "Schalter") #define TR_TRIMS "Trims" #define TR_FADEIN "Langs. Ein" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index d83e74e5e..6515ccc31 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -566,6 +566,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" #define TR_TRIMS "Trims" #define TR_FADEIN "Fade in" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 95ea1e70d..401a7f32a 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -571,6 +571,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Interr" #define TR_TRIMS "Trims" #define TR_FADEIN "Inicio" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 713f76875..ee3987d8c 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -563,6 +563,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" #define TR_TRIMS "Trims" #define TR_FADEIN "Fade In" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index e3856eb73..28eb453ec 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -580,6 +580,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Inter", "Interrupteur") #define TR_TRIMS "Trims" #define TR_FADEIN "Fondu ON" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 8440f38c3..33330d96b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -569,6 +569,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Inter." #define TR_TRIMS "Trims" #define TR_FADEIN "Diss.In" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 47cfbf8ea..d860725a7 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -563,6 +563,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schak.", "Schakelaar") #define TR_TRIMS "Trims" #define TR_FADEIN "Fade in" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a560a2b90..23a97885a 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -570,6 +570,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Przełą" #define TR_TRIMS "Trymy" #define TR_FADEIN "Pojawia" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 6cedfde68..97b505244 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -570,6 +570,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Chave" #define TR_TRIMS "Trims" #define TR_FADEIN "Aparecer" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index e8ae0b8ec..f6133f73a 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -582,6 +582,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Brytare" #define TR_TRIMS "Trimmar" #define TR_FADEIN "Tona In" From b850470783e039bab37bee07fa545df3c07b6c86 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 13 Dec 2018 08:15:00 +0100 Subject: [PATCH 32/46] Extra union added --- radio/src/datastructs.h | 15 ++++++++++++--- radio/src/gui/128x64/model_setup.cpp | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 44eb39f6a..1010276fe 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -406,9 +406,18 @@ PACK(struct ModuleData { int8_t rfProtocol:4; uint8_t channelsStart; int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; union { struct { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 67fa85ef6..20118ad8c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1232,7 +1232,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].subType, 2, 1); + uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].r9m.freq, 2, 1); lcdDrawTextAlignedLeft(y, STR_FREQUENCY); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, frequency, LEFT | attr); if (attr) From 50e004df9a0f810e06305da803a7ff7a1cf3e4e2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 08:28:28 +0100 Subject: [PATCH 33/46] A more elegant approach (thank @bsongis) --- radio/src/gui/128x64/model_setup.cpp | 8 +++----- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/telemetry/frsky.cpp | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 20118ad8c..2385ea836 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -729,7 +729,7 @@ void menuModelSetup(event_t event) else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isR9ModuleRunning(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType & 0x03, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1232,13 +1232,11 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].r9m.freq, 2, 1); lcdDrawTextAlignedLeft(y, STR_FREQUENCY); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, frequency, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, frequency, 1); - BF_SET(g_model.moduleData[moduleIdx].subType, frequency, 2, 1); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); } } diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 86545034a..a2c2bbb78 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -502,7 +502,7 @@ bool isR9MModeAvailable(int mode) bool isR9MMFlex(int module) { - return g_model.moduleData[module].subType >= MODULE_SUBTYPE_R9M_EUPLUS; + return g_model.moduleData[module].r9m.region == 0x02; } bool isModuleAvailable(int module) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 9ddf55d09..22edba920 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -62,7 +62,7 @@ void processFrskyPXX2Data(uint8_t data) R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; if (R9Region != 0x04) { - BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 0, 2); // heading bit holds flex frequency + g_model.moduleData[EXTERNAL_MODULE].r9m.region = R9Region; } if (telemetryRxBuffer[2] & 0x80) { createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); From cc6660291da96690e52fb480c5538b1b95d022e6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 08:54:41 +0100 Subject: [PATCH 34/46] Cleanups and fixes related to R9 region changes --- radio/src/myeeprom.h | 9 +++++++++ radio/src/pulses/modules.h | 10 +++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index ba58a329d..15713ab96 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -321,6 +321,15 @@ enum R9MSubTypes MODULE_SUBTYPE_R9M_LAST=MODULE_SUBTYPE_R9M_AUPLUS }; +enum R9MRegion +{ + MODULE_REGION_R9M_FCC, + MODULE_REGION_R9M_EU, + MODULE_REGION_R9M_FLEX, + MODULE_REGION_R9M_LAST=MODULE_REGION_R9M_FLEX +}; + + enum MultiModuleRFProtocols { MM_RF_PROTO_CUSTOM = -1, MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM, diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 2ecb78168..cbc26a5df 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -106,27 +106,27 @@ inline bool isModuleR9M(uint8_t idx) inline bool isModuleR9M_FCC(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FCC; } inline bool isModuleR9M_LBT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_EU; } inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_REGION_R9M_EU; } inline bool isModuleR9M_EUPLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EUPLUS; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x00; } inline bool isModuleR9M_AU_PLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_AUPLUS; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x01; } From 1c3d306c48600412b42a79abedc2a994f6089c05 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 12:59:04 +0100 Subject: [PATCH 35/46] Tidy up --- radio/src/bitfield.h | 51 ---------------------------- radio/src/gui/128x64/model_setup.cpp | 1 + radio/src/gui/gui_common_arm.cpp | 6 ++-- radio/src/myeeprom.h | 14 +++++--- radio/src/opentx.h | 1 - radio/src/pulses/modules.h | 10 +++--- radio/src/pulses/pxx2.cpp | 1 - radio/src/telemetry/frsky.cpp | 1 - 8 files changed, 19 insertions(+), 66 deletions(-) delete mode 100644 radio/src/bitfield.h diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h deleted file mode 100644 index 84b3632b5..000000000 --- a/radio/src/bitfield.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * 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 BITFIELD_H -#define BITFIELD_H - -// A set of bitfield handling macros -#define BF_BIT(n) ( 1<<(n) ) -#define BF_BIT_GET(y, mask) ( y & (mask) ) -#define BF_BIT_SET(y, mask) ( y |= (mask) ) -#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) -#define BF_BIT_FLIP(y, mask) ( y ^= (mask) ) -#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i)) -#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) - -//! Create a bitmask of length 'len'. -#define BF_BITMASK(len) ( BF_BIT(len)-1 ) - -//! Create a bitfield mask of length 'len' starting at bit 'start'. -#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) - -//! Prepare a bitmask for insertion or combining. -#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) - -//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. -#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) - -//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. -#define BF_SET(y, x, start, len) \ - ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) - -#endif //BITFIELD_H \ No newline at end of file diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2385ea836..bffa812c6 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1239,6 +1239,7 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); } } + break; #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index a2c2bbb78..771f6fb0a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -502,7 +502,7 @@ bool isR9MModeAvailable(int mode) bool isR9MMFlex(int module) { - return g_model.moduleData[module].r9m.region == 0x02; + return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; } bool isModuleAvailable(int module) @@ -526,7 +526,7 @@ bool isModuleAvailable(int module) return false; } #endif -#if !defined(PCBSKY9X) +#if defined(PCBTARANIS) || defined(PCBHORUS) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } @@ -548,7 +548,7 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif -#if defined(pxx) +#if defined(PCBTARANIS) || defined(PCBHORUS) if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return false; } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 15713ab96..8f435befe 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -323,12 +323,18 @@ enum R9MSubTypes enum R9MRegion { - MODULE_REGION_R9M_FCC, - MODULE_REGION_R9M_EU, - MODULE_REGION_R9M_FLEX, - MODULE_REGION_R9M_LAST=MODULE_REGION_R9M_FLEX + MODULE_R9M_REGION_FCC, + MODULE_R9M_REGION_EU, + MODULE_R9M_REGION_FLEX, + MODULE_R9M_REGION_LAST=MODULE_R9M_REGION_FLEX }; +enum R9MFrenquency +{ + MODULE_R9M_FREQ_868MHZ + MODULE_R9M_FREQ_915MHZ, + MODULE_R9M_FREQ_LAST=MODULE_R9M_FREQ_915MHZ +}; enum MultiModuleRFProtocols { MM_RF_PROTO_CUSTOM = -1, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 0039e0a3f..daf616120 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -27,7 +27,6 @@ #include #include "definitions.h" #include "opentx_types.h" -#include "bitfield.h" #if defined(STM32) #include "usbd_conf.h" #endif diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index cbc26a5df..8a8dd2bec 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -106,27 +106,27 @@ inline bool isModuleR9M(uint8_t idx) inline bool isModuleR9M_FCC(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FCC; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FCC; } inline bool isModuleR9M_LBT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_EU; } inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_REGION_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_R9M_REGION_EU; } inline bool isModuleR9M_EUPLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x00; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_868MHZ; } inline bool isModuleR9M_AU_PLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x01; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_915MHZ; } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 7cce0f298..2ae1adfd8 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -45,7 +45,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - TRACE("SENDING TELEM"); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 22edba920..6b5d61edf 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -76,7 +76,6 @@ void processFrskyPXX2Data(uint8_t data) if (telemetryRxBuffer[0] == 0x0c) { sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); - TRACE("Got TELEM data"); } } telemetryRxBufferCount = 0; From 32146e767a4b864b4e1ac1efdb6691b29666162b Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 14:16:14 +0100 Subject: [PATCH 36/46] typo, fix compilation --- radio/src/myeeprom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 8f435befe..dacfab2d6 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -331,7 +331,7 @@ enum R9MRegion enum R9MFrenquency { - MODULE_R9M_FREQ_868MHZ + MODULE_R9M_FREQ_868MHZ, MODULE_R9M_FREQ_915MHZ, MODULE_R9M_FREQ_LAST=MODULE_R9M_FREQ_915MHZ }; From 0f8c4a7a7fa068f1e7149c308e01557598567f2e Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 17:35:07 +0100 Subject: [PATCH 37/46] Fix Xlite R9 UI (pulse still wrong) --- radio/src/gui/128x64/model_setup.cpp | 46 +++++++++++++++++++++++++--- radio/src/gui/gui_common.h | 6 ++++ radio/src/gui/gui_common_arm.cpp | 12 +++++++- radio/src/pulses/modules.h | 33 +++++++++++++++++++- 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bffa812c6..600f980c1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -97,7 +97,9 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, +#if !defined(PCBXLITE) ITEM_MODEL_EXTERNAL_MODULE_FREQ, +#endif #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -161,17 +163,21 @@ enum MenuModelSetupItems { #define OUTPUT_TYPE_ROWS() #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) - +#if defined(PCBXLITE) + #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#else #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 - +#endif #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) #define POT_WARN_ITEMS() ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) #define TIMER_ROWS 2, 0, 0, 0, 0 #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, +#elif defined(PCBXLITE) + #define EXTRA_MODULE_ROWS #else - #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW + #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #endif #if defined(PCBX7) @@ -274,7 +280,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - EXTRA_MODULE_ROWS, + EXTRA_MODULE_ROWS FAILSAFE_ROWS(EXTERNAL_MODULE), TRAINER_ROWS }); #else @@ -728,8 +734,13 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); +#if defined(PCBXLITE) + else if (isModuleR9M(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); +#else else if (isR9ModuleRunning(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); +#endif #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -756,6 +767,17 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); +#if defined(PCBXLITE) + else if (isModuleR9M(EXTERNAL_MODULE)) { + uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); + if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { + POPUP_WARNING(STR_R9MFLEXWARN1); + const char * w = STR_R9MFLEXWARN2; + SET_WARNING_INFO(w, strlen(w), 0); + } + g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; + } +#endif #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1182,7 +1204,20 @@ void menuModelSetup(event_t event) } } #endif +#if defined(PCBXLITE) + if (isModuleR9M(moduleIdx)) { + lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); + if (IS_TELEMETRY_INTERNAL_MODULE()) { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); + } + else { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); + } + } + else if (isModuleSBUS(moduleIdx)) { +#else if (isModuleSBUS(moduleIdx)) { +#endif lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1228,7 +1263,7 @@ void menuModelSetup(event_t event) } break; - +#if !defined(PCBXLITE) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1240,6 +1275,7 @@ void menuModelSetup(event_t event) } } break; +#endif #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 91711344e..1b06616ce 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -157,10 +157,16 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define FAILSAFE_ROWS(x) ((isModuleXJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#if defined(PCBXLITE) +#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#else #define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#endif #if defined(PCBXLITE) && !defined(MODULE_R9M_FULLSIZE) #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW +#elif defined(PCBXLITE) +#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #else #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #endif diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 771f6fb0a..38ae22b4a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -494,12 +494,22 @@ bool isR9ModuleRunning(int module) return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; #endif } +#if defined(PCBXLITE) +bool isR9MModeAvailable(int mode) +{ +#if defined(MODULE_R9M_FLEX_FW) + return mode >= MODULE_SUBTYPE_R9M_EUPLUS; +#else + return mode <= MODULE_SUBTYPE_R9M_EU; +#endif +} +#else bool isR9MModeAvailable(int mode) { return mode <= MODULE_SUBTYPE_R9M_EUPLUS; } - +#endif bool isR9MMFlex(int module) { return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 8a8dd2bec..0af8a58ef 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -99,6 +99,37 @@ inline bool isModulePPM(uint8_t idx) } #endif +#if defined(PCBXLITE) +inline bool isModuleR9M(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_R9M; +} + +inline bool isModuleR9M_FCC(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; +} + +inline bool isModuleR9M_LBT(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; +} + +inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; +} + +inline bool isModuleR9M_EUPLUS(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EUPLUS; +} + +inline bool isModuleR9M_AU_PLUS(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_AUPLUS; +} +#else inline bool isModuleR9M(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_R9M; @@ -128,7 +159,7 @@ inline bool isModuleR9M_AU_PLUS(uint8_t idx) { return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_915MHZ; } - +#endif inline bool isModulePXX(uint8_t idx) { From 03c162b8da106ad3ae4a909c6ae138aec6887a1e Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 17:53:57 +0100 Subject: [PATCH 38/46] Fix Xlite R9 pulse (untested) --- radio/src/pulses/pulses_arm.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 4cd7ab383..290369e3a 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -66,7 +66,11 @@ uint8_t getRequiredProtocol(uint8_t port) required_protocol = PROTOCOL_CHANNELS_PXX; break; case MODULE_TYPE_R9M: +#if defined(PCBXLITE) + required_protocol = PROTOCOL_CHANNELS_PXX; +#else required_protocol = PROTOCOL_CHANNELS_PXX2; +#endif break; case MODULE_TYPE_SBUS: required_protocol = PROTOCOL_CHANNELS_SBUS; From d08910778b6cd7c739a3519ad0af6ac30366ee35 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 14 Dec 2018 09:38:26 +0100 Subject: [PATCH 39/46] X9 UI --- radio/src/gui/212x64/model_setup.cpp | 41 +++++++++++++--------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 4f8c5ead2..193f3b805 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -88,6 +88,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_LINE1, @@ -253,7 +254,8 @@ int getSwitchWarningsCount() #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : isModuleMultimodule(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -296,6 +298,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTRA_MODULE_ROWS LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS}); MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); @@ -733,8 +736,8 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -771,15 +774,6 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1129,16 +1123,7 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1174,6 +1159,18 @@ void menuModelSetup(event_t event) break; } + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawTextAlignedLeft(y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; + #if defined (MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) From de6574f45c68ee03c24941a140084523b2ef5f30 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 14 Dec 2018 10:26:55 +0100 Subject: [PATCH 40/46] HORUS UI --- radio/src/gui/480x272/model_setup.cpp | 41 +++++++++++++-------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 0931e475b..ef90129b2 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -82,6 +82,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_LINE1, @@ -236,7 +237,8 @@ int getSwitchWarningsCount() #define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : isModuleMultimodule(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -285,6 +287,7 @@ bool menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTRA_MODULE_ROWS LABEL(Trainer), 0, TRAINER_LINE1_ROWS, @@ -693,8 +696,8 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); - else if (isModuleR9M(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -728,15 +731,6 @@ bool menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1068,16 +1062,7 @@ bool menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_WARN_BATTVOLTAGE); drawValueWithUnit(MODEL_SETUP_4TH_COLUMN, y, getBatteryVoltage(), UNIT_VOLTS, attr|PREC2|LEFT); } @@ -1116,6 +1101,18 @@ bool menuModelSetup(event_t event) } break; + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; + #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) From 15cf9748e39bae2522b8ff1d18948c576f487bdb Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 14 Dec 2018 12:03:24 +0100 Subject: [PATCH 41/46] Fix R9M lite telemetry on Xlite --- radio/src/telemetry/telemetry.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 400a27ed6..daaf9947d 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -129,7 +129,11 @@ inline uint8_t modelTelemetryProtocol() } if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { +#if defined(PCBXLITE) + return PROTOCOL_TELEMETRY_FRSKY_SPORT; +#else return PROTOCOL_TELEMETRY_PXX2; +#endif } #if defined(MULTIMODULE) From 0e0943ba974c1140b0938baf001aba2aef39cd6b Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 16 Dec 2018 10:36:37 +0100 Subject: [PATCH 42/46] Compilation fix --- radio/src/pulses/modules.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 0af8a58ef..7d9a7275c 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -88,7 +88,7 @@ inline bool isModulePPM(uint8_t idx) { return idx == TRAINER_MODULE || (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || - (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM)); + (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #else inline bool isModulePPM(uint8_t idx) From 460686bc9fdec1af443b1ec8200354fcae17d991 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 14:30:59 +0100 Subject: [PATCH 43/46] Does it fix the freeze issue? --- radio/src/gui/480x272/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index e8bb01f92..8a08cdbd4 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] { +const uint8_t __alpha_button_on[] __DMA { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] { +const uint8_t __alpha_button_off[] __DMA { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); From b2d9037da88eca96dcebf74ce76a9e2f03475a5d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 14:32:04 +0100 Subject: [PATCH 44/46] Cosmetics --- radio/src/gui/480x272/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index 8a08cdbd4..d9eff1526 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] __DMA { +const uint8_t __alpha_button_on[] __DMA = { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] __DMA { +const uint8_t __alpha_button_off[] __DMA = { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); From c6d932c98856916800ff0dcafe3cd3cca328db22 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 14:44:21 +0100 Subject: [PATCH 45/46] Alignment --- radio/src/gui/480x272/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index d9eff1526..065017c6f 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] __DMA = { +static const uint8_t __alpha_button_on[] __ALIGNED(4) = { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] __DMA = { +static const uint8_t __alpha_button_off[] __ALIGNED(4) = { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); From d0f87bc3e211c2e218b5944ff22c1e49cfac2675 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Jan 2019 21:57:51 +0100 Subject: [PATCH 46/46] CRC bytestuffing (needs to be tested) ... --- radio/src/pulses/pxx.h | 18 +++++++++--------- radio/src/pulses/pxx1.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 31e7e16fc..0fcf7f89e 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -150,7 +150,7 @@ class StandardPxxTransport: public BitTransport, public PxxCrcMixin { addByteWithoutCrc(byte); }; - void addRawByteWithoutCrc(uint8_t byte) + void addRawByte(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { if (byte & 0x80) @@ -198,28 +198,28 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { addWithByteStuffing(byte); } - void addRawByteWithoutCrc(uint8_t byte) + void addRawByte(uint8_t byte) { - addByteWithoutCrc(byte); + *ptr++ = byte; } void addByteWithoutCrc(uint8_t byte) { - *ptr++ = byte; + addWithByteStuffing(byte); } void addWithByteStuffing(uint8_t byte) { if (0x7E == byte) { - *ptr++ = 0x7D; - *ptr++ = 0x5E; + addRawByte(0x7D); + addRawByte(0x5E); } else if (0x7D == byte) { - *ptr++ = 0x7D; - *ptr++ = 0x5D; + addRawByte(0x7D); + addRawByte(0x5D); } else { - *ptr++ = byte; + addRawByte(byte); } } diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index d7d958b45..03624e7ea 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -33,7 +33,7 @@ class Pxx1Pulses: public PxxPulses void addHead() { // send 7E, do not CRC - PxxTransport::addRawByteWithoutCrc(0x7E); + PxxTransport::addRawByte(0x7E); } void addCrc()