diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index 89f5a08cb..eecfbfd4c 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -66,7 +66,6 @@ enum MenuModelOutputsItems { #endif #define LIMITS_CURVE_POS 17*FW+1 -#define LIMITS_MIN_MAX_OFFSET 1000 #define CONVERT_US_MIN_MAX(x) ((int16_t(x)*128)/25) #define MIN_MAX_ATTR attr @@ -116,7 +115,7 @@ void menuModelLimitsOne(event_t event) uint8_t i = k + menuVerticalOffset; uint8_t attr = (sub==i ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); uint8_t active = (attr && s_editMode > 0) ; - int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : 1000); + int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : LIMIT_STD_MAX); switch (i) { case ITEM_OUTPUTONE_CH_NAME: diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index 1b21b60d2..890125f58 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -53,7 +53,6 @@ enum LimitsItems { #define LIMITS_CURVE_POS 32*FW-3 #endif -#define LIMITS_MIN_MAX_OFFSET 1000 #define CONVERT_US_MIN_MAX(x) (((x)*1280)/250) #if defined(PPM_UNIT_US) diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index 78ff16149..036214b24 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -65,13 +65,13 @@ void drawGVarValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t gvar, gvar_t void drawValueOrGVar(BitmapBuffer* dc, coord_t x, coord_t y, gvar_t value, gvar_t vmin, gvar_t vmax, LcdFlags flags, - const char* suffix) + const char* suffix, gvar_t offset) { 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, suffix); + dc->drawNumber(x, y, value + offset, flags, 0, nullptr, suffix); } } @@ -551,4 +551,4 @@ void drawTextLines(BitmapBuffer * dc, coord_t left, coord_t top, coord_t width, } str = nxt; } -} \ No newline at end of file +} diff --git a/radio/src/gui/colorlcd/draw_functions.h b/radio/src/gui/colorlcd/draw_functions.h index 956c55ba6..e6b8d8996 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, const char* suffix = "%"); +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 = "%", gvar_t offset = 0); 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 60cbae26d..5e97f6f90 100644 --- a/radio/src/gui/colorlcd/gvar_numberedit.h +++ b/radio/src/gui/colorlcd/gvar_numberedit.h @@ -30,97 +30,113 @@ constexpr coord_t GVAR_BUTTON_WIDTH = 30; #if !defined(GVARS) typedef NumberEdit GVarNumberEdit; #else -class GVarNumberEdit: public FormGroup +class GVarNumberEdit : public FormGroup { - public: - 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) : + public: + 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, + int32_t voffset = 0) : FormGroup(parent, rect, FORWARD_SCROLL | FORM_FORWARD_FOCUS), vmin(vmin), vmax(vmax), + voffset(voffset), getValue(getValue), setValue(setValue), - windowFlags(windowFlags), + windowFlags(windowFlags), textFlags(textFlags) - { - update(); - } + { + update(); + } - void switchGVarMode() - { - int32_t value = getValue(); - 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) ); + void switchGVarMode() + { + int32_t value = getValue(); + 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(); - } + update(); + } - void setSuffix(std::string value) - { - suffix = std::move(value); - update(); - } + void setSuffix(std::string value) + { + suffix = std::move(value); + update(); + } #if defined(HARDWARE_KEYS) - void onEvent(event_t event) override - { - if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - switchGVarMode(); - field->setFocus(SET_FOCUS_DEFAULT); - } - else { - FormGroup::onEvent(event); - } + void onEvent(event_t event) override + { + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + switchGVarMode(); + field->setFocus(SET_FOCUS_DEFAULT); + } else { + FormGroup::onEvent(event); } + } #endif - protected: - FormField * field = nullptr; - int32_t vmin; - int32_t vmax; - std::function getValue; - std::function setValue; - WindowFlags windowFlags; - LcdFlags textFlags; - std::string suffix; + protected: + FormField* field = nullptr; + int32_t vmin; + int32_t vmax; + int32_t voffset; + std::function getValue; + std::function setValue; + WindowFlags windowFlags; + LcdFlags textFlags; + std::string suffix; - void update() - { - clear(); + void update() + { + clear(); - // The main field - int32_t value = getValue(); - if (GV_IS_GV_VALUE(value, vmin, vmax)) { - auto result = new Choice(this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, -MAX_GVARS, MAX_GVARS - 1, - [=]() { - uint16_t gvar1 = GV_GET_GV1_VALUE(vmin, vmax); - return GV_INDEX_CALC_DELTA(getValue(), gvar1); - }, - [=](int idx) { - uint16_t gvar1 = GV_GET_GV1_VALUE(vmin, vmax); - if (idx < 0) - setValue(GV_CALC_VALUE_IDX_NEG(idx, gvar1)); - else - setValue(GV_CALC_VALUE_IDX_POS(idx, gvar1)); - }); - result->setTextHandler([=](int32_t value) { - return getGVarString(value); - }); - field = result; - } - else { - auto result = new NumberEdit(this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, vmin, vmax, getValue, setValue, windowFlags, textFlags); - result->setSuffix(suffix); - field = result; - } + // The main field + int32_t value = getValue(); + if (GV_IS_GV_VALUE(value, vmin, vmax)) { + auto result = new Choice( + this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, -MAX_GVARS, + MAX_GVARS - 1, + [=]() { + uint16_t gvar1 = GV_GET_GV1_VALUE(vmin, vmax); + return GV_INDEX_CALC_DELTA(getValue(), gvar1); + }, + [=](int idx) { + uint16_t gvar1 = GV_GET_GV1_VALUE(vmin, vmax); + if (idx < 0) + setValue(GV_CALC_VALUE_IDX_NEG(idx, gvar1)); + else + setValue(GV_CALC_VALUE_IDX_POS(idx, gvar1)); + }); + result->setTextHandler( + [=](int32_t value) { return getGVarString(value); }); + field = result; + } else { + auto result = new NumberEdit( + this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, vmin, vmax, + [=]() { return getValue() + voffset; }, + [=](int32_t newValue) { return setValue(newValue - voffset); }, + windowFlags, textFlags); + result->setSuffix(suffix); + field = result; + } - // The GVAR button - new TextButton(this, {width() - GVAR_BUTTON_WIDTH, 0, GVAR_BUTTON_WIDTH, height()}, STR_GV, [=]() { + // The GVAR button + new TextButton( + this, {width() - GVAR_BUTTON_WIDTH, 0, GVAR_BUTTON_WIDTH, height()}, + STR_GV, + [=]() { switchGVarMode(); return 0; - }, BUTTON_BACKGROUND | OPAQUE | FORM_DETACHED); - } + }, + BUTTON_BACKGROUND | OPAQUE | FORM_DETACHED); + } }; #endif diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index f5f365ab8..310df22f6 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -59,30 +59,34 @@ class OutputEditWindow : public Page { LimitData * output = limitAddress(channel); // Name - new StaticText(window, grid.getLabelSlot(), STR_NAME, 0, COLOR_THEME_PRIMARY1); - new ModelTextEdit(window, grid.getFieldSlot(), output->name, sizeof(output->name)); + new StaticText(window, grid.getLabelSlot(), STR_NAME, 0, + COLOR_THEME_PRIMARY1); + new ModelTextEdit(window, grid.getFieldSlot(), output->name, + sizeof(output->name)); grid.nextLine(); // Offset - new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_SUBTRIM, 0, COLOR_THEME_PRIMARY1); - new GVarNumberEdit(window, grid.getFieldSlot(), -LIMIT_STD_MAX, +LIMIT_STD_MAX, - GET_SET_DEFAULT(output->offset), 0, PREC1); + new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_SUBTRIM, 0, + COLOR_THEME_PRIMARY1); + 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 GVarNumberEdit(window, grid.getFieldSlot(), -limit, 0, - GET_VALUE(output->min - LIMIT_STD_MAX), - SET_VALUE(output->min, newValue + LIMIT_STD_MAX), 0, PREC1); + GET_SET_DEFAULT(output->min), 0, PREC1, + -LIMIT_STD_MAX); grid.nextLine(); // Max 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); + GET_SET_DEFAULT(output->max), 0, PREC1, + +LIMIT_STD_MAX); grid.nextLine(); // Direction @@ -91,23 +95,30 @@ class OutputEditWindow : public Page { grid.nextLine(); // Curve - new StaticText(window, grid.getLabelSlot(), TR_CURVE, 0, COLOR_THEME_PRIMARY1); - auto edit = new NumberEdit(window, grid.getFieldSlot(), -MAX_CURVES, +MAX_CURVES, GET_SET_DEFAULT(output->curve)); - edit->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawText(2, 2, getCurveString(value)); - }); + new StaticText(window, grid.getLabelSlot(), TR_CURVE, 0, + COLOR_THEME_PRIMARY1); + auto edit = new NumberEdit(window, grid.getFieldSlot(), -MAX_CURVES, + +MAX_CURVES, GET_SET_DEFAULT(output->curve)); + edit->setDisplayHandler( + [](BitmapBuffer *dc, LcdFlags flags, int32_t value) { + dc->drawText(2, 2, getCurveString(value)); + }); grid.nextLine(); // PPM center - new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_PPMCENTER, 0, COLOR_THEME_PRIMARY1); - new NumberEdit(window, grid.getFieldSlot(), PPM_CENTER - PPM_CENTER_MAX, PPM_CENTER + PPM_CENTER_MAX, + new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_PPMCENTER, + 0, COLOR_THEME_PRIMARY1); + new NumberEdit(window, grid.getFieldSlot(), PPM_CENTER - PPM_CENTER_MAX, + PPM_CENTER + PPM_CENTER_MAX, GET_VALUE(output->ppmCenter + PPM_CENTER), SET_VALUE(output->ppmCenter, newValue - PPM_CENTER)); grid.nextLine(); // Subtrims mode - new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_SUBTRIMMODE, 0, COLOR_THEME_PRIMARY1); - new Choice(window, grid.getFieldSlot(), STR_SUBTRIMMODES, 0, 1, GET_SET_DEFAULT(output->symetrical)); + new StaticText(window, grid.getLabelSlot(), TR_LIMITS_HEADERS_SUBTRIMMODE, + 0, COLOR_THEME_PRIMARY1); + new Choice(window, grid.getFieldSlot(), STR_SUBTRIMMODES, 0, 1, + GET_SET_DEFAULT(output->symetrical)); grid.nextLine(); window->setInnerHeight(grid.getWindowHeight()); @@ -129,17 +140,28 @@ 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 - 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); + + // Min + drawValueOrGVar(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, + output->min, -GV_RANGELARGE, + 0, PREC1 | textColor, nullptr, + -LIMITS_MIN_MAX_OFFSET); + + // Max + drawValueOrGVar(dc, 68, FIELD_PADDING_TOP, + output->max, 0, + GV_RANGELARGE, PREC1 | textColor, nullptr, + +LIMITS_MIN_MAX_OFFSET); + + // Offset + drawValueOrGVar(dc, 132, FIELD_PADDING_TOP, output->offset, -LIMIT_STD_MAX, + +LIMIT_STD_MAX, PREC1 | textColor, nullptr); + + // PPM center 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 43f9dbbed..9fea846e5 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -149,6 +149,8 @@ enum CurveRefType { #define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) +#define LIMITS_MIN_MAX_OFFSET LIMIT_STD_MAX + #define TRIM_OFF (1) #define TRIM_ON (0) #define TRIM_RUD (-1)