Add more generic class for channel range

This commit is contained in:
Raphael Coeffic
2022-06-25 15:37:11 +02:00
committed by Raphael Coeffic
parent b81d174a2e
commit 7b053c1c05
5 changed files with 286 additions and 96 deletions
+1
View File
@@ -54,6 +54,7 @@ set(GUI_SRC
trainer_setup.cpp
custom_failsafe.cpp
ppm_settings.cpp
channel_range.cpp
module_setup.cpp
timer_setup.cpp
trims_setup.cpp
+192
View File
@@ -0,0 +1,192 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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 "channel_range.h"
#include "opentx.h"
#define SET_DIRTY() storageDirty(EE_MODEL)
ChannelRange::ChannelRange(Window* parent) :
FormGroup(parent, rect_t{})
{
setFlexLayout(LV_FLEX_FLOW_ROW);
}
void ChannelRange::build()
{
chStart = new NumberEdit(this, rect_t{}, 1, 1, GET_DEFAULT(1 + getChannelsStart()));
chStart->setSetValueHandler([=](int newValue) { setStart(newValue); });
chStart->setPrefix(STR_CH);
chEnd = new NumberEdit(this, rect_t{}, 8, 8,
GET_DEFAULT(getChannelsStart() + 8 + getChannelsCount()));
chEnd->setPrefix(STR_CH);
chEnd->setSetValueHandler([=](int newValue) { setEnd(newValue); });
}
void ChannelRange::setStart(uint8_t newValue)
{
setChannelsStart(newValue - 1);
updateEnd();
SET_DIRTY();
}
void ChannelRange::setEnd(uint8_t newValue)
{
setChannelsCount(newValue - getChannelsStart() - 8);
updateStart();
SET_DIRTY();
}
void ChannelRange::updateEnd()
{
auto min_ch = getChannelsStart() + getChannelsMin();
chEnd->setMin(min_ch);
auto max_ch = getChannelsStart() + getChannelsMax();
max_ch = min<int8_t>(MAX_OUTPUT_CHANNELS, max_ch);
chEnd->setMax(max_ch);
chEnd->setDefault(max_ch);
chEnd->update();
}
void ChannelRange::updateStart()
{
chStart->setMax(MAX_OUTPUT_CHANNELS - getChannelsUsed() + 1);
}
void ChannelRange::update()
{
updateStart();
updateEnd();
}
ModuleChannelRange::ModuleChannelRange(Window* parent, uint8_t moduleIdx) :
ChannelRange(parent), moduleIdx(moduleIdx)
{
build();
update();
}
void ModuleChannelRange::update()
{
ChannelRange::update();
auto min_mod_ch = minModuleChannels(moduleIdx);
auto max_mod_ch = maxModuleChannels(moduleIdx);
chEnd->enable(min_mod_ch < max_mod_ch);
if (chEnd->getValue() > chEnd->getMax())
chEnd->setValue(chEnd->getMax());
if (!isModulePXX2(moduleIdx)) {
chEnd->setAvailableHandler(nullptr);
}
#if defined(PXX2)
else {
chEnd->setAvailableHandler(
[=](int value) { return isPxx2IsrmChannelsCountAllowed(value - 8); });
}
#endif
}
uint8_t ModuleChannelRange::getChannelsStart()
{
ModuleData* md = &g_model.moduleData[moduleIdx];
return md->channelsStart;
}
void ModuleChannelRange::setChannelsStart(uint8_t val)
{
ModuleData* md = &g_model.moduleData[moduleIdx];
md->channelsStart = val;
}
int8_t ModuleChannelRange::getChannelsCount()
{
ModuleData* md = &g_model.moduleData[moduleIdx];
return md->channelsCount;
}
void ModuleChannelRange::setChannelsCount(int8_t val)
{
ModuleData* md = &g_model.moduleData[moduleIdx];
md->channelsCount = val;
}
uint8_t ModuleChannelRange::getChannelsUsed()
{
return sentModuleChannels(moduleIdx);
}
uint8_t ModuleChannelRange::getChannelsMin()
{
return minModuleChannels(moduleIdx);
}
uint8_t ModuleChannelRange::getChannelsMax()
{
return maxModuleChannels(moduleIdx);
}
TrainerChannelRange::TrainerChannelRange(Window* parent) :
ChannelRange(parent)
{
build();
update();
}
uint8_t TrainerChannelRange::getChannelsStart()
{
return g_model.trainerData.channelsStart;
}
void TrainerChannelRange::setChannelsStart(uint8_t val)
{
g_model.trainerData.channelsStart = val;
}
int8_t TrainerChannelRange::getChannelsCount()
{
return g_model.trainerData.channelsCount;
}
void TrainerChannelRange::setChannelsCount(int8_t val)
{
g_model.trainerData.channelsCount = val;
}
uint8_t TrainerChannelRange::getChannelsUsed()
{
return 8 + getChannelsCount();
}
uint8_t TrainerChannelRange::getChannelsMin()
{
return MIN_TRAINER_CHANNELS;
}
uint8_t TrainerChannelRange::getChannelsMax()
{
return MAX_TRAINER_CHANNELS;
}
+90
View File
@@ -0,0 +1,90 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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.
*/
#pragma once
#include "form.h"
#include "numberedit.h"
class ChannelRange : public FormGroup
{
public:
ChannelRange(Window* parent);
void setStart(uint8_t newValue);
void setEnd(uint8_t newValue);
virtual void update();
void updateStart();
void updateEnd();
protected:
NumberEdit* chStart;
NumberEdit* chEnd;
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;
virtual uint8_t getChannelsMin() = 0;
virtual uint8_t getChannelsMax() = 0;
};
class ModuleChannelRange : public ChannelRange
{
uint8_t moduleIdx;
void update() override;
uint8_t getChannelsStart() override;
void setChannelsStart(uint8_t val) override;
int8_t getChannelsCount() override;
void setChannelsCount(int8_t val) override;
uint8_t getChannelsUsed() override;
uint8_t getChannelsMin() override;
uint8_t getChannelsMax() override;
public:
ModuleChannelRange(Window* parent, uint8_t moduleIdx);
};
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;
uint8_t getChannelsMin() override;
uint8_t getChannelsMax() override;
public:
TrainerChannelRange(Window* parent);
};
+2 -96
View File
@@ -30,6 +30,7 @@
#include "bind_menu_d16.h"
#include "custom_failsafe.h"
#include "ppm_settings.h"
#include "channel_range.h"
#if defined(PXX2)
#include "access_settings.h"
@@ -60,101 +61,6 @@ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT,
LV_GRID_TEMPLATE_LAST};
struct ChannelRange : public FormGroup {
uint8_t moduleIdx;
NumberEdit* chStart;
NumberEdit* chEnd;
ChannelRange(Window* parent, uint8_t moduleIdx);
void setStart(uint32_t newValue);
void setEnd(uint32_t newValue);
void update();
void updateStart();
void updateEnd();
};
ChannelRange::ChannelRange(Window* parent, uint8_t moduleIdx) :
FormGroup(parent, rect_t{}), moduleIdx(moduleIdx)
{
setFlexLayout(LV_FLEX_FLOW_ROW);
ModuleData* md = &g_model.moduleData[moduleIdx];
chStart = new NumberEdit(this, rect_t{}, 1, 1, GET_DEFAULT(1 + md->channelsStart));
chStart->setPrefix(STR_CH);
chStart->setSetValueHandler([=](int32_t newValue) { setStart(newValue); });
chEnd = new NumberEdit(this, rect_t{}, 8, 8,
GET_DEFAULT(md->channelsStart + 8 + md->channelsCount));
chEnd->setPrefix(STR_CH);
chEnd->setSetValueHandler([=](int32_t newValue) { setEnd(newValue); });
update();
}
void ChannelRange::setStart(uint32_t newValue)
{
ModuleData* md = &g_model.moduleData[moduleIdx];
md->channelsStart = newValue - 1;
updateEnd();
SET_DIRTY();
}
void ChannelRange::setEnd(uint32_t newValue)
{
ModuleData* md = &g_model.moduleData[moduleIdx];
md->channelsCount = newValue - md->channelsStart - 8;
updateStart();
SET_DIRTY();
}
void ChannelRange::updateEnd()
{
ModuleData* md = &g_model.moduleData[moduleIdx];
auto min_ch = md->channelsStart + minModuleChannels(moduleIdx);
chEnd->setMin(min_ch);
auto max_ch = md->channelsStart + maxModuleChannels(moduleIdx);
max_ch = min<int8_t>(MAX_OUTPUT_CHANNELS, max_ch);
chEnd->setMax(max_ch);
chEnd->setDefault(max_ch);
chEnd->update();
}
void ChannelRange::updateStart()
{
chStart->setMax(MAX_OUTPUT_CHANNELS - sentModuleChannels(moduleIdx) + 1);
}
void ChannelRange::update()
{
// ModuleData* md = &g_model.moduleData[moduleIdx];
updateStart();
updateEnd();
auto min_mod_ch = minModuleChannels(moduleIdx);
auto max_mod_ch = maxModuleChannels(moduleIdx);
chEnd->enable(min_mod_ch < max_mod_ch);
if (chEnd->getValue() > chEnd->getMax())
chEnd->setValue(chEnd->getMax());
if (!isModulePXX2(moduleIdx)) {
chEnd->setAvailableHandler(nullptr);
}
#if defined(PXX2)
else {
chEnd->setAvailableHandler(
[=](int value) { return isPxx2IsrmChannelsCountAllowed(value - 8); });
}
#endif
}
class ModuleWindow : public FormGroup
{
public:
@@ -259,7 +165,7 @@ void ModuleWindow::updateModule()
// Channel Range
auto line = newLine(&grid);
new StaticText(line, rect_t{}, STR_CHANNELRANGE, 0, COLOR_THEME_PRIMARY1);
chRange = new ChannelRange(line, moduleIdx);
chRange = new ModuleChannelRange(line, moduleIdx);
// PPM modules
if (isModulePPM(moduleIdx)) {
+1
View File
@@ -188,6 +188,7 @@ void TrainerModuleWindow::update()
} else
#endif
if (g_model.trainerData.mode == TRAINER_MODE_SLAVE) {
// TODO: use generic ChannelRange
#define PPMCH_START_MIN 1
#define PPMCH_START_MAX \
(MAX_OUTPUT_CHANNELS - g_model.trainerData.channelsCount + 1 - \