Merge pull request #726 from EdgeTX/fix-722

Call GV_IS_GV_VALUE() without offset applied
This commit is contained in:
Peter Feerick
2021-09-15 11:36:09 +10:00
committed by GitHub
8 changed files with 147 additions and 122 deletions
+1 -2
View File
@@ -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:
-1
View File
@@ -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)
+6 -6
View File
@@ -152,13 +152,13 @@ class OutputChannelBar : public ChannelBar
int32_t ldMax;
int32_t ldMin;
if (GV_IS_GV_VALUE(ld->min - LIMIT_STD_MAX, -limit, 0)) {
if (GV_IS_GV_VALUE(ld->min, -limit, 0)) {
ldMin = limMin;
} else {
ldMin = ld->min;
}
if (GV_IS_GV_VALUE(ld->max + LIMIT_STD_MAX, 0, limit)) {
if (GV_IS_GV_VALUE(ld->max, 0, limit)) {
ldMax = limMax;
} else {
ldMax = ld->max;
@@ -200,16 +200,16 @@ class OutputChannelBar : public ChannelBar
int limit = CHANNELS_LIMIT;
LimitData* lim = limitAddress(channel);
if (GV_IS_GV_VALUE(lim->min - LIMIT_STD_MAX, -limit, 0)) {
if (GV_IS_GV_VALUE(lim->min, -limit, 0)) {
int ldMin =
GET_GVAR_PREC1(lim->min - LIMIT_STD_MAX, -limit, 0, mixerCurrentFlightMode)
GET_GVAR_PREC1(lim->min, -limit, 0, mixerCurrentFlightMode)
+ LIMIT_STD_MAX;
if (limMin != ldMin) invalidate();
limMin = ldMin;
}
if (GV_IS_GV_VALUE(lim->max + LIMIT_STD_MAX, 0, limit)) {
if (GV_IS_GV_VALUE(lim->max, 0, limit)) {
int ldMax =
GET_GVAR_PREC1(lim->max + LIMIT_STD_MAX, 0, limit, mixerCurrentFlightMode)
GET_GVAR_PREC1(lim->max, 0, limit, mixerCurrentFlightMode)
- LIMIT_STD_MAX;
if (limMax != ldMax) invalidate();
limMax = ldMax;
+3 -3
View File
@@ -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;
}
}
}
+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, 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);
+87 -71
View File
@@ -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<int32_t()> getValue, std::function<void(int32_t)> setValue, WindowFlags windowFlags = 0, LcdFlags textFlags = 0) :
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,
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<int32_t()> getValue;
std::function<void(int32_t)> setValue;
WindowFlags windowFlags;
LcdFlags textFlags;
std::string suffix;
protected:
FormField* field = nullptr;
int32_t vmin;
int32_t vmax;
int32_t voffset;
std::function<int32_t()> getValue;
std::function<void(int32_t)> 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
+47 -25
View File
@@ -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",
+2 -13
View File
@@ -117,18 +117,6 @@ enum CurveRefType {
#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10)
#define LIMIT_STD_MAX (LIMIT_STD_PERCENT*10)
#define PPM_CENTER_MAX 500
#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, \
@@ -139,7 +127,6 @@ enum CurveRefType {
? 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, \
@@ -149,6 +136,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)