From bf15410bf1c2a9f1ae475052ed38172bde044c1e Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Tue, 24 Jan 2017 07:36:40 +0100 Subject: [PATCH] 3djc/x7 outputs (#4273) [128x64] Rework Outputs screen [X7] Fix for min/max limits bug [X7/X9] UI fixes --- .../src/firmwares/opentx/opentxeeprom.cpp | 10 +- companion/src/modeledit/channels.cpp | 2 +- radio/src/gui/128x64/gui.h | 1 + radio/src/gui/128x64/model_input_edit.cpp | 2 +- radio/src/gui/128x64/model_outputs_arm.cpp | 343 ++++++++++++++++++ ...odel_outputs.cpp => model_outputs_avr.cpp} | 75 +--- radio/src/gui/128x64/widgets.cpp | 31 +- radio/src/gui/212x64/model_input_edit.cpp | 1 - radio/src/gui/212x64/model_mix_edit.cpp | 6 +- radio/src/gui/212x64/widgets.cpp | 40 +- radio/src/gui/CMakeLists.txt | 20 +- radio/src/gui/common/stdlcd/model_curves.cpp | 31 +- radio/src/gui/common/stdlcd/model_inputs.cpp | 6 +- radio/src/gui/common/stdlcd/widgets.cpp | 11 +- radio/src/strhelpers.cpp | 16 + radio/src/strhelpers.h | 1 + 16 files changed, 451 insertions(+), 145 deletions(-) create mode 100644 radio/src/gui/128x64/model_outputs_arm.cpp rename radio/src/gui/128x64/{model_outputs.cpp => model_outputs_avr.cpp} (66%) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 373b288c3..e7adcf4f1 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1456,14 +1456,8 @@ class LimitField: public StructField { StructField("Limit") { if (IS_ARM(board) && version >= 218) { - if (HAS_LARGE_LCD(board)) { - Append(new ConversionField< SignedField<11> >(limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>)); - Append(new ConversionField< SignedField<11> >(limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>)); - } - else { - Append(new ConversionField< SignedField<11> >(limit.min, +100, 10)); - Append(new ConversionField< SignedField<11> >(limit.max, -100, 10)); - } + Append(new ConversionField< SignedField<11> >(limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>)); + Append(new ConversionField< SignedField<11> >(limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>)); Append(new SignedField<10>(limit.ppmCenter)); Append(new ConversionField< SignedField<11> >(limit.offset, exportLimitValue<0, 1024>, importLimitValue<0, 1024>)); Append(new BoolField<1>(limit.symetrical)); diff --git a/companion/src/modeledit/channels.cpp b/companion/src/modeledit/channels.cpp index 2beac5c4f..49bf42654 100644 --- a/companion/src/modeledit/channels.cpp +++ b/companion/src/modeledit/channels.cpp @@ -45,7 +45,7 @@ LimitsGroup::LimitsGroup(Firmware * firmware, TableLayout * tableLayout, int row spinbox->setSuffix("%"); } - if (HAS_LARGE_LCD(board) || deflt == 0 /*it's the offset*/) { + if (IS_ARM(board) || deflt == 0 /*it's the offset*/) { spinbox->setDecimals(1); } else { diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 174827028..1782f98a2 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -304,6 +304,7 @@ int8_t editSwitch(coord_t x, coord_t y, int8_t value, LcdFlags attr, event_t eve #if defined(GVARS) && defined(CPUARM) int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event); +void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0); #elif defined(GVARS) int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, event_t event); #else diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp index 078072418..2ac86b85b 100644 --- a/radio/src/gui/128x64/model_input_edit.cpp +++ b/radio/src/gui/128x64/model_input_edit.cpp @@ -132,7 +132,7 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_CURVE: - editCurveRef(EXPO_ONE_2ND_COLUMN-3*FW, y, ed->curve, event, RIGHT | attr); + editCurveRef(EXPO_ONE_2ND_COLUMN, y, ed->curve, event, RIGHT | attr); break; #endif diff --git a/radio/src/gui/128x64/model_outputs_arm.cpp b/radio/src/gui/128x64/model_outputs_arm.cpp new file mode 100644 index 000000000..e0035a979 --- /dev/null +++ b/radio/src/gui/128x64/model_outputs_arm.cpp @@ -0,0 +1,343 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +bool isThrottleOutput(uint8_t ch) +{ + for (uint8_t i=0; idestCh==ch && mix->srcRaw==MIXSRC_Thr) + return true; + } + return false; +} + +enum MenuModelOutputsItems { + ITEM_OUTPUTS_OFFSET, + ITEM_OUTPUTS_MIN, + ITEM_OUTPUTS_MAX, + ITEM_OUTPUTS_DIRECTION, + ITEM_OUTPUTS_CURVE, +#if defined(PPM_LIMITS_SYMETRICAL) + ITEM_OUTPUTS_SYMETRICAL, +#endif + ITEM_OUTPUTS_COUNT, + ITEM_OUTPUTS_MAXROW = ITEM_OUTPUTS_COUNT-1 +}; + +#if defined(PPM_UNIT_US) + #define LIMITS_MIN_POS 12*FW+1 +#else + #define LIMITS_MIN_POS 12*FW-2 +#endif + +#define LIMITS_OFFSET_POS 8*FW-1 + +#if defined(PPM_LIMITS_SYMETRICAL) + #if defined(PPM_CENTER_ADJUSTABLE) + #define LIMITS_MAX_POS 15*FW+3 + #define LIMITS_REVERT_POS 16*FW-1 + #define LIMITS_PPM_CENTER_POS 20*FW+1 + #else + #define LIMITS_DIRECTION_POS 12*FW+4 + #define LIMITS_MAX_POS 16*FW+4 + #define LIMITS_REVERT_POS 17*FW + #endif +#else + #if defined(PPM_CENTER_ADJUSTABLE) + #define LIMITS_MAX_POS 16*FW + #define LIMITS_REVERT_POS 17*FW-2 + #define LIMITS_PPM_CENTER_POS 21*FW+2 + #else + #define LIMITS_MAX_POS 17*FW + #define LIMITS_REVERT_POS 18*FW + #define LIMITS_DIRECTION_POS 12*FW+5 + #endif +#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 + +#if defined(PPM_UNIT_US) + #define SET_MIN_MAX(x, val) x = ((val)*250)/128 + #define MIN_MAX_DISPLAY(x) CONVERT_US_MIN_MAX(x) +#else + #define MIN_MAX_DISPLAY(x) (x) + #define SET_MIN_MAX(x, val) x = (val) +#endif + +enum MenuModelOutputsOneItems { + ITEM_OUTPUTONE_CH_NAME, + ITEM_OUTPUTONE_OFFSET, + ITEM_OUTPUTONE_MIN, + ITEM_OUTPUTONE_MAX, + ITEM_OUTPUTONE_DIR, + ITEM_OUTPUTONE_CURVE, + ITEM_OUTPUTONE_PPM_CENTER, + ITEM_OUTPUTONE_SYMETRICAL, + ITEM_OUTPUTONE_MAXROW +}; + +#define LIMITS_ONE_2ND_COLUMN (13*FW) + +void menuModelLimitsOne(event_t event) +{ + TITLE(STR_MENULIMITS); + LimitData * ld = limitAddress(s_currIdx); + + putsChn(11*FW, 0, s_currIdx+1, 0); + lcdDrawNumber(19*FW, 0, PPM_CH_CENTER(s_currIdx)+channelOutputs[s_currIdx]/2, RIGHT); + lcdDrawText(19*FW, 0, STR_US); + + SUBMENU_NOTITLE(ITEM_OUTPUTONE_MAXROW, { 0, 0, 0, 0, 0, 0 , 0 /*, 0...*/ }); + + int8_t sub = menuVerticalPosition; + + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ; + int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : 1000); + + switch (i) { + case ITEM_OUTPUTONE_CH_NAME: + editSingleName(LIMITS_ONE_2ND_COLUMN, y, STR_NAME, ld->name, sizeof(ld->name), event, attr); + break; + + case ITEM_OUTPUTONE_OFFSET: + lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_SUBTRIM); + ld->offset = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->offset, -1000, 1000, PREC1 | attr, 0, event); + break; + + case ITEM_OUTPUTONE_MIN: + lcdDrawTextAlignedLeft(y, TR_MIN); + if (GV_IS_GV_VALUE(ld->min, -GV_RANGELARGE, GV_RANGELARGE) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { + ld->min = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1, 0, event); + break; + } + lcdDrawNumber(LIMITS_ONE_2ND_COLUMN, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), attr|PREC1); + if (active) { + ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL, NULL, stops1000); + } + break; + + case ITEM_OUTPUTONE_MAX: + lcdDrawTextAlignedLeft(y, TR_MAX); + if (GV_IS_GV_VALUE(ld->max, -GV_RANGELARGE, GV_RANGELARGE) || (attr && event == EVT_KEY_LONG(KEY_ENTER))) { + ld->max = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, attr|PREC1, 0, event); + break; + } + lcdDrawNumber(LIMITS_ONE_2ND_COLUMN, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), attr|PREC1); + if (active) { + ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL, NULL, stops1000); + } + break; + + case ITEM_OUTPUTONE_DIR: + { + uint8_t revert = ld->revert; + lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_DIRECTION); + lcdDrawTextAtIndex(LIMITS_ONE_2ND_COLUMN, y, STR_MMMINV, revert, attr); + if (active) { + uint8_t revert_new = checkIncDecModel(event, revert, 0, 1); + if (checkIncDec_Ret && isThrottleOutput(k)) { + POPUP_CONFIRMATION(STR_INVERT_THR); + } + else { + ld->revert = revert_new; + } + } + break; + } + + case ITEM_OUTPUTONE_CURVE: + lcdDrawTextAlignedLeft(y, TR_CURVE); + drawCurveName(LIMITS_ONE_2ND_COLUMN, y, ld->curve, attr); + if (active) { + CHECK_INCDEC_MODELVAR(event, ld->curve, -MAX_CURVES, +MAX_CURVES); + } + break; + + case ITEM_OUTPUTONE_PPM_CENTER: + lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_PPMCENTER); + ld->ppmCenter = GVAR_MENU_ITEM(LIMITS_ONE_2ND_COLUMN, y, ld->ppmCenter, -PPM_CENTER_MAX, PPM_CENTER_MAX, PREC1 | attr, 0, event); + break; + + case ITEM_OUTPUTONE_SYMETRICAL: + lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_SUBTRIMMODE); + lcdDrawChar(LIMITS_ONE_2ND_COLUMN, y, ld->symetrical ? '=' : '\306', attr); + if (active) { + CHECK_INCDEC_MODELVAR_ZERO(event, ld->symetrical, 1); + } + break; + } + } +} + +void onLimitsMenu(const char *result) +{ + s_currIdx = menuVerticalPosition; + + if (result == STR_RESET) { + LimitData *ld = limitAddress(s_currIdx); + ld->min = 0; + ld->max = 0; + ld->offset = 0; + ld->ppmCenter = 0; + ld->revert = false; + ld->curve = 0; + } + else if (result == STR_COPY_STICKS_TO_OFS) { + copySticksToOffset(s_currIdx); + } + else if (result == STR_COPY_TRIMS_TO_OFS) { + copyTrimsToOffset(s_currIdx); + } + else if (result == STR_EDIT) { + pushMenu(menuModelLimitsOne); + } +} + +void menuModelLimits(event_t event) +{ + uint8_t sub = menuVerticalPosition - HEADER_LINE; + + if (sub < MAX_OUTPUT_CHANNELS) { + lcdDrawNumber(13*FW, 0, PPM_CH_CENTER(sub)+channelOutputs[sub]/2, RIGHT); + lcdDrawText(13*FW, 0, STR_US); + } + + SIMPLE_MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, HEADER_LINE+MAX_OUTPUT_CHANNELS+1); + + if (warningResult) { + warningResult = 0; + LimitData * ld = limitAddress(sub); + ld->revert = !ld->revert; + storageDirty(EE_MODEL); + } + + for (uint8_t i=0; iname[0] == 0) { + putsChn(0, y, k+1, (sub==k) ? INVERS : 0); + } + else { + lcdDrawSizedText(0, y, ld->name, sizeof(ld->name), ((sub==k) ? INVERS : 0) | ZCHAR | LEFT); + } + + for (uint8_t j=0; j0 || p1valdiff)) STICK_SCROLL_DISABLE(); + switch (j) { + case ITEM_OUTPUTS_OFFSET: +#if defined(PPM_UNIT_US) + lcdDrawNumber(LIMITS_OFFSET_POS, y, ((int32_t)ld->offset*128) / 25, PREC1|RIGHT); +#else +#if defined(GVARS) + if (GV_IS_GV_VALUE(ld->offset, -GV_RANGELARGE, GV_RANGELARGE)) { + drawGVarName(LIMITS_OFFSET_POS, y, ld->offset, attr|PREC1|RIGHT); + break; + } +#endif + if (abs(ld->offset) >= 1000) { + lcdDrawNumber(LIMITS_OFFSET_POS, y, ld->offset/10, RIGHT); + } + else { + lcdDrawNumber(LIMITS_OFFSET_POS, y, ld->offset, PREC1|RIGHT); + } +#endif + break; + + case ITEM_OUTPUTS_MIN: +#if defined(GVARS) + if (GV_IS_GV_VALUE(ld->min, -GV_RANGELARGE, GV_RANGELARGE)) { + drawGVarName(LIMITS_MIN_POS, y, ld->min, attr|PREC1|RIGHT); + break; + } +#endif + if (ld->min <= 0) { + lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET)/10, RIGHT); + } + else { + lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), attr|PREC1|RIGHT); + } + break; + + case ITEM_OUTPUTS_MAX: +#if defined(GVARS) + if (GV_IS_GV_VALUE(ld->max, -GV_RANGELARGE, GV_RANGELARGE)) { + drawGVarName(LIMITS_MAX_POS, y, ld->max, attr|PREC1|RIGHT); + break; + } +#endif + if (ld->max >= 0) { + lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET)/10, RIGHT); + } + else { + lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), attr|PREC1|RIGHT); + } + break; + + case ITEM_OUTPUTS_DIRECTION: + lcdDrawChar(LIMITS_REVERT_POS, y, ld->revert ? 127 : 126, 0); + break; + + case ITEM_OUTPUTS_CURVE: + drawCurveName(LIMITS_CURVE_POS, y, ld->curve, 0); + break; + + case ITEM_OUTPUTS_SYMETRICAL: + lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '\306', 0); + break; + } + } + } +} diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs_avr.cpp similarity index 66% rename from radio/src/gui/128x64/model_outputs.cpp rename to radio/src/gui/128x64/model_outputs_avr.cpp index b0fe180b5..3d24b0883 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs_avr.cpp @@ -48,13 +48,15 @@ enum MenuModelOutputsItems { #if defined(PPM_UNIT_US) #define LIMITS_MIN_POS 12*FW+1 #else - #define LIMITS_MIN_POS 12*FW + #define LIMITS_MIN_POS 12*FW-2 #endif + #define LIMITS_OFFSET_POS 8*FW + #if defined(PPM_LIMITS_SYMETRICAL) #if defined(PPM_CENTER_ADJUSTABLE) - #define LIMITS_MAX_POS 15*FW - #define LIMITS_REVERT_POS 16*FW-3 + #define LIMITS_MAX_POS 15*FW+3 + #define LIMITS_REVERT_POS 16*FW-1 #define LIMITS_PPM_CENTER_POS 20*FW+1 #else #define LIMITS_DIRECTION_POS 12*FW+4 @@ -73,43 +75,18 @@ enum MenuModelOutputsItems { #endif #endif -#define LIMITS_MIN_MAX_OFFSET 100 +#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 #if defined(PPM_UNIT_US) #define SET_MIN_MAX(x, val) x = ((val)*250)/128 #define MIN_MAX_DISPLAY(x) CONVERT_US_MIN_MAX(x) -#elif defined(CPUARM) - #define MIN_MAX_DISPLAY(x) (x) - #define SET_MIN_MAX(x, val) x = (val) #else #define MIN_MAX_DISPLAY(x) ((int8_t)(x)) #endif -#if defined(CPUARM) -void onLimitsMenu(const char *result) -{ - int ch = menuVerticalPosition; - - if (result == STR_RESET) { - LimitData *ld = limitAddress(ch); - ld->min = 0; - ld->max = 0; - ld->offset = 0; - ld->ppmCenter = 0; - ld->revert = false; - ld->curve = 0; - } - else if (result == STR_COPY_STICKS_TO_OFS) { - copySticksToOffset(ch); - } - else if (result == STR_COPY_TRIMS_TO_OFS) { - copyTrimsToOffset(ch); - } -} -#endif - void menuModelLimits(event_t event) { uint8_t sub = menuVerticalPosition - HEADER_LINE; @@ -123,11 +100,7 @@ void menuModelLimits(event_t event) #endif } -#if defined(CPUARM) - MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, HEADER_LINE+MAX_OUTPUT_CHANNELS+1, { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, 0}); -#else MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, HEADER_LINE+MAX_OUTPUT_CHANNELS+1, { HEADER_LINE_COLUMNS ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, 0}); -#endif if (warningResult) { warningResult = 0; @@ -170,16 +143,6 @@ void menuModelLimits(event_t event) putsChn(0, y, k+1, IS_LINE_SELECTED(sub, k) ? INVERS : 0); -#if defined(CPUARM) - if (sub==k && CURSOR_ON_LINE() && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) { - killEvents(event); - POPUP_MENU_ADD_ITEM(STR_RESET); - POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); - POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); - POPUP_MENU_START(onLimitsMenu); - } -#endif - for (uint8_t j=0; j0) ? BLINK|INVERS : INVERS) : 0); uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ; @@ -192,11 +155,7 @@ void menuModelLimits(event_t event) lcdDrawNumber(LIMITS_OFFSET_POS, y, ld->offset, attr|PREC1|RIGHT); #endif if (active) { -#if defined(CPUARM) - ld->offset = checkIncDec(event, ld->offset, -1000, 1000, EE_MODEL, NULL, stops1000); -#else ld->offset = checkIncDec(event, ld->offset, -1000, 1000, EE_MODEL|NO_INCDEC_MARKS); -#endif } else if (attr && event==EVT_KEY_LONG(KEY_MENU)) { copySticksToOffset(k); @@ -206,20 +165,16 @@ void menuModelLimits(event_t event) case ITEM_OUTPUTS_MIN: lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT); -#if defined(CPUARM) - if (active) ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL, NULL, stops1000); -#else - if (active) ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL); -#endif + if (active) { + ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL); + } break; case ITEM_OUTPUTS_MAX: lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT); -#if defined(CPUARM) - if (active) ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL, NULL, stops1000); -#else - if (active) ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL); -#endif + if (active) { + ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL); + } break; case ITEM_OUTPUTS_DIRECTION: @@ -253,11 +208,7 @@ void menuModelLimits(event_t event) #if defined(PPM_LIMITS_SYMETRICAL) case ITEM_OUTPUTS_SYMETRICAL: -#if defined(CPUARM) - lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '\306', attr); -#else lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '^', attr); -#endif if (active) { CHECK_INCDEC_MODELVAR_ZERO(event, ld->symetrical, 1); } diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index dfe6f3000..8079737e0 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -114,12 +114,8 @@ void display5posSlider(coord_t x, coord_t y, uint8_t value, uint8_t attr) } #endif -#if defined(GVARS) && defined(CPUARM) -bool noZero(int val) -{ - return val != 0; -} +#if defined(GVARS) && defined(CPUARM) int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event) { uint16_t delta = GV_GET_GV1_VALUE(max); @@ -137,31 +133,18 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int } if (GV_IS_GV_VALUE(value, min, max)) { - if (IS_LEFT_ALIGNED(attr)) { - attr -= LEFT; /* because of ZCHAR */ - } - else { - x -= 3*FW; - attr -= RIGHT; - } - attr &= ~PREC1; - - int8_t idx = (int16_t) GV_INDEX_CALC_DELTA(value, delta); - if (idx >= 0) ++idx; // transform form idx=0=GV1 to idx=1=GV1 in order to handle double keys invert + int8_t idx = (int16_t)GV_INDEX_CALC_DELTA(value, delta); if (invers) { - CHECK_INCDEC_MODELVAR_CHECK(event, idx, -MAX_GVARS, MAX_GVARS, noZero); - if (idx == 0) idx = 1; // handle reset to zero, map to GV1 + CHECK_INCDEC_MODELVAR(event, idx, -MAX_GVARS, MAX_GVARS-1); } if (idx < 0) { - value = (int16_t) GV_CALC_VALUE_IDX_NEG(idx, delta); - idx = -idx; - lcdDrawChar(x-6, y, '-', attr); + value = (int16_t)GV_CALC_VALUE_IDX_NEG(idx, delta); } else { - value = (int16_t) GV_CALC_VALUE_IDX_POS(idx-1, delta); + value = (int16_t)GV_CALC_VALUE_IDX_POS(idx, delta); } - drawStringWithIndex(x, y, STR_GV, idx, attr); + drawGVarName(x, y, idx, attr); } else { lcdDrawNumber(x, y, value, attr); diff --git a/radio/src/gui/212x64/model_input_edit.cpp b/radio/src/gui/212x64/model_input_edit.cpp index 047245afe..73ae3a36f 100644 --- a/radio/src/gui/212x64/model_input_edit.cpp +++ b/radio/src/gui/212x64/model_input_edit.cpp @@ -21,7 +21,6 @@ #include "opentx.h" #define EXPO_ONE_2ND_COLUMN (LCD_W-8*FW-90) -#define EXPO_ONE_FM_WIDTH (9*FW) int expoFn(int x) { diff --git a/radio/src/gui/212x64/model_mix_edit.cpp b/radio/src/gui/212x64/model_mix_edit.cpp index 12acf96a7..b37c6f75d 100644 --- a/radio/src/gui/212x64/model_mix_edit.cpp +++ b/radio/src/gui/212x64/model_mix_edit.cpp @@ -126,14 +126,16 @@ void menuModelMixOne(event_t event) MD_OFFSET_TO_UNION(md2, offset); offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event); MD_UNION_TO_OFFSET(offset, md2); - drawOffsetBar(MIXES_2ND_COLUMN+22, y, md2); + drawOffsetBar(MIXES_2ND_COLUMN+35, y, md2); break; } case MIX_FIELD_TRIM: lcdDrawTextAlignedLeft(y, STR_TRIM); drawCheckBox(MIXES_2ND_COLUMN, y, !md2->carryTrim, attr); - if (attr) md2->carryTrim = !checkIncDecModel(event, !md2->carryTrim, 0, 1); + if (attr) { + md2->carryTrim = !checkIncDecModel(event, !md2->carryTrim, 0, 1); + } break; #if defined(CURVES) diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 6db43c25e..bd8d556c5 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -159,19 +159,6 @@ void drawSlider(coord_t x, coord_t y, uint8_t value, uint8_t max, uint8_t attr) } #if defined(GVARS) -bool noZero(int val) -{ - return val != 0; -} - -void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags) -{ - if (ZEXIST(g_model.gvars[index].name)) - lcdDrawSizedText(x, y, g_model.gvars[index].name, LEN_GVAR_NAME, ZCHAR|flags); - else - drawStringWithIndex(x, y, STR_GV, index+1, flags); -} - void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags) { uint8_t prec = g_model.gvars[gvar].prec; @@ -190,37 +177,28 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int if (invers && event == EVT_KEY_LONG(KEY_ENTER)) { s_editMode = !s_editMode; - if (attr & PREC1) + if (attr & PREC1) { value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode)*10 : delta); - else + } + else { value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, mixerCurrentFlightMode) : delta); + } storageDirty(EE_MODEL); } if (GV_IS_GV_VALUE(value, min, max)) { - if (attr & RIGHT) { - x -= 3*FW; - attr -= RIGHT; - } - attr &= ~PREC1; - - int8_t idx = (int16_t) GV_INDEX_CALC_DELTA(value, delta); - if (idx >= 0) ++idx; // transform form idx=0=GV1 to idx=1=GV1 in order to handle double keys invert + int8_t idx = (int16_t)GV_INDEX_CALC_DELTA(value, delta); if (invers) { - CHECK_INCDEC_MODELVAR_CHECK(event, idx, -MAX_GVARS, MAX_GVARS, noZero); - if (idx == 0) idx = 1; // handle reset to zero, map to GV1 + CHECK_INCDEC_MODELVAR(event, idx, -MAX_GVARS, MAX_GVARS-1); } if (idx < 0) { - value = (int16_t) GV_CALC_VALUE_IDX_NEG(idx, delta); - idx = -idx; - lcdDrawChar(x-6, y, '-', attr); + value = (int16_t)GV_CALC_VALUE_IDX_NEG(idx, delta); } else { - value = (int16_t) GV_CALC_VALUE_IDX_POS(idx-1, delta); + value = (int16_t)GV_CALC_VALUE_IDX_POS(idx, delta); } - - drawGVarName(x, y, idx-1, attr); + drawGVarName(x, y, idx, attr); } else { lcdDrawNumber(x, y, value, attr); diff --git a/radio/src/gui/CMakeLists.txt b/radio/src/gui/CMakeLists.txt index f1a9e90d3..22a453e7a 100644 --- a/radio/src/gui/CMakeLists.txt +++ b/radio/src/gui/CMakeLists.txt @@ -10,7 +10,6 @@ set(GUI_SRC menu_model.cpp model_select.cpp model_setup.cpp - model_outputs.cpp model_logical_switches.cpp model_special_functions.cpp model_telemetry.cpp @@ -23,6 +22,25 @@ set(GUI_SRC view_statistics.cpp ) +if(GUI_DIR STREQUAL 128x64) + if (ARCH STREQUAL ARM) + set(GUI_SRC + ${GUI_SRC} + model_outputs_arm.cpp + ) + else() + set(GUI_SRC + ${GUI_SRC} + model_outputs_avr.cpp + ) + endif() +else() + set(GUI_SRC + ${GUI_SRC} + model_outputs.cpp + ) +endif() + set(SRC ${SRC} gui/common/widgets.cpp diff --git a/radio/src/gui/common/stdlcd/model_curves.cpp b/radio/src/gui/common/stdlcd/model_curves.cpp index 3e70798b4..41fbfda5e 100644 --- a/radio/src/gui/common/stdlcd/model_curves.cpp +++ b/radio/src/gui/common/stdlcd/model_curves.cpp @@ -108,31 +108,42 @@ void menuModelCurvesAll(event_t event) void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags) { coord_t x1 = x; + LcdFlags flags1 = flags; if (flags & RIGHT) { - x1 -= 6*FW; - flags -= RIGHT; + x1 -= 9*FW; + flags1 -= RIGHT; } else { - x += 6*FW; + x += 5*FW; } - lcdDrawTextAtIndex(x1, y, "\004DiffExpoFuncCstm", curve.type, menuHorizontalPosition==0 ? flags : 0); - if (flags && menuHorizontalPosition==0) { + uint8_t active = (flags & INVERS); + + if (menuHorizontalPosition == 0) { + flags = flags & RIGHT; + } + else { + flags1 = 0; + } + + lcdDrawTextAtIndex(x1, y, "\004DiffExpoFuncCstm", curve.type, flags1); + + if (active && menuHorizontalPosition==0) { CHECK_INCDEC_MODELVAR_ZERO(event, curve.type, CURVE_REF_CUSTOM); if (checkIncDec_Ret) curve.value = 0; } switch (curve.type) { case CURVE_REF_DIFF: case CURVE_REF_EXPO: - curve.value = GVAR_MENU_ITEM(x, y, curve.value, -100, 100, LEFT | (menuHorizontalPosition==1 ? flags : 0), 0, event); + curve.value = GVAR_MENU_ITEM(x, y, curve.value, -100, 100, LEFT | flags, 0, event); break; case CURVE_REF_FUNC: - lcdDrawTextAtIndex(x+2*FW, y, STR_VCURVEFUNC, curve.value, RIGHT | (menuHorizontalPosition==1 ? flags : 0)); - if (flags && menuHorizontalPosition==1) CHECK_INCDEC_MODELVAR_ZERO(event, curve.value, CURVE_BASE-1); + lcdDrawTextAtIndex(x, y, STR_VCURVEFUNC, curve.value, flags); + if (active && menuHorizontalPosition==1) CHECK_INCDEC_MODELVAR_ZERO(event, curve.value, CURVE_BASE-1); break; case CURVE_REF_CUSTOM: - drawCurveName(x+2*FW, y, curve.value, RIGHT | (menuHorizontalPosition==1 ? flags : 0)); - if (flags && menuHorizontalPosition==1) { + drawCurveName(x, y, curve.value, flags); + if (active && menuHorizontalPosition==1) { if (event==EVT_KEY_LONG(KEY_ENTER) && curve.value!=0) { s_curveChan = (curve.value<0 ? -curve.value-1 : curve.value-1); pushMenu(menuModelCurveOne); diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index 469739a82..675ec6eac 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -158,8 +158,8 @@ void onExposMenu(const char * result) #define EXPO_LINE_WEIGHT_POS 8*FW+8 #define EXPO_LINE_SRC_POS 9*FW+3 #define EXPO_LINE_CURVE_POS 12*FW+11 -#define EXPO_LINE_TRIM_POS 19*FW-4 -#define EXPO_LINE_SWITCH_POS 20*FW-1 +#define EXPO_LINE_TRIM_POS 19*FW-2 +#define EXPO_LINE_SWITCH_POS 20*FW #define EXPO_LINE_SIDE_POS 25*FW #define EXPO_LINE_FM_POS 12*FW+11 #define EXPO_LINE_SELECT_POS 5*FW+2 @@ -221,7 +221,7 @@ void displayExpoLine(coord_t y, ExpoData * ed) else if (!ed->flightModes || ((ed->curve.value || ed->swtch) && ((get_tmr10ms() / 200) & 1))) displayExpoInfos(y, ed); else - displayFlightModes(EXPO_LINE_INFOS_POS, y, ed->flightModes); + displayFlightModes(EXPO_LINE_INFOS_POS+9*FWNUM, y, ed->flightModes); } #endif diff --git a/radio/src/gui/common/stdlcd/widgets.cpp b/radio/src/gui/common/stdlcd/widgets.cpp index db0a67b15..de3337c17 100644 --- a/radio/src/gui/common/stdlcd/widgets.cpp +++ b/radio/src/gui/common/stdlcd/widgets.cpp @@ -24,7 +24,7 @@ void drawStringWithIndex(coord_t x, coord_t y, const pm_char * str, uint8_t idx, { if (flags & RIGHT) { lcdDrawNumber(x, y, idx, flags); - lcdDrawText(x-FW, y, str, flags & ~LEADING0); + lcdDrawText(x-FWNUM, y, str, flags & ~LEADING0); } else { lcdDrawText(x, y, str, flags & ~LEADING0); @@ -180,3 +180,12 @@ void gvarWeightItem(coord_t x, coord_t y, MixData * md, LcdFlags attr, event_t e weight.word = GVAR_MENU_ITEM(x, y, weight.word, GV_RANGELARGE_WEIGHT_NEG, GV_RANGELARGE_WEIGHT, attr, 0, event); MD_UNION_TO_WEIGHT(weight, md); } + +#if defined(CPUARM) +void drawGVarName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) +{ + char s[8]; + getGVarString(s, idx); + lcdDrawText(x, y, s, flags); +} +#endif diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index ce9044547..c0a408904 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -209,6 +209,22 @@ char * getCurveString(char * dest, int idx) return dest; } +char * getGVarString(char * dest, int idx) +{ + char * s = dest; + if (idx < 0) { + *s++ = '-'; + idx = -idx-1; + } + + if (ZEXIST(g_model.gvars[idx].name)) + zchar2str(s, g_model.gvars[idx].name, LEN_GVAR_NAME); + else + strAppendStringWithIndex(s, STR_GV, idx+1); + + return dest; +} + char * getSwitchString(char * dest, swsrc_t idx) { if (idx == SWSRC_NONE) { diff --git a/radio/src/strhelpers.h b/radio/src/strhelpers.h index b3f760956..bd2de317a 100644 --- a/radio/src/strhelpers.h +++ b/radio/src/strhelpers.h @@ -34,6 +34,7 @@ char * strAppendStringWithIndex(char * dest, const char * s, int idx); #define LEN_TIMER_STRING 10 // "-00:00:00" char * getTimerString(char * dest, int32_t tme, uint8_t hours=0); char * getCurveString(char * dest, int idx); +char * getGVarString(char * dest, int idx); char * getSwitchString(char * dest, swsrc_t idx); char * getSourceString(char * dest, mixsrc_t idx); #endif