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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,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
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user