diff --git a/radio/src/gui/colorlcd/model_gvars.cpp b/radio/src/gui/colorlcd/model_gvars.cpp index 482f1aa02..b381201a6 100644 --- a/radio/src/gui/colorlcd/model_gvars.cpp +++ b/radio/src/gui/colorlcd/model_gvars.cpp @@ -225,6 +225,9 @@ void GVarEditWindow::setProperties(int onlyForFlightMode) } FlightModeData * fmData; for (int fm = 0; fm < MAX_FLIGHT_MODES; fm++) { + if (values[fm] == nullptr) // KLK: the order of calls has changed and this might not be initialized yet. + continue; + if (onlyForFlightMode >= 0 && fm != onlyForFlightMode) continue; fmData = &g_model.flightModeData[fm]; @@ -238,13 +241,13 @@ void GVarEditWindow::setProperties(int onlyForFlightMode) else { values[fm]->setMin(GVAR_MAX + 1); values[fm]->setMax(GVAR_MAX + MAX_FLIGHT_MODES - 1); - values[fm]->setDisplayHandler([=](BitmapBuffer * dc, LcdFlags flags, int32_t value) { + values[fm]->setDisplayHandler([=](int32_t value) { uint8_t targetFlightMode = value - GVAR_MAX - 1; if (targetFlightMode >= fm) targetFlightMode++; char label[16]; getFlightModeString(label, targetFlightMode + 1); - dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, label, strlen(label), flags); + return std::string(label); }); } diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index d951de66b..2e74253c9 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -121,16 +121,25 @@ class LogicalSwitchEditPage: public Page edit2->setMax(222 - cs->v2); edit2->invalidate(); }); - edit1->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(value), flags | PREC1); + edit1->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, lswTimerValue(value), PREC1); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(value), flags | PREC1); }); - edit2->setDisplayHandler([cs](BitmapBuffer * dc, LcdFlags flags, int32_t value) { + edit2->setDisplayHandler([cs](int32_t value) { if (value < 0) - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, "<<", flags); + return std::string("<<"); + //dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, "<<", flags); else if (value == 0) - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, "--", flags); - else - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(cs->v2 + value), flags | PREC1); + return std::string("--"); + // dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, "--", flags); + else { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, lswTimerValue(value), PREC1); + return std::string(s); + } + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(cs->v2 + value), flags | PREC1); }); grid.nextLine(); } @@ -146,15 +155,19 @@ class LogicalSwitchEditPage: public Page else if (cstate == LS_FAMILY_TIMER) { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1, 0, COLOR_THEME_PRIMARY1); auto timer = new NumberEdit(logicalSwitchOneWindow, grid.getFieldSlot(), -128, 122, GET_SET_DEFAULT(cs->v1)); - timer->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(value), flags | PREC1); + timer->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, lswTimerValue(value), PREC1); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(value), flags | PREC1); }); grid.nextLine(); new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V2, 0, COLOR_THEME_PRIMARY1); timer = new NumberEdit(logicalSwitchOneWindow, grid.getFieldSlot(), -128, 122, GET_SET_DEFAULT(cs->v2)); - timer->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(value), flags | PREC1); + timer->setDisplayHandler([](int32_t value) { + return std::to_string(lswTimerValue(value)); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, lswTimerValue(value), flags | PREC1); }); grid.nextLine(); } @@ -179,8 +192,10 @@ class LogicalSwitchEditPage: public Page int16_t v2_min = 0, v2_max = 0; getMixSrcRange(cs->v1, v2_min, v2_max); v2Edit = new NumberEdit(logicalSwitchOneWindow, grid.getFieldSlot(), v2_min, v2_max, GET_SET_DEFAULT(cs->v2)); - v2Edit->setDisplayHandler([=](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawSourceCustomValue(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, cs->v1, (cs->v1 <= MIXSRC_LAST_CH ? calc100toRESX(value) : value), flags); + v2Edit->setDisplayHandler( + [=](int value) { + // drawSourceCustomValue(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, cs->v1, (cs->v1 <= MIXSRC_LAST_CH ? calc100toRESX(value) : value), flags); + return "ddd"; // ToDo This is not good }); grid.nextLine(); } diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index c7e85d21d..e38495bc0 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -170,8 +170,8 @@ class OutputEditWindow : public Page 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)); + [](int32_t value) { + return getCurveString(value); }); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index c67cdf30e..e772125d3 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -19,6 +19,8 @@ * GNU General Public License for more details. */ +#include +#include #include "model_telemetry.h" #include "opentx.h" #include "libopenui.h" @@ -225,8 +227,11 @@ class SensorEditWindow : public Page { else { new StaticText(sensorParametersWindow, grid.getLabelSlot(), STR_ID, 0, COLOR_THEME_PRIMARY1); auto hex = new NumberEdit(sensorParametersWindow, grid.getFieldSlot(2, 0), 0, 0xFFFF, GET_SET_DEFAULT(sensor->id)); - hex->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawHexNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags); + hex->setDisplayHandler([](int32_t value) { + std::stringstream stream; + stream << std::hex << value; + return stream.str(); + // drawHexNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags); }); new NumberEdit(sensorParametersWindow, grid.getFieldSlot(2, 1), 0, 0xff, GET_SET_DEFAULT(sensor->instance)); grid.nextLine(); @@ -462,16 +467,18 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex) new StaticText(window, grid.getLabelSlot(true), STR_LOWALARM, 0, COLOR_THEME_PRIMARY1); auto edit = new NumberEdit(window, grid.getFieldSlot(), -30, 30, GET_SET_DEFAULT(g_model.rssiAlarms.warning)); - edit->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getWarningRssi(), flags); + edit->setDisplayHandler([](int32_t value) { + return std::to_string(g_model.rssiAlarms.getWarningRssi()); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getWarningRssi(), flags); }); // window->setFirstField(edit); grid.nextLine(); new StaticText(window, grid.getLabelSlot(true), STR_CRITICALALARM, 0, COLOR_THEME_PRIMARY1); edit = new NumberEdit(window, grid.getFieldSlot(), -30, 30, GET_SET_DEFAULT(g_model.rssiAlarms.critical)); - edit->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getCriticalRssi(), flags); + edit->setDisplayHandler([](int32_t value) { + return std::to_string(g_model.rssiAlarms.getCriticalRssi()); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getCriticalRssi(), flags); }); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index a461d4440..83c4d04bd 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -448,8 +448,11 @@ void RadioHardwarePage::build(FormWindow * window) // Bat calibration new StaticText(window, grid.getLabelSlot(), STR_BATT_CALIB, 0, COLOR_THEME_PRIMARY1); auto batCal = new NumberEdit(window, grid.getFieldSlot(1,0), -127, 127, GET_SET_DEFAULT(g_eeGeneral.txVoltageCalibration)); - batCal->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, getBatteryVoltage(), flags | PREC2, 0, nullptr, "V"); + batCal->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, getBatteryVoltage(), PREC2, 0, nullptr, "V"); + return std::string(s); + //dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, getBatteryVoltage(), flags | PREC2, 0, nullptr, "V"); }); batCal->setWindowFlags(REFRESH_ALWAYS); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index dff0f5e8e..a0afe2e2b 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -78,8 +78,11 @@ class DateTimeWindow : public FormGroup { t.tm_mon = newValue - 1; SET_LOAD_DATETIME(&t); }); - month->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + month->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, value, LEADING0); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); /* TODO dynamic max instead of 31 ... @@ -100,8 +103,11 @@ class DateTimeWindow : public FormGroup { t.tm_mday = newValue; SET_LOAD_DATETIME(&t); }); - day->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + day->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, value, LEADING0, 2); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); grid.nextLine(); @@ -119,8 +125,11 @@ class DateTimeWindow : public FormGroup { t.tm_hour = newValue; SET_LOAD_DATETIME(&t); }); - hour->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + hour->setDisplayHandler([](int32_t value) { + static char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, value, LEADING0, 2); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); auto minutes = new NumberEdit(this, grid.getFieldSlot(3, 1), 0, 59, @@ -135,8 +144,11 @@ class DateTimeWindow : public FormGroup { t.tm_min = newValue; SET_LOAD_DATETIME(&t); }); - minutes->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + minutes->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, value, LEADING0, 2); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); auto seconds = new NumberEdit(this, grid.getFieldSlot(3, 2), 0, 59, @@ -151,8 +163,8 @@ class DateTimeWindow : public FormGroup { t.tm_sec = newValue; SET_LOAD_DATETIME(&t); }); - seconds->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + seconds->setDisplayHandler([](int value) { + return std::to_string(value); }); } }; diff --git a/radio/src/gui/colorlcd/radio_trainer.cpp b/radio/src/gui/colorlcd/radio_trainer.cpp index bbbc53483..465f734bf 100644 --- a/radio/src/gui/colorlcd/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio_trainer.cpp @@ -82,8 +82,11 @@ void RadioTrainerPage::build(FormWindow * window) // Trainer multiplier new StaticText(window, grid.getLabelSlot(), STR_MULTIPLIER, 0, COLOR_THEME_PRIMARY1); auto multiplier = new NumberEdit(window, grid.getFieldSlot(3, 0), -10, 40, GET_SET_DEFAULT(g_eeGeneral.PPM_Multiplier)); - multiplier->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value+10, flags | PREC1, 0); + multiplier->setDisplayHandler([](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, value+10, PREC1); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value+10, flags | PREC1, 0); }); grid.nextLine(); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index ab6377caa..ee303f135 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -235,9 +235,12 @@ class SpecialFunctionEditPage : public Page new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), 0, 255, GET_SET_DEFAULT(CFN_PARAM(cfn))); edit->setDisplayHandler( - [=](BitmapBuffer *dc, LcdFlags flags, int32_t value) { - dc->drawNumber(2, 2, CFN_PARAM(cfn), PREC1, - sizeof(CFN_PARAM(cfn)), nullptr, "s"); + [=](int32_t value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, CFN_PARAM(cfn), PREC1, sizeof(CFN_PARAM(cfn)), nullptr, "s"); + return (std::string(s)); + // dc->drawNumber(2, 2, CFN_PARAM(cfn), PREC1, + // sizeof(CFN_PARAM(cfn)), nullptr, "s"); }); break; } @@ -318,9 +321,12 @@ class SpecialFunctionEditPage : public Page grid.getFieldSlot(), val_min, val_max, GET_SET_DEFAULT(CFN_PARAM(cfn))); numedit->setDisplayHandler( - [](BitmapBuffer *dc, LcdFlags flags, int value) { - dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, abs(value), - flags, 0, value >= 0 ? "+= " : "-= ", nullptr); + [](int value) { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, abs(value), 0, 0, value >= 0 ? "+=" : "--", nullptr); + return std::string(s); + // dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, abs(value), + // flags, 0, value >= 0 ? "+= " : "-= ", nullptr); }); break; } @@ -342,14 +348,16 @@ class SpecialFunctionEditPage : public Page 60 / CFN_PLAY_REPEAT_MUL, GET_DEFAULT((int8_t)CFN_PLAY_REPEAT(cfn)), SET_DEFAULT(CFN_PLAY_REPEAT(cfn))); repeat->setDisplayHandler( - [](BitmapBuffer *dc, LcdFlags flags, int32_t value) { + [](int32_t value) { if (value == 0) - dc->drawText(3, 0, "1x", flags); + return "1x"; else if (value == (int8_t)CFN_PLAY_REPEAT_NOSTART) - dc->drawText(3, 0, "!1x", flags); - else - dc->drawNumber(3, 0, value * CFN_PLAY_REPEAT_MUL, flags, 0, - nullptr, "s"); + return "!1x"; + else { + char s[50]; + BitmapBuffer::formatNumberAsString(s, 49, value * CFN_PLAY_REPEAT_MUL, 0, 0, nullptr, "s"); + return (const char *)s; + } }); grid.nextLine(); } diff --git a/radio/src/gui/colorlcd/timeedit.cpp b/radio/src/gui/colorlcd/timeedit.cpp index 056429ea2..1a67fcd34 100644 --- a/radio/src/gui/colorlcd/timeedit.cpp +++ b/radio/src/gui/colorlcd/timeedit.cpp @@ -27,22 +27,27 @@ TimeEdit::TimeEdit(Window * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function getValue, std::function setValue): NumberEdit(parent, rect, vmin, vmax, std::move(getValue), std::move(setValue)) { + setDisplayHandler([=] (int value) { + TimerOptions timerOptions; + timerOptions.options = (textFlags & TIMEHOUR) != 0 ? SHOW_TIME : SHOW_TIMER; + return std::string(getTimerString(this->getValue(), timerOptions)); + }); } -void TimeEdit::paint(BitmapBuffer * dc) -{ - FormField::paint(dc); +// void TimeEdit::paint(BitmapBuffer * dc) +// { +// FormField::paint(dc); - LcdFlags textColor; - if (editMode) - textColor = COLOR_THEME_PRIMARY2; - else if (hasFocus()) - textColor = COLOR_THEME_PRIMARY2; - else - textColor = COLOR_THEME_SECONDARY1; +// LcdFlags textColor; +// if (editMode) +// textColor = COLOR_THEME_PRIMARY2; +// else if (hasFocus()) +// textColor = COLOR_THEME_PRIMARY2; +// else +// textColor = COLOR_THEME_SECONDARY1; - TimerOptions timerOptions; - timerOptions.options = (textFlags & TIMEHOUR) != 0 ? SHOW_TIME : SHOW_TIMER; - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, - getTimerString(getValue(), timerOptions), textColor); -} +// TimerOptions timerOptions; +// timerOptions.options = (textFlags & TIMEHOUR) != 0 ? SHOW_TIME : SHOW_TIMER; +// dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, +// getTimerString(getValue(), timerOptions), textColor); +// } diff --git a/radio/src/gui/colorlcd/timeedit.h b/radio/src/gui/colorlcd/timeedit.h index 106b4e586..ee8311c89 100644 --- a/radio/src/gui/colorlcd/timeedit.h +++ b/radio/src/gui/colorlcd/timeedit.h @@ -34,9 +34,6 @@ class TimeEdit : public NumberEdit { return "TimeEdit"; } #endif - - void paint(BitmapBuffer * dc) override; - }; #endif // _TIMEEDIT_H_ diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 2fb7c8f34..e6dc11ee0 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 2fb7c8f34244170c2699134c8f98b1dd892e3eb0 +Subproject commit e6dc11ee06256add3d719dac3899104629693c97