From f85ab455ed1e752de83315ecccc5b638ad2581c6 Mon Sep 17 00:00:00 2001 From: eshifri <46511024+eshifri@users.noreply.github.com> Date: Sun, 12 Sep 2021 16:13:50 -0700 Subject: [PATCH] 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 --- radio/src/gui/colorlcd/channel_bar.h | 47 ++++++++++++++++++++--- radio/src/gui/colorlcd/draw_functions.cpp | 9 +++-- radio/src/gui/colorlcd/draw_functions.h | 2 +- radio/src/gui/colorlcd/gvar_numberedit.h | 15 ++++++-- radio/src/gui/colorlcd/model_outputs.cpp | 38 ++++++++++-------- radio/src/myeeprom.h | 33 ++++++++++++++-- 6 files changed, 110 insertions(+), 34 deletions(-) diff --git a/radio/src/gui/colorlcd/channel_bar.h b/radio/src/gui/colorlcd/channel_bar.h index 4aa0952f0..fbf2308cc 100644 --- a/radio/src/gui/colorlcd/channel_bar.h +++ b/radio/src/gui/colorlcd/channel_bar.h @@ -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; diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index fb5485071..78ff16149 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -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); } } diff --git a/radio/src/gui/colorlcd/draw_functions.h b/radio/src/gui/colorlcd/draw_functions.h index 3262bdcf8..956c55ba6 100644 --- a/radio/src/gui/colorlcd/draw_functions.h +++ b/radio/src/gui/colorlcd/draw_functions.h @@ -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); diff --git a/radio/src/gui/colorlcd/gvar_numberedit.h b/radio/src/gui/colorlcd/gvar_numberedit.h index 9051b3607..60cbae26d 100644 --- a/radio/src/gui/colorlcd/gvar_numberedit.h +++ b/radio/src/gui/colorlcd/gvar_numberedit.h @@ -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 getValue, std::function setValue) : + GVarNumberEdit(FormGroup * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function getValue, std::function 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 getValue; std::function 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; } diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index 06c35be76..f5f365ab8 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -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", diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index ac9f9d460..43f9dbbed 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -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))