From 749f13417ee591319e3a9a404fdefe0869fe10d1 Mon Sep 17 00:00:00 2001 From: KlausMu Date: Tue, 23 Apr 2024 14:37:16 +0200 Subject: [PATCH] support of "showSpecificGUI" in sceneHandler --- .../src/applicationInternal/gui/guiBase.cpp | 4 +- .../gui/guiMemoryOptimizer.cpp | 56 +++++++------------ .../scenes/sceneHandler.cpp | 37 +++++++----- .../scenes/sceneRegistry.cpp | 41 +++++++------- .../scenes/sceneRegistry.h | 6 +- .../misc/device_smarthome/gui_smarthome.cpp | 2 +- 6 files changed, 70 insertions(+), 76 deletions(-) diff --git a/Platformio/src/applicationInternal/gui/guiBase.cpp b/Platformio/src/applicationInternal/gui/guiBase.cpp index dac2306..50d2933 100644 --- a/Platformio/src/applicationInternal/gui/guiBase.cpp +++ b/Platformio/src/applicationInternal/gui/guiBase.cpp @@ -104,7 +104,7 @@ static void tabview_animation_ready_cb(lv_anim_t* a) { void tabview_tab_changed_event_cb(lv_event_t* e) { if (lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) { - int newTabID = lv_tabview_get_tab_active((lv_obj_t*)lv_event_get_target(e)); + int newTabID = lv_tabview_get_tab_act((lv_obj_t*)lv_event_get_target(e)); // Wait until the animation ended, then call "guis_doTabCreationAfterSliding(newTabID);" // https://forum.lvgl.io/t/delete-a-tab-after-the-tabview-scroll-animation-is-complete/3155/4 @@ -313,7 +313,7 @@ void guis_doTabCreationAfterSliding(int newTabID) { gui_memoryOptimizer_afterSliding(&tabview, &panel, &img1, &img2, newTabID); doLogMemoryUsage(); } -// 3. after gui list has changed (called by handleScene()), when switching between main_gui_list and scene specific list +// 3. after gui list has changed (called by handleScene()), when switching between main_gui_list and scene specific list. Will show first GUi in list void guis_doTabCreationAfterGUIlistChanged(GUIlists newGUIlist) { gui_memoryOptimizer_afterGUIlistChanged(&tabview, &panel, &img1, &img2, newGUIlist); doLogMemoryUsage(); diff --git a/Platformio/src/applicationInternal/gui/guiMemoryOptimizer.cpp b/Platformio/src/applicationInternal/gui/guiMemoryOptimizer.cpp index 718377b..b8fa535 100644 --- a/Platformio/src/applicationInternal/gui/guiMemoryOptimizer.cpp +++ b/Platformio/src/applicationInternal/gui/guiMemoryOptimizer.cpp @@ -168,8 +168,8 @@ lv_obj_t* create_panel() { std::string get_name_of_gui_to_be_shown(int index) { if (index == -1) { return ""; - } else if (index <= get_gui_list_active()->size() -1) { - return get_gui_list_active()->at(index); + } else if (index <= get_gui_list_active_withFallback()->size() -1) { + return get_gui_list_active_withFallback()->at(index); } else { return ""; } @@ -210,10 +210,10 @@ void setGUIlistIndicesToBeShown_forSpecificGUIlistIndex(int gui_list_index, t_gu Serial.printf(" GUIlistIndices: will resume at specific index with \"first state\"\r\n"); gui_state->gui_on_tab[0] = {NULL, "", 0}; // take care if there is only one gui in list - gui_state->gui_on_tab[1] = {NULL, "", get_gui_list_active()->size() >= 2 ? 1 : -1}; + gui_state->gui_on_tab[1] = {NULL, "", get_gui_list_active_withFallback()->size() >= 2 ? 1 : -1}; gui_state->gui_on_tab[2] = {NULL, "", -1}; gui_state->activeTabID = 0; - } else if (gui_list_index == get_gui_list_active()->size() -1) { + } else if (gui_list_index == get_gui_list_active_withFallback()->size() -1) { // last state Serial.printf(" GUIlistIndices: will resume at specific index with \"last state\"\r\n"); gui_state->gui_on_tab[0] = {NULL, "", gui_list_index -1}; @@ -233,9 +233,9 @@ void setGUIlistIndicesToBeShown_forSpecificGUIlistIndex(int gui_list_index, t_gu void setGUIlistIndicesToBeShown_forFirstGUIinGUIlist(t_gui_state *gui_state) { Serial.printf(" GUIlistIndices: will show the first gui from \"gui_list\" as initial state\r\n"); // take care if there is no gui in list - gui_state->gui_on_tab[0] = {NULL, "", get_gui_list_active()->size() != 0 ? 0 : -1}; + gui_state->gui_on_tab[0] = {NULL, "", get_gui_list_active_withFallback()->size() != 0 ? 0 : -1}; // take care if there is only one gui in list - gui_state->gui_on_tab[1] = {NULL, "", get_gui_list_active()->size() >= 2 ? 1 : -1}; + gui_state->gui_on_tab[1] = {NULL, "", get_gui_list_active_withFallback()->size() >= 2 ? 1 : -1}; gui_state->gui_on_tab[2] = {NULL, "", -1}; gui_state->activeTabID = 0; } @@ -268,7 +268,7 @@ void setGUIlistIndicesToBeShown_afterSlide(t_gui_state *gui_state) { } else { oldListIndex = gui_state->gui_on_tab[1].gui_list_index_previous; } - if (oldListIndex == get_gui_list_active()->size() -2) { + if (oldListIndex == get_gui_list_active_withFallback()->size() -2) { // next state is the "last state" gui_state->gui_on_tab[0] = {NULL, "", oldListIndex}; gui_state->gui_on_tab[1] = {NULL, "", oldListIndex +1}; @@ -292,8 +292,8 @@ void doTabCreation_strategyMax3(lv_obj_t* tabview, t_gui_state *gui_state) { create_new_tab(tabview, &gui_state->gui_on_tab[i]); } - if (get_gui_list_active()->size() > 0) { - std::string nameOfNewActiveTab = get_gui_list_active()->at(gui_state->gui_on_tab[gui_state->activeTabID].gui_list_index); + if (get_gui_list_active_withFallback()->size() > 0) { + std::string nameOfNewActiveTab = get_gui_list_active_withFallback()->at(gui_state->gui_on_tab[gui_state->activeTabID].gui_list_index); Serial.printf(" New visible tab is \"%s\"\r\n", nameOfNewActiveTab.c_str()); // set active tab @@ -305,24 +305,10 @@ void doTabCreation_strategyMax3(lv_obj_t* tabview, t_gui_state *gui_state) { LV_IMG_DECLARE(gradientLeft); LV_IMG_DECLARE(gradientRight); -void getBreadcrumpPosition(uint8_t* breadcrumpPosition, std::string nameOfGUI) { - *breadcrumpPosition = 0; - - gui_list gui_list_active = get_gui_list_active(); - uint8_t counter = 0; - for (std::vector::iterator it = gui_list_active->begin() ; it != gui_list_active->end(); ++it) { - counter++; - if (*it == nameOfGUI) { - *breadcrumpPosition = counter; - return; - } - } -} - void fillPanelWithPageIndicator_strategyMax3(lv_obj_t* panel, lv_obj_t* img1, lv_obj_t* img2, t_gui_state *gui_state) { Serial.printf(" Will fill panel with page indicators\r\n"); - if (get_gui_list_active()->size() == 0) { + if (get_gui_list_active_withFallback()->size() == 0) { Serial.printf(" no tab available, so no page indicators\r\n"); // at least add the style lv_obj_add_style(panel, &panel_style, 0); @@ -362,9 +348,9 @@ void fillPanelWithPageIndicator_strategyMax3(lv_obj_t* panel, lv_obj_t* img1, lv uint8_t breadcrumpDotSize = 8; // should be an even number uint8_t breadcrumpDotDistance = 2; // should be an even number - uint8_t breadcrumpMainGuiListLength = get_gui_list(MAIN_GUI_LIST)->size(); + uint8_t breadcrumpMainGuiListLength = get_gui_list_withFallback(MAIN_GUI_LIST)->size(); int8_t breadcrumpMainGuiListStartPositionX = (-1) * (breadcrumpMainGuiListLength -1) * (breadcrumpDotSize + breadcrumpDotDistance) / 2; - uint8_t breadcrumpSceneGuiListLength = get_gui_list(SCENE_GUI_LIST)->size(); + uint8_t breadcrumpSceneGuiListLength = get_gui_list_withFallback(SCENE_GUI_LIST)->size(); int8_t breadcrumpSceneGuiListStartPositionX = (-1) * (breadcrumpSceneGuiListLength -1) * (breadcrumpDotSize + breadcrumpDotDistance) / 2; #if (USE_SCENE_SPECIFIC_GUI_LIST != 0) bool show_scene_gui_list = get_scene_has_gui_list(gui_memoryOptimizer_getActiveSceneName()); @@ -389,11 +375,11 @@ void fillPanelWithPageIndicator_strategyMax3(lv_obj_t* panel, lv_obj_t* img1, lv for (int i=0; i<3; i++) { if (gui_state->gui_on_tab[i].gui_list_index != -1) { nameOfGUI = gui_state->gui_on_tab[i].GUIname; - getBreadcrumpPosition(&breadcrumpPosition, nameOfGUI); + breadcrumpPosition = gui_state->gui_on_tab[i].gui_list_index +1; // Create actual buttons for every tab lv_obj_t* btn = lv_btn_create(panel); - if (nameOfGUI == gui_memoryOptimizer_getActiveGUIname()) { + if (i == gui_state->activeTabID) { // only if this is the button for the currently active tab, make it clickable to get to scene selection gui lv_obj_add_flag(btn, LV_OBJ_FLAG_CLICKABLE); lv_obj_set_user_data(btn,(void *)(intptr_t)2); @@ -484,8 +470,8 @@ void fillPanelWithPageIndicator_strategyMax3(lv_obj_t* panel, lv_obj_t* img1, lv btn = lv_btn_create(panel); lv_obj_clear_flag(btn, LV_OBJ_FLAG_CLICKABLE); lv_obj_set_size(btn, 150, lv_pct(100)); - // 4 at last position 4 at middle position only one tab available overall - if ((gui_state->gui_on_tab[2].gui_list_index == get_gui_list_active()->size()-1) || (gui_state->gui_on_tab[1].gui_list_index == get_gui_list_active()->size()-1) || (gui_state->gui_on_tab[1].gui_list_index == -1)) { + // 4 at last position 4 at middle position only one tab available overall + if ((gui_state->gui_on_tab[2].gui_list_index == get_gui_list_active_withFallback()->size()-1) || (gui_state->gui_on_tab[1].gui_list_index == get_gui_list_active_withFallback()->size()-1) || (gui_state->gui_on_tab[1].gui_list_index == -1)) { lv_obj_set_style_bg_color(btn, lv_color_black(), LV_PART_MAIN); } else { lv_obj_set_style_bg_color(btn, color_primary, LV_PART_MAIN); @@ -555,8 +541,8 @@ void gui_memoryOptimizer_onStartup(lv_obj_t** tabview, lv_obj_t** panel, lv_obj_ // 1. find last used gui int gui_list_index = -1; // find index of gui_memoryOptimizer_getActiveGUIname() in gui_list_active - for (int i=0; isize(); i++) { - if (get_gui_list_active()->at(i) == gui_memoryOptimizer_getActiveGUIname()) { + for (int i=0; isize(); i++) { + if (get_gui_list_active_withFallback()->at(i) == gui_memoryOptimizer_getActiveGUIname()) { Serial.printf("Startup: found GUI with name \"%s\" in \"gui_list_active\" at position %d\r\n", gui_memoryOptimizer_getActiveGUIname().c_str(), i); gui_list_index = i; break; @@ -564,7 +550,7 @@ void gui_memoryOptimizer_onStartup(lv_obj_t** tabview, lv_obj_t** panel, lv_obj_ } // 2. set gui_list_indices and the tab to be activated - if ((gui_list_index >= 0) && (gui_list_index < get_gui_list_active()->size())) { + if ((gui_list_index >= 0) && (gui_list_index < get_gui_list_active_withFallback()->size())) { // gui was found setGUIlistIndicesToBeShown_forSpecificGUIlistIndex(gui_list_index, &gui_state); @@ -619,7 +605,7 @@ void gui_memoryOptimizer_afterSliding(lv_obj_t** tabview, lv_obj_t** panel, lv_o } -// 3. after gui list has changed (called by handleScene()), when switching between main_gui_list and scene specific list +// 3. after gui list has changed (called by handleScene()), when switching between main_gui_list and scene specific list. Will show first GUi in list void gui_memoryOptimizer_afterGUIlistChanged(lv_obj_t** tabview, lv_obj_t** panel, lv_obj_t** img1, lv_obj_t** img2, GUIlists newGUIlist) { Serial.printf("--- Will change to new gui_list\r\n"); @@ -646,7 +632,7 @@ void gui_memoryOptimizer_navigateToGUI(lv_obj_t** tabview, lv_obj_t** panel, lv_ Serial.printf("--- Will navigate to specific GUI\r\n"); - if ( !((gui_list_index >= 0) && (gui_list_index < get_gui_list(GUIlist)->size()))) { + if ( !((gui_list_index >= 0) && (gui_list_index < get_gui_list_withFallback(GUIlist)->size()))) { Serial.printf(" cannot navigate to GUI because gui_list_index \"%d\" is out of range\r\n", gui_list_index); return; } diff --git a/Platformio/src/applicationInternal/scenes/sceneHandler.cpp b/Platformio/src/applicationInternal/scenes/sceneHandler.cpp index 8ea033c..3e77910 100644 --- a/Platformio/src/applicationInternal/scenes/sceneHandler.cpp +++ b/Platformio/src/applicationInternal/scenes/sceneHandler.cpp @@ -5,6 +5,7 @@ #include "applicationInternal/scenes/sceneRegistry.h" #include "applicationInternal/hardware/hardwarePresenter.h" #include "applicationInternal/commandHandler.h" +#include "guis/gui_sceneSelection.h" #include "scenes/scene__default.h" void setLabelActiveScene() { @@ -13,7 +14,7 @@ void setLabelActiveScene() { } } -void navigateBackToSceneGUIlist(); +void showSpecificGUI(GUIlists GUIlist, std::string GUIname); void handleScene(uint16_t command, commandData commandData, std::string additionalPayload = "") { @@ -23,7 +24,7 @@ void handleScene(uint16_t command, commandData commandData, std::string addition // --- do not switch scene, but show scene selection gui. From that on, we are in the main_gui_list. ---------------- if (scene_name == scene_name_selection) { Serial.println("scene: will show scene selection gui"); - guis_doTabCreationAfterGUIlistChanged(MAIN_GUI_LIST); + showSpecificGUI(MAIN_GUI_LIST, tabName_sceneSelection); return; } @@ -127,30 +128,38 @@ void handleScene(uint16_t command, commandData commandData, std::string addition guis_doTabCreationAfterGUIlistChanged(SCENE_GUI_LIST); } -void handleGUI(uint16_t command, commandData commandData, std::string additionalPayload = "") { +void showSpecificGUI(GUIlists GUIlist, std::string GUIname) { + gui_list gui_list_for_search = get_gui_list_withFallback(GUIlist); - auto current = commandData.commandPayloads.begin(); - std::string GUIname = *current; - - // 1. check if the gui is known in the main_gui_list + // 1. search for gui in the gui list int gui_list_index = -1; - // find index of gui_memoryOptimizer_getActiveGUIname() in gui_list_active - for (int i=0; i < main_gui_list.size(); i++) { - if (main_gui_list.at(i) == GUIname) { - Serial.printf("handleGUI: found GUI with name \"%s\" in \"main_gui_list\" at position %d\r\n", GUIname.c_str(), i); + for (int i=0; i < gui_list_for_search->size(); i++) { + if (gui_list_for_search->at(i) == GUIname) { + Serial.printf("showSpecificGUI: found GUI with name \"%s\" in %s at position %d\r\n", GUIname.c_str(), GUIlist == MAIN_GUI_LIST ? "\"main_gui_list\"" : "\"scene gui list\"", i); gui_list_index = i; break; } } // 2. call guiBase.cpp - if ((gui_list_index >= 0) && (gui_list_index < main_gui_list.size())) { - guis_doTabCreationForSpecificGUI(MAIN_GUI_LIST, gui_list_index); + if ((gui_list_index >= 0) && (gui_list_index < gui_list_for_search->size())) { + guis_doTabCreationForSpecificGUI(GUIlist, gui_list_index); } else { // gui was not found - Serial.printf("handleGUI: GUI with name \"%s\" was not found. Cannot navigate to that GUI\r\n", GUIname.c_str()); + Serial.printf("showSpecificGUI: GUI with name \"%s\" was not found in gui list %s. Cannot navigate to that GUI\r\n", GUIname.c_str(), GUIlist == MAIN_GUI_LIST ? "\"main_gui_list\"" : "\"scene gui list\""); return; } +} + +void handleGUI(uint16_t command, commandData commandData, std::string additionalPayload = "") { + + auto current = commandData.commandPayloads.begin(); + GUIlists GUIlist = (GUIlists)std::stoi(*current); + + current = std::next(current, 1); + std::string GUIname = *current; + + showSpecificGUI(GUIlist, GUIname); } diff --git a/Platformio/src/applicationInternal/scenes/sceneRegistry.cpp b/Platformio/src/applicationInternal/scenes/sceneRegistry.cpp index 53c8f5b..74f354e 100644 --- a/Platformio/src/applicationInternal/scenes/sceneRegistry.cpp +++ b/Platformio/src/applicationInternal/scenes/sceneRegistry.cpp @@ -183,11 +183,10 @@ uint16_t get_command_long(std::string sceneName, char keyChar) { } -gui_list get_gui_list(GUIlists gui_list) { +gui_list get_gui_list_withFallback(GUIlists gui_list) { try { - // If gui_list == MAIN_GUI_LIST, then we are in the main_gui_list, either if a scene is active or not. - // If gui_list == SCENE_GUI_LIST, then a scene is active and we are not in the main_gui_list (with the scene selector as first gui). - // In that case, we try to use the scene specific gui list, if the scene defined one. + // If gui_list == MAIN_GUI_LIST, then we want the main_gui_list, either if a scene is active or not. + // If gui_list == SCENE_GUI_LIST, then we want the scene gui list. If none is defined, return main_gui_list as fallback. if (gui_list == MAIN_GUI_LIST) { return &main_gui_list; @@ -214,8 +213,23 @@ gui_list get_gui_list(GUIlists gui_list) { } } -gui_list get_gui_list_active() { - return get_gui_list(gui_memoryOptimizer_getActiveGUIlist()); +gui_list get_gui_list_active_withFallback() { + return get_gui_list_withFallback(gui_memoryOptimizer_getActiveGUIlist()); +} + +bool get_scene_has_gui_list(std::string sceneName) { + try { + // look if the scene is known + if ((registered_scenes.count(sceneName) > 0)) { + return (registered_scenes.at(sceneName).this_gui_list != NULL); + } else { + return false; + } + } + catch (const std::out_of_range& oor) { + Serial.printf("get_scene_has_gui_list: internal error, sceneName not registered\r\n"); + return false; + } } uint16_t get_activate_scene_command(std::string sceneName) { @@ -239,21 +253,6 @@ uint16_t get_activate_scene_command(std::string sceneName) { } -bool get_scene_has_gui_list(std::string sceneName) { - try { - // look if the scene is known - if ((registered_scenes.count(sceneName) > 0)) { - return (registered_scenes.at(sceneName).this_gui_list != NULL); - } else { - return false; - } - } - catch (const std::out_of_range& oor) { - Serial.printf("get_scene_has_gui_list: internal error, sceneName not registered\r\n"); - return false; - } -} - scene_list get_scenes_on_sceneSelectionGUI() { return &scenes_on_sceneSelectionGUI; } diff --git a/Platformio/src/applicationInternal/scenes/sceneRegistry.h b/Platformio/src/applicationInternal/scenes/sceneRegistry.h index 06c3d64..a89d43e 100644 --- a/Platformio/src/applicationInternal/scenes/sceneRegistry.h +++ b/Platformio/src/applicationInternal/scenes/sceneRegistry.h @@ -31,10 +31,10 @@ void scene_end_sequence_from_registry(std::string sceneName); repeatModes get_key_repeatMode(std::string sceneName, char keyChar); uint16_t get_command_short(std::string sceneName, char keyChar); uint16_t get_command_long(std::string sceneName, char keyChar); -gui_list get_gui_list(GUIlists gui_list); -gui_list get_gui_list_active(); -uint16_t get_activate_scene_command(std::string sceneName); +gui_list get_gui_list_withFallback(GUIlists gui_list); +gui_list get_gui_list_active_withFallback(); bool get_scene_has_gui_list(std::string sceneName); +uint16_t get_activate_scene_command(std::string sceneName); scene_list get_scenes_on_sceneSelectionGUI(); void set_scenes_on_sceneSelectionGUI(t_scene_list a_scene_list); diff --git a/Platformio/src/devices/misc/device_smarthome/gui_smarthome.cpp b/Platformio/src/devices/misc/device_smarthome/gui_smarthome.cpp index 90a072d..f736070 100644 --- a/Platformio/src/devices/misc/device_smarthome/gui_smarthome.cpp +++ b/Platformio/src/devices/misc/device_smarthome/gui_smarthome.cpp @@ -184,5 +184,5 @@ void register_gui_smarthome(void){ & key_commands_long_smarthome ); - register_command(&GUI_SMARTHOME_ACTIVATE, makeCommandData(GUI, {std::string(tabName_smarthome)})); + register_command(&GUI_SMARTHOME_ACTIVATE, makeCommandData(GUI, {std::to_string(MAIN_GUI_LIST), std::string(tabName_smarthome)})); }