From e5676436528d1c4ec9dc74c64178830e9370dc16 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Feb 2019 13:12:09 +0100 Subject: [PATCH] Refactoring. CAUTION: ERASE your EEPROM again! --- radio/src/datastructs.h | 36 +++---- radio/src/gui/128x64/model_setup.cpp | 25 ++--- radio/src/gui/128x64/radio_hardware.cpp | 5 +- radio/src/pulses/pulses.cpp | 6 +- radio/src/pulses/pxx.cpp | 101 -------------------- radio/src/pulses/pxx1.cpp | 72 +++++++++++++- radio/src/pulses/pxx1.h | 2 +- radio/src/pulses/pxx2.cpp | 54 ++++++++++- radio/src/pulses/pxx2.h | 2 + radio/src/storage/eeprom_conversions.cpp | 33 ++++++- radio/src/targets/common/arm/CMakeLists.txt | 3 - radio/src/targets/taranis/CMakeLists.txt | 4 + 12 files changed, 197 insertions(+), 146 deletions(-) delete mode 100644 radio/src/pulses/pxx.cpp diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index e87e312ab..4f38a909b 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -446,8 +446,6 @@ PACK(struct ModuleData { } r9m; }; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - union { struct { int8_t delay:6; @@ -569,24 +567,10 @@ PACK(struct CustomScreenData { // TODO other boards could have their custom screens here as well #endif -#if defined(PCBX12S) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); -#elif defined(PCBX10) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]); -#elif defined(PCBTARANIS) - #define MODELDATA_EXTRA \ - uint8_t spare:6; \ - uint8_t potsWarnMode:2; \ - ModuleData moduleData[NUM_MODULES]; \ - TrainerModuleData trainerData; \ - ScriptData scriptsData[MAX_SCRIPTS]; \ - char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ - uint8_t potsWarnEnabled; \ - int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; -#elif defined(PCBSKY9X) - #define MODELDATA_EXTRA uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; +#if defined(PCBHORUS) || defined(PCBTARANIS) + #define SCRIPTS_DATA NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); #else - #define MODELDATA_EXTRA + #define SCRIPTS_DATA #endif PACK(struct ModelData { @@ -624,7 +608,17 @@ PACK(struct ModelData { TELEMETRY_DATA - MODELDATA_EXTRA + NOBACKUP(uint8_t spare:6); + NOBACKUP(uint8_t potsWarnMode:2); + ModuleData moduleData[NUM_MODULES]; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + TrainerModuleData trainerData; + + SCRIPTS_DATA + + NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); + NOBACKUP(uint8_t potsWarnEnabled); + NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS]); NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];) @@ -804,7 +798,7 @@ PACK(struct RadioData { #undef SWITCHES_WARNING_DATA #undef MODEL_GVARS_DATA #undef TELEMETRY_DATA -#undef MODELDATA_EXTRA +#undef SCRIPTS_DATA #undef CUSTOM_SCREENS_DATA #undef SPLASH_MODE #undef EXTRA_GENERAL_FIELDS diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 649422b10..3dea17fa7 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -303,7 +303,7 @@ void runPopupRegister(event_t event) if (menuVerticalPosition != 2) { break; } - else if (menuHorizontalPosition == 0) { + else if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED && menuHorizontalPosition == 0) { // [Enter] pressed reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue @@ -322,7 +322,7 @@ void runPopupRegister(event_t event) } if (warningText) { - const uint8_t dialogRows[] = { 0, 0, 1}; + const uint8_t dialogRows[] = { 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; check(event, 0, nullptr, 0, dialogRows, 2, 2); drawMessageBox(); @@ -330,21 +330,24 @@ void runPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Waiting ..."); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 ? INVERS : 0); + } + else { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); } - lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; } menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; - menuHorizontalPosition = 1; + menuHorizontalPosition = 0; menuVerticalOffset = backupVerticalOffset; s_editMode = backupEditMode; } @@ -1172,12 +1175,12 @@ void menuModelSetup(event_t event) if (attr) { if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 0 && event == EVT_KEY_FIRST(KEY_ENTER)) { - moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; + moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; s_editMode = 0; POPUP_INPUT("", runPopupRegister); } @@ -1780,11 +1783,11 @@ void menuModelFailsafe(event_t event) if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { if (s_editMode > 0) { - g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; + g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; s_editMode = 0; } else { - int16_t & failsafe = g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition]; + int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; if (failsafe < FAILSAFE_CHANNEL_HOLD) failsafe = FAILSAFE_CHANNEL_HOLD; else if (failsafe == FAILSAFE_CHANNEL_HOLD) @@ -1816,7 +1819,7 @@ void menuModelFailsafe(event_t event) // Channels for (; line < 8; line++) { const int32_t channelValue = channelOutputs[ch+channelStart]; - int32_t failsafeValue = g_model.moduleData[g_moduleIdx].failsafeChannels[ch]; + int32_t failsafeValue = g_model.failsafeChannels[ch]; //Channel putsChn(x+1, y, ch+1, SMLSIZE); @@ -1831,7 +1834,7 @@ void menuModelFailsafe(event_t event) } else { flags |= BLINK; - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[g_moduleIdx].failsafeChannels[ch], -lim, +lim); + CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[ch], -lim, +lim); } } } diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 5fcbe91e9..563515c30 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -199,7 +199,10 @@ void runHWPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Waiting for receiver ..."); + } + else { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); } diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 2e2833430..eb8325a47 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -337,10 +337,10 @@ void setCustomFailsafe(uint8_t moduleIndex) if (moduleIndex < NUM_MODULES) { for (int ch=0; ch= sentModuleChannels(moduleIndex) + g_model.moduleData[moduleIndex].channelsStart) { - g_model.moduleData[moduleIndex].failsafeChannels[ch] = 0; + g_model.failsafeChannels[ch] = 0; } - else if (g_model.moduleData[moduleIndex].failsafeChannels[ch] < FAILSAFE_CHANNEL_HOLD) { - g_model.moduleData[moduleIndex].failsafeChannels[ch] = channelOutputs[ch]; + else if (g_model.failsafeChannels[ch] < FAILSAFE_CHANNEL_HOLD) { + g_model.failsafeChannels[ch] = channelOutputs[ch]; } } } diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp deleted file mode 100644 index fc1167b80..000000000 --- a/radio/src/pulses/pxx.cpp +++ /dev/null @@ -1,101 +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" - -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; - } - } -} - -#if defined(PXX1) -template class PxxPulses >; -template class PxxPulses >; -template class PxxPulses; -#endif - -#if defined(PXX2) -template class PxxPulses; -#endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 1394f5ad5..568f9b38b 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -110,6 +110,76 @@ void Pxx1Pulses::addExtraFlags(uint8_t module) PxxTransport::addByte(extra_flags); } +template +void Pxx1Pulses::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.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.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 void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpperChannels) { @@ -128,7 +198,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpp PxxTransport::addByte(0); // Channels - PxxPulses::addChannels(module, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + addChannels(module, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); // Extra flags addExtraFlags(module); diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 33c374a3a..99480efe6 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -156,7 +156,7 @@ class Pxx1Pulses: public PxxPulses uint8_t addFlag1(uint8_t port); void addExtraFlags(uint8_t port); - + void addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels); void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); }; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 5e21aaa4a..e795a763f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -39,6 +39,50 @@ void Pxx2Pulses::addFlag1(uint8_t module) Pxx2Transport::addByte(flag1); } +void Pxx2Pulses::addChannels(uint8_t module, uint8_t sendFailsafe, uint8_t firstChannel) +{ + uint16_t pulseValue = 0; + uint16_t pulseValueLow = 0; + + for (int8_t i=0; i<8; i++) { + uint8_t channel = firstChannel + i; + if (sendFailsafe) { + if (g_model.moduleData[module].failsafeMode == FAILSAFE_HOLD) { + pulseValue = 2047; + } + else if (g_model.moduleData[module].failsafeMode == FAILSAFE_NOPULSES) { + pulseValue = 0; + } + else { + int16_t failsafeValue = g_model.failsafeChannels[channel]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 2047; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 0; + } + else { + failsafeValue += 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); + } + } + } + else { + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); + } + + if (i & 1) { + Pxx2Transport::addByte(pulseValueLow); // Low byte of channel + Pxx2Transport::addByte(((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels + Pxx2Transport::addByte(pulseValue >> 4); // High byte of channel + } + else { + pulseValueLow = pulseValue; + } + } +} + void Pxx2Pulses::setupChannelsFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); @@ -50,8 +94,14 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) addFlag1(module); // Channels - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 0); - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 1); + uint8_t channelsCount = sentModuleChannels(module); + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart); + if (channelsCount > 8) { + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 8); + if (channelsCount > 16) { + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 16); + } + } } bool Pxx2Pulses::setupRegisterFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index dcd64a9c3..a07fa8d69 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -132,6 +132,8 @@ class Pxx2Pulses: public PxxPulses { void addFlag1(uint8_t module); + void addChannels(uint8_t module, uint8_t sendFailsafe, uint8_t firstChannel); + void addCrc() { Pxx2Transport::addByteWithoutCrc(Pxx2CrcMixin::crc >> 8); diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index 357977afe..b28d0f639 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -486,6 +486,34 @@ PACK(typedef struct { uint8_t ppmPulsePol; }) ModuleData_v216; +PACK(typedef struct { + uint8_t type:4; + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + }; +}) ModuleData_v217; + #if defined(PCBTARANIS) #define MODELDATA_EXTRA_216 \ uint8_t externalModule; \ @@ -511,7 +539,7 @@ PACK(typedef struct { uint8_t spare:3; \ uint8_t trainerMode:3; \ uint8_t potsWarnMode:2; \ - ModuleData moduleData[NUM_MODULES+1]; \ + ModuleData_v217 moduleData[NUM_MODULES+1]; \ char curveNames[MAX_CURVES][6]; \ ScriptData scriptsData[MAX_SCRIPTS]; \ char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ @@ -1205,7 +1233,8 @@ void ConvertModel_217_to_218(ModelData & model) } } for (int i=0; i