Outputs - enable using GV for Subtrim, Min, Max values (#687)

* Model Outputs - GV for Subtrim, Min, Max values #683

* fix scaling

* fix limits

* invalidate limits

* formatting

* defines added
This commit is contained in:
eshifri
2021-09-13 09:13:50 +10:00
committed by GitHub
parent 5dd4a89eb4
commit f85ab455ed
6 changed files with 110 additions and 34 deletions
+42 -5
View File
@@ -22,6 +22,7 @@
#include "opentx.h"
#include "libopenui.h"
#include "static.h"
constexpr coord_t ROW_HEIGHT = 42;
constexpr coord_t BAR_HEIGHT = 13;
@@ -29,7 +30,8 @@ constexpr coord_t COLUMN_SIZE = 200;
constexpr coord_t X_OFFSET = 25;
constexpr coord_t LEG_COLORBOX = 15;
#define VIEW_CHANNELS_LIMIT_PCT (g_model.extendedLimits ? LIMIT_EXT_PERCENT : 100)
#define VIEW_CHANNELS_LIMIT_PCT (g_model.extendedLimits ? LIMIT_EXT_PERCENT : LIMIT_STD_PERCENT)
#define CHANNELS_LIMIT (g_model.extendedLimits ? LIMIT_EXT_MAX : LIMIT_STD_MAX)
class ChannelBar : public Window
{
@@ -145,13 +147,29 @@ class OutputChannelBar : public ChannelBar
dc->drawSolidVerticalLine(width() / 2, 0, height(), COLOR_THEME_SECONDARY1);
// Draw output limits bars
int limit = CHANNELS_LIMIT;
LimitData* ld = limitAddress(channel);
int32_t ldMax;
int32_t ldMin;
if (GV_IS_GV_VALUE(ld->min - LIMIT_STD_MAX, -limit, 0)) {
ldMin = limMin;
} else {
ldMin = ld->min;
}
if (GV_IS_GV_VALUE(ld->max + LIMIT_STD_MAX, 0, limit)) {
ldMax = limMax;
} else {
ldMax = ld->max;
}
if (ld && ld->revert) {
drawOutputBarLimits(dc, posOnBar(-100 - ld->max / 10),
posOnBar(100 - ld->min / 10));
drawOutputBarLimits(dc, posOnBar(-100 - ldMax / 10),
posOnBar(100 - ldMin / 10));
} else if (ld) {
drawOutputBarLimits(dc, posOnBar(-100 + ld->min / 10),
posOnBar(100 + ld->max / 10));
drawOutputBarLimits(dc, posOnBar(-100 + ldMin / 10),
posOnBar(100 + ldMax / 10));
}
}
@@ -179,10 +197,29 @@ class OutputChannelBar : public ChannelBar
value = newValue;
invalidate();
}
int limit = CHANNELS_LIMIT;
LimitData* lim = limitAddress(channel);
if (GV_IS_GV_VALUE(lim->min - LIMIT_STD_MAX, -limit, 0)) {
int ldMin =
GET_GVAR_PREC1(lim->min - LIMIT_STD_MAX, -limit, 0, mixerCurrentFlightMode)
+ LIMIT_STD_MAX;
if (limMin != ldMin) invalidate();
limMin = ldMin;
}
if (GV_IS_GV_VALUE(lim->max + LIMIT_STD_MAX, 0, limit)) {
int ldMax =
GET_GVAR_PREC1(lim->max + LIMIT_STD_MAX, 0, limit, mixerCurrentFlightMode)
- LIMIT_STD_MAX;
if (limMax != ldMax) invalidate();
limMax = ldMax;
}
}
protected:
int value = 0;
int limMax = 0;
int limMin = 0;
};
constexpr coord_t lmargin = 25;
+5 -4
View File
@@ -63,14 +63,15 @@ void drawGVarValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t gvar, gvar_t
drawValueWithUnit(dc, x, y, value, g_model.gvars[gvar].unit ? UNIT_PERCENT : UNIT_RAW, flags);
}
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, gvar_t vmin, gvar_t vmax, LcdFlags flags)
void drawValueOrGVar(BitmapBuffer* dc, coord_t x, coord_t y, gvar_t value,
gvar_t vmin, gvar_t vmax, LcdFlags flags,
const char* suffix)
{
if (GV_IS_GV_VALUE(value, vmin, vmax)) {
int index = GV_INDEX_CALC_DELTA(value, GV_GET_GV1_VALUE(vmin, vmax));
dc->drawText(x, y, getGVarString(index), flags);
}
else {
dc->drawNumber(x, y, value, flags, 0, nullptr, "%");
} else {
dc->drawNumber(x, y, value, flags, 0, nullptr, suffix);
}
}
+1 -1
View File
@@ -62,7 +62,7 @@ void drawVerticalTrimPosition(BitmapBuffer * dc, coord_t x, coord_t y, int16_t d
void drawVerticalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options);
void drawHorizontalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options);
void drawSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options);
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, gvar_t vmin, gvar_t vmax, LcdFlags flags = 0);
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, gvar_t vmin, gvar_t vmax, LcdFlags flags = 0, const char* suffix = "%");
void drawGVarValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags = 0);
void drawTimer(BitmapBuffer * dc, coord_t x, coord_t y, int32_t tme, LcdFlags flags = 0);
void drawSourceValue(BitmapBuffer * dc, coord_t x, coord_t y, source_t source, LcdFlags flags = 0);
+11 -4
View File
@@ -33,12 +33,14 @@ typedef NumberEdit GVarNumberEdit;
class GVarNumberEdit: public FormGroup
{
public:
GVarNumberEdit(FormGroup * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function<int32_t()> getValue, std::function<void(int32_t)> setValue) :
GVarNumberEdit(FormGroup * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function<int32_t()> getValue, std::function<void(int32_t)> setValue, WindowFlags windowFlags = 0, LcdFlags textFlags = 0) :
FormGroup(parent, rect, FORWARD_SCROLL | FORM_FORWARD_FOCUS),
vmin(vmin),
vmax(vmax),
getValue(getValue),
setValue(setValue)
setValue(setValue),
windowFlags(windowFlags),
textFlags(textFlags)
{
update();
}
@@ -46,7 +48,10 @@ class GVarNumberEdit: public FormGroup
void switchGVarMode()
{
int32_t value = getValue();
setValue(GV_IS_GV_VALUE(value, vmin, vmax) ? GET_GVAR(value, vmin, vmax, mixerCurrentFlightMode) : GV_GET_GV1_VALUE(vmin, vmax));
setValue(GV_IS_GV_VALUE(value, vmin, vmax) ?
( (textFlags & PREC1) ? GET_GVAR_PREC1(value, vmin, vmax, mixerCurrentFlightMode) : GET_GVAR(value, vmin, vmax, mixerCurrentFlightMode) ) :
GV_GET_GV1_VALUE(vmin, vmax) );
update();
}
@@ -76,6 +81,8 @@ class GVarNumberEdit: public FormGroup
int32_t vmax;
std::function<int32_t()> getValue;
std::function<void(int32_t)> setValue;
WindowFlags windowFlags;
LcdFlags textFlags;
std::string suffix;
void update()
@@ -103,7 +110,7 @@ class GVarNumberEdit: public FormGroup
field = result;
}
else {
auto result = new NumberEdit(this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, vmin, vmax, getValue, setValue);
auto result = new NumberEdit(this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, vmin, vmax, getValue, setValue, windowFlags, textFlags);
result->setSuffix(suffix);
field = result;
}
+21 -17
View File
@@ -21,7 +21,7 @@
#include "model_outputs.h"
#include "opentx.h"
#include "libopenui.h"
#include "gvar_numberedit.h"
#define SET_DIRTY() storageDirty(EE_MODEL)
class OutputEditWindow : public Page {
@@ -54,7 +54,7 @@ class OutputEditWindow : public Page {
FormGridLayout grid;
grid.spacer(8);
int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : 1000);
int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : LIMIT_STD_MAX);
LimitData * output = limitAddress(channel);
@@ -65,23 +65,24 @@ class OutputEditWindow : public Page {
// Offset
new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_SUBTRIM, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(window, grid.getFieldSlot(), -1000, +1000, GET_SET_DEFAULT(output->offset), 0, PREC1);
new GVarNumberEdit(window, grid.getFieldSlot(), -LIMIT_STD_MAX, +LIMIT_STD_MAX,
GET_SET_DEFAULT(output->offset), 0, PREC1);
grid.nextLine();
// Min
new StaticText(window, grid.getLabelSlot(), TR_MIN, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(window, grid.getFieldSlot(), -limit, 0,
GET_VALUE(output->min - 1000),
SET_VALUE(output->min, newValue + 1000),
0, PREC1);
new StaticText(window, grid.getLabelSlot(), TR_MIN, 0,
COLOR_THEME_PRIMARY1);
new GVarNumberEdit(window, grid.getFieldSlot(), -limit, 0,
GET_VALUE(output->min - LIMIT_STD_MAX),
SET_VALUE(output->min, newValue + LIMIT_STD_MAX), 0, PREC1);
grid.nextLine();
// Max
new StaticText(window, grid.getLabelSlot(), TR_MAX, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(window, grid.getFieldSlot(), 0, +limit,
GET_VALUE(output->max + 1000),
SET_VALUE(output->max, newValue - 1000),
0, PREC1);
new StaticText(window, grid.getLabelSlot(), TR_MAX, 0,
COLOR_THEME_PRIMARY1);
new GVarNumberEdit(window, grid.getFieldSlot(), 0, +limit,
GET_VALUE(output->max + LIMIT_STD_MAX),
SET_VALUE(output->max, newValue - LIMIT_STD_MAX), 0, PREC1);
grid.nextLine();
// Direction
@@ -128,14 +129,17 @@ class OutputLineButton : public Button {
{
LcdFlags textColor = COLOR_THEME_SECONDARY1;
LcdFlags bgColor = COLOR_THEME_PRIMARY2;
int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : 1000);
dc->drawSolidFilledRect(0, 0, width(), height(), bgColor);
// first line
dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, output->min - 1000,
PREC1 | textColor);
dc->drawNumber(68, FIELD_PADDING_TOP, output->max + 1000, PREC1 | textColor);
dc->drawNumber(132, FIELD_PADDING_TOP, output->offset, PREC1 | textColor);
drawValueOrGVar(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, output->min - 1000,
-limit, 0, PREC1 | textColor, nullptr);
drawValueOrGVar(dc, 68, FIELD_PADDING_TOP, output->max + 1000,
0, limit, PREC1 | textColor, nullptr);
drawValueOrGVar(dc, 132, FIELD_PADDING_TOP, output->offset,
-limit, +limit, PREC1 | textColor, nullptr);
dc->drawNumber(226, FIELD_PADDING_TOP, PPM_CENTER + output->ppmCenter,
RIGHT | textColor);
dc->drawText(228, FIELD_PADDING_TOP, output->symetrical ? "=" : "\210",
+30 -3
View File
@@ -113,11 +113,38 @@ enum CurveRefType {
#define limit_min_max_t int16_t
#define LIMIT_EXT_PERCENT 150
#define LIMIT_STD_PERCENT 100
#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10)
#define LIMIT_STD_MAX (LIMIT_STD_PERCENT*10)
#define PPM_CENTER_MAX 500
#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000)
#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000)
#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset)
#if (defined(COLORLCD))
#define LIMIT_MAX(lim) \
(GV_IS_GV_VALUE(lim->max + LIMIT_STD_MAX, 0, +GV_RANGELARGE) \
? GET_GVAR_PREC1(lim->max + LIMIT_STD_MAX, 0, +LIMIT_EXT_MAX, \
mixerCurrentFlightMode) \
: lim->max + LIMIT_STD_MAX)
#define LIMIT_MIN(lim) \
(GV_IS_GV_VALUE(lim->min - LIMIT_STD_MAX, -GV_RANGELARGE, 0) \
? GET_GVAR_PREC1(lim->min - LIMIT_STD_MAX, -LIMIT_EXT_MAX, 0, \
mixerCurrentFlightMode) \
: lim->min - LIMIT_STD_MAX)
#else
#define LIMIT_MAX(lim) \
(GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) \
? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, +LIMIT_EXT_MAX, \
mixerCurrentFlightMode) \
: lim->max + LIMIT_STD_MAX)
#define LIMIT_MIN(lim) \
(GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) \
? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, +LIMIT_EXT_MAX, \
mixerCurrentFlightMode) \
: lim->min - LIMIT_STD_MAX)
#endif
#define LIMIT_OFS(lim) \
(GV_IS_GV_VALUE(lim->offset, -LIMIT_STD_MAX, LIMIT_STD_MAX) \
? GET_GVAR_PREC1(lim->offset, -LIMIT_STD_MAX, +LIMIT_STD_MAX, \
mixerCurrentFlightMode) \
: lim->offset)
#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim))
#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim))
#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim))