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
This commit is contained in:
@@ -1489,6 +1489,8 @@ void menuModelSetup(event_t event)
|
||||
break;
|
||||
case 1:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min<int8_t>(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart));
|
||||
if (checkIncDec_Ret)
|
||||
setDefaultPpmFrameLengthTrainer();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1376,6 +1376,8 @@ void menuModelSetup(event_t event)
|
||||
break;
|
||||
case 1:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min<int8_t>(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart));
|
||||
if (checkIncDec_Ret)
|
||||
setDefaultPpmFrameLengthTrainer();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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<PpmModule>(line, &md->ppm);
|
||||
|
||||
// copy pointer to frame len edit object to channel range
|
||||
chRange->setPpmFrameLenEditObject(obj->getPpmFrameLenEditObject());
|
||||
}
|
||||
|
||||
// Generic module parameters
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
template <typename T>
|
||||
PpmFrameSettings<T>::PpmFrameSettings(Window* parent, const FlexGridLayout& g, T* ppm) :
|
||||
PpmFrameSettings<T>::PpmFrameSettings(Window* parent, T* ppm) :
|
||||
FormGroup(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
@@ -38,6 +38,9 @@ PpmFrameSettings<T>::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<T>::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<TrainerModuleData>;
|
||||
|
||||
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<PpmModule>(line, grid, &md->ppm);
|
||||
}
|
||||
template struct PpmFrameSettings<PpmModule>;
|
||||
@@ -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 <typename T>
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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<TrainerModuleData>(line, grid, td);
|
||||
auto obj = new PpmFrameSettings<TrainerModuleData>(line, td);
|
||||
|
||||
// copy pointer to frame len edit object to channel range
|
||||
chRange->setPpmFrameLenEditObject(obj->getPpmFrameLenEditObject());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -788,6 +788,12 @@ inline void setDefaultPpmFrameLength(uint8_t moduleIdx)
|
||||
4 * max<int>(0, g_model.moduleData[moduleIdx].channelsCount);
|
||||
}
|
||||
|
||||
inline void setDefaultPpmFrameLengthTrainer()
|
||||
{
|
||||
g_model.trainerData.frameLength =
|
||||
4 * max<int>(0, g_model.trainerData.channelsCount);
|
||||
}
|
||||
|
||||
inline void resetAccessAuthenticationCount()
|
||||
{
|
||||
// the module will reset on mode switch, we need to reset the authentication counter
|
||||
|
||||
Reference in New Issue
Block a user