From 713402b572f7972267ebce155624bbe0eb2b00c7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Oct 2018 00:12:53 +0200 Subject: [PATCH 01/61] PXX2 first draft --- radio/src/CMakeLists.txt | 7 +- radio/src/io/pxx2.h | 27 +++ radio/src/myeeprom.h | 8 +- radio/src/pulses/pulses_arm.cpp | 24 ++- radio/src/pulses/pulses_arm.h | 4 +- radio/src/pulses/pxx.h | 23 +++ radio/src/pulses/pxx2.cpp | 184 ++++++++++++++++++ radio/src/pulses/pxx2.h | 21 ++ radio/src/pulses/pxx_arm.cpp | 5 +- .../targets/common/arm/stm32/CMakeLists.txt | 10 + radio/src/targets/taranis/board.h | 18 +- radio/src/targets/taranis/pulses_driver.cpp | 9 + 12 files changed, 322 insertions(+), 18 deletions(-) create mode 100644 radio/src/io/pxx2.h create mode 100644 radio/src/pulses/pxx.h create mode 100644 radio/src/pulses/pxx2.cpp create mode 100644 radio/src/pulses/pxx2.h diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index b620c7f86..713655f44 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -47,6 +47,7 @@ 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).") @@ -313,7 +314,11 @@ if(NIGHTLY_BUILD_WARNING) endif(NIGHTLY_BUILD_WARNING) if(MODULE_R9M_FLEX_FW) - add_definitions(-DMODULE_R9M_FLEX_FW) + add_definitions(-DMODULE_R9M_FLEX_FW) +endif() + +if(PXX2) + add_definitions(-DPXX2) endif() set(SRC diff --git a/radio/src/io/pxx2.h b/radio/src/io/pxx2.h new file mode 100644 index 000000000..3a1506a67 --- /dev/null +++ b/radio/src/io/pxx2.h @@ -0,0 +1,27 @@ +/* + * 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 + * + * 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 _IO_PXX2_H_ +#define _IO_PXX2_H_ + +#define PXX2_BAUDRATE 230400 +#define PXX2_PERIOD 4 // 4ms + +#endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index c8a2d9af0..30767b1cb 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -342,10 +342,16 @@ enum Protocols { #endif PROTO_MULTIMODULE, PROTO_SBUS, - PROTO_MAX, + PROTO_PXX2, PROTO_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, diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index f9e613682..14543ebd7 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -20,6 +20,11 @@ #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) }; uint16_t failsafeCounter[NUM_MODULES] = { MODULES_INIT(100) }; @@ -56,14 +61,13 @@ uint8_t getRequiredProtocol(uint8_t port) #endif default: - port = EXTERNAL_MODULE; // ensure it's external module only switch (g_model.moduleData[EXTERNAL_MODULE].type) { case MODULE_TYPE_PPM: required_protocol = PROTO_PPM; break; case MODULE_TYPE_XJT: case MODULE_TYPE_R9M: - required_protocol = PROTO_PXX; + required_protocol = PROTO_PXX_EXTERNAL_MODULE; // either PXX or PXX2 depending on compilation options break; case MODULE_TYPE_SBUS: required_protocol = PROTO_SBUS; @@ -146,6 +150,12 @@ void setupPulses(uint8_t port) break; #endif +#if defined(PXX2) + case PROTO_PXX2: + disable_pxx2(port); + break; +#endif + #if defined(MULTIMODULE) case PROTO_MULTIMODULE: #endif @@ -208,6 +218,16 @@ void setupPulses(uint8_t port) break; #endif +#if defined(PXX2) + case PROTO_PXX2: + if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && !init_needed) { + createPXX2ChannelsFrame(port); + sportSendBuffer(modulePulsesData[port].pxx_uart.pulses, modulePulsesData[port].pxx_uart.ptr - modulePulsesData[port].pxx_uart.pulses); + } + scheduleNextMixerCalculation(port, PXX2_PERIOD); + break; +#endif + #if defined(MULTIMODULE) case PROTO_MULTIMODULE: setupPulsesMultimodule(port); diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index e726f8e63..92841f311 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -86,7 +86,7 @@ PACK(struct Dsm2TimerPulsesData { }); #endif -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) || defined(PXX2) PACK(struct PxxUartPulsesData { uint8_t pulses[64]; uint8_t * ptr; @@ -131,7 +131,7 @@ PACK(struct CrossfirePulsesData { }); union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) || defined(PXX2) PxxUartPulsesData pxx_uart; #endif #if defined(PPM_PIN_SERIAL) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h new file mode 100644 index 000000000..15ac96784 --- /dev/null +++ b/radio/src/pulses/pxx.h @@ -0,0 +1,23 @@ +/* + * 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 + * + * 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. + */ + +#define PXX_SEND_BIND 0x01 +#define PXX_SEND_FAILSAFE (1 << 4) +#define PXX_SEND_RANGECHECK (1 << 5) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp new file mode 100644 index 000000000..93df83ec1 --- /dev/null +++ b/radio/src/pulses/pxx2.cpp @@ -0,0 +1,184 @@ +/* + * 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 + * + * 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. + */ + +#include "opentx.h" +#include "pulses/pxx.h" + +void uartInitPcmArray(uint8_t port) +{ + modulePulsesData[port].pxx_uart.pcmCrc = 0; + modulePulsesData[port].pxx_uart.ptr = modulePulsesData[port].pxx_uart.pulses; +} + +void putPXX2Byte(uint8_t port, uint8_t byte) +{ + modulePulsesData[port].pxx_uart.pcmCrc = (modulePulsesData[port].pxx_uart.pcmCrc<<8) ^ (CRCTable[((modulePulsesData[port].pxx_uart.pcmCrc>>8) ^ byte) & 0xFF]); + *modulePulsesData[port].pxx_uart.ptr++ = byte; +} + +void createPXX2ChannelsFrame(uint8_t port) +{ + uint16_t pulseValue=0, pulseValueLow=0; + + static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; + uint8_t sendUpperChannels = 0; + if (pass[port]++ & 0x01) { + sendUpperChannels = g_model.moduleData[port].channelsCount; + } + + uartInitPcmArray(port); + + // Model ID + putPXX2Byte(port, g_model.header.modelId[port]); + + // Flag1 + uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); + if (moduleFlag[port] == MODULE_BIND) { + flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; + } + else if (moduleFlag[port] == MODULE_RANGECHECK) { + flag1 |= PXX_SEND_RANGECHECK; + } + else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { + if (failsafeCounter[port]-- == 0) { + failsafeCounter[port] = 1000; + flag1 |= PXX_SEND_FAILSAFE; + } + if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { + flag1 |= PXX_SEND_FAILSAFE; + } + } + putPXX2Byte(port, flag1); + + // Flag2 + putPXX2Byte(port, 0); + + // Channels + for (int i=0; i<8; i++) { + if (flag1 & PXX_SEND_FAILSAFE) { + if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { + pulseValue = (i < sendUpperChannels ? 4095 : 2047); + } + else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { + pulseValue = (i < sendUpperChannels ? 2048 : 0); + } + else { + if (i < sendUpperChannels) { + int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+i]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 4095; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 2048; + } + else { + failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); + } + } + else { + int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 2047; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 0; + } + else { + failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); + } + } + } + } + else { + if (i < sendUpperChannels) { + int channel = 8 + g_model.moduleData[port].channelsStart + i; + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); + } + else if (i < sentModuleChannels(port)) { + int channel = g_model.moduleData[port].channelsStart + i; + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); + } + else { + pulseValue = 1024; + } + } + + if (i & 1) { + putPXX2Byte(port, pulseValueLow); // Low byte of channel + putPXX2Byte(port, ((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels + putPXX2Byte(port, pulseValue >> 4); // High byte of channel + } + else { + pulseValueLow = pulseValue; + } + } + + // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) + uint8_t extra_flags = 0; +#if defined(PCBHORUS) || defined(PCBXLITE) + if (port == INTERNAL_MODULE) { + extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); + } +#endif + extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); + 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)) { + extra_flags |= (1 << 6); + } + } + // Disable S.PORT if internal module is active + if (IS_TELEMETRY_INTERNAL_MODULE()) { + extra_flags |= (1 << 5); + } + putPXX2Byte(port, extra_flags); + + // Flag3, reserved + putPXX2Byte(port, 0); + +#if defined(LUA) + if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { + // CMD/Resp + putPXX2Byte(port, 1); + // primID (1 byte) + dataID (2 bytes) + value (4 bytes) + for (uint8_t i=0; i<7; i++) { + putPXX2Byte(port, outputTelemetryBuffer[i]); + } + outputTelemetryBufferTrigger = 0x00; + outputTelemetryBufferSize = 0; + } + else { + // CMD/Resp + putPXX2Byte(port, 0); + } +#else + // CMD/Resp + putPXX2Byte(port, 0); +#endif + + // CRC + putPXX2Byte(port, modulePulsesData[port].pxx_uart.pcmCrc); // TODO need to check the CRC chosen algorithm +} + diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h new file mode 100644 index 000000000..fc5f8116a --- /dev/null +++ b/radio/src/pulses/pxx2.h @@ -0,0 +1,21 @@ +/* + * 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 + * + * 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. + */ + +void createPXX2ChannelsFrame(uint8_t port); diff --git a/radio/src/pulses/pxx_arm.cpp b/radio/src/pulses/pxx_arm.cpp index 1418df9a4..8d19a1642 100644 --- a/radio/src/pulses/pxx_arm.cpp +++ b/radio/src/pulses/pxx_arm.cpp @@ -19,10 +19,7 @@ */ #include "opentx.h" - -#define PXX_SEND_BIND 0x01 -#define PXX_SEND_FAILSAFE (1 << 4) -#define PXX_SEND_RANGECHECK (1 << 5) +#include "pulses/pxx.h" const uint16_t CRCTable[]= { diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index ad2dca3d2..feedb073f 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -9,6 +9,7 @@ option(USB_SERIAL "Enable USB serial (CDC)" OFF) set(ARCH ARM) set(STM32USB_DIR ${THIRDPARTY_DIR}/STM32_USB-Host-Device_Lib_V2.2.0/Libraries) add_definitions(-DSTM32 -DLUA_INPUTS -DVARIO -DCROSSFIRE) + include_directories(${RADIO_SRC_DIRECTORY}/targets/common/arm/stm32) include_directories(${STM32USB_DIR}/STM32_USB_OTG_Driver/inc) include_directories(${STM32USB_DIR}/STM32_USB_Device_Library/Core/inc) @@ -90,12 +91,21 @@ foreach(FILE ${STM32USB_SRC}) ${STM32USB_DIR}/${FILE} ) endforeach() + set(SRC ${SRC} telemetry/crossfire.cpp io/bootloader_flash.cpp ) + set(PULSES_SRC ${PULSES_SRC} crossfire.cpp ) + +if(PXX2) + set(PULSES_SRC + ${PULSES_SRC} + pxx2.cpp + ) +endif() diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 87fabf59b..235afc1d4 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -182,14 +182,16 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #endif void init_no_pulses(uint32_t port); void disable_no_pulses(uint32_t port); -void init_ppm( uint32_t module_index ); -void disable_ppm( uint32_t module_index ); -void init_pxx( uint32_t module_index ); -void disable_pxx( uint32_t module_index ); -void init_serial( uint32_t module_index, uint32_t baudrate, uint32_t period ); -void disable_serial( uint32_t module_index ); -void init_crossfire( uint32_t module_index ); -void disable_crossfire( uint32_t module_index ); +void init_ppm( uint32_t module_index); +void disable_ppm( uint32_t module_index); +void init_pxx( uint32_t module_index); +void disable_pxx( uint32_t module_index); +void init_serial( uint32_t module_index, uint32_t baudrate, uint32_t period); +void disable_serial( uint32_t module_index); +void init_crossfire( uint32_t module_index); +void disable_crossfire( uint32_t module_index); +void init_pxx2( uint32_t module_index); +void disable_pxx2( uint32_t module_index); // Trainer driver #define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index f70a241ed..ad7931bc1 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -120,3 +120,12 @@ void disable_crossfire(uint32_t port) extmoduleStop(); } } + +void disable_pxx2(uint32_t port) +{ + if (port == EXTERNAL_MODULE) { + extmoduleStop(); + } +} + + From f798bbfcc7c362891f4e807d060503bcc048eafb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Oct 2018 08:22:20 +0200 Subject: [PATCH 02/61] Wrong baudrate chosen for PXX2 on setup --- radio/src/telemetry/frsky.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index bf4e15d6a..e138dcf62 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -32,7 +32,13 @@ 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 #define FRSKY_SPORT_PACKET_SIZE 9 From 946f66b1286f935f58a71e9576f14ef4bcf31eab Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 9 Oct 2018 07:57:58 +0200 Subject: [PATCH 03/61] Pulses refactoring ... WIP --- radio/src/pulses/pulses_arm.cpp | 4 +- radio/src/pulses/pulses_arm.h | 12 +- radio/src/pulses/pxx.cpp | 230 +++++++++ radio/src/pulses/pxx.h | 221 +++++++++ radio/src/pulses/pxx2.cpp | 141 +----- radio/src/pulses/pxx2.h | 54 ++- radio/src/pulses/pxx_arm.cpp | 450 ------------------ radio/src/targets/common/arm/CMakeLists.txt | 2 +- radio/src/targets/horus/board.h | 2 +- radio/src/targets/horus/telemetry_driver.cpp | 2 +- radio/src/targets/taranis/board.h | 2 +- .../src/targets/taranis/telemetry_driver.cpp | 2 +- 12 files changed, 536 insertions(+), 586 deletions(-) create mode 100644 radio/src/pulses/pxx.cpp delete mode 100644 radio/src/pulses/pxx_arm.cpp diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 14543ebd7..6ade90621 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -221,8 +221,8 @@ void setupPulses(uint8_t port) #if defined(PXX2) case PROTO_PXX2: if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && !init_needed) { - createPXX2ChannelsFrame(port); - sportSendBuffer(modulePulsesData[port].pxx_uart.pulses, modulePulsesData[port].pxx_uart.ptr - modulePulsesData[port].pxx_uart.pulses); + modulePulsesData[port].pxx2.setupFrame(port); + sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); } scheduleNextMixerCalculation(port, PXX2_PERIOD); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 92841f311..aab6832bb 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -54,8 +54,6 @@ template struct PpmPulsesData { #define PXX_PERIOD 9/*ms*/ #endif -#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) - #if defined(PPM_PIN_SERIAL) PACK(struct PxxSerialPulsesData { uint8_t pulses[64]; @@ -125,13 +123,17 @@ PACK(struct PxxTimerPulsesData { }); #endif +#if !defined(BOOT) +#include "pulses/pxx2.h" +#endif + #define CROSSFIRE_FRAME_MAXLEN 64 PACK(struct CrossfirePulsesData { uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; }); union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) || defined(PXX2) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) PxxUartPulsesData pxx_uart; #endif #if defined(PPM_PIN_SERIAL) @@ -140,6 +142,10 @@ union ModulePulsesData { PxxTimerPulsesData pxx; #endif +#if defined(PXX2) && !defined(BOOT) + Pxx2Pulses pxx2; +#endif + #if defined(PPM_PIN_SERIAL) Dsm2SerialPulsesData dsm2; #else diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp new file mode 100644 index 000000000..5d491c5dd --- /dev/null +++ b/radio/src/pulses/pxx.cpp @@ -0,0 +1,230 @@ +/* + * 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 + * + * 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. + */ + +#include "opentx.h" +#include "pulses/pxx.h" + +const uint16_t PxxCrcMixin::CRCTable[] = { + 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, + 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, + 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, + 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, + 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, + 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, + 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, + 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, + 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, + 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, + 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, + 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, + 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, + 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, + 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, + 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, + 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, + 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, + 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, + 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, + 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, + 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, + 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, + 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, + 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, + 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, + 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, + 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, + 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, + 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, + 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, + 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 +}; + +template +void StandardPxxPulses::setup8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) +{ + PxxTransport::initCrc(); + + // Sync + addHead(); + + // RX Number + PxxTransport::addByte(g_model.header.modelId[port]); + + // Flag1 + uint8_t flag1 = PxxPulses::addFlag1(port); + + // Flag2 + PxxTransport::addByte(0); + + // Channels + PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + + // Extra flags + PxxPulses::addExtraFlags(); + + // CRC + addCrc(); + + // Sync = HEAD + addHead(); + + // Tail + PxxTransport::addTail(); +} + +template +void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) +{ + uint16_t pulseValue = 0; + uint16_t pulseValueLow = 0; + + for (int8_t i=0; i<8; i++) { + if (sendFailsafe) { + if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { + pulseValue = (i < sendUpperChannels ? 4095 : 2047); + } + else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { + pulseValue = (i < sendUpperChannels ? 2048 : 0); + } + else { + if (i < sendUpperChannels) { + int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+i]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 4095; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 2048; + } + else { + failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); + } + } + else { + int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 2047; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 0; + } + else { + failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); + } + } + } + } + else { + if (i < sendUpperChannels) { + int channel = 8 + g_model.moduleData[port].channelsStart + i; + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); + } + else if (i < sentModuleChannels(port)) { + int channel = g_model.moduleData[port].channelsStart + i; + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); + } + else { + pulseValue = 1024; + } + } + + if (i & 1) { + PxxTransport::addByte(pulseValueLow); // Low byte of channel + PxxTransport::addByte(((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels + PxxTransport::addByte(pulseValue >> 4); // High byte of channel + } + else { + pulseValueLow = pulseValue; + } + } +} + +template +uint8_t PxxPulses::addFlag1(uint8_t port) +{ + uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); + if (moduleFlag[port] == MODULE_BIND) { + flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; + } + else if (moduleFlag[port] == MODULE_RANGECHECK) { + flag1 |= PXX_SEND_RANGECHECK; + } + else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { + if (failsafeCounter[port]-- == 0) { + failsafeCounter[port] = 1000; + flag1 |= PXX_SEND_FAILSAFE; + } + if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { + flag1 |= PXX_SEND_FAILSAFE; + } + } + PxxTransport::addByte(flag1); + return flag1; +} + +template +void PxxPulses::addExtraFlags(uint8_t port) +{ + // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) + uint8_t extra_flags = 0; + +#if defined(PCBHORUS) || defined(PCBXLITE) + if (port == INTERNAL_MODULE) { + extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); + } +#endif + + extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); + 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)) + extra_flags |= (1 << 6); + } + + // Disable S.PORT if internal module is active + if (IS_TELEMETRY_INTERNAL_MODULE()) { + extra_flags |= (1 << 5); + } + PxxTransport::addByte(extra_flags); +} + +template +void StandardPxxPulses::setupFrame(uint8_t port) +{ + PxxPulses::initFrame(); + +#if defined(PXX_FREQUENCY_HIGH) + setup8ChannelsFrame(port, 0); + if (sentModuleChannels(port) > 8) { + setup8ChannelsFrame(port, 8); + } +#else + static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; + uint8_t sendUpperChannels = 0; + if (pass[port]++ & 0x01) { + sendUpperChannels = g_model.moduleData[port].channelsCount; + } + setup8ChannelsFrame(port, sendUpperChannels); +#endif +} diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 15ac96784..5f6362e2d 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -18,6 +18,227 @@ * GNU General Public License for more details. */ +#ifndef _PULSES_PXX_H_ +#define _PULSES_PXX_H_ + +#include + #define PXX_SEND_BIND 0x01 #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) + +class PxxCrcMixin { + protected: + void initCrc() + { + crc = 0; + } + + void addToCrc(uint8_t byte) + { + crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); + } + + uint8_t crc; + static const uint16_t CRCTable[]; +}; + + +class SerialPxxBitTransport { + protected: + uint8_t data[64]; + uint8_t * ptr; + uint8_t byte; + uint8_t bits_count; + uint8_t padding[2]; + + void initFrame() + { + ptr = data; + byte = 0; + bits_count = 0; + } + + void addSerialBit(uint8_t bit) + { + byte >>= 1; + if (bit & 1) { + byte |= 0x80; + } + if (++bits_count >= 8) { + *ptr++ = byte; + bits_count = 0; + } + } + + // 8uS/bit 01 = 0, 001 = 1 + void addPart(uint8_t value) + { + addSerialBit(0); + if (value) { + addSerialBit(0); + } + addSerialBit(1); + } + + void addTail() + { + while (bits_count != 0) { + addSerialBit(1); + } + } +}; + +// TODO elsewhere !!! + +#if defined(PCBX12S) && PCBREV < 13 + #define pulse_duration_t uint32_t + #define trainer_pulse_duration_t uint16_t +#else + #define pulse_duration_t uint16_t + #define trainer_pulse_duration_t uint16_t +#endif + +#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) + +class PwmPxxBitTransport { + protected: + pulse_duration_t pulses[200]; + pulse_duration_t * ptr; + uint16_t rest; + uint8_t padding[2]; + + void initFrame() + { + ptr = pulses; + rest = PXX_PERIOD_HALF_US; + } + + void addPart(uint8_t value) + { + pulse_duration_t duration = value ? 47 : 31; + *ptr++ = duration; + rest -= duration + 1; + } + + void addTail(uint8_t port) + { + // rest min value is 18000 - 200 * 48 = 8400 (4.2ms) + *(ptr - 1) += rest; + } +}; + +template +class StandardPxxTransport: public PxxCrcMixin, public BitTransport { + protected: + uint8_t ones_count; + uint8_t padding[3]; + + void addByte(uint8_t byte) + { + PxxCrcMixin::addToCrc(byte); + addByteWithoutCrc(byte); + }; + + void addByteWithoutCrc(uint8_t byte) + { + for (uint8_t i = 0; i < 8; i++) { + addBit(byte & 0x80); + byte <<= 1; + } + } + + void addBit(uint8_t bit) + { + if (bit) { + BitTransport::addPart(1); + if (++ones_count == 5) { + ones_count = 0; + BitTransport::addPart(0); // Stuff a 0 bit in + } + } + else { + BitTransport::addPart(0); + ones_count = 0; + } + } + + void initFrame() + { + ones_count = 0; + } +}; + +class UartPxxTransport: public PxxCrcMixin { + protected: + uint8_t data[64]; + uint8_t * ptr; + + void initFrame() + { + ptr = data; + } + + void addByte(uint8_t byte) + { + PxxCrcMixin::addToCrc(byte); + addWithByteStuffing(byte); + } + + void addWithByteStuffing(uint8_t byte) + { + if (0x7E == byte) { + *ptr++ = 0x7D; + *ptr++ = 0x5E; + } + else if (0x7D == byte) { + *ptr++ = 0x7D; + *ptr++ = 0x5D; + } + else { + *ptr++ = byte; + } + } + + void addTail() + { + // nothing + } +}; + +template +class PxxPulses: public PxxTransport { + protected: + uint8_t addFlag1(uint8_t port); + void addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels); + void addExtraFlags(uint8_t port); +}; + +typedef PxxPulses UartPxxPulses; + +template +class StandardPxxPulses: public PxxPulses +{ + public: + void setupFrame(uint8_t port); + + protected: + void addHead() + { + // send 7E, do not CRC + PxxTransport::addByteWithoutCrc(0x7E); + } + + void addCrc() + { + addByteWithoutCrc(PxxCrcMixin::crc >> 8); + addByteWithoutCrc(PxxCrcMixin::crc); + } + + void setup8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); +}; + +typedef StandardPxxPulses> PwmPxxPxxPulses; + + +#endif diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 93df83ec1..d7d32b588 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -19,23 +19,12 @@ */ #include "opentx.h" -#include "pulses/pxx.h" +#include "pulses/pxx2.h" -void uartInitPcmArray(uint8_t port) +void Pxx2Pulses::setupFrame(uint8_t port) { - modulePulsesData[port].pxx_uart.pcmCrc = 0; - modulePulsesData[port].pxx_uart.ptr = modulePulsesData[port].pxx_uart.pulses; -} - -void putPXX2Byte(uint8_t port, uint8_t byte) -{ - modulePulsesData[port].pxx_uart.pcmCrc = (modulePulsesData[port].pxx_uart.pcmCrc<<8) ^ (CRCTable[((modulePulsesData[port].pxx_uart.pcmCrc>>8) ^ byte) & 0xFF]); - *modulePulsesData[port].pxx_uart.ptr++ = byte; -} - -void createPXX2ChannelsFrame(uint8_t port) -{ - uint16_t pulseValue=0, pulseValueLow=0; + initFrame(); + initCrc(); static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; uint8_t sendUpperChannels = 0; @@ -43,142 +32,44 @@ void createPXX2ChannelsFrame(uint8_t port) sendUpperChannels = g_model.moduleData[port].channelsCount; } - uartInitPcmArray(port); - // Model ID - putPXX2Byte(port, g_model.header.modelId[port]); + addByte(g_model.header.modelId[port]); // Flag1 - uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); - if (moduleFlag[port] == MODULE_BIND) { - flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; - } - else if (moduleFlag[port] == MODULE_RANGECHECK) { - flag1 |= PXX_SEND_RANGECHECK; - } - else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { - if (failsafeCounter[port]-- == 0) { - failsafeCounter[port] = 1000; - flag1 |= PXX_SEND_FAILSAFE; - } - if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { - flag1 |= PXX_SEND_FAILSAFE; - } - } - putPXX2Byte(port, flag1); + uint8_t flag1 = addFlag1(port); // Flag2 - putPXX2Byte(port, 0); + addByte(0); // Channels - for (int i=0; i<8; i++) { - if (flag1 & PXX_SEND_FAILSAFE) { - if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { - pulseValue = (i < sendUpperChannels ? 4095 : 2047); - } - else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { - pulseValue = (i < sendUpperChannels ? 2048 : 0); - } - else { - if (i < sendUpperChannels) { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+i]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 4095; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 2048; - } - else { - failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; - pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); - } - } - else { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 2047; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 0; - } - else { - failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; - pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); - } - } - } - } - else { - if (i < sendUpperChannels) { - int channel = 8 + g_model.moduleData[port].channelsStart + i; - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); - } - else if (i < sentModuleChannels(port)) { - int channel = g_model.moduleData[port].channelsStart + i; - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); - } - else { - pulseValue = 1024; - } - } + addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); - if (i & 1) { - putPXX2Byte(port, pulseValueLow); // Low byte of channel - putPXX2Byte(port, ((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels - putPXX2Byte(port, pulseValue >> 4); // High byte of channel - } - else { - pulseValueLow = pulseValue; - } - } - - // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) - uint8_t extra_flags = 0; -#if defined(PCBHORUS) || defined(PCBXLITE) - if (port == INTERNAL_MODULE) { - extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); - } -#endif - extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); - 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)) { - extra_flags |= (1 << 6); - } - } - // Disable S.PORT if internal module is active - if (IS_TELEMETRY_INTERNAL_MODULE()) { - extra_flags |= (1 << 5); - } - putPXX2Byte(port, extra_flags); + // Extra flags + addExtraFlags(port); // Flag3, reserved - putPXX2Byte(port, 0); + addByte(0); #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { // CMD/Resp - putPXX2Byte(port, 1); + addByte(1); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { - putPXX2Byte(port, outputTelemetryBuffer[i]); + addByte(outputTelemetryBuffer[i]); } outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } else { // CMD/Resp - putPXX2Byte(port, 0); + addByte(0); } #else // CMD/Resp - putPXX2Byte(port, 0); + addByte(0); #endif // CRC - putPXX2Byte(port, modulePulsesData[port].pxx_uart.pcmCrc); // TODO need to check the CRC chosen algorithm + addByte(crc); // TODO need to check the CRC chosen algorithm } - diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index fc5f8116a..ce2a83f2e 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -18,4 +18,56 @@ * GNU General Public License for more details. */ -void createPXX2ChannelsFrame(uint8_t port); +#ifndef _PULSES_PXX2_H_ +#define _PULSES_PXX2_H_ + +#include "pulses/pxx.h" + +class Pxx2Transport: public PxxCrcMixin { + protected: + uint8_t data[64]; + uint8_t * ptr; + + void initFrame() + { + ptr = data; + } + + void addByte(uint8_t byte) + { + PxxCrcMixin::addToCrc(byte); + *ptr++ = byte; + } + + void addTail() + { + // nothing + } +}; + + +class Pxx2Pulses: public PxxPulses { + public: + void setupFrame(uint8_t port); + + const uint8_t * getData() + { + return data; + } + + uint8_t getSize() + { + return ptr - data; + } + + protected: + uint8_t data[64]; + uint8_t * ptr; + + void initFrame() + { + ptr = data; + } +}; + +#endif diff --git a/radio/src/pulses/pxx_arm.cpp b/radio/src/pulses/pxx_arm.cpp deleted file mode 100644 index 8d19a1642..000000000 --- a/radio/src/pulses/pxx_arm.cpp +++ /dev/null @@ -1,450 +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 - * - * 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. - */ - -#include "opentx.h" -#include "pulses/pxx.h" - -const uint16_t CRCTable[]= -{ - 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, - 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, - 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, - 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, - 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, - 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, - 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, - 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, - 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, - 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, - 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, - 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, - 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, - 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, - 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, - 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, - 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, - 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, - 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, - 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, - 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, - 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, - 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, - 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, - 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, - 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, - 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, - 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, - 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, - 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, - 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, - 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 -}; - -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) -inline void uartPutPcmPart(uint8_t port, uint8_t byte) -{ - if (0x7E == byte) { - *modulePulsesData[port].pxx_uart.ptr++ = 0x7D; - *modulePulsesData[port].pxx_uart.ptr++ = 0x5E; - } - else if (0x7D == byte) { - *modulePulsesData[port].pxx_uart.ptr++ = 0x7D; - *modulePulsesData[port].pxx_uart.ptr++ = 0x5D; - } - else { - *modulePulsesData[port].pxx_uart.ptr++ = byte; - } -} - -void uartPutPcmByte(uint8_t port, uint8_t byte) -{ - modulePulsesData[port].pxx_uart.pcmCrc = (modulePulsesData[port].pxx_uart.pcmCrc<<8) ^ (CRCTable[((modulePulsesData[port].pxx_uart.pcmCrc>>8)^byte) & 0xFF]); - uartPutPcmPart(port, byte); -} - -void uartInitPcmArray(uint8_t port) -{ - modulePulsesData[port].pxx_uart.ptr = modulePulsesData[port].pxx_uart.pulses; -} - -void uartInitPcmCrc(uint8_t port) -{ - modulePulsesData[port].pxx_uart.pcmCrc = 0; -} - -void uartPutPcmHead(uint8_t port) -{ - // send 7E, do not CRC - *modulePulsesData[port].pxx_uart.ptr++ = 0x7E; -} - -void uartPutPcmCrc(uint8_t port) -{ - uint16_t pulseValue = modulePulsesData[port].pxx_uart.pcmCrc; - uartPutPcmByte(port, pulseValue >> 8); - uartPutPcmByte(port, pulseValue); -} -#endif - -#if !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - -#if defined(PPM_PIN_SERIAL) -void pxxPutPcmSerialBit(uint8_t port, uint8_t bit) -{ - modulePulsesData[port].pxx.serialByte >>= 1; - if (bit & 1) { - modulePulsesData[port].pxx.serialByte |= 0x80; - } - if (++modulePulsesData[port].pxx.serialBitCount >= 8) { - *modulePulsesData[port].pxx.ptr++ = modulePulsesData[port].pxx.serialByte; - modulePulsesData[port].pxx.serialBitCount = 0; - } -} - -// 8uS/bit 01 = 0, 001 = 1 -void pxxPutPcmPart(uint8_t port, uint8_t value) -{ - pxxPutPcmSerialBit(port, 0); - if (value) { - pxxPutPcmSerialBit(port, 0); - } - pxxPutPcmSerialBit(port, 1); -} - -void pxxPutPcmTail(uint8_t port) -{ - while (modulePulsesData[port].pxx.serialBitCount != 0) { - pxxPutPcmSerialBit(port, 1); - } -} -#else -void pxxPutPcmPart(uint8_t port, uint8_t value) -{ - pulse_duration_t duration = value ? 47 : 31; - *modulePulsesData[port].pxx.ptr++ = duration; - modulePulsesData[port].pxx.rest -= duration + 1; -} - -void pxxPutPcmTail(uint8_t port) -{ - // rest min value is 18000 - 200 * 48 = 8400 (4.2ms) - *(modulePulsesData[port].pxx.ptr-1) += modulePulsesData[port].pxx.rest; -} -#endif - -void pxxPutPcmBit(uint8_t port, uint8_t bit) -{ - if (bit) { - pxxPutPcmPart(port, 1); - if (++modulePulsesData[port].pxx.pcmOnesCount == 5) { - modulePulsesData[port].pxx.pcmOnesCount = 0; - pxxPutPcmPart(port, 0); // Stuff a 0 bit in - } - } - else { - pxxPutPcmPart(port, 0); - modulePulsesData[port].pxx.pcmOnesCount = 0; - } -} - -void pxxPutPcmByte(uint8_t port, uint8_t byte) -{ - modulePulsesData[port].pxx.pcmCrc = (modulePulsesData[port].pxx.pcmCrc<<8) ^ (CRCTable[((modulePulsesData[port].pxx.pcmCrc>>8)^byte) & 0xFF]); - for (uint8_t i=0; i<8; i++) { - pxxPutPcmBit(port, byte & 0x80); - byte <<= 1; - } -} - -void pxxInitPcmArray(uint8_t port) -{ - modulePulsesData[port].pxx.ptr = modulePulsesData[port].pxx.pulses; -#if defined(PPM_PIN_SERIAL) - modulePulsesData[port].pxx.pcmValue = 0; -#else - modulePulsesData[port].pxx.rest = PXX_PERIOD_HALF_US; -#endif - - modulePulsesData[port].pxx.pcmOnesCount = 0; -} - -void pxxInitPcmCrc(uint8_t port) -{ - modulePulsesData[port].pxx.pcmCrc = 0; -} - -void pxxPutPcmHead(uint8_t port) -{ - // send 7E, do not CRC - // 01111110 - pxxPutPcmPart(port, 0); - pxxPutPcmPart(port, 1); - pxxPutPcmPart(port, 1); - pxxPutPcmPart(port, 1); - pxxPutPcmPart(port, 1); - pxxPutPcmPart(port, 1); - pxxPutPcmPart(port, 1); - pxxPutPcmPart(port, 0); -} - -void pxxPutPcmCrc(uint8_t port) -{ - uint16_t pulseValue = modulePulsesData[port].pxx.pcmCrc; - pxxPutPcmByte(port, pulseValue >> 8); - pxxPutPcmByte(port, pulseValue); -} -#else - // those functions should not be used, a link error will occur if wrong - void pxxInitPcmArray(uint8_t port); - void pxxInitPcmCrc(uint8_t port); - void pxxPutPcmByte(uint8_t port, uint8_t byte); - void pxxPutPcmHead(uint8_t port); - void pxxPutPcmTail(uint8_t port); - void pxxPutPcmCrc(uint8_t port); -#endif - -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) -inline void initPcmArray(uint8_t port) -{ - if (IS_UART_MODULE(port)) - uartInitPcmArray(port); - else - pxxInitPcmArray(port); -} - -inline void initPcmCrc(uint8_t port) -{ - if (IS_UART_MODULE(port)) - uartInitPcmCrc(port); - else - pxxInitPcmCrc(port); -} - -inline void putPcmHead(uint8_t port) -{ - if (IS_UART_MODULE(port)) - uartPutPcmHead(port); - else - pxxPutPcmHead(port); -} - -inline void putPcmByte(uint8_t port, uint8_t byte) -{ - if (IS_UART_MODULE(port)) - uartPutPcmByte(port, byte); - else - pxxPutPcmByte(port, byte); -} - -inline void putPcmCrc(uint8_t port) -{ - if (IS_UART_MODULE(port)) - uartPutPcmCrc(port); - else - pxxPutPcmCrc(port); -} - -inline void putPcmTail(uint8_t port) -{ - if (!IS_UART_MODULE(port)) - pxxPutPcmTail(port); -} -#else -inline void initPcmArray(uint8_t port) -{ - pxxInitPcmArray(port); -} - -inline void initPcmCrc(uint8_t port) -{ - pxxInitPcmCrc(port); -} - -inline void putPcmHead(uint8_t port) -{ - pxxPutPcmHead(port); -} - -inline void putPcmByte(uint8_t port, uint8_t byte) -{ - pxxPutPcmByte(port, byte); -} - -inline void putPcmCrc(uint8_t port) -{ - pxxPutPcmCrc(port); -} - -inline void putPcmTail(uint8_t port) -{ - pxxPutPcmTail(port); -} -#endif - -inline void setupFramePXX(uint8_t port, uint8_t sendUpperChannels) -{ - uint16_t pulseValue=0, pulseValueLow=0; - - initPcmCrc(port); - - /* Sync */ - putPcmHead(port); - - /* Rx Number */ - putPcmByte(port, g_model.header.modelId[port]); - - /* FLAG1 */ - uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); - if (moduleFlag[port] == MODULE_BIND) { - flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; - } - else if (moduleFlag[port] == MODULE_RANGECHECK) { - flag1 |= PXX_SEND_RANGECHECK; - } - else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { - if (failsafeCounter[port]-- == 0) { - failsafeCounter[port] = 1000; - flag1 |= PXX_SEND_FAILSAFE; - } - if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { - flag1 |= PXX_SEND_FAILSAFE; - } - } - - putPcmByte(port, flag1); - - /* FLAG2 */ - putPcmByte(port, 0); - - /* CHANNELS */ - for (int i=0; i<8; i++) { - if (flag1 & PXX_SEND_FAILSAFE) { - if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { - pulseValue = (i < sendUpperChannels ? 4095 : 2047); - } - else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { - pulseValue = (i < sendUpperChannels ? 2048 : 0); - } - else { - if (i < sendUpperChannels) { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+i]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 4095; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 2048; - } - else { - failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; - pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); - } - } - else { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 2047; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 0; - } - else { - failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; - pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); - } - } - } - } - else { - if (i < sendUpperChannels) { - int channel = 8 + g_model.moduleData[port].channelsStart + i; - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); - } - else if (i < sentModuleChannels(port)) { - int channel = g_model.moduleData[port].channelsStart + i; - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); - } - else { - pulseValue = 1024; - } - } - - if (i & 1) { - putPcmByte(port, pulseValueLow); // Low byte of channel - putPcmByte(port, ((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels - putPcmByte(port, pulseValue >> 4); // High byte of channel - } - else { - pulseValueLow = pulseValue; - } - } - - uint8_t extra_flags = 0; - -/* Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) */ -#if defined(PCBHORUS) || defined(PCBXLITE) - if (port == INTERNAL_MODULE) { - extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); - } -#endif - - extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); - 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)) - extra_flags |= (1 << 6); - } - - // Disable S.PORT if internal module is active - if (IS_TELEMETRY_INTERNAL_MODULE()) { - extra_flags |= (1 << 5); - } - - putPcmByte(port, extra_flags); - - /* CRC */ - putPcmCrc(port); - - /* Sync */ - putPcmHead(port); - - putPcmTail(port); -} - -void setupPulsesPXX(uint8_t port) -{ - initPcmArray(port); - -#if defined(PXX_FREQUENCY_HIGH) - setupFramePXX(port, 0); - if (sentModuleChannels(port) > 8) { - setupFramePXX(port, 8); - } -#else - static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; - uint8_t sendUpperChannels = 0; - if (pass[port]++ & 0x01) { - sendUpperChannels = g_model.moduleData[port].channelsCount; - } - setupFramePXX(port, sendUpperChannels); -#endif -} diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 8099d6d56..0d552c781 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -129,7 +129,7 @@ set(PULSES_SRC ${PULSES_SRC} pulses_arm.cpp ppm_arm.cpp - pxx_arm.cpp + pxx.cpp dsm2_arm.cpp sbus_arm.cpp ) \ No newline at end of file diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 0818657da..cc513c449 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -526,7 +526,7 @@ int32_t getVolume(void); #define TELEMETRY_FIFO_SIZE 512 void telemetryPortInit(uint32_t baudrate, uint8_t mode); void telemetryPortSetDirectionOutput(void); -void sportSendBuffer(uint8_t * buffer, uint32_t count); +void sportSendBuffer(const uint8_t * buffer, uint32_t count); uint8_t telemetryGetByte(uint8_t * byte); extern uint32_t telemetryErrors; diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 75e31cb81..8541c0742 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -138,7 +138,7 @@ void telemetryPortSetDirectionInput() TELEMETRY_USART->CR1 |= USART_CR1_RE; // turn on receiver } -void sportSendBuffer(uint8_t * buffer, uint32_t count) +void sportSendBuffer(const uint8_t * buffer, uint32_t count) { telemetryPortSetDirectionOutput(); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 235afc1d4..004f55648 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -567,7 +567,7 @@ void debugPutc(const char c); // Telemetry driver void telemetryPortInit(uint32_t baudrate, uint8_t mode); void telemetryPortSetDirectionOutput(void); -void sportSendBuffer(uint8_t * buffer, uint32_t count); +void sportSendBuffer(const uint8_t * buffer, uint32_t count); uint8_t telemetryGetByte(uint8_t * byte); extern uint32_t telemetryErrors; diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index fbcfdbd56..f3b58159e 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -89,7 +89,7 @@ void telemetryPortSetDirectionInput() TELEMETRY_USART->CR1 |= USART_CR1_RE; // turn on receiver } -void sportSendBuffer(uint8_t * buffer, uint32_t count) +void sportSendBuffer(const uint8_t * buffer, uint32_t count) { telemetryPortSetDirectionOutput(); From 62dcd6ac5e2e56fc14e736d28bb61a3ea3eaa831 Mon Sep 17 00:00:00 2001 From: bsongis Date: Tue, 9 Oct 2018 12:47:22 +0200 Subject: [PATCH 04/61] Refactoring continued --- radio/src/pulses/pulses_arm.cpp | 2 +- radio/src/pulses/pulses_arm.h | 22 ++--- radio/src/pulses/pulses_common.h | 65 ++++++++++++++ radio/src/pulses/pxx.cpp | 57 +----------- radio/src/pulses/pxx.h | 90 ++++++------------- radio/src/pulses/pxx1.cpp | 77 ++++++++++++++++ radio/src/pulses/pxx1.h | 52 +++++++++++ radio/src/pulses/pxx2.h | 23 +---- .../targets/common/arm/stm32/CMakeLists.txt | 6 ++ .../src/targets/taranis/extmodule_driver.cpp | 6 +- .../taranis/intmodule_pulses_driver.cpp | 6 +- 11 files changed, 246 insertions(+), 160 deletions(-) create mode 100644 radio/src/pulses/pulses_common.h create mode 100644 radio/src/pulses/pxx1.cpp create mode 100644 radio/src/pulses/pxx1.h diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 6ade90621..f88bf37ab 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -177,7 +177,7 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { case PROTO_PXX: - setupPulsesPXX(port); + modulePulsesData[port].pxx.setupFrame(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index aab6832bb..5fd2619a8 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -44,16 +44,6 @@ template struct PpmPulsesData { T * ptr; }; -#if defined(PXX_FREQUENCY_HIGH) -#define EXTMODULE_USART_PXX_BAUDRATE 420000 -#define INTMODULE_USART_PXX_BAUDRATE 450000 -#define PXX_PERIOD 4/*ms*/ -#else -#define EXTMODULE_USART_PXX_BAUDRATE 115200 -#define INTMODULE_USART_PXX_BAUDRATE 115200 -#define PXX_PERIOD 9/*ms*/ -#endif - #if defined(PPM_PIN_SERIAL) PACK(struct PxxSerialPulsesData { uint8_t pulses[64]; @@ -125,6 +115,7 @@ PACK(struct PxxTimerPulsesData { #if !defined(BOOT) #include "pulses/pxx2.h" +#include "pulses/pxx1.h" #endif #define CROSSFIRE_FRAME_MAXLEN 64 @@ -133,13 +124,14 @@ PACK(struct CrossfirePulsesData { }); union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - PxxUartPulsesData pxx_uart; +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) && !defined(BOOT) + UartPxxPulses pxx_uart; #endif -#if defined(PPM_PIN_SERIAL) - PxxSerialPulsesData pxx; +#if defined(BOOT) +#elif defined(PPM_PIN_SERIAL) + SerialPxxPulses pxx; #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - PxxTimerPulsesData pxx; + PwmPxxPulses pxx; #endif #if defined(PXX2) && !defined(BOOT) diff --git a/radio/src/pulses/pulses_common.h b/radio/src/pulses/pulses_common.h new file mode 100644 index 000000000..da70a13c0 --- /dev/null +++ b/radio/src/pulses/pulses_common.h @@ -0,0 +1,65 @@ +/* + * 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 + * + * 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 _PULSES_COMMON_H_ +#define _PULSES_COMMON_H_ + +#include + +#if defined(PCBX12S) && PCBREV < 13 + #define pulse_duration_t uint32_t + #define trainer_pulse_duration_t uint16_t +#else + #define pulse_duration_t uint16_t + #define trainer_pulse_duration_t uint16_t +#endif + +template +class DataBuffer { + public: + const T * getData() + { + return data; + } + + uint8_t getSize() + { + return ptr - data; + } + + protected: + T data[SIZE]; + T * ptr; + + void initBuffer() + { + ptr = data; + } +}; + +template +class PulsesBuffer: public DataBuffer { + public: + T getLast() { + return *(DataBuffer::ptr - 1); + }; +}; + +#endif diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 5d491c5dd..69257831a 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -19,7 +19,8 @@ */ #include "opentx.h" -#include "pulses/pxx.h" +#include "pulses/pxx1.h" +#include "pulses/pxx2.h" const uint16_t PxxCrcMixin::CRCTable[] = { 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, @@ -56,39 +57,6 @@ const uint16_t PxxCrcMixin::CRCTable[] = { 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 }; -template -void StandardPxxPulses::setup8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) -{ - PxxTransport::initCrc(); - - // Sync - addHead(); - - // RX Number - PxxTransport::addByte(g_model.header.modelId[port]); - - // Flag1 - uint8_t flag1 = PxxPulses::addFlag1(port); - - // Flag2 - PxxTransport::addByte(0); - - // Channels - PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); - - // Extra flags - PxxPulses::addExtraFlags(); - - // CRC - addCrc(); - - // Sync = HEAD - addHead(); - - // Tail - PxxTransport::addTail(); -} - template void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) { @@ -209,22 +177,5 @@ void PxxPulses::addExtraFlags(uint8_t port) PxxTransport::addByte(extra_flags); } -template -void StandardPxxPulses::setupFrame(uint8_t port) -{ - PxxPulses::initFrame(); - -#if defined(PXX_FREQUENCY_HIGH) - setup8ChannelsFrame(port, 0); - if (sentModuleChannels(port) > 8) { - setup8ChannelsFrame(port, 8); - } -#else - static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; - uint8_t sendUpperChannels = 0; - if (pass[port]++ & 0x01) { - sendUpperChannels = g_model.moduleData[port].channelsCount; - } - setup8ChannelsFrame(port, sendUpperChannels); -#endif -} +template class PxxPulses >; +template class PxxPulses; diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 5f6362e2d..ce96cf5d6 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -21,12 +21,24 @@ #ifndef _PULSES_PXX_H_ #define _PULSES_PXX_H_ -#include +#include "pulses_common.h" #define PXX_SEND_BIND 0x01 #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) +#if defined(PXX_FREQUENCY_HIGH) + #define EXTMODULE_USART_PXX_BAUDRATE 420000 + #define INTMODULE_USART_PXX_BAUDRATE 450000 + #define PXX_PERIOD 4/*ms*/ +#else + #define EXTMODULE_USART_PXX_BAUDRATE 115200 + #define INTMODULE_USART_PXX_BAUDRATE 115200 + #define PXX_PERIOD 9/*ms*/ +#endif + +#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) + class PxxCrcMixin { protected: void initCrc() @@ -43,18 +55,16 @@ class PxxCrcMixin { static const uint16_t CRCTable[]; }; - -class SerialPxxBitTransport { +// Used by the Sky9x family boards +class SerialPxxBitTransport: public DataBuffer { protected: - uint8_t data[64]; - uint8_t * ptr; uint8_t byte; uint8_t bits_count; uint8_t padding[2]; void initFrame() { - ptr = data; + initBuffer(); byte = 0; bits_count = 0; } @@ -89,28 +99,14 @@ class SerialPxxBitTransport { } }; -// TODO elsewhere !!! - -#if defined(PCBX12S) && PCBREV < 13 - #define pulse_duration_t uint32_t - #define trainer_pulse_duration_t uint16_t -#else - #define pulse_duration_t uint16_t - #define trainer_pulse_duration_t uint16_t -#endif - -#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) - -class PwmPxxBitTransport { +class PwmPxxBitTransport: public PulsesBuffer { protected: - pulse_duration_t pulses[200]; - pulse_duration_t * ptr; uint16_t rest; uint8_t padding[2]; void initFrame() { - ptr = pulses; + initBuffer(); rest = PXX_PERIOD_HALF_US; } @@ -121,7 +117,7 @@ class PwmPxxBitTransport { rest -= duration + 1; } - void addTail(uint8_t port) + void addTail() { // rest min value is 18000 - 200 * 48 = 8400 (4.2ms) *(ptr - 1) += rest; @@ -134,6 +130,12 @@ class StandardPxxTransport: public PxxCrcMixin, public BitTransport { uint8_t ones_count; uint8_t padding[3]; + void initFrame() + { + BitTransport::initBuffer(); + ones_count = 0; + } + void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); @@ -162,23 +164,10 @@ class StandardPxxTransport: public PxxCrcMixin, public BitTransport { ones_count = 0; } } - - void initFrame() - { - ones_count = 0; - } }; -class UartPxxTransport: public PxxCrcMixin { +class UartPxxTransport: public DataBuffer, public PxxCrcMixin { protected: - uint8_t data[64]; - uint8_t * ptr; - - void initFrame() - { - ptr = data; - } - void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); @@ -214,31 +203,4 @@ class PxxPulses: public PxxTransport { void addExtraFlags(uint8_t port); }; -typedef PxxPulses UartPxxPulses; - -template -class StandardPxxPulses: public PxxPulses -{ - public: - void setupFrame(uint8_t port); - - protected: - void addHead() - { - // send 7E, do not CRC - PxxTransport::addByteWithoutCrc(0x7E); - } - - void addCrc() - { - addByteWithoutCrc(PxxCrcMixin::crc >> 8); - addByteWithoutCrc(PxxCrcMixin::crc); - } - - void setup8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); -}; - -typedef StandardPxxPulses> PwmPxxPxxPulses; - - #endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp new file mode 100644 index 000000000..7dbebe84f --- /dev/null +++ b/radio/src/pulses/pxx1.cpp @@ -0,0 +1,77 @@ +/* + * 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 + * + * 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. + */ + +#include "opentx.h" +#include "pulses/pxx1.h" + +template +void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) +{ + PxxTransport::initCrc(); + + // Sync + addHead(); + + // RX Number + PxxTransport::addByte(g_model.header.modelId[port]); + + // Flag1 + uint8_t flag1 = PxxPulses::addFlag1(port); + + // Flag2 + PxxTransport::addByte(0); + + // Channels + PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + + // Extra flags + PxxPulses::addExtraFlags(port); + + // CRC + addCrc(); + + // Sync = HEAD + addHead(); + + // Tail + PxxTransport::addTail(); +} + +template +void Pxx1Pulses::setupFrame(uint8_t port) +{ + PxxPulses::initFrame(); + +#if defined(PXX_FREQUENCY_HIGH) + add8ChannelsFrame(port, 0); + if (sentModuleChannels(port) > 8) { + add8ChannelsFrame(port, 8); + } +#else + static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; + uint8_t sendUpperChannels = 0; + if (pass[port]++ & 0x01) { + sendUpperChannels = g_model.moduleData[port].channelsCount; + } + add8ChannelsFrame(port, sendUpperChannels); +#endif +} + +template class Pxx1Pulses >; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h new file mode 100644 index 000000000..444202d26 --- /dev/null +++ b/radio/src/pulses/pxx1.h @@ -0,0 +1,52 @@ +/* + * 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 + * + * 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 _PULSES_PXX1_H_ +#define _PULSES_PXX1_H_ + +#include "pxx.h" + +template +class Pxx1Pulses: public PxxPulses +{ + public: + void setupFrame(uint8_t port); + + protected: + void addHead() + { + // send 7E, do not CRC + PxxTransport::addByteWithoutCrc(0x7E); + } + + void addCrc() + { + PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); + PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc); + } + + void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); +}; + +typedef Pxx1Pulses UartPxxPulses; +typedef Pxx1Pulses> PwmPxxPulses; +typedef Pxx1Pulses> SerialPxxPulses; + +#endif diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index ce2a83f2e..bef2eea98 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -21,18 +21,10 @@ #ifndef _PULSES_PXX2_H_ #define _PULSES_PXX2_H_ -#include "pulses/pxx.h" +#include "./pxx.h" -class Pxx2Transport: public PxxCrcMixin { +class Pxx2Transport: public DataBuffer, public PxxCrcMixin { protected: - uint8_t data[64]; - uint8_t * ptr; - - void initFrame() - { - ptr = data; - } - void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); @@ -45,21 +37,10 @@ class Pxx2Transport: public PxxCrcMixin { } }; - class Pxx2Pulses: public PxxPulses { public: void setupFrame(uint8_t port); - const uint8_t * getData() - { - return data; - } - - uint8_t getSize() - { - return ptr - data; - } - protected: uint8_t data[64]; uint8_t * ptr; diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index feedb073f..9dbabfc41 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -103,6 +103,12 @@ set(PULSES_SRC crossfire.cpp ) +set(PULSES_SRC + ${PULSES_SRC} + pxx1.cpp + ) + + if(PXX2) set(PULSES_SRC ${PULSES_SRC} diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index c18b86e12..6cf69c54d 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -300,12 +300,12 @@ void extmoduleSendNextFrame() USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; #else - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].pxx.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_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; EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.ptr - modulePulsesData[EXTERNAL_MODULE].pxx.pulses; + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); + EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA #endif } diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 0f8cf3e43..1999dc796 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -61,12 +61,12 @@ void intmoduleNoneStart() void intmoduleSendNextFrame() { if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { - INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].pxx.ptr - 1) - 4000; // 2mS in advance + 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; INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx.pulses); - INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.ptr - modulePulsesData[INTERNAL_MODULE].pxx.pulses; + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx.getData()); + INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.getSize(); INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) From 67b145b22e0398688c7c62b2859952598e8a1779 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 9 Oct 2018 22:56:51 +0200 Subject: [PATCH 05/61] Compilation fixes --- radio/src/pulses/pulses_arm.cpp | 16 ++++- radio/src/pulses/pulses_arm.h | 64 ++----------------- radio/src/pulses/pxx.cpp | 2 + radio/src/pulses/pxx.h | 21 ++++-- radio/src/pulses/pxx1.cpp | 4 +- radio/src/pulses/pxx2.h | 2 +- radio/src/targets/common/arm/CMakeLists.txt | 11 +++- .../targets/common/arm/stm32/CMakeLists.txt | 13 ---- .../arm/stm32/intmodule_serial_driver.cpp | 4 +- radio/src/targets/horus/board.h | 1 + radio/src/targets/horus/extmodule_driver.cpp | 6 +- radio/src/targets/horus/pulses_driver.cpp | 8 +++ radio/src/targets/sky9x/pulses_driver.cpp | 4 +- .../src/targets/taranis/extmodule_driver.cpp | 4 +- 14 files changed, 72 insertions(+), 88 deletions(-) diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index f88bf37ab..0b226ce20 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -122,6 +122,20 @@ uint8_t getRequiredProtocol(uint8_t port) return required_protocol; } +void setupPulsesPXX(uint8_t port) +{ +#if defined(INTMODULE_USART) && defined(EXTMODULE_USART) + modulePulsesData[port].pxx_uart.setupFrame(port); +#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) + modulePulsesData[port].pxx.setupFrame(port); +#else + if (IS_UART_MODULE(port)) + modulePulsesData[port].pxx_uart.setupFrame(port); + else + modulePulsesData[port].pxx.setupFrame(port); +#endif +} + void setupPulses(uint8_t port) { bool init_needed = false; @@ -177,7 +191,7 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { case PROTO_PXX: - modulePulsesData[port].pxx.setupFrame(port); + setupPulsesPXX(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 5fd2619a8..744abb07b 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -21,20 +21,15 @@ #ifndef _PULSES_ARM_H_ #define _PULSES_ARM_H_ +#include "pulses/pxx2.h" +#include "pulses/pxx1.h" + #if NUM_MODULES == 2 #define MODULES_INIT(...) __VA_ARGS__, __VA_ARGS__ #else #define MODULES_INIT(...) __VA_ARGS__ #endif -#if defined(PCBX12S) && PCBREV < 13 - #define pulse_duration_t uint32_t - #define trainer_pulse_duration_t uint16_t -#else - #define pulse_duration_t uint16_t - #define trainer_pulse_duration_t uint16_t -#endif - extern uint8_t s_current_protocol[NUM_MODULES]; extern uint8_t s_pulses_paused; extern uint16_t failsafeCounter[NUM_MODULES]; @@ -44,18 +39,6 @@ template struct PpmPulsesData { T * ptr; }; -#if defined(PPM_PIN_SERIAL) -PACK(struct PxxSerialPulsesData { - uint8_t pulses[64]; - uint8_t * ptr; - uint16_t pcmValue; - uint16_t pcmCrc; - uint32_t pcmOnesCount; - uint16_t serialByte; - uint16_t serialBitCount; -}); -#endif - #if defined(PPM_PIN_SERIAL) PACK(struct Dsm2SerialPulsesData { uint8_t pulses[64]; @@ -74,15 +57,6 @@ PACK(struct Dsm2TimerPulsesData { }); #endif -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) || defined(PXX2) -PACK(struct PxxUartPulsesData { - uint8_t pulses[64]; - uint8_t * ptr; - uint16_t pcmCrc; - uint16_t _alignment; -}); -#endif - #define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ #define PPM_PERIOD(module) (PPM_PERIOD_HALF_US(module) / 2000) /*ms*/ #define DSM2_BAUDRATE 125000 @@ -93,48 +67,22 @@ PACK(struct PxxUartPulsesData { #define MULTIMODULE_BAUDRATE 100000 #define MULTIMODULE_PERIOD 7 /*ms*/ -#if !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) -/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ -/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ -/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */ -/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */ -/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */ - -#if defined(PXX_FREQUENCY_HIGH) -#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" -#endif - -PACK(struct PxxTimerPulsesData { - pulse_duration_t pulses[200]; - pulse_duration_t * ptr; - uint16_t rest; - uint16_t pcmCrc; - uint32_t pcmOnesCount; -}); -#endif - -#if !defined(BOOT) -#include "pulses/pxx2.h" -#include "pulses/pxx1.h" -#endif - #define CROSSFIRE_FRAME_MAXLEN 64 PACK(struct CrossfirePulsesData { uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; }); union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) && !defined(BOOT) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) UartPxxPulses pxx_uart; #endif -#if defined(BOOT) -#elif defined(PPM_PIN_SERIAL) +#if defined(PPM_PIN_SERIAL) SerialPxxPulses pxx; #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) PwmPxxPulses pxx; #endif -#if defined(PXX2) && !defined(BOOT) +#if defined(PXX2) Pxx2Pulses pxx2; #endif diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 69257831a..19a547ac7 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -178,4 +178,6 @@ void PxxPulses::addExtraFlags(uint8_t port) } template class PxxPulses >; +template class PxxPulses >; template class PxxPulses; +template class PxxPulses; diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index ce96cf5d6..c9c0a3fca 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -37,6 +37,17 @@ #define PXX_PERIOD 9/*ms*/ #endif +#if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) +/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ +/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ +/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */ +/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */ +/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */ + +#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" +#endif + + #define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) class PxxCrcMixin { @@ -60,7 +71,6 @@ class SerialPxxBitTransport: public DataBuffer { protected: uint8_t byte; uint8_t bits_count; - uint8_t padding[2]; void initFrame() { @@ -102,7 +112,6 @@ class SerialPxxBitTransport: public DataBuffer { class PwmPxxBitTransport: public PulsesBuffer { protected: uint16_t rest; - uint8_t padding[2]; void initFrame() { @@ -125,10 +134,9 @@ class PwmPxxBitTransport: public PulsesBuffer { }; template -class StandardPxxTransport: public PxxCrcMixin, public BitTransport { +class StandardPxxTransport: public BitTransport, public PxxCrcMixin { protected: uint8_t ones_count; - uint8_t padding[3]; void initFrame() { @@ -174,6 +182,11 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { addWithByteStuffing(byte); } + void addByteWithoutCrc(uint8_t byte) + { + *ptr++ = byte; + } + void addWithByteStuffing(uint8_t byte) { if (0x7E == byte) { diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 7dbebe84f..0981184f3 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -57,7 +57,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper template void Pxx1Pulses::setupFrame(uint8_t port) { - PxxPulses::initFrame(); + PxxTransport::initBuffer(); #if defined(PXX_FREQUENCY_HIGH) add8ChannelsFrame(port, 0); @@ -75,3 +75,5 @@ void Pxx1Pulses::setupFrame(uint8_t port) } template class Pxx1Pulses >; +template class Pxx1Pulses >; +template class Pxx1Pulses; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index bef2eea98..1f1384a62 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -47,7 +47,7 @@ class Pxx2Pulses: public PxxPulses { void initFrame() { - ptr = data; + Pxx2Transport::initBuffer(); } }; diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 0d552c781..51110e88b 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -125,11 +125,20 @@ set(FIRMWARE_SRC ${COOS_DIR}/portable/GCC/port.c ${COOS_DIR}/portable/arch.c ) + set(PULSES_SRC ${PULSES_SRC} pulses_arm.cpp ppm_arm.cpp pxx.cpp + pxx1.cpp dsm2_arm.cpp sbus_arm.cpp - ) \ No newline at end of file + ) + +if(PXX2) + set(PULSES_SRC + ${PULSES_SRC} + pxx2.cpp + ) +endif() diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index 9dbabfc41..0398e2f74 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -102,16 +102,3 @@ set(PULSES_SRC ${PULSES_SRC} crossfire.cpp ) - -set(PULSES_SRC - ${PULSES_SRC} - pxx1.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 dbefcf170..a930fd227 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -130,8 +130,8 @@ void intmoduleSendNextFrame() DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&INTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx_uart.pulses); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx_uart.ptr - modulePulsesData[INTERNAL_MODULE].pxx_uart.pulses; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx_uart.getData()); + DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx_uart.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index cc513c449..b793280cf 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -197,6 +197,7 @@ void init_serial(uint32_t module_index, uint32_t baudrate, uint32_t period_half_ void disable_serial(uint32_t module_index); void init_crossfire(uint32_t module_index); void disable_crossfire(uint32_t module_index); +void disable_pxx2(uint32_t module_index); // Trainer driver void init_trainer_ppm(void); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 10e86cf58..4b0240763 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -259,7 +259,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].pxx.ptr - 1) - 4000; // 2mS in advance + 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 EXTMODULE_DMA_STREAM->CR |= EXTMODULE_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; @@ -267,8 +267,8 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.pulses); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.ptr - modulePulsesData[EXTERNAL_MODULE].pxx.pulses; + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); + EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else if (IS_DSM2_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_MULTIMODULE_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) { diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index be46b31b8..f3e8e7a66 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -107,3 +107,11 @@ void disable_crossfire(uint32_t port) extmoduleStop(); } } + + +void disable_pxx2(uint32_t port) +{ + if (port == EXTERNAL_MODULE) { + extmoduleStop(); + } +} diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 299684489..02f8d5cf5 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -278,8 +278,8 @@ extern "C" void PWM_IRQHandler(void) else { // Kick off serial output here Ssc * sscptr = SSC; - sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.pulses); - sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].pxx.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].pxx.pulses; + sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); + sscptr->SSC_TCR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 6cf69c54d..4d1799ce6 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -283,8 +283,8 @@ void extmoduleSendNextFrame() DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx_uart.pulses); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.ptr - modulePulsesData[EXTERNAL_MODULE].pxx_uart.pulses; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx_uart.getData()); + DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; From 2823fe9a12d3680aeab5c1285039bd46378dc959 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 10 Oct 2018 08:49:58 +0200 Subject: [PATCH 06/61] PXX2 init was not called --- radio/src/pulses/pulses_arm.cpp | 12 ++++-- radio/src/targets/horus/board.h | 5 +-- radio/src/targets/horus/extmodule_driver.cpp | 40 ++++--------------- radio/src/targets/horus/pulses_driver.cpp | 18 +++------ radio/src/targets/taranis/board.h | 6 +-- .../src/targets/taranis/extmodule_driver.cpp | 39 +++--------------- radio/src/targets/taranis/pulses_driver.cpp | 21 +++------- 7 files changed, 38 insertions(+), 103 deletions(-) diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 0b226ce20..f91a36194 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -160,13 +160,13 @@ void setupPulses(uint8_t port) #if defined(CROSSFIRE) case PROTO_CROSSFIRE: - disable_crossfire(port); + disable_module_timer(port); break; #endif #if defined(PXX2) case PROTO_PXX2: - disable_pxx2(port); + disable_module_timer(port); break; #endif @@ -277,7 +277,13 @@ void setupPulses(uint8_t port) #if defined(CROSSFIRE) case PROTO_CROSSFIRE: - init_crossfire(port); + init_module_timer(port, CROSSFIRE_PERIOD, true); + break; +#endif + +#if defined(PXX2) + case PROTO_PXX2: + init_module_timer(port, PXX2_PERIOD, true); break; #endif diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index b793280cf..d14f2f706 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -195,9 +195,8 @@ void init_pxx(uint32_t module_index); void disable_pxx(uint32_t module_index); void init_serial(uint32_t module_index, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t module_index); -void init_crossfire(uint32_t module_index); -void disable_crossfire(uint32_t module_index); -void disable_pxx2(uint32_t module_index); +void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); +void disable_module_timer( uint32_t module_index); // Trainer driver void init_trainer_ppm(void); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 4b0240763..724c16837 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -34,9 +34,12 @@ void extmoduleStop() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; } -void extmoduleNoneStart() +void extmoduleTimerStart(uint32_t period, uint8_t state) { - EXTERNAL_MODULE_OFF(); + if (state) + EXTERNAL_MODULE_ON(); + else + EXTERNAL_MODULE_OFF(); GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); @@ -51,8 +54,8 @@ void extmoduleNoneStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = 36000; // 18mS - EXTMODULE_TIMER->CCR2 = 32000; // Update time + EXTMODULE_TIMER->ARR = (2000 * period); + EXTMODULE_TIMER->CCR2 = (2000 * period) - 1000; EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt @@ -62,6 +65,7 @@ void extmoduleNoneStart() NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); } + void extmodulePpmStart() { EXTERNAL_MODULE_ON(); @@ -209,34 +213,6 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) } #endif -void extmoduleCrossfireStart() -{ - EXTERNAL_MODULE_ON(); - - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); - GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); // Set high - - EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = (2000 * CROSSFIRE_PERIOD); - EXTMODULE_TIMER->CCR2 = (2000 * CROSSFIRE_PERIOD) - 1000; - EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); -} - void extmoduleSendNextFrame() { if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index f3e8e7a66..97305df0b 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -26,18 +26,17 @@ void extmoduleStop(void); void intmoduleNoneStart(void); void intmodulePxxStart(void); -void extmoduleNoneStart(void); +void extmoduleTimerStart(uint32_t period, uint8_t state); void extmodulePpmStart(void); void extmodulePxxStart(void); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); -void extmoduleCrossfireStart(void); void init_no_pulses(uint32_t port) { if (port == INTERNAL_MODULE) intmoduleNoneStart(); else - extmoduleNoneStart(); + extmoduleTimerStart(18, false); } void disable_no_pulses(uint32_t port) @@ -94,24 +93,17 @@ void disable_serial(uint32_t port) } #endif -void init_crossfire(uint32_t port) +void init_module_timer(uint32_t port, uint32_t period, uint8_t state) { if (port == EXTERNAL_MODULE) { - extmoduleCrossfireStart(); + extmoduleTimerStart(period, state); } } -void disable_crossfire(uint32_t port) +void disable_module_timer(uint32_t port) { if (port == EXTERNAL_MODULE) { extmoduleStop(); } } - -void disable_pxx2(uint32_t port) -{ - if (port == EXTERNAL_MODULE) { - extmoduleStop(); - } -} diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 004f55648..be890a8ad 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -188,10 +188,8 @@ void init_pxx( uint32_t module_index); void disable_pxx( uint32_t module_index); void init_serial( uint32_t module_index, uint32_t baudrate, uint32_t period); void disable_serial( uint32_t module_index); -void init_crossfire( uint32_t module_index); -void disable_crossfire( uint32_t module_index); -void init_pxx2( uint32_t module_index); -void disable_pxx2( uint32_t module_index); +void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); +void disable_module_timer( uint32_t module_index); // Trainer driver #define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 4d1799ce6..522ae7ba0 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -41,11 +41,12 @@ void extmoduleStop() } } -void extmoduleNoneStart() +void extmoduleTimerStart(uint32_t period, uint8_t state) { - if (!IS_TRAINER_EXTERNAL_MODULE()) { + if (state) + EXTERNAL_MODULE_ON(); + else if (!IS_TRAINER_EXTERNAL_MODULE()) EXTERNAL_MODULE_OFF(); - } GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); @@ -60,8 +61,8 @@ void extmoduleNoneStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = 36000; // 18mS - EXTMODULE_TIMER->CCR2 = 32000; // Update time + EXTMODULE_TIMER->ARR = (2000 * period); + EXTMODULE_TIMER->CCR2 = (2000 * period) - 1000; EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt @@ -235,34 +236,6 @@ void extmodulePxxStart() } #endif -void extmoduleCrossfireStart() -{ - EXTERNAL_MODULE_ON(); - - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); - GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); // Set high - - EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = (2000 * CROSSFIRE_PERIOD); - EXTMODULE_TIMER->CCR2 = (2000 * CROSSFIRE_PERIOD) - 1000; - EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); -} - void extmoduleSendNextFrame() { if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index ad7931bc1..9b7cfea4d 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -29,11 +29,11 @@ void intmodulePxxStart(void); void intmodulePpmStart(void); #endif -void extmoduleNoneStart(void); +void extmoduleTimerStart(uint32_t period, uint8_t state); void extmodulePpmStart(void); void extmodulePxxStart(void); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); -void extmoduleCrossfireStart(void); + void init_pxx(uint32_t port) { @@ -96,7 +96,7 @@ void init_no_pulses(uint32_t port) if (port == INTERNAL_MODULE) intmoduleNoneStart(); else - extmoduleNoneStart(); + extmoduleTimerStart(18, false); } void disable_no_pulses(uint32_t port) @@ -107,25 +107,16 @@ void disable_no_pulses(uint32_t port) extmoduleStop(); } -void init_crossfire(uint32_t port) +void init_module_timer(uint32_t port, uint32_t period, uint8_t state) { if (port == EXTERNAL_MODULE) { - extmoduleCrossfireStart(); + extmoduleTimerStart(period, state); } } -void disable_crossfire(uint32_t port) +void disable_module_timer(uint32_t port) { if (port == EXTERNAL_MODULE) { extmoduleStop(); } } - -void disable_pxx2(uint32_t port) -{ - if (port == EXTERNAL_MODULE) { - extmoduleStop(); - } -} - - From fd4b309e0b98ffe1f73ce51bc687e46ca854f9b2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 10 Oct 2018 09:47:34 +0200 Subject: [PATCH 07/61] PXX2 uses S.PORT CRC algorithm --- radio/src/pulses/pxx2.h | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 1f1384a62..939d0204d 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -23,11 +23,29 @@ #include "./pxx.h" -class Pxx2Transport: public DataBuffer, public PxxCrcMixin { +class SportCrcMixin { + protected: + void initCrc() + { + crc = 0; + } + + void addToCrc(uint8_t byte) + { + crc += byte; // 0-1FF + crc += crc >> 8; // 0-100 + crc &= 0x00ff; + } + + uint16_t crc; +}; + + +class Pxx2Transport: public DataBuffer, public SportCrcMixin { protected: void addByte(uint8_t byte) { - PxxCrcMixin::addToCrc(byte); + SportCrcMixin::addToCrc(byte); *ptr++ = byte; } From bbfa94151f6bfc143b914fee0d73f7a008d6f928 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 10 Oct 2018 09:49:25 +0200 Subject: [PATCH 08/61] Regular PXX will need to be checked --- radio/src/pulses/pxx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index c9c0a3fca..aa381c9a9 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -62,7 +62,7 @@ class PxxCrcMixin { crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); } - uint8_t crc; + uint16_t crc; static const uint16_t CRCTable[]; }; From 2ddc047ac8a6daadf4a7e3917fafa3ff7b85ac37 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 2 Nov 2018 22:29:30 +0100 Subject: [PATCH 09/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 972df9c2a..93a63aff1 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1450,3 +1450,4 @@ Edmond Dufresne Jaroslav Gazik Philippe Desrichard Vincent Heron +Marcel Schäfer From 9d93d88a665a164ae1265c034dbf6badba560d10 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 3 Nov 2018 16:28:57 +0100 Subject: [PATCH 10/61] PXX seems now OK on X7. More tests needed --- radio/src/pulses/pxx.h | 7 ++++++- radio/src/pulses/pxx1.cpp | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index aa381c9a9..02296bbe5 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -140,7 +140,7 @@ class StandardPxxTransport: public BitTransport, public PxxCrcMixin { void initFrame() { - BitTransport::initBuffer(); + BitTransport::initFrame(); ones_count = 0; } @@ -176,6 +176,11 @@ class StandardPxxTransport: public BitTransport, public PxxCrcMixin { class UartPxxTransport: public DataBuffer, public PxxCrcMixin { protected: + void initFrame() + { + initBuffer(); + } + void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 0981184f3..3ab3963d8 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -57,7 +57,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper template void Pxx1Pulses::setupFrame(uint8_t port) { - PxxTransport::initBuffer(); + PxxTransport::initFrame(); #if defined(PXX_FREQUENCY_HIGH) add8ChannelsFrame(port, 0); From 5233fc85b8924102c976d35c02e0678ab48c44bf Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 5 Nov 2018 16:22:56 +0100 Subject: [PATCH 11/61] 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 12/61] 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 13/61] 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 14/61] 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 15/61] 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 16/61] 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 17/61] 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 874356694c6de19a1995751467a73aa78a2f1876 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 2 Dec 2018 16:40:35 +0100 Subject: [PATCH 18/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 414023ed6..5135374e4 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1457,3 +1457,4 @@ Stefan Hufnagl Jean Philippe Bonacci Jack Mitchell Santiago Iglesias Garcia +Steve Kurywchak From 45ebb29de4a0e8b73cc4f08f4348163c5d056930 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 7 Dec 2018 08:17:05 +0100 Subject: [PATCH 19/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 5135374e4..a08fc3cc6 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1458,3 +1458,4 @@ Jean Philippe Bonacci Jack Mitchell Santiago Iglesias Garcia Steve Kurywchak +Tore Skjefstad From ac80681b7722a5901ec90482d2b4bbcf5b0dcb3b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 8 Dec 2018 13:40:35 +0100 Subject: [PATCH 20/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a08fc3cc6..c3bcfe6a8 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1459,3 +1459,4 @@ Jack Mitchell Santiago Iglesias Garcia Steve Kurywchak Tore Skjefstad +Sergio Digiandco di Molino From 3ecf8448f05ac76568130e89c6aafda384213315 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 11 Dec 2018 22:40:04 +0100 Subject: [PATCH 21/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c3bcfe6a8..e9de2a747 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1460,3 +1460,4 @@ Santiago Iglesias Garcia Steve Kurywchak Tore Skjefstad Sergio Digiandco di Molino +Xavier Delepine From 19898e3e0adb8d2935e6dab868eaec8033cb4e7d Mon Sep 17 00:00:00 2001 From: Kilrah Date: Thu, 13 Dec 2018 11:24:53 +0100 Subject: [PATCH 22/61] Fix DIY_FIRST_ID --- 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 e138dcf62..dc19a5bd7 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -181,7 +181,7 @@ enum FrSkyDataState { #define GASSUIT_MAX_FLOW_LAST_ID 0x0d6f #define GASSUIT_AVG_FLOW_FIRST_ID 0x0d70 #define GASSUIT_AVG_FLOW_LAST_ID 0x0d7f -#define DIY_FIRST_ID 0x5000 +#define DIY_FIRST_ID 0x5100 #define DIY_LAST_ID 0x52ff #define DIY_STREAM_FIRST_ID 0x5000 #define DIY_STREAM_LAST_ID 0x50ff From 1d28f319165ad6893824f7501425e3ba26693234 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 13 Dec 2018 19:41:36 +0100 Subject: [PATCH 23/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index e9de2a747..448e728df 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1461,3 +1461,4 @@ Steve Kurywchak Tore Skjefstad Sergio Digiandco di Molino Xavier Delepine +Miles Shearman From 2ed1b6cf7c6cfa4ebb7445668ff07c5a9a3afd64 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 15 Dec 2018 12:08:03 +0100 Subject: [PATCH 24/61] Update CREDITS.txt --- CREDITS.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 448e728df..3e1504a19 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1462,3 +1462,9 @@ Tore Skjefstad Sergio Digiandco di Molino Xavier Delepine Miles Shearman +Bernard Teyssier +Entel Consulting BVBA +Stuart Olson +Maximilian Wechselberger + + From 03835558fc3b7d3ce6d7b6e0da221962e3c8b588 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 15 Dec 2018 15:24:17 +0100 Subject: [PATCH 25/61] Update CREDITS.txt --- CREDITS.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CREDITS.txt b/CREDITS.txt index 3e1504a19..2feb043db 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1466,5 +1466,4 @@ Bernard Teyssier Entel Consulting BVBA Stuart Olson Maximilian Wechselberger - - +Kenneth Crump From 2f4863241b2c869a9cc9950cd1f95460c37fb05e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 09:21:50 +0100 Subject: [PATCH 26/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 2feb043db..eae0a4787 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1467,3 +1467,4 @@ Entel Consulting BVBA Stuart Olson Maximilian Wechselberger Kenneth Crump +Ken Elder From edec4149cf1d9afe8ca32f57cd912edfea058e7d Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 16 Dec 2018 14:55:20 +0100 Subject: [PATCH 27/61] Fix alignement --- 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..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[] { +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[] { +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 b50a152dd55cf5ceb0c51cb200e8831be1de870d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 17 Dec 2018 21:31:39 +0100 Subject: [PATCH 28/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index eae0a4787..9eade9979 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1468,3 +1468,4 @@ Stuart Olson Maximilian Wechselberger Kenneth Crump Ken Elder +Darko Perković From c3cb7b78fe0663cc5caa217b0e85dcfaa26d6f74 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 18 Dec 2018 18:59:11 +0100 Subject: [PATCH 29/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9eade9979..5e3c68174 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1469,3 +1469,4 @@ Maximilian Wechselberger Kenneth Crump Ken Elder Darko Perković +Martin Krueger From 74b9446a301f4502fa27f7d3e5531838fbec7d55 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 20 Dec 2018 09:22:47 +0100 Subject: [PATCH 30/61] Fix backlight not turning off on radio with physical on/off switch This fixes #6270 --- radio/src/targets/taranis/keys_driver.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 95c93c658..1f44b824f 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -149,7 +149,11 @@ void readKeysAndTrims() keys[index++].input(trims_input & i); } +#if defined(PWR_BUTTON_PRESS) if ((keys_input || trims_input || pwrPressed()) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { +#else + if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { +#endif // on keypress turn the light on backlightOn(); } From c7896aeecf9ec02d66f512640a894a84bba44a8e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 20 Dec 2018 19:39:17 +0100 Subject: [PATCH 31/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 5e3c68174..3bb616de6 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1470,3 +1470,4 @@ Kenneth Crump Ken Elder Darko Perković Martin Krueger +Jack Lopes From 32a7b503187a69e27914fc431cf9af84f8ac1819 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 22 Dec 2018 10:11:34 +0100 Subject: [PATCH 32/61] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3bb616de6..e30045d76 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1471,3 +1471,5 @@ Ken Elder Darko Perković Martin Krueger Jack Lopes +Huguette Viale +Didier Christien From e1d056486f92bbade2dcc4e45995cbd091919ee9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 22 Dec 2018 11:08:16 +0100 Subject: [PATCH 33/61] Fix wrong default channels in D8 (thx @Kilrah) --- 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 2ecb78168..f15a9968c 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -193,7 +193,7 @@ inline int8_t defaultModuleChannels_M8(uint8_t idx) else if (isModuleMultimoduleDSM2(idx)) return -1; // 7 channels else - return 8; // 16 channels + return maxModuleChannels_M8(idx); } inline int8_t sentModuleChannels(uint8_t idx) From fb4160e8e87f8ae86d106b4abdb1d9b2d75427c5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 23 Dec 2018 11:47:49 +0100 Subject: [PATCH 34/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index e30045d76..0bedf93be 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1473,3 +1473,4 @@ Martin Krueger Jack Lopes Huguette Viale Didier Christien +Pascal Roublot From cad0d484565c89954b443ae3733d13b157819528 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 24 Dec 2018 00:25:23 +0100 Subject: [PATCH 35/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 0bedf93be..54b6e28f4 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1474,3 +1474,4 @@ Jack Lopes Huguette Viale Didier Christien Pascal Roublot +Arnaud Sourisse From 419da20ca48f1e8024cc02ab81f82da0729cb502 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 5 Jan 2019 20:58:01 +0100 Subject: [PATCH 36/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 54b6e28f4..8c9f919d0 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1475,3 +1475,4 @@ Huguette Viale Didier Christien Pascal Roublot Arnaud Sourisse +Aldo Midali From d35a8bdea3000d968ed46ff19a25eb777bb7921f Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 6 Jan 2019 10:19:49 +0100 Subject: [PATCH 37/61] R9M 1W setting is Auto up to 1W --- companion/src/firmwares/moduledata.cpp | 2 +- radio/src/pulses/pulses_arm.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/companion/src/firmwares/moduledata.cpp b/companion/src/firmwares/moduledata.cpp index 9734fd29e..cc1ccd285 100644 --- a/companion/src/firmwares/moduledata.cpp +++ b/companion/src/firmwares/moduledata.cpp @@ -114,7 +114,7 @@ QString ModuleData::protocolToString(unsigned protocol) QStringList ModuleData::powerValueStrings(int subType, Firmware * fw) { static const QStringList strings[] = { - { tr("10mW - 16CH"), tr("100mW - 16CH"), tr("500mW - 16CH"), tr("1W - 16CH") }, // full-size FCC + { tr("10mW - 16CH"), tr("100mW - 16CH"), tr("500mW - 16CH"), tr("Auto <= 1W - 16CH") }, // full-size FCC { tr("25mW - 8CH"), tr("25mW - 16CH"), tr("200mW - 16CH (no telemetry)"), tr("500mW - 16CH (no telemetry)") }, // full-size EU { tr("100mW - 16CH") }, // mini FCC { tr("25mW - 8CH"), tr("25mW - 16CH"), tr("100mW - 16CH (no telemetry)") } // mini EU diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 744abb07b..12bd41389 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -188,10 +188,10 @@ enum R9MLBTPowerValues { #define LEN_R9M_REGION "\006" #define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" -#define LEN_R9M_FCC_POWER_VALUES "\006" +#define LEN_R9M_FCC_POWER_VALUES "\013" #define LEN_R9M_LBT_POWER_VALUES "\013" -#define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0" -#define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0" "200 mW 16ch" "500 mW 16ch" +#define TR_R9M_FCC_POWER_VALUES "10 mW\0 " "100 mW\0 " "500 mW\0 " "Auto <= 1 W" +#define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 " "25 mW 16ch\0" "200 mW 16ch" "500 mW 16ch" enum R9MFCCPowerValues { R9M_FCC_POWER_10 = 0, From 1a96655173751252551a22b85fee93c3ffc87157 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 6 Jan 2019 10:27:59 +0100 Subject: [PATCH 38/61] R9M 1W setting is Auto up to 1W --- radio/src/pulses/pulses_arm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 12bd41389..fb512de85 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -190,7 +190,7 @@ enum R9MLBTPowerValues { #define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" #define LEN_R9M_FCC_POWER_VALUES "\013" #define LEN_R9M_LBT_POWER_VALUES "\013" -#define TR_R9M_FCC_POWER_VALUES "10 mW\0 " "100 mW\0 " "500 mW\0 " "Auto <= 1 W" +#define TR_R9M_FCC_POWER_VALUES "10 mW\0 " "100 mW\0 " "500 mW\0 " "Auto <= 1 W" #define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 " "25 mW 16ch\0" "200 mW 16ch" "500 mW 16ch" enum R9MFCCPowerValues { From 3407f91aa0b2787914b701eae51ad31b6a2bcd9a Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 6 Jan 2019 09:32:28 +0100 Subject: [PATCH 39/61] Use website for release notes --- companion/src/mainwindow.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 6cc2f5ab8..490887c75 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -863,16 +863,8 @@ void MainWindow::sdsync() void MainWindow::changelog() { - Firmware * firmware = getCurrentFirmware(); - QString url = firmware->getReleaseNotesUrl(); - if (url.isEmpty()) { - QMessageBox::information(this, tr("Release notes"), tr("Cannot retrieve release notes from the server.")); - } - else { - ReleaseNotesFirmwareDialog * dialog = new ReleaseNotesFirmwareDialog(this, url); - dialog->exec(); - dialog->deleteLater(); - } + QString link = "http://www.open-tx.org"; + QDesktopServices::openUrl(QUrl(link)); } void MainWindow::customizeSplash() From 350acc3cc331b8cdf4a982129571c3bafb1fcedf Mon Sep 17 00:00:00 2001 From: MRC3742 Date: Sun, 6 Jan 2019 04:59:40 -0500 Subject: [PATCH 40/61] Multi protocol updates to MPM version 1.2.1.16 (#6249) --- companion/src/firmwares/moduledata.h | 8 +++++++- companion/src/firmwares/multiprotocols.cpp | 4 +++- radio/src/gui/gui_common_arm.cpp | 2 ++ radio/src/myeeprom.h | 8 +++++++- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 2 +- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 15 files changed, 30 insertions(+), 14 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index f07975534..e0ea74958 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -92,7 +92,13 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_HITEC, MM_RF_PROTO_WFLY, MM_RF_PROTO_BUGS, - MM_RF_PROTO_LAST= MM_RF_PROTO_BUGS + MM_RF_PROTO_BUGS_MINI, + MM_RF_PROTO_TRAXXAS, + MM_RF_PROTO_NCC1701, + MM_RF_PROTO_E01X, + MM_RF_PROTO_V911S, + MM_RF_PROTO_GD00X, + MM_RF_PROTO_LAST = MM_RF_PROTO_GD00X }; enum TrainerProtocol { diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index fc38a133a..3d7923a9a 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -61,6 +61,7 @@ static const QStringList STR_SUBTYPE_CABELL {"Cabell V3", "Cab V3 Telem", "-", static const QStringList STR_SUBTYPE_H83D {"H8 Mini 3D", "H20H", "H20 Mini", "H30 Mini"}; static const QStringList STR_SUBTYPE_CORONA {"V1", "V2", "Flydream V3"}; static const QStringList STR_SUBTYPE_HITEC {"Optima", "Optima Hub Telem", "Minima"}; +static const QStringList STR_SUBTYPE_E01X {"E012", "E015"}; static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; @@ -95,6 +96,7 @@ const Multiprotocols multiProtocols { {MM_RF_PROTO_H83D, 3, false, STR_SUBTYPE_H83D, nullptr}, {MM_RF_PROTO_CORONA, 2, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, {MM_RF_PROTO_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, + {MM_RF_PROTO_E01X, 1, false, STR_SUBTYPE_E01X, nullptr}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -136,7 +138,7 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023", "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS", "FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", - "Hitec", "Wfly", "Bugs" + "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "V911S", "GD00X" }); if (protocol == MM_RF_CUSTOM_SELECTED || custom) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 2b22783e0..5d6b1fe0a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -680,6 +680,7 @@ const char STR_SUBTYPE_CABELL[] = "\007""V3\0 ""V3 Telm""-\0 ""-\0 " const char STR_SUBTYPE_H83D[] = "\007""Std\0 ""H20H\0 ""H20Mini""H30Mini"; const char STR_SUBTYPE_CORONA[] = "\006"" V1\0 "" V2\0 "" FD V3"; const char STR_SUBTYPE_HITEC[] = "\007""Optima\0""Opt Hub""Minima\0"; +const char STR_SUBTYPE_E01X[] = "\004""E012""E015"; const mm_protocol_definition multi_protocols[] = { @@ -710,6 +711,7 @@ const mm_protocol_definition multi_protocols[] = { {MM_RF_PROTO_H83D, 3, false, STR_SUBTYPE_H83D, nullptr}, {MM_RF_PROTO_CORONA, 2, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, {MM_RF_PROTO_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, + {MM_RF_PROTO_E01X, 1, false, STR_SUBTYPE_E01X, nullptr}, {MM_RF_CUSTOM_SELECTED, 7, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 3024536b5..e21595ce0 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -411,7 +411,13 @@ enum MultiModuleRFProtocols { MM_RF_PROTO_HITEC, MM_RF_PROTO_WFLY, MM_RF_PROTO_BUGS, - MM_RF_PROTO_LAST= MM_RF_PROTO_BUGS + MM_RF_PROTO_BUGS_MINI, + MM_RF_PROTO_TRAXXAS, + MM_RF_PROTO_NCC1701, + MM_RF_PROTO_E01X, + MM_RF_PROTO_V911S, + MM_RF_PROTO_GD00X, + MM_RF_PROTO_LAST = MM_RF_PROTO_GD00X }; enum MMDSM2Subtypes { diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 20b40cd90..dad143ba0 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -112,7 +112,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 94520161b..df6663b80 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -115,7 +115,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 920dce585..6107e6048 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9526692a3..434d932e9 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 2b29e1140..46e7ad7ea 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index b6b62a7e5..344e29d4c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Perso" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 4cc640c15..e50eeed7e 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 1091d3ae1..27f78c492 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -116,7 +116,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f24c2846e..a8b8d8f99 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 61de3d069..bb298b1ea 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 7bc236511..b4d2d6289 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -114,7 +114,7 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 " +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0" #define TR_MULTI_CUSTOM "Custom" From 0d7a486630b5f025fe4e90b9ab44078a55766be8 Mon Sep 17 00:00:00 2001 From: Bryan Mayland Date: Sun, 6 Jan 2019 05:01:11 -0500 Subject: [PATCH 41/61] Display FlySky VOLTS values as signed integers (#6252) Standard AFHDS2A protocol transmits all values as 2 raw bytes and a stock FS-i6 transmitter shows voltage type values properly as signed. This change interprets all UNIT_VOLTS FlySky telemetry items as being signed 16-bit values so their display matches the values displayed on stock FS-i6 and FS-i6X receivers. Signed-off-by: Bryan Mayland --- radio/src/telemetry/flysky_ibus.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/telemetry/flysky_ibus.cpp b/radio/src/telemetry/flysky_ibus.cpp index 7f54c6594..980b158ce 100644 --- a/radio/src/telemetry/flysky_ibus.cpp +++ b/radio/src/telemetry/flysky_ibus.cpp @@ -103,6 +103,9 @@ static void processFlySkySensor(const uint8_t *packet) else if (id == FS_ID_TEMP) // Temperature sensors have 40 degree offset value -= 400; + else if (sensor->unit == UNIT_VOLTS) + // Voltage types are signed 16bit integers + value = (int16_t)value; setTelemetryValue(TELEM_PROTO_FLYSKY_IBUS, id, 0, instance, value, sensor->unit, sensor->precision); return; } From f858fa2234eca6123dd9d2e1106bb660f022070e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 6 Jan 2019 11:05:07 +0100 Subject: [PATCH 42/61] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 8c9f919d0..8a5e05e6b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1476,3 +1476,5 @@ Didier Christien Pascal Roublot Arnaud Sourisse Aldo Midali +Sidney Gates + From e67cb385bef34f550c3c12e05e657087f3282b34 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Mon, 7 Jan 2019 19:32:48 +1100 Subject: [PATCH 43/61] Add file name to model edit window title (#6288) --- companion/src/mdichild.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp index d0d3e1869..ade0caeb1 100644 --- a/companion/src/mdichild.cpp +++ b/companion/src/mdichild.cpp @@ -1260,7 +1260,7 @@ void MdiChild::openModelEditWindow(int row) gStopwatch.report("ModelEdit creation"); ModelEdit * t = new ModelEdit(this, radioData, (row), firmware); gStopwatch.report("ModelEdit created"); - t->setWindowTitle(tr("Editing model %1: ").arg(row+1) + QString(model.name)); + t->setWindowTitle(tr("Editing model %1: ").arg(row+1) + QString(model.name) + QString(" (%1)").arg(userFriendlyCurrentFile())); connect(t, &ModelEdit::modified, this, &MdiChild::setModified); gStopwatch.report("STARTING MODEL EDIT"); t->show(); From 7f7a6947993c2da5f4df66338b6c42d2d960f2b5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 5 Jan 2019 16:19:08 +0100 Subject: [PATCH 44/61] SBEC telem support --- radio/src/telemetry/frsky.h | 2 ++ radio/src/telemetry/frsky_sport.cpp | 6 ++++++ radio/src/translations/cz.h.txt | 2 ++ radio/src/translations/de.h.txt | 2 ++ radio/src/translations/en.h.txt | 2 ++ radio/src/translations/es.h.txt | 2 ++ radio/src/translations/fi.h.txt | 3 ++- radio/src/translations/fr.h.txt | 2 ++ radio/src/translations/it.h.txt | 2 ++ radio/src/translations/nl.h.txt | 2 ++ radio/src/translations/pl.h.txt | 2 ++ radio/src/translations/pt.h.txt | 2 ++ radio/src/translations/se.h.txt | 2 ++ 13 files changed, 30 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index dc19a5bd7..96145e3e7 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -181,6 +181,8 @@ enum FrSkyDataState { #define GASSUIT_MAX_FLOW_LAST_ID 0x0d6f #define GASSUIT_AVG_FLOW_FIRST_ID 0x0d70 #define GASSUIT_AVG_FLOW_LAST_ID 0x0d7f +#define SBEC_POWER_FIRST_ID 0x0e50 +#define SBEC_POWER_LAST_ID 0x0e5f #define DIY_FIRST_ID 0x5100 #define DIY_LAST_ID 0x52ff #define DIY_STREAM_FIRST_ID 0x5000 diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 9369c3024..dd394de6c 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -77,6 +77,8 @@ const FrSkySportSensor sportSensors[] = { { GASSUIT_FLOW_FIRST_ID, GASSUIT_FLOW_LAST_ID, 0, ZSTR_GASSUIT_FLOW, UNIT_MILLILITERS, 0 }, //TODO this needs to be changed to ml/min, but need eeprom conversion { GASSUIT_MAX_FLOW_FIRST_ID, GASSUIT_MAX_FLOW_LAST_ID, 0, ZSTR_GASSUIT_MAX_FLOW, UNIT_MILLILITERS, 0 }, //TODO this needs to be changed to ml/min, but need eeprom conversion { GASSUIT_AVG_FLOW_FIRST_ID, GASSUIT_AVG_FLOW_LAST_ID, 0, ZSTR_GASSUIT_AVG_FLOW, UNIT_MILLILITERS, 0 }, //TODO this needs to be changed to ml/min, but need eeprom conversion + { SBEC_POWER_FIRST_ID, SBEC_POWER_LAST_ID, 0, ZSTR_SBEC_VOLTAGE, UNIT_VOLTS, 2 }, + { SBEC_POWER_FIRST_ID, SBEC_POWER_LAST_ID, 1, ZSTR_SBEC_CURRENT, UNIT_AMPS, 2 }, { 0, 0, 0, NULL, UNIT_RAW, 0 } // sentinel }; @@ -235,6 +237,10 @@ void sportProcessTelemetryPacket(const uint8_t * packet) else if (id >= ESC_TEMPERATURE_FIRST_ID && id <= ESC_TEMPERATURE_LAST_ID) { sportProcessTelemetryPacket(id, 0, instance, data & 0x00ff); } + else if (id >= SBEC_POWER_FIRST_ID && id <= SBEC_POWER_LAST_ID) { + sportProcessTelemetryPacket(id, 0, instance, data & 0xffff); + sportProcessTelemetryPacket(id, 1, instance, data >> 16); + } else if (id >= DIY_STREAM_FIRST_ID && id <= DIY_STREAM_LAST_ID) { #if defined(LUA) if (luaInputTelemetryFifo && luaInputTelemetryFifo->hasSpace(sizeof(SportTelemetryPacket))) { diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index dad143ba0..4294d322a 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1274,3 +1274,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index df6663b80..ab02c533b 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1272,3 +1272,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 6107e6048..322932530 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1283,3 +1283,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 434d932e9..53da96ac6 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1278,3 +1278,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 46e7ad7ea..b09f22406 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1263,4 +1263,5 @@ #define ZSTR_GASSUIT_RES_VOL "GRVl" #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" -#define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 344e29d4c..26a901ffc 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1290,3 +1290,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e50eeed7e..32d1eebc0 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1273,3 +1273,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 27f78c492..ab9e48e41 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1280,3 +1280,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a8b8d8f99..8f7af0ef1 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1274,3 +1274,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" \ No newline at end of file diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index bb298b1ea..255b5f3f6 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1277,3 +1277,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index b4d2d6289..9d2c71498 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1285,3 +1285,5 @@ #define ZSTR_GASSUIT_RES_PERC "GRPc" #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_GASSUIT_AVG_FLOW "GAFl" +#define ZSTR_SBEC_VOLTAGE "BecV" +#define ZSTR_SBEC_CURRENT "BecA" From d363f957f517a935ad23e71c7e6ffa92f7d59e1b Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 7 Jan 2019 07:15:32 +0100 Subject: [PATCH 45/61] Fix SBEC sensor scale --- radio/src/telemetry/frsky_sport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index dd394de6c..0309ecb2f 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -238,8 +238,8 @@ void sportProcessTelemetryPacket(const uint8_t * packet) sportProcessTelemetryPacket(id, 0, instance, data & 0x00ff); } else if (id >= SBEC_POWER_FIRST_ID && id <= SBEC_POWER_LAST_ID) { - sportProcessTelemetryPacket(id, 0, instance, data & 0xffff); - sportProcessTelemetryPacket(id, 1, instance, data >> 16); + sportProcessTelemetryPacket(id, 0, instance, (data & 0xffff) / 10); + sportProcessTelemetryPacket(id, 1, instance, (data >> 16) / 10); } else if (id >= DIY_STREAM_FIRST_ID && id <= DIY_STREAM_LAST_ID) { #if defined(LUA) From fd7f839342c069858447087bcd6e647aff3b90a1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 8 Jan 2019 16:34:52 +0100 Subject: [PATCH 46/61] Fix Horus wiazrd when 'no motor' is choosen --- radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua | 2 +- radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua index df21f59c4..2e8c0bf88 100644 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua @@ -355,7 +355,7 @@ local function runConfigSummary(event) -- motors if(MotorFields[1][5] == 1) then drawNextLine("Motor chan :", MotorFields[2][5]) - elseif (MotorFields[2][5] == 2) then + elseif (MotorFields[1][5] == 2) then drawNextLine("Motor 1 chan :", MotorFields[2][5]) drawNextLine("Motor 2 chan :", MotorFields[3][5]) end diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua index 00ceaa6a2..bff885361 100755 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua @@ -355,7 +355,7 @@ local function runConfigSummary(event) -- motors if(MotorFields[1][5] == 1) then drawNextLine("Motor chan :", MotorFields[2][5]) - elseif (MotorFields[2][5] == 2) then + elseif (MotorFields[1][5] == 2) then drawNextLine("Motor 1 chan :", MotorFields[2][5]) drawNextLine("Motor 2 chan :", MotorFields[3][5]) end From 415544d012eee4882a727ffff13efd6cbe9d6e9b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 8 Jan 2019 17:03:00 +0100 Subject: [PATCH 47/61] Fix Horus wiazrd when 'no motor' is choosen (continued) --- radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua | 2 +- radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua index 2e8c0bf88..05a8bf6e0 100644 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua @@ -414,7 +414,7 @@ local function createModel(event) -- motor if(MotorFields[1][5] == 1) then addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor") - elseif (MotorFields[2][5] == 2) then + elseif (MotorFields[1][5] == 2) then addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor1") addMix(MotorFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor2") end diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua index bff885361..b5701e56d 100755 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua @@ -414,7 +414,7 @@ local function createModel(event) -- motor if(MotorFields[1][5] == 1) then addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor") - elseif (MotorFields[2][5] == 2) then + elseif (MotorFields[1][5] == 2) then addMix(MotorFields[2][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor1") addMix(MotorFields[3][5], MIXSRC_FIRST_INPUT+defaultChannel(2), "Motor2") end From 31f1c7761f09637212b40e57e41b8b019ae9231c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 9 Jan 2019 16:02:57 +0100 Subject: [PATCH 48/61] Update CREDITS.txt --- CREDITS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CREDITS.txt b/CREDITS.txt index 8a5e05e6b..9a57f9f42 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1477,4 +1477,4 @@ Pascal Roublot Arnaud Sourisse Aldo Midali Sidney Gates - +Serhiy Semenenko From 23e2c503005bc44c5c61b0423a6bb953ce0fc982 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 9 Jan 2019 17:44:15 +0100 Subject: [PATCH 49/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9a57f9f42..255509530 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1478,3 +1478,4 @@ Arnaud Sourisse Aldo Midali Sidney Gates Serhiy Semenenko +Miguel Esquer Ramiro From 25761039f6e87938cac401635f460c4a1145d265 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 13 Jan 2019 21:28:22 +0100 Subject: [PATCH 50/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 255509530..b9a230133 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1479,3 +1479,4 @@ Aldo Midali Sidney Gates Serhiy Semenenko Miguel Esquer Ramiro +Stefan Grunenberg From 677df3c18e37f74ed7a4e1336285c442262cf3d7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 13 Jan 2019 21:28:51 +0100 Subject: [PATCH 51/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b9a230133..6e4002ad3 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1480,3 +1480,4 @@ Sidney Gates Serhiy Semenenko Miguel Esquer Ramiro Stefan Grunenberg +Ferenc Kunkli From 75ed73412dc6f8b4f0b84e1cbc687384adcd0ce0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 16 Jan 2019 12:42:47 +0100 Subject: [PATCH 52/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6e4002ad3..b4f3a3703 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1481,3 +1481,4 @@ Serhiy Semenenko Miguel Esquer Ramiro Stefan Grunenberg Ferenc Kunkli +Stefano Boggia From cf6f0f6f0b118ca1e4ebc44515a1be6f55ef4387 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 17 Jan 2019 22:00:40 +0100 Subject: [PATCH 53/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b4f3a3703..185397366 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1482,3 +1482,4 @@ Miguel Esquer Ramiro Stefan Grunenberg Ferenc Kunkli Stefano Boggia +Lee Bennett From 00e28d3c0eb305f0b4de360b83728d21f070337d Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 20 Jan 2019 19:56:15 +0400 Subject: [PATCH 54/61] flexr9m was missing from compile scripts for sky9x (fix #6305) --- radio/util/fwoptions.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 3e16c3b4f..b990212e1 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -40,7 +40,8 @@ options_sky9x = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "multimodule": ("MULTIMODULE", "YES", "NO") + "multimodule": ("MULTIMODULE", "YES", "NO"), + "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_ar9x = { @@ -61,7 +62,8 @@ options_ar9x = { "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), # "rtc": ("RTCLOCK", "YES", "NO"), - "multimodule": ("MULTIMODULE", "YES", "NO") + "multimodule": ("MULTIMODULE", "YES", "NO"), + "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranis = { From 490243eb1103fa171d1d62e4e629e5f25c970865 Mon Sep 17 00:00:00 2001 From: Massimiliano Zambrini Date: Tue, 22 Jan 2019 10:35:13 +0100 Subject: [PATCH 55/61] enhanced Italian language sounds --- radio/util/tts_it.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/radio/util/tts_it.py b/radio/util/tts_it.py index 81360605e..18105e17e 100755 --- a/radio/util/tts_it.py +++ b/radio/util/tts_it.py @@ -16,12 +16,12 @@ for i, s in enumerate(["virgola", "un", "e", "meno", "ora", "ore", "minuto", "mi systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 103 + i))) for i, (s, f) in enumerate([("volt", "volt0"), ("ampere", "amp0"), - ("milliampers", "mamp0"), + ("milliampere", "mamp0"), ("nodo", "knot0"), ("nodi", "knot1"), ("metro al secondo", "mps0"), ("metri al secondo", "msp1"), ("piede al secondo", "fps0"), ("piedi al secondo", "fps1"), - ("chilometro ora", "kph0"), ("chilometri orari", "kph1"), - ("miglio per ora", "mph0"), ("miglia per ora", "mph1"), + ("chilometri orari", "kph0"), ("chilometri orari", "kph1"), + ("miglia orarie", "mph0"), ("miglia orarie", "mph1"), ("metro", "meter0"), ("metri", "meter1"), ("piede", "foot0"), ("piedi", "foot1"), ("grado celsius", "celsius0"), ("gradi celsius", "celsius1"), @@ -36,7 +36,7 @@ for i, (s, f) in enumerate([("volt", "volt0"), ("grado", "degree0"), ("gradi", "degree1"), ("radian", "rad0"), ("radians", "rad1"), ("millilitro", "m10"), ("millilitri", "m11"), - ("oncia", "founce0"), ("once", "founce1"), + ("oncia fluida", "founce0"), ("once fluide", "founce1"), ("ora", "hour0"), ("ore", "hour1"), ("minuto", "minute0"), ("minuti", "minute1"), ("secondo", "second0"), ("secondi", "second1"), @@ -70,14 +70,14 @@ for s, f, a in [("radio inattiva controllare", "inactiv", 486), ("Problema all'antenna della radio", "swr_red", NO_ALTERNATE), ("Telemetria assente", "telemko", NO_ALTERNATE), ("Telemetria disponibile", "telemok", NO_ALTERNATE), - ("servo overload", "servoko", NO_ALTERNATE), - ("power overload", "rxko", NO_ALTERNATE), - ("receiver still connected", "modelpwr", NO_ALTERNATE), + ("sovraccarico servo", "servoko", NO_ALTERNATE), + ("sovraccarico di alimentazione", "rxko", NO_ALTERNATE), + ("ricevente ancora connessa", "modelpwr", NO_ALTERNATE), ]: systemSounds.append((s, filename(f, a))) for i, s in enumerate(["timer", "", "tensione", "tensione", "trasmissione", "ricezione", "altitudine", "motore", "carburante", "temperatura", "temperatura", "velocità", "distanza", "altitudine", "cella lipo", - "totale lipo", "tensione", "corrente", "consumo", "potenza", "accellerazione X", "accellerazione Y", "accellerazione Z", + "totale lipo", "tensione", "corrente", "consumo", "potenza", "accelerazione X", "accelerazione Y", "accelerazione Z", "direzione", "variometro", "minimo", "massimo"]): systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 135 + i))) for i, (s, f) in enumerate([("carrello chiuso", "gearup"), From a030f215dd04d98ae9a5e27ea43cb25482a70e25 Mon Sep 17 00:00:00 2001 From: Massimiliano Zambrini Date: Thu, 24 Jan 2019 10:48:17 +0100 Subject: [PATCH 56/61] Corrected grammatical errors --- radio/util/tts_it.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/util/tts_it.py b/radio/util/tts_it.py index 18105e17e..050a9fc16 100755 --- a/radio/util/tts_it.py +++ b/radio/util/tts_it.py @@ -18,8 +18,8 @@ for i, (s, f) in enumerate([("volt", "volt0"), ("ampere", "amp0"), ("milliampere", "mamp0"), ("nodo", "knot0"), ("nodi", "knot1"), - ("metro al secondo", "mps0"), ("metri al secondo", "msp1"), - ("piede al secondo", "fps0"), ("piedi al secondo", "fps1"), + ("metri al secondo", "mps0"), ("metri al secondo", "msp1"), + ("piedi al secondo", "fps0"), ("piedi al secondo", "fps1"), ("chilometri orari", "kph0"), ("chilometri orari", "kph1"), ("miglia orarie", "mph0"), ("miglia orarie", "mph1"), ("metro", "meter0"), ("metri", "meter1"), @@ -34,7 +34,7 @@ for i, (s, f) in enumerate([("volt", "volt0"), ("r p m", "rpm0"), ("r p m", "rpm1"), ("g", "g0"), ("g", "g1"), ("grado", "degree0"), ("gradi", "degree1"), - ("radian", "rad0"), ("radians", "rad1"), + ("radiante", "rad0"), ("radianti", "rad1"), ("millilitro", "m10"), ("millilitri", "m11"), ("oncia fluida", "founce0"), ("once fluide", "founce1"), ("ora", "hour0"), ("ore", "hour1"), @@ -47,7 +47,7 @@ for s, f, a in [("radio inattiva controllare", "inactiv", 486), ("controllo motore non in posizione, verificare", "thralert", 481), ("interruttori non in posizione, verificare", "swalert", 482), ("eeprom corrotta", "eebad", NO_ALTERNATE), - ("formattazzione eeprom in corso", "eeformat", NO_ALTERNATE), + ("formattazione eeprom in corso", "eeformat", NO_ALTERNATE), ("errore", "error", NO_ALTERNATE), ("trim centrato", "midtrim", 495), ("potenziometro centrato", "midpot", 496), From d3e839c8d0a88f8a2814997b260560104cf7477e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Jan 2019 11:37:33 +0100 Subject: [PATCH 57/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 185397366..09c2a0d58 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1483,3 +1483,4 @@ Stefan Grunenberg Ferenc Kunkli Stefano Boggia Lee Bennett +Morgantech From f813b9923d5bed1b0b1f8329ce034e15b5a51f2f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Jan 2019 13:03:12 +0100 Subject: [PATCH 58/61] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 09c2a0d58..673a08dc7 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1484,3 +1484,5 @@ Ferenc Kunkli Stefano Boggia Lee Bennett Morgantech +Marek Přikryl +Peter Scott From 2ff56febb841abcada6fd58a0645c60a51706fc3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 Feb 2019 00:14:06 +0100 Subject: [PATCH 59/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 673a08dc7..4b4f8e893 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1486,3 +1486,4 @@ Lee Bennett Morgantech Marek Přikryl Peter Scott +Ernst Camenzind From 26692b457bbeed8c8dd82ed88100e2c6e8249556 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Feb 2019 20:07:43 +0100 Subject: [PATCH 60/61] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 4b4f8e893..b02c82c9a 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1487,3 +1487,4 @@ Morgantech Marek Přikryl Peter Scott Ernst Camenzind +Steve Robbins From 5780a8fd785d4b8925d3f3e31fbfceb70d68edaa Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 09:19:58 +0100 Subject: [PATCH 61/61] Add telem1-32 and lua mixer outputs to LUA --- radio/src/dataconstants.h | 4 ++-- radio/src/lua/api_general.cpp | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index a82ecb289..c22d85869 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -524,7 +524,7 @@ enum MixSources { MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, #if defined(LUA_INPUTS) - MIXSRC_FIRST_LUA, + MIXSRC_FIRST_LUA, LUA_EXPORT_MULTIPLE("lua", "Lua mix output %d", MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS) MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, #endif @@ -699,7 +699,7 @@ enum MixSources { MIXSRC_TIMER3, LUA_EXPORT("timer3", "Timer 3 value [seconds]") MIXSRC_LAST_TIMER = MIXSRC_TIMER3, - MIXSRC_FIRST_TELEM, + MIXSRC_FIRST_TELEM, LUA_EXPORT_MULTIPLE("telem", "Telemetry sensor %d", MAX_TELEMETRY_SENSORS) MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1 }; diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index c0b377298..be543535f 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -301,7 +301,10 @@ bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags) continue; } if (index < luaMultipleFields[n].count) { - field.id = luaMultipleFields[n].id + index; + if(luaMultipleFields[n].id == MIXSRC_FIRST_TELEM) + field.id = luaMultipleFields[n].id + index*3; + else + field.id = luaMultipleFields[n].id + index; if (flags & FIND_FIELD_DESC) { snprintf(field.desc, sizeof(field.desc)-1, luaMultipleFields[n].desc, index+1); field.desc[sizeof(field.desc)-1] = '\0';