From 2a64ae372015e61768eda287fb201b4d92575318 Mon Sep 17 00:00:00 2001 From: bsongis Date: Fri, 2 Jan 2015 20:55:57 +0100 Subject: [PATCH] Logical Switches screen splitted for better maintainability ... --- radio/src/Makefile | 7 +- .../Taranis/menu_model_logical_switches.cpp | 286 ++++++++++++++++++ radio/src/gui/menu_model_logical_switches.cpp | 88 +----- 3 files changed, 297 insertions(+), 84 deletions(-) create mode 100755 radio/src/gui/Taranis/menu_model_logical_switches.cpp diff --git a/radio/src/Makefile b/radio/src/Makefile index 096492c3d..c4a132bb8 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -365,7 +365,12 @@ M128_VARIANT = +32768 M2561_VARIANT = +16384 EEPROM_VARIANT = 0 -GUIMODELSRC = gui/menu_model.cpp gui/menu_model_select.cpp gui/menu_model_setup.cpp gui/menu_model_inputs_mixes.cpp gui/menu_model_limits.cpp gui/menu_model_logical_switches.cpp gui/menu_model_custom_functions.cpp gui/menu_model_telemetry.cpp +ifeq ($(PCB), TARANIS) + GUIMODELSRC = gui/menu_model.cpp gui/menu_model_select.cpp gui/menu_model_setup.cpp gui/menu_model_inputs_mixes.cpp gui/menu_model_limits.cpp gui/Taranis/menu_model_logical_switches.cpp gui/menu_model_custom_functions.cpp gui/menu_model_telemetry.cpp +else + GUIMODELSRC = gui/menu_model.cpp gui/menu_model_select.cpp gui/menu_model_setup.cpp gui/menu_model_inputs_mixes.cpp gui/menu_model_limits.cpp gui/menu_model_logical_switches.cpp gui/menu_model_custom_functions.cpp gui/menu_model_telemetry.cpp +endif + GUIGENERALSRC = gui/menu_general.cpp gui/menu_general_setup.cpp gui/menu_general_trainer.cpp gui/menu_general_version.cpp gui/menu_general_diagkeys.cpp gui/menu_general_diaganas.cpp gui/menu_general_calib.cpp ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) diff --git a/radio/src/gui/Taranis/menu_model_logical_switches.cpp b/radio/src/gui/Taranis/menu_model_logical_switches.cpp new file mode 100755 index 000000000..75115093a --- /dev/null +++ b/radio/src/gui/Taranis/menu_model_logical_switches.cpp @@ -0,0 +1,286 @@ +/* + * Authors (alphabetical order) + * - Andre Bernet + * - Andreas Weitl + * - Bertrand Songis + * - Bryan J. Rentoul (Gruvin) + * - Cameron Weeks + * - Erez Raviv + * - Gabriel Birkus + * - Jean-Pierre Parisy + * - Karl Szmutny + * - Michael Blandford + * - Michal Hlavinka + * - Pat Mackenzie + * - Philip Moss + * - Rob Thomson + * - Thomas Husterer + * + * opentx is based on code named + * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, + * er9x by Erez Raviv: http://code.google.com/p/er9x/, + * and the original (and ongoing) project by + * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * + * 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" + +enum LogicalSwitchFields { + LS_FIELD_FUNCTION, + LS_FIELD_V1, + LS_FIELD_V2, + LS_FIELD_V3, + LS_FIELD_ANDSW, + LS_FIELD_DURATION, + LS_FIELD_DELAY, + LS_FIELD_COUNT, + LS_FIELD_LAST = LS_FIELD_COUNT-1 +}; + +#define CSW_1ST_COLUMN (4*FW-3) +#define CSW_2ND_COLUMN (8*FW+2+FW/2) +#define CSW_3RD_COLUMN (14*FW+1+FW/2) +#define CSW_4TH_COLUMN (22*FW) +#define CSW_5TH_COLUMN (26*FW+3) +#define CSW_6TH_COLUMN (31*FW+1) + +#define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL +#define INCDEC_SET_FLAG(f) incdecFlag = (f) +#define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn +#define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) + +void putsEdgeDelayParam(coord_t x, coord_t y, LogicalSwitchData *cs, uint8_t lattr, uint8_t rattr) +{ + lcd_putc(x-4, y, '['); + lcd_outdezAtt(x, y, lswTimerValue(cs->v2), LEFT|PREC1|lattr); + lcd_putc(lcdLastPos, y, ':'); + if (cs->v3 < 0) + lcd_putsAtt(lcdLastPos+3, y, "<<", rattr); + else if (cs->v3 == 0) + lcd_putsAtt(lcdLastPos+3, y, "--", rattr); + else + lcd_outdezAtt(lcdLastPos+3, y, lswTimerValue(cs->v2+cs->v3), LEFT|PREC1|rattr); + lcd_putc(lcdLastPos, y, ']'); +} + +enum ClipboardType { + CLIPBOARD_TYPE_NONE, + CLIPBOARD_TYPE_CUSTOM_SWITCH, + CLIPBOARD_TYPE_CUSTOM_FUNCTION, +}; + +struct Clipboard { + ClipboardType type; + union { + LogicalSwitchData csw; + CustomFunctionData cfn; + } data; +}; + +Clipboard clipboard; + +void onLogicalSwitchesMenu(const char *result) +{ + int8_t sub = m_posVert-1; + LogicalSwitchData * cs = lswAddress(sub); + + if (result == STR_COPY) { + clipboard.type = CLIPBOARD_TYPE_CUSTOM_SWITCH; + clipboard.data.csw = *cs; + } + else if (result == STR_PASTE) { + *cs = clipboard.data.csw; + eeDirty(EE_MODEL); + } + else if (result == STR_CLEAR) { + memset(cs, 0, sizeof(LogicalSwitchData)); + eeDirty(EE_MODEL); + } +} + +void menuModelLogicalSwitches(uint8_t event) +{ + INCDEC_DECLARE_VARS(EE_MODEL); + + MENU(STR_MENULOGICALSWITCHES, menuTabModel, e_LogicalSwitches, NUM_LOGICAL_SWITCH+1, {0, NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/}); + + int k = 0; + int sub = m_posVert - 1; + horzpos_t horz = m_posHorz; + + if (horz>=0) { + displayColumnHeader(STR_CSW_HEADERS, horz); + } + + if (sub>=0 && horz<0 && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) { + killEvents(event); + LogicalSwitchData * cs = lswAddress(sub); + if (cs->func) + MENU_ADD_ITEM(STR_COPY); + if (clipboard.type == CLIPBOARD_TYPE_CUSTOM_SWITCH) + MENU_ADD_ITEM(STR_PASTE); + if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) + MENU_ADD_ITEM(STR_CLEAR); + menuHandler = onLogicalSwitchesMenu; + } + + for (int i=0; i0) ? BLINK|INVERS : INVERS) : 0); + LcdFlags attr1 = (horz==1 ? attr : 0); + LcdFlags attr2 = (horz==2 ? attr : 0); + LogicalSwitchData * cs = lswAddress(k); + + // CSW name + unsigned int sw = SWSRC_SW1+k; + putsSwitches(0, y, sw, (getSwitch(sw) ? BOLD : 0) | ((sub==k && CURSOR_ON_LINE()) ? INVERS : 0)); + + // CSW func + lcd_putsiAtt(CSW_1ST_COLUMN, y, STR_VCSWFUNC, cs->func, horz==0 ? attr : 0); + + // CSW params + unsigned int cstate = lswFamily(cs->func); + int v1_val=cs->v1, v1_min=0, v1_max=MIXSRC_LAST_TELEM, v2_min=0, v2_max=MIXSRC_LAST_TELEM, v3_min=-1, v3_max=100; + + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); + putsSwitches(CSW_3RD_COLUMN, y, cs->v2, attr2); + v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; + v2_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v2_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; + INCDEC_SET_FLAG(EE_MODEL | INCDEC_SWITCH); + INCDEC_ENABLE_CHECK(isSwitchAvailableInLogicalSwitches); + } + else if (cstate == LS_FAMILY_EDGE) { + putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); + putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, attr2, horz==LS_FIELD_V3 ? attr : 0); + v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; + v2_min=-129; v2_max = 122; + v3_max = 222 - cs->v2; + if (horz == 1) { + INCDEC_SET_FLAG(EE_MODEL | INCDEC_SWITCH); + INCDEC_ENABLE_CHECK(isSwitchAvailableInLogicalSwitches); + } + else { + INCDEC_SET_FLAG(EE_MODEL); + INCDEC_ENABLE_CHECK(NULL); + } + } + else if (cstate == LS_FAMILY_COMP) { + v1_val = (uint8_t)cs->v1; + putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); + putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, attr2); + INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); + INCDEC_ENABLE_CHECK(isSourceAvailable); + } + else if (cstate == LS_FAMILY_TIMER) { + lcd_outdezAtt(CSW_2ND_COLUMN, y, lswTimerValue(cs->v1), LEFT|PREC1|attr1); + lcd_outdezAtt(CSW_3RD_COLUMN, y, lswTimerValue(cs->v2), LEFT|PREC1|attr2); + v1_min = v2_min = -128; + v1_max = v2_max = 122; + INCDEC_SET_FLAG(EE_MODEL); + INCDEC_ENABLE_CHECK(NULL); + } + else { + v1_val = (uint8_t)cs->v1; + putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); + if (horz == 1) { + INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); + INCDEC_ENABLE_CHECK(isSourceAvailableInCustomSwitches); + } + else { + INCDEC_SET_FLAG(EE_MODEL); + INCDEC_ENABLE_CHECK(NULL); + } + putsChannelValue(CSW_3RD_COLUMN, y, v1_val, calc100toRESX(cs->v2), LEFT|attr2); + v2_min = -30000; + v2_max = 30000; + } + + // CSW AND switch + putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, horz==LS_FIELD_ANDSW ? attr : 0); + + // CSW duration + if (cs->duration > 0) + lcd_outdezAtt(CSW_5TH_COLUMN, y, cs->duration, (horz==LS_FIELD_DURATION ? attr : 0)|PREC1|LEFT); + else + lcd_putsiAtt(CSW_5TH_COLUMN, y, STR_MMMINV, 0, horz==LS_FIELD_DURATION ? attr : 0); + + // CSW delay + if (cstate == LS_FAMILY_EDGE) { + lcd_puts(CSW_6TH_COLUMN, y, STR_NA); + if (attr && horz == LS_FIELD_DELAY) { + REPEAT_LAST_CURSOR_MOVE(); + } + } + else if (cs->delay > 0) { + lcd_outdezAtt(CSW_6TH_COLUMN, y, cs->delay, (horz==LS_FIELD_DELAY ? attr : 0)|PREC1|LEFT); + } + else { + lcd_putsiAtt(CSW_6TH_COLUMN, y, STR_MMMINV, 0, horz==LS_FIELD_DELAY ? attr : 0); + } + + if (attr && horz == LS_FIELD_V3 && cstate != LS_FAMILY_EDGE) { + REPEAT_LAST_CURSOR_MOVE(); + } + + if ((s_editMode>0 || p1valdiff) && attr) { + switch (horz) { + case LS_FIELD_FUNCTION: + { + cs->func = checkIncDec(event, cs->func, 0, LS_FUNC_MAX, EE_MODEL, isLogicalSwitchFunctionAvailable); + uint8_t new_cstate = lswFamily(cs->func); + if (cstate != new_cstate) { + if (new_cstate == LS_FAMILY_TIMER) { + cs->v1 = cs->v2 = -119; + } + else if (new_cstate == LS_FAMILY_EDGE) { + cs->v1 = 0; cs->v2 = -129; cs->v3 = 0; + } + else { + cs->v1 = cs->v2 = 0; + } + } + break; + } + case LS_FIELD_V1: + cs->v1 = CHECK_INCDEC_PARAM(event, v1_val, v1_min, v1_max); + break; + case LS_FIELD_V2: + cs->v2 = CHECK_INCDEC_PARAM(event, cs->v2, v2_min, v2_max); + if (cstate==LS_FAMILY_OFS && cs->v1!=0 && event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + getvalue_t x = getValue(v1_val); + if (v1_val < MIXSRC_GVAR1) + cs->v2 = calcRESXto100(x); + eeDirty(EE_MODEL); + } + break; + case LS_FIELD_V3: + cs->v3 = CHECK_INCDEC_PARAM(event, cs->v3, v3_min, v3_max); + break; + case LS_FIELD_ANDSW: + INCDEC_SET_FLAG(EE_MODEL | INCDEC_SWITCH); + INCDEC_ENABLE_CHECK(isSwitchAvailableInLogicalSwitches); + cs->andsw = CHECK_INCDEC_PARAM(event, cs->andsw, -MAX_LS_ANDSW, MAX_LS_ANDSW); + break; + case LS_FIELD_DURATION: + CHECK_INCDEC_MODELVAR_ZERO(event, cs->duration, MAX_LS_DURATION); + break; + case LS_FIELD_DELAY: + CHECK_INCDEC_MODELVAR_ZERO(event, cs->delay, MAX_LS_DELAY); + break; + } + } + } +} diff --git a/radio/src/gui/menu_model_logical_switches.cpp b/radio/src/gui/menu_model_logical_switches.cpp index 2e76fe030..cf4f62697 100755 --- a/radio/src/gui/menu_model_logical_switches.cpp +++ b/radio/src/gui/menu_model_logical_switches.cpp @@ -39,9 +39,6 @@ enum LogicalSwitchFields { LS_FIELD_FUNCTION, LS_FIELD_V1, LS_FIELD_V2, -#if defined(PCBTARANIS) - LS_FIELD_V3, -#endif LS_FIELD_ANDSW, #if defined(CPUARM) LS_FIELD_DURATION, @@ -51,19 +48,10 @@ enum LogicalSwitchFields { LS_FIELD_LAST = LS_FIELD_COUNT-1 }; -#if LCD_W >= 212 - #define CSW_1ST_COLUMN (4*FW-3) - #define CSW_2ND_COLUMN (8*FW+2+FW/2) - #define CSW_3RD_COLUMN (14*FW+1+FW/2) - #define CSW_4TH_COLUMN (22*FW) - #define CSW_5TH_COLUMN (26*FW+3) - #define CSW_6TH_COLUMN (31*FW+1) -#else - #define CSW_1ST_COLUMN (4*FW-3) - #define CSW_2ND_COLUMN (8*FW-3) - #define CSW_3RD_COLUMN (13*FW-6) - #define CSW_4TH_COLUMN (18*FW+2) -#endif +#define CSW_1ST_COLUMN (4*FW-3) +#define CSW_2ND_COLUMN (8*FW-3) +#define CSW_3RD_COLUMN (13*FW-6) +#define CSW_4TH_COLUMN (18*FW+2) #if defined(CPUARM) #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL @@ -98,7 +86,7 @@ void putsEdgeDelayParam(coord_t x, coord_t y, LogicalSwitchData *cs, uint8_t lat } #endif -#if defined(CPUARM) && LCD_W < 212 +#if defined(CPUARM) #define CSWONE_2ND_COLUMN (11*FW) @@ -320,43 +308,6 @@ void menuModelLogicalSwitches(uint8_t event) #else -#if defined(PCBTARANIS) -enum ClipboardType { - CLIPBOARD_TYPE_NONE, - CLIPBOARD_TYPE_CUSTOM_SWITCH, - CLIPBOARD_TYPE_CUSTOM_FUNCTION, -}; - -struct Clipboard { - ClipboardType type; - union { - LogicalSwitchData csw; - CustomFunctionData cfn; - } data; -}; - -Clipboard clipboard; - -void onLogicalSwitchesMenu(const char *result) -{ - int8_t sub = m_posVert-1; - LogicalSwitchData * cs = lswAddress(sub); - - if (result == STR_COPY) { - clipboard.type = CLIPBOARD_TYPE_CUSTOM_SWITCH; - clipboard.data.csw = *cs; - } - else if (result == STR_PASTE) { - *cs = clipboard.data.csw; - eeDirty(EE_MODEL); - } - else if (result == STR_CLEAR) { - memset(cs, 0, sizeof(LogicalSwitchData)); - eeDirty(EE_MODEL); - } -} -#endif - void menuModelLogicalSwitches(uint8_t event) { INCDEC_DECLARE_VARS(EE_MODEL); @@ -367,26 +318,6 @@ void menuModelLogicalSwitches(uint8_t event) int8_t sub = m_posVert - 1; horzpos_t horz = m_posHorz; -#if LCD_W >= 212 - if (horz>=0) { - displayColumnHeader(STR_CSW_HEADERS, horz); - } -#endif - -#if defined(PCBTARANIS) - if (sub>=0 && horz<0 && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) { - killEvents(event); - LogicalSwitchData * cs = lswAddress(sub); - if (cs->func) - MENU_ADD_ITEM(STR_COPY); - if (clipboard.type == CLIPBOARD_TYPE_CUSTOM_SWITCH) - MENU_ADD_ITEM(STR_PASTE); - if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) - MENU_ADD_ITEM(STR_CLEAR); - menuHandler = onLogicalSwitchesMenu; - } -#endif - for (uint8_t i=0; iv2 = CHECK_INCDEC_PARAM(event, cs->v2, v2_min, v2_max); if (checkIncDec_Ret) TRACE("v2=%d", cs->v2); -#if defined(PCBTARANIS) - if (cstate==LS_FAMILY_OFS && cs->v1!=0 && event==EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - getvalue_t x = getValue(v1_val); - if (v1_val < MIXSRC_GVAR1) - cs->v2 = calcRESXto100(x); - eeDirty(EE_MODEL); - } -#endif break; #if defined(CPUARM) case LS_FIELD_V3: