From a0225ac345009ce4d33d9f3b6f794b67ab7dc15b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Jan 2022 08:24:52 +0100 Subject: [PATCH 1/6] Fix toggle switch --- radio/src/switches.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index ef2cf120e..9d0184cd6 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -123,17 +123,19 @@ void evalFunctionSwitches() g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit } else if (FSWITCH_CONFIG(i) == SWITCH_TOGGLE) { - g_model.functionSwitchLogicalState ^= (physicalState ^ g_model.functionSwitchLogicalState) & (1 << i); // Set bit to switch value + g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit } + if (FSWITCH_GROUP(i) && physicalState == 1) { // switch is in a group, other in group need to be turned off for (uint8_t j = 0; j < NUM_FUNCTIONS_SWITCHES; j++) { - if (i == j) + if (i == j) continue; if (FSWITCH_GROUP(j) == FSWITCH_GROUP(i)) { g_model.functionSwitchLogicalState &= ~(1 << j); // clear state } } } + fsPreviousState ^= 1 << i; // Toggle state storageDirty(EE_MODEL); } From dca0071319eea19b53b65f382b7063f7db199082 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Jan 2022 10:12:55 +0100 Subject: [PATCH 2/6] Add always on group --- radio/src/gui/128x64/model_setup.cpp | 11 +++++++++-- radio/src/myeeprom.h | 1 + radio/src/switches.cpp | 12 +++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 58caf0bb8..25e0a8923 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -266,7 +266,7 @@ inline uint8_t MODULE_SUBTYPE_ROWS(int moduleIdx) #endif #if defined(FUNCTION_SWITCHES) - #define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1), + #define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1), #else #define FUNCTION_SWITCHES_ROWS #endif @@ -620,11 +620,18 @@ void menuModelSetup(event_t event) } config = FSWITCH_GROUP(index); - config = editChoice(30 + 15*FW, y, "", STR_FSGROUPS, config, 0, 3, menuHorizontalPosition == 2 ? attr : 0, event); + config = editChoice(30 + 13*FW, y, "", STR_FSGROUPS, config, 0, 3, menuHorizontalPosition == 2 ? attr : 0, event); if (attr && checkIncDec_Ret && menuHorizontalPosition == 2) { swconfig_t mask = (swconfig_t) 0x03 << (2 * index); g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | ((swconfig_t(config) & 0x03) << (2 * index)); } + + uint8_t groupeAlwaysOn = FSWITCH_GROUP_ON(config); + groupeAlwaysOn = editCheckBox(groupeAlwaysOn, 30 + 15*FW, y, "", menuHorizontalPosition == 3 ? attr : 0, event); + if (attr && checkIncDec_Ret && menuHorizontalPosition == 3) { + swconfig_t mask = (swconfig_t) 0x01 << (2 * NUM_FUNCTIONS_SWITCHES + config); + g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * NUM_FUNCTIONS_SWITCHES + config)); + } break; } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 0fc21a61d..99d5d0b30 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -83,6 +83,7 @@ #if defined(FUNCTION_SWITCHES) #define FSWITCH_CONFIG(x) (bfGet(g_model.functionSwitchConfig, 2*(x), 2)) #define FSWITCH_GROUP(x) (bfGet(g_model.functionSwitchGroup, 2*(x), 2)) + #define FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1)) #define IS_SWITCH_FS(x) (x >= NUM_REGULAR_SWITCHES) #define SWITCH_EXISTS(x) (IS_SWITCH_FS(x) ? true : (FSWITCH_CONFIG(x) != SWITCH_NONE)) #define IS_CONFIG_3POS(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_3POS) : (SWITCH_CONFIG(x) == SWITCH_3POS)) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 9d0184cd6..6e4f299ef 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -119,11 +119,13 @@ void evalFunctionSwitches() uint8_t physicalState = getFSPhysicalState(i); if (physicalState != getFSPreviousPhysicalState(i)) { // FS was moved - if (FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState == 1) { - g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit - } - else if (FSWITCH_CONFIG(i) == SWITCH_TOGGLE) { - g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit + if ((FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState == 1) || (FSWITCH_CONFIG(i) == SWITCH_TOGGLE)) { + if (FSWITCH_GROUP_ON(FSWITCH_GROUP(i)) != 0) { // In an always on group + g_model.functionSwitchLogicalState |= 1 << i; // Set bit + } + else { + g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit + } } if (FSWITCH_GROUP(i) && physicalState == 1) { // switch is in a group, other in group need to be turned off From 2247e6a1e22fdd015193547d77604d8e0b243b13 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Jan 2022 10:55:02 +0100 Subject: [PATCH 3/6] Prevent misbehavior --- radio/src/gui/128x64/model_setup.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 25e0a8923..fb91d85e7 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -620,17 +620,22 @@ void menuModelSetup(event_t event) } config = FSWITCH_GROUP(index); - config = editChoice(30 + 13*FW, y, "", STR_FSGROUPS, config, 0, 3, menuHorizontalPosition == 2 ? attr : 0, event); + config = editChoice(30 + 13 * FW, y, "", STR_FSGROUPS, config, 0, 3, menuHorizontalPosition == 2 ? attr : 0, event); if (attr && checkIncDec_Ret && menuHorizontalPosition == 2) { swconfig_t mask = (swconfig_t) 0x03 << (2 * index); g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | ((swconfig_t(config) & 0x03) << (2 * index)); } - - uint8_t groupeAlwaysOn = FSWITCH_GROUP_ON(config); - groupeAlwaysOn = editCheckBox(groupeAlwaysOn, 30 + 15*FW, y, "", menuHorizontalPosition == 3 ? attr : 0, event); - if (attr && checkIncDec_Ret && menuHorizontalPosition == 3) { - swconfig_t mask = (swconfig_t) 0x01 << (2 * NUM_FUNCTIONS_SWITCHES + config); - g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * NUM_FUNCTIONS_SWITCHES + config)); + + if (FSWITCH_GROUP(index)) { + uint8_t groupeAlwaysOn = FSWITCH_GROUP_ON(config); + groupeAlwaysOn = editCheckBox(groupeAlwaysOn, 30 + 15 * FW, y, "", menuHorizontalPosition == 3 ? attr : 0, event); + if (attr && checkIncDec_Ret && menuHorizontalPosition == 3) { + swconfig_t mask = (swconfig_t) 0x01 << (2 * NUM_FUNCTIONS_SWITCHES + config); + g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * NUM_FUNCTIONS_SWITCHES + config)); + } + } + else if (menuHorizontalPosition == 3 ) { + REPEAT_LAST_CURSOR_MOVE(); } break; } From 2f651e132011d29ce52cad9b36457b26d441fb9c Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Jan 2022 11:15:12 +0100 Subject: [PATCH 4/6] Fix menu glitch --- radio/src/gui/128x64/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index fb91d85e7..80284c578 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -634,7 +634,7 @@ void menuModelSetup(event_t event) g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * NUM_FUNCTIONS_SWITCHES + config)); } } - else if (menuHorizontalPosition == 3 ) { + else if (attr && menuHorizontalPosition == 3 ) { REPEAT_LAST_CURSOR_MOVE(); } break; From a8ded2e15fffc27bc1d45bf2f44af4cb5fc28002 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Jan 2022 15:56:14 +0100 Subject: [PATCH 5/6] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/myeeprom.h | 2 +- radio/src/switches.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 80284c578..3f9b3100d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -627,14 +627,14 @@ void menuModelSetup(event_t event) } if (FSWITCH_GROUP(index)) { - uint8_t groupeAlwaysOn = FSWITCH_GROUP_ON(config); + uint8_t groupeAlwaysOn = IS_FSWITCH_GROUP_ON(config); groupeAlwaysOn = editCheckBox(groupeAlwaysOn, 30 + 15 * FW, y, "", menuHorizontalPosition == 3 ? attr : 0, event); if (attr && checkIncDec_Ret && menuHorizontalPosition == 3) { swconfig_t mask = (swconfig_t) 0x01 << (2 * NUM_FUNCTIONS_SWITCHES + config); g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * NUM_FUNCTIONS_SWITCHES + config)); } } - else if (attr && menuHorizontalPosition == 3 ) { + else if (attr && menuHorizontalPosition == 3) { // Non visible checkbox REPEAT_LAST_CURSOR_MOVE(); } break; diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 99d5d0b30..d1b576fd8 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -83,7 +83,7 @@ #if defined(FUNCTION_SWITCHES) #define FSWITCH_CONFIG(x) (bfGet(g_model.functionSwitchConfig, 2*(x), 2)) #define FSWITCH_GROUP(x) (bfGet(g_model.functionSwitchGroup, 2*(x), 2)) - #define FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1)) + #define IS_FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1)) #define IS_SWITCH_FS(x) (x >= NUM_REGULAR_SWITCHES) #define SWITCH_EXISTS(x) (IS_SWITCH_FS(x) ? true : (FSWITCH_CONFIG(x) != SWITCH_NONE)) #define IS_CONFIG_3POS(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_3POS) : (SWITCH_CONFIG(x) == SWITCH_3POS)) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 6e4f299ef..922387c4c 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -120,7 +120,7 @@ void evalFunctionSwitches() uint8_t physicalState = getFSPhysicalState(i); if (physicalState != getFSPreviousPhysicalState(i)) { // FS was moved if ((FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState == 1) || (FSWITCH_CONFIG(i) == SWITCH_TOGGLE)) { - if (FSWITCH_GROUP_ON(FSWITCH_GROUP(i)) != 0) { // In an always on group + if (IS_FSWITCH_GROUP_ON(FSWITCH_GROUP(i)) != 0) { // In an always on group g_model.functionSwitchLogicalState |= 1 << i; // Set bit } else { From 73643979d4821cc7be5c5d68f4dcb183510274ee Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Jan 2022 15:58:26 +0100 Subject: [PATCH 6/6] Cosmetics --- radio/src/myeeprom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index d1b576fd8..11f6e82e6 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -83,7 +83,7 @@ #if defined(FUNCTION_SWITCHES) #define FSWITCH_CONFIG(x) (bfGet(g_model.functionSwitchConfig, 2*(x), 2)) #define FSWITCH_GROUP(x) (bfGet(g_model.functionSwitchGroup, 2*(x), 2)) - #define IS_FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1)) + #define IS_FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1)) #define IS_SWITCH_FS(x) (x >= NUM_REGULAR_SWITCHES) #define SWITCH_EXISTS(x) (IS_SWITCH_FS(x) ? true : (FSWITCH_CONFIG(x) != SWITCH_NONE)) #define IS_CONFIG_3POS(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_3POS) : (SWITCH_CONFIG(x) == SWITCH_3POS))