From e25c6d8a997485f84b824a138decea2d75371f1f Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 31 May 2023 05:29:17 +0200 Subject: [PATCH] fix(ui): Auto adjust PPM frame length if greater than 8 ch (#3622) * Auto-adjusts PPM frame length if channel count is greater than 8 channels * added auto adjust for PPM trainer mode on b&w targets * code cleanup --- radio/src/gui/128x64/model_setup.cpp | 2 ++ radio/src/gui/212x64/model_setup.cpp | 2 ++ radio/src/gui/colorlcd/channel_range.cpp | 35 ++++++++++++++++++++++++ radio/src/gui/colorlcd/channel_range.h | 12 ++++++-- radio/src/gui/colorlcd/module_setup.cpp | 8 +++++- radio/src/gui/colorlcd/ppm_settings.cpp | 20 ++++---------- radio/src/gui/colorlcd/ppm_settings.h | 21 +++++++------- radio/src/gui/colorlcd/trainer_setup.cpp | 5 +++- radio/src/pulses/modules_helpers.h | 6 ++++ 9 files changed, 81 insertions(+), 30 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4feb0c875..2552eafbc 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1489,6 +1489,8 @@ void menuModelSetup(event_t event) break; case 1: CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + if (checkIncDec_Ret) + setDefaultPpmFrameLengthTrainer(); break; } } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index dd5df366b..df08599f1 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1376,6 +1376,8 @@ void menuModelSetup(event_t event) break; case 1: CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + if (checkIncDec_Ret) + setDefaultPpmFrameLengthTrainer(); break; } } diff --git a/radio/src/gui/colorlcd/channel_range.cpp b/radio/src/gui/colorlcd/channel_range.cpp index ed70e1a80..5e37f2be9 100644 --- a/radio/src/gui/colorlcd/channel_range.cpp +++ b/radio/src/gui/colorlcd/channel_range.cpp @@ -24,6 +24,27 @@ #define SET_DIRTY() storageDirty(EE_MODEL) +inline int16_t ppmFrameLen(int8_t chCount) { + #define PPM_PULSE_LEN_MAX (4 * PPM_STEP_SIZE) // let's assume roughly 2ms max pulse length + + if(chCount > 0) + return((PPM_PULSE_LEN_MAX * chCount) + PPM_DEF_PERIOD); // for more than 8 channels update frame length + else + return(PPM_DEF_PERIOD); // else leave frame Length at default (22.5ms) +} + +void cb_value_changed(lv_event_t* e) { + ChannelRange* chRangeEditObject = (ChannelRange*)lv_event_get_user_data(e); + if(!chRangeEditObject) + return; + + NumberEdit* ppmFrameLenEditObject = chRangeEditObject->getPpmFrameLenEditObject(); + if(!ppmFrameLenEditObject) + return; + + ppmFrameLenEditObject->setValue(ppmFrameLen(chRangeEditObject->getChannelsCount())); +} + ChannelRange::ChannelRange(Window* parent) : FormGroup(parent, rect_t{}) { @@ -83,11 +104,22 @@ void ChannelRange::update() updateEnd(); } +NumberEdit* ChannelRange::getPpmFrameLenEditObject() { + return this->ppmFrameLenEditObject; +} + +void ChannelRange::setPpmFrameLenEditObject(NumberEdit* ppmFrameLenEditObject) { + this->ppmFrameLenEditObject = ppmFrameLenEditObject; +} + ModuleChannelRange::ModuleChannelRange(Window* parent, uint8_t moduleIdx) : ChannelRange(parent), moduleIdx(moduleIdx) { build(); update(); + + // add callback to be notified when channel count changes + lv_obj_add_event_cb(chEnd->getLvObj(), cb_value_changed, LV_EVENT_VALUE_CHANGED, (void *)this); } void ModuleChannelRange::update() @@ -156,6 +188,9 @@ TrainerChannelRange::TrainerChannelRange(Window* parent) : { build(); update(); + + // add callback to be notified when channel count changes + lv_obj_add_event_cb(chEnd->getLvObj(), cb_value_changed, LV_EVENT_VALUE_CHANGED, (void *)this); } uint8_t TrainerChannelRange::getChannelsStart() diff --git a/radio/src/gui/colorlcd/channel_range.h b/radio/src/gui/colorlcd/channel_range.h index 87dd07696..cb5b02685 100644 --- a/radio/src/gui/colorlcd/channel_range.h +++ b/radio/src/gui/colorlcd/channel_range.h @@ -36,16 +36,20 @@ class ChannelRange : public FormGroup void updateStart(); void updateEnd(); + virtual int8_t getChannelsCount() = 0; + void setPpmFrameLenEditObject(NumberEdit* ppmFrameLenEditObject); + NumberEdit* getPpmFrameLenEditObject(); + protected: NumberEdit* chStart; NumberEdit* chEnd; + NumberEdit* ppmFrameLenEditObject = nullptr; void build(); virtual uint8_t getChannelsStart() = 0; virtual void setChannelsStart(uint8_t val) = 0; - virtual int8_t getChannelsCount() = 0; virtual void setChannelsCount(int8_t val) = 0; virtual uint8_t getChannelsUsed() = 0; @@ -62,7 +66,6 @@ class ModuleChannelRange : public ChannelRange uint8_t getChannelsStart() override; void setChannelsStart(uint8_t val) override; - int8_t getChannelsCount() override; void setChannelsCount(int8_t val) override; uint8_t getChannelsUsed() override; @@ -71,6 +74,8 @@ class ModuleChannelRange : public ChannelRange public: ModuleChannelRange(Window* parent, uint8_t moduleIdx); + + int8_t getChannelsCount() override; }; class TrainerChannelRange : public ChannelRange @@ -78,7 +83,6 @@ class TrainerChannelRange : public ChannelRange uint8_t getChannelsStart() override; void setChannelsStart(uint8_t val) override; - int8_t getChannelsCount() override; void setChannelsCount(int8_t val) override; uint8_t getChannelsUsed() override; @@ -87,4 +91,6 @@ class TrainerChannelRange : public ChannelRange public: TrainerChannelRange(Window* parent); + + int8_t getChannelsCount() override; }; diff --git a/radio/src/gui/colorlcd/module_setup.cpp b/radio/src/gui/colorlcd/module_setup.cpp index cd8c8d927..98450e1b1 100644 --- a/radio/src/gui/colorlcd/module_setup.cpp +++ b/radio/src/gui/colorlcd/module_setup.cpp @@ -242,7 +242,13 @@ void ModuleWindow::updateModule() // PPM modules if (isModulePPM(moduleIdx)) { - new PpmSettings(this, grid, moduleIdx); + // PPM frame + auto line = newLine(&grid); + new StaticText(line, rect_t{}, STR_PPMFRAME, 0, COLOR_THEME_PRIMARY1); + auto obj = new PpmFrameSettings(line, &md->ppm); + + // copy pointer to frame len edit object to channel range + chRange->setPpmFrameLenEditObject(obj->getPpmFrameLenEditObject()); } // Generic module parameters diff --git a/radio/src/gui/colorlcd/ppm_settings.cpp b/radio/src/gui/colorlcd/ppm_settings.cpp index 74f88b33d..4e5c23936 100644 --- a/radio/src/gui/colorlcd/ppm_settings.cpp +++ b/radio/src/gui/colorlcd/ppm_settings.cpp @@ -25,7 +25,7 @@ #define SET_DIRTY() storageDirty(EE_MODEL) template -PpmFrameSettings::PpmFrameSettings(Window* parent, const FlexGridLayout& g, T* ppm) : +PpmFrameSettings::PpmFrameSettings(Window* parent, T* ppm) : FormGroup(parent, rect_t{}) { setFlexLayout(LV_FLEX_FLOW_ROW); @@ -38,6 +38,9 @@ PpmFrameSettings::PpmFrameSettings(Window* parent, const FlexGridLayout& g, T 0, PREC1); edit->setStep(PPM_STEP_SIZE); edit->setSuffix(STR_MS); + + // memorize PPM frame length NumberEdit object + this->ppmFrameLenEditObject = edit; // PPM frame delay edit = new NumberEdit(this, rect_t{}, 100, 800, @@ -50,17 +53,6 @@ PpmFrameSettings::PpmFrameSettings(Window* parent, const FlexGridLayout& g, T new Choice(this, rect_t{}, STR_PPM_POL, 0, 1, GET_SET_DEFAULT(ppm->pulsePol)); } -// explicit instantiation +// explicit instantiation to make linker happy template struct PpmFrameSettings; - -PpmSettings::PpmSettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx) : - FormGroup(parent, rect_t{}), md(&g_model.moduleData[moduleIdx]) -{ - FlexGridLayout grid(g); - setFlexLayout(); - - // PPM frame - auto line = newLine(&grid); - new StaticText(line, rect_t{}, STR_PPMFRAME, 0, COLOR_THEME_PRIMARY1); - new PpmFrameSettings(line, grid, &md->ppm); -} +template struct PpmFrameSettings; \ No newline at end of file diff --git a/radio/src/gui/colorlcd/ppm_settings.h b/radio/src/gui/colorlcd/ppm_settings.h index 610f6ede3..af9a23ea5 100644 --- a/radio/src/gui/colorlcd/ppm_settings.h +++ b/radio/src/gui/colorlcd/ppm_settings.h @@ -22,18 +22,17 @@ #pragma once #include "form.h" - -struct ModuleData; - -class PpmSettings : public FormGroup -{ - ModuleData* md; - -public: - PpmSettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx); -}; +#include "numberedit.h" template struct PpmFrameSettings : public FormGroup { - PpmFrameSettings(Window* parent, const FlexGridLayout& g, T* ppm); + private: + NumberEdit* ppmFrameLenEditObject = nullptr; + + public: + PpmFrameSettings(Window* parent, T* ppm); + + NumberEdit* getPpmFrameLenEditObject() { + return ppmFrameLenEditObject; + }; }; diff --git a/radio/src/gui/colorlcd/trainer_setup.cpp b/radio/src/gui/colorlcd/trainer_setup.cpp index 456e96ca6..6cf8f3bf6 100644 --- a/radio/src/gui/colorlcd/trainer_setup.cpp +++ b/radio/src/gui/colorlcd/trainer_setup.cpp @@ -134,7 +134,10 @@ void TrainerModuleWindow::update() // PPM frame line = newLine(&grid); new StaticText(line, rect_t{}, STR_PPMFRAME, 0, COLOR_THEME_PRIMARY1); - new PpmFrameSettings(line, grid, td); + auto obj = new PpmFrameSettings(line, td); + + // copy pointer to frame len edit object to channel range + chRange->setPpmFrameLenEditObject(obj->getPpmFrameLenEditObject()); } } diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 1f4891c17..e0605bd90 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -788,6 +788,12 @@ inline void setDefaultPpmFrameLength(uint8_t moduleIdx) 4 * max(0, g_model.moduleData[moduleIdx].channelsCount); } +inline void setDefaultPpmFrameLengthTrainer() +{ + g_model.trainerData.frameLength = + 4 * max(0, g_model.trainerData.channelsCount); +} + inline void resetAccessAuthenticationCount() { // the module will reset on mode switch, we need to reset the authentication counter