From d0c72be9e6e35cee7142c390688e2fe5929e0bdb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Apr 2019 18:08:11 +0200 Subject: [PATCH] Receiver RESET added --- radio/src/gui/128x64/model_setup.cpp | 12 ++++++++++ radio/src/opentx.h | 3 +++ radio/src/pulses/pulses.h | 1 + radio/src/pulses/pxx2.cpp | 11 ++++++++- radio/src/pulses/pxx2.h | 8 +++++++ radio/src/telemetry/frsky.h | 4 ++-- radio/src/telemetry/frsky_pxx2.cpp | 20 ++++++++++++++++- radio/src/telemetry/frsky_sport.cpp | 8 ++++--- radio/src/telemetry/telemetry_holders.cpp | 24 +++++++++----------- radio/src/telemetry/telemetry_holders.h | 27 ++++++++++++++++++----- 10 files changed, 92 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 956e818be..4d1814b35 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -246,11 +246,14 @@ enum MenuModelSetupItems { #if defined(PXX2) const char * STR_BIND = "Bind"; const char * STR_SHARE = "Share"; +const char * STR_UNBIND = "Unbind"; +const char * STR_ERASE = "Erase"; void removePXX2ReceiverIfEmpty(uint8_t moduleIdx, uint8_t receiverIdx) { if (is_memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME)) { g_model.moduleData[moduleIdx].pxx2.receivers &= ~(1 << receiverIdx); + storageDirty(EE_MODEL); } } @@ -296,6 +299,13 @@ void onPXX2ReceiverMenu(const char * result) memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); storageDirty(EE_MODEL); } + else if (result == STR_UNBIND || result == STR_ERASE) { + memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); + reusableBuffer.moduleSetup.pxx2.resetReceiverIndex = receiverIdx; + reusableBuffer.moduleSetup.pxx2.resetReceiverFlags = (result == STR_ERASE ? 0xFF : 0x01); + moduleSettings[moduleIdx].mode = MODULE_MODE_RESET; + s_editMode = 1; + } else { removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); } @@ -1338,6 +1348,8 @@ void menuModelSetup(event_t event) POPUP_MENU_ADD_ITEM(STR_OPTIONS); POPUP_MENU_ADD_ITEM(STR_SHARE); POPUP_MENU_ADD_ITEM(STR_DELETE); + POPUP_MENU_ADD_ITEM(STR_UNBIND); + POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_START(onPXX2ReceiverMenu); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 5809197aa..2ae61b5dc 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1136,6 +1136,7 @@ union ReusableBuffer union { uint8_t registerStep; uint8_t bindStep; + uint8_t resetStep; }; uint32_t bindWaitTimeout; uint8_t registerPopupVerticalPosition; @@ -1149,7 +1150,9 @@ union ReusableBuffer union { uint8_t bindSelectedReceiverIndex; uint8_t shareReceiverIndex; + uint8_t resetReceiverIndex; }; + uint8_t resetReceiverFlags; } pxx2; }; } moduleSetup; diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 405956259..ffce56216 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -76,6 +76,7 @@ enum ModuleSettingsMode MODULE_MODE_BIND, MODULE_MODE_SHARE, MODULE_MODE_RANGECHECK, + MODULE_MODE_RESET }; PACK(struct ModuleSettings { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 467ba41aa..b57a6086f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -245,6 +245,13 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) } } +void Pxx2Pulses::setupResetFrame(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RESET); + Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.resetReceiverIndex); + Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.resetReceiverFlags); +} + void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) { if (moduleSettings[module].counter > 1000) { @@ -261,7 +268,6 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.step); } - void Pxx2Pulses::setupPowerMeter(uint8_t module) { if (moduleSettings[module].counter > 1000) { @@ -303,6 +309,9 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_BIND: setupBindFrame(module); break; + case MODULE_MODE_RESET: + setupRegisterFrame(module); + break; case MODULE_MODE_SPECTRUM_ANALYSER: setupSpectrumAnalyser(module); break; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 6f4a61c4c..571ffa2ad 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -33,6 +33,7 @@ #define PXX2_TYPE_ID_RX_SETTINGS 0x05 #define PXX2_TYPE_ID_HW_INFO 0x06 #define PXX2_TYPE_ID_SHARE 0x07 + #define PXX2_TYPE_ID_RESET 0x08 #define PXX2_TYPE_ID_TELEMETRY 0xFE #define PXX2_TYPE_C_POWER_METER 0x02 @@ -126,6 +127,11 @@ enum PXX2BindSteps { BIND_OK }; +enum PXX2ResetSteps { + RESET_START, + RESET_OK +}; + enum PXX2ReceiverStatus { PXX2_HARDWARE_INFO, PXX2_SETTINGS_READ, @@ -184,6 +190,8 @@ class Pxx2Pulses: public PxxPulses { void setupBindFrame(uint8_t module); + void setupResetFrame(uint8_t module); + void setupShareMode(uint8_t module); void setupModuleSettingsFrame(uint8_t module); diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 9227821ee..ed45cccfd 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -303,8 +303,8 @@ enum TelemetryProtocol }; struct TelemetryData { - TelemetryValueWithMin swr; // TODO Min not needed - TelemetryValueWithMin rssi; // TODO Min not needed + TelemetryValue swr; + FilteredTelemetryValue rssi; uint16_t xjtVersion; bool varioHighPrecision; }; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 7dca6f57c..1becb6681 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -122,7 +122,8 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; POPUP_INFORMATION(STR_REG_OK); - } else { + } + else { TRACE("KO %s %s", &frame[4], reusableBuffer.moduleSetup.pxx2.registerRxName); } } @@ -165,6 +166,19 @@ void processBindFrame(uint8_t module, uint8_t * frame) } } +void processResetFrame(uint8_t module, uint8_t * frame) +{ + if (moduleSettings[module].mode != MODULE_MODE_RESET) { + return; + } + + if (reusableBuffer.moduleSetup.pxx2.resetReceiverIndex == frame[3]) { + memclear(g_model.moduleData[module].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.resetReceiverIndex], PXX2_LEN_RX_NAME); + } + + moduleSettings[module].mode = MODULE_MODE_NORMAL; +} + void processTelemetryFrame(uint8_t module, uint8_t * frame) { uint8_t origin = (module << 2) + (frame[3] & 0x03); @@ -232,6 +246,10 @@ void processModuleFrame(uint8_t module, uint8_t *frame) case PXX2_TYPE_ID_TELEMETRY: processTelemetryFrame(module, frame); break; + + case PXX2_TYPE_ID_RESET: + processResetFrame(module, frame); + break; } } diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 8b73386c9..1ba3acf1a 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -162,13 +162,15 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe if (dataId == RSSI_ID) { telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected data = SPORT_DATA_U8(packet); - if(g_model.frsky.rssiSource) { + if (g_model.frsky.rssiSource) { TelemetrySensor * sensor = & g_model.telemetrySensors[g_model.frsky.rssiSource]; - if(sensor->instance == instance) + if (sensor->instance == instance) { telemetryData.rssi.set(data); + } } - else + else { telemetryData.rssi.set(data); + } } else if (dataId == R9_PWR_ID) { uint32_t r9pwr[] = {100, 200, 500, 1000}; diff --git a/radio/src/telemetry/telemetry_holders.cpp b/radio/src/telemetry/telemetry_holders.cpp index 606ae8fe2..f01977df5 100644 --- a/radio/src/telemetry/telemetry_holders.cpp +++ b/radio/src/telemetry/telemetry_holders.cpp @@ -20,12 +20,12 @@ #include "opentx.h" -void TelemetryValueWithMin::reset() +void FilteredTelemetryValue::reset() { memclear(this, sizeof(*this)); } -void TelemetryValueWithMin::set(uint8_t value) +void FilteredTelemetryValue::set(uint8_t value) { if (this->value == 0) { memset(values, value, TELEMETRY_AVERAGE_COUNT); @@ -44,19 +44,17 @@ void TelemetryValueWithMin::set(uint8_t value) sum += value; this->value = sum/(TELEMETRY_AVERAGE_COUNT+1); } +} +void TelemetryValueWithMin::reset() +{ + memclear(this, sizeof(*this)); +} + +void TelemetryValueWithMin::set(uint8_t value) +{ + FilteredTelemetryValue::set(value); if (!min || value < min) { min = value; } } - -void TelemetryValueWithMinMax::set(uint8_t value, uint8_t unit) -{ - TelemetryValueWithMin::set(value); - if (unit != UNIT_VOLTS) { - this->value = value; - } - if (!max || value > max) { - max = value; - } -} diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index ef74fe010..dc076c541 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -25,19 +25,34 @@ #define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! #define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] -class TelemetryValueWithMin { + +class TelemetryValue { public: - uint8_t value; // fitered value (average of last TELEMETRY_AVERAGE_COUNT+1 values) - uint8_t min; + uint8_t value; + void set(uint8_t value) + { + this->value = value; + } + + void reset() + { + this->value = 0; + }; +}; + +class FilteredTelemetryValue: public TelemetryValue { + public: + uint8_t value; // filtered value (average of last TELEMETRY_AVERAGE_COUNT+1 values) uint8_t values[TELEMETRY_AVERAGE_COUNT]; void set(uint8_t value); void reset(); }; -class TelemetryValueWithMinMax: public TelemetryValueWithMin { +class TelemetryValueWithMin: public FilteredTelemetryValue { public: - uint8_t max; - void set(uint8_t value, uint8_t unit); + uint8_t min; + void set(uint8_t value); + void reset(); }; #endif // _TELEMETRY_HOLDERS_H_