diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 316f70a88..7a852ca18 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -306,6 +306,7 @@ int8_t editSwitch(coord_t x, coord_t y, int8_t value, LcdFlags attr, event_t eve 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); void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags=0); +void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t flightMode, LcdFlags flags); #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/menus.h b/radio/src/gui/128x64/menus.h index 77adbe7b0..9da7c7a69 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -148,6 +148,7 @@ void menuModelTelemetryFrsky(event_t event); void menuModelTelemetryMavlink(event_t event); void menuModelDisplay(event_t event); void menuModelTemplates(event_t event); +void menuModelGVarOne(event_t event); static const MenuHandlerFunc menuTabModel[] PROGMEM = { menuModelSelect, diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index 6dcd2be4a..5f4fe10f6 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -198,20 +198,28 @@ void menuModelFlightModeOne(event_t event) { uint8_t idx = i-ITEM_MODEL_FLIGHT_MODE_GV1; uint8_t posHorz = menuHorizontalPosition; + if (attr && posHorz > 0 && s_currIdx==0) posHorz++; - drawStringWithIndex(INDENT_WIDTH, y, STR_GV, idx+1); - + drawStringWithIndex(INDENT_WIDTH, y, STR_GV, idx+1, posHorz==0 ? attr : 0); +#if defined(CPUARM) + lcdDrawSizedText(4*FW, y,g_model.gvars[idx].name, LEN_GVAR_NAME, ZCHAR); + if (attr && editMode>0 && posHorz==0) { + s_currIdx = sub - ITEM_MODEL_FLIGHT_MODE_GV1; + editMode = 0; + pushMenu(menuModelGVarOne); + } +#else editName(4*FW, y, g_model.gvars[idx].name, LEN_GVAR_NAME, event, posHorz==0 ? attr : 0); - +#endif int16_t v = fm->gvars[idx]; if (v > GVAR_MAX) { uint8_t p = v - GVAR_MAX - 1; if (p >= s_currIdx) p++; - drawFlightMode(10*FW, y, p+1, posHorz==1 ? attr : 0); + drawFlightMode(9*FW, y, p+1, posHorz==1 ? attr : 0); } else { - lcdDrawText(10*FW, y, STR_OWN, posHorz==1 ? attr : 0); + lcdDrawText(9*FW, y, STR_OWN, posHorz==1 ? attr : 0); } if (attr && s_currIdx>0 && posHorz==1 && (editMode>0 || p1valdiff)) { if (v < GVAR_MAX) v = GVAR_MAX; @@ -221,13 +229,15 @@ void menuModelFlightModeOne(event_t event) fm->gvars[idx] = v; } } - +#if defined(CPUARM) + editGVarValue(17*FW, y, event, idx, getGVarFlightMode(s_currIdx, idx), posHorz==2 ? attr : 0); +#else uint8_t p = getGVarFlightMode(s_currIdx, idx); lcdDrawNumber(18*FW, y, GVAR_VALUE(idx, p), posHorz==2 ? attr : 0); if (attr && posHorz==2 && ((editMode>0) || p1valdiff)) { GVAR_VALUE(idx, p) = checkIncDec(event, GVAR_VALUE(idx, p), -500, 500, EE_MODEL); } - +#endif break; } #endif diff --git a/radio/src/gui/128x64/model_gvars.cpp b/radio/src/gui/128x64/model_gvars.cpp new file mode 100644 index 000000000..9fc3b5fbc --- /dev/null +++ b/radio/src/gui/128x64/model_gvars.cpp @@ -0,0 +1,115 @@ +/* + * 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" + +void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t flightMode, LcdFlags flags) +{ + FlightModeData * fm = &g_model.flightModeData[flightMode]; + gvar_t & v = fm->gvars[gvar]; + int16_t vmin, vmax; + if (v > GVAR_MAX) { + uint8_t fm = v - GVAR_MAX - 1; + if (fm >= flightMode) fm++; + drawFlightMode(x, y, fm + 1, flags&(~LEFT)); + vmin = GVAR_MAX + 1; + vmax = GVAR_MAX + MAX_FLIGHT_MODES - 1; + } + else { + drawGVarValue(x, y, gvar, v, flags); + vmin = GVAR_MIN + g_model.gvars[gvar].min; + vmax = GVAR_MAX - g_model.gvars[gvar].max; + } + + if (flags & INVERS) { + if (event == EVT_KEY_LONG(KEY_ENTER) && flightMode > 0) { + v = (v > GVAR_MAX ? 0 : GVAR_MAX+1); + storageDirty(EE_MODEL); + } + else if (s_editMode > 0) { + v = checkIncDec(event, v, vmin, vmax, EE_MODEL); + } + } +} + +enum GVarFields { + GVAR_FIELD_NAME, + GVAR_FIELD_UNIT, + GVAR_FIELD_PREC, + GVAR_FIELD_MIN, + GVAR_FIELD_MAX, + GVAR_FIELD_POPUP, + GVAR_FIELD_FM0, + GVAR_FIELD_LAST=GVAR_FIELD_FM0+MAX_FLIGHT_MODES +}; + +#define GVAR_2ND_COLUMN (12*FW) + +void menuModelGVarOne(event_t event) +{ + GVarData * gvar = &g_model.gvars[s_currIdx]; + + drawStringWithIndex(PSIZE(TR_GVARS)*FW+FW, 0, STR_GV, s_currIdx+1, 0); + drawGVarValue(32*FW, 0, s_currIdx, getGVarValue(s_currIdx, getFlightMode())); + lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID); + + SIMPLE_SUBMENU(STR_GVARS, GVAR_FIELD_LAST); + + for (int i=0; i 0 ? BLINK | INVERS : INVERS) : 0); + + switch (k) { + case GVAR_FIELD_NAME: + editSingleName(GVAR_2ND_COLUMN, y, STR_NAME, gvar->name, LEN_GVAR_NAME, event, attr); + break; + + case GVAR_FIELD_UNIT: + gvar->unit = editChoice(GVAR_2ND_COLUMN, y, STR_UNIT, "\001-%", gvar->unit, 0, 1, attr, event); + break; + + case GVAR_FIELD_PREC: + gvar->prec = editChoice(GVAR_2ND_COLUMN, y, STR_PRECISION, STR_VPREC, gvar->prec, 0, 1, attr, event); + break; + + case GVAR_FIELD_MIN: + lcdDrawText(0, y, STR_MIN); + drawGVarValue(GVAR_2ND_COLUMN, y, s_currIdx, GVAR_MIN+gvar->min, LEFT|attr); + if (attr) gvar->min = checkIncDec(event, GVAR_MIN+gvar->min, GVAR_MIN, GVAR_MAX-gvar->max, EE_MODEL) - GVAR_MIN; + break; + + case GVAR_FIELD_MAX: + lcdDrawText(0, y, STR_MAX); + drawGVarValue(GVAR_2ND_COLUMN, y, s_currIdx, GVAR_MAX-gvar->max, LEFT|attr); + if (attr) gvar->max = GVAR_MAX - checkIncDec(event, GVAR_MAX-gvar->max, GVAR_MIN+gvar->min, GVAR_MAX, EE_MODEL); + break; + + case GVAR_FIELD_POPUP: + ON_OFF_MENU_ITEM(gvar->popup, GVAR_2ND_COLUMN, y, STR_POPUP, attr, event); + break; + + default: + drawStringWithIndex(0, y, STR_FP, k-GVAR_FIELD_FM0); + editGVarValue(GVAR_2ND_COLUMN, y, event, s_currIdx, k-GVAR_FIELD_FM0, LEFT|attr); + break; + } + } +} diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 7e3abc5f3..ff921e577 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -634,9 +634,16 @@ void menuMainView(event_t event) warningText = STR_GLOBAL_VAR; drawMessageBox(); lcdDrawSizedText(16, 5*FH, g_model.gvars[gvarLastChanged].name, LEN_GVAR_NAME, ZCHAR); - lcdDrawText(16+7*FW, 5*FH, PSTR("[\010]"), BOLD); - - lcdDrawNumber(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(gvarLastChanged, getGVarFlightMode(mixerCurrentFlightMode, gvarLastChanged)), BOLD); + lcdDrawText(16+6*FW, 5*FH, PSTR("["), BOLD); +#if defined(CPUARM) + drawGVarValue(lcdLastRightPos, 5*FH, gvarLastChanged, GVAR_VALUE(gvarLastChanged, getGVarFlightMode(mixerCurrentFlightMode, gvarLastChanged)), LEFT|BOLD); + if (g_model.gvars[gvarLastChanged].unit) { + lcdDrawText(lcdLastRightPos, 5*FH, "%", BOLD); + } +#else + lcdDrawNumber(lcdLastRightPos, 5*FH, GVAR_VALUE(gvarLastChanged, getGVarFlightMode(mixerCurrentFlightMode, gvarLastChanged)), BOLD); +#endif + lcdDrawText(lcdLastRightPos, 5*FH, PSTR("]"), BOLD); warningText = NULL; } #endif diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 119c08b09..d8a3d0c88 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -70,6 +70,7 @@ set(GUI_SRC model_input_edit.cpp model_mix_edit.cpp model_display.cpp + model_gvars.cpp radio_diagkeys.cpp radio_diaganas.cpp radio_hardware.cpp diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 84fb138a7..70772a75a 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -73,6 +73,7 @@ elseif(PCB STREQUAL X7) set(BITMAPS_TARGET 9x_bitmaps) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) + set(GVAR_SCREEN model_gvars.cpp) elseif(PCB STREQUAL XLITE) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) @@ -88,6 +89,7 @@ elseif(PCB STREQUAL XLITE) set(BITMAPS_TARGET 9x_bitmaps) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) + set(GVAR_SCREEN model_gvars.cpp) endif() if(PCB STREQUAL XLITE)