diff --git a/display.go b/display.go index 495505e8..f236d906 100644 --- a/display.go +++ b/display.go @@ -53,8 +53,10 @@ func updateDisplay() { nativeInstance.UpdateLabelIfChanged("cloud_status_label", fmt.Sprintf("%d active", actionSessions)) if networkState.IsUp() { + nativeInstance.UISetVar("main_screen", "home_screen") nativeInstance.SwitchToScreenIf("home_screen", []string{"no_network_screen", "boot_screen"}) } else { + nativeInstance.UISetVar("main_screen", "no_network_screen") nativeInstance.SwitchToScreenIf("no_network_screen", []string{"home_screen", "boot_screen"}) } diff --git a/internal/native/display.go b/internal/native/display.go index b92b8731..925a0a10 100644 --- a/internal/native/display.go +++ b/internal/native/display.go @@ -37,6 +37,16 @@ func (n *Native) UIObjShow(objName string) (bool, error) { return uiObjShow(objName) } +// UISetVar sets the variable +func (n *Native) UISetVar(name string, value string) { + uiSetVar(name, value) +} + +// UIGetVar gets the variable +func (n *Native) UIGetVar(name string) string { + return uiGetVar(name) +} + // UIObjSetState clears the state then adds the new state func (n *Native) UIObjSetState(objName string, state string) (bool, error) { return uiObjSetState(objName, state) diff --git a/internal/native/eez/jetkvm.eez-project b/internal/native/eez/jetkvm.eez-project index 81231dec..058410c1 100644 --- a/internal/native/eez/jetkvm.eez-project +++ b/internal/native/eez/jetkvm.eez-project @@ -48,7 +48,7 @@ { "objID": "58af3ebb-96b3-494c-f4e3-9c23852e3e42", "fileName": "actions.c", - "template": "#include \"actions.h\"\n#include \"screens.h\"\n#include \"ui.h\"\n#include \n\nint handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId) {\n lv_event_code_t event_code = lv_event_get_code(e);\n if (event_code != LV_EVENT_GESTURE) {\n return 0;\n }\n\n if (lv_indev_get_gesture_dir(lv_indev_get_act()) != direction) {\n return 0;\n }\n lv_indev_wait_release(lv_indev_get_act());\n loadScreen(screenId);\n return 1;\n}\n\nvoid action_switch_to_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_switch_to_advanced_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_ADVANCED_SCREEN);\n}\n\nvoid action_switch_to_status(lv_event_t *e) {\n loadScreen(SCREEN_ID_STATUS_SCREEN);\n}\n\nvoid action_switch_to_about(lv_event_t *e) {\n loadScreen(SCREEN_ID_ABOUT_SCREEN);\n}\n\nvoid action_switch_to_reset_config(lv_event_t *e) {\n loadScreen(SCREEN_ID_RESET_CONFIG_SCREEN);\n}\n\nvoid action_switch_to_reboot(lv_event_t *e) {\n loadScreen(SCREEN_ID_REBOOT_SCREEN);\n}\n\nvoid action_menu_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_HOME_SCREEN);\n}\n\nvoid action_menu_advanced_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_reset_config_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_home_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_LEFT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_about_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\n// user_data doesn't seem to be working, so we use a global variable here\nstatic uint32_t t_reset_config;\nstatic uint32_t t_reboot;\nconst int RESET_CONFIG_HOLD_TIME = 10;\nconst int REBOOT_HOLD_TIME = 5;\n\nvoid action_reset_config(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reset_config = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = RESET_CONFIG_HOLD_TIME * 1000 - lv_tick_elaps(t_reset_config);\n if (remaining_time <= 0) { \n lv_obj_add_flag(objects.reset_config_button, LV_OBJ_FLAG_HIDDEN);\n lv_obj_clear_flag(objects.reset_config_spinner, LV_OBJ_FLAG_HIDDEN); \n ui_call_rpc_handler(\"resetConfig\", NULL);\n } else {\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reset_config_label, buf);\n }\n }\n}\n\nvoid action_reboot(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reboot = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = REBOOT_HOLD_TIME * 1000 - lv_tick_elaps(t_reboot);\n if (remaining_time <= 0) {\n ui_call_rpc_handler(\"reboot\", NULL);\n } else {\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reboot_label, buf);\n }\n }\n}" + "template": "#include \"actions.h\"\n#include \"screens.h\"\n#include \n#include \"ui.h\"\n#include \"vars.h\"\n\nint handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId) {\n lv_event_code_t event_code = lv_event_get_code(e);\n if (event_code != LV_EVENT_GESTURE) {\n return 0;\n }\n\n if (lv_indev_get_gesture_dir(lv_indev_get_act()) != direction) {\n return 0;\n }\n lv_indev_wait_release(lv_indev_get_act());\n loadScreen(screenId);\n return 1;\n}\n\nvoid handle_gesture_main_screen_switch(lv_event_t *e, lv_dir_t direction) {\n const char *main_screen = get_var_main_screen();\n if (strcmp(main_screen, \"home_screen\") == 0) { \n loadScreen(SCREEN_ID_HOME_SCREEN);\n } else if (strcmp(main_screen, \"no_network_screen\") == 0) {\n loadScreen(SCREEN_ID_NO_NETWORK_SCREEN);\n }\n}\n\nvoid action_switch_to_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_switch_to_advanced_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_ADVANCED_SCREEN);\n}\n\nvoid action_switch_to_status(lv_event_t *e) {\n loadScreen(SCREEN_ID_STATUS_SCREEN);\n}\n\nvoid action_switch_to_about(lv_event_t *e) {\n loadScreen(SCREEN_ID_ABOUT_SCREEN);\n}\n\nvoid action_switch_to_reset_config(lv_event_t *e) {\n loadScreen(SCREEN_ID_RESET_CONFIG_SCREEN);\n}\n\nvoid action_switch_to_reboot(lv_event_t *e) {\n loadScreen(SCREEN_ID_REBOOT_SCREEN);\n}\n\nvoid action_menu_screen_gesture(lv_event_t * e) {\n handle_gesture_main_screen_switch(e, LV_DIR_RIGHT);\n}\n\nvoid action_menu_advanced_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_reset_config_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_home_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_LEFT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_about_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\n// user_data doesn't seem to be working, so we use a global variable here\nstatic uint32_t t_reset_config;\nstatic uint32_t t_reboot;\nstatic bool b_reboot = false;\nstatic bool b_reset_config = false;\nconst int RESET_CONFIG_HOLD_TIME = 10;\nconst int REBOOT_HOLD_TIME = 5;\n\nvoid action_reset_config(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reset_config = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = RESET_CONFIG_HOLD_TIME * 1000 - lv_tick_elaps(t_reset_config);\n if (remaining_time <= 0) { \n lv_obj_add_flag(objects.reset_config_button, LV_OBJ_FLAG_HIDDEN);\n lv_obj_clear_flag(objects.reset_config_spinner, LV_OBJ_FLAG_HIDDEN); \n ui_call_rpc_handler(\"resetConfig\", NULL);\n b_reset_config = true;\n } else {\n b_reset_config = false;\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reset_config_label, buf);\n }\n } else if (event_code == LV_EVENT_RELEASED) {\n if (!b_reset_config) {\n lv_label_set_text(objects.reset_config_label, \"Press and hold for 10 seconds\");\n }\n }\n}\n\nvoid action_reboot(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reboot = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = REBOOT_HOLD_TIME * 1000 - lv_tick_elaps(t_reboot);\n if (remaining_time <= 0) {\n ui_call_rpc_handler(\"reboot\", NULL);\n b_reboot = false;\n } else {\n b_reboot = false;\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reboot_label, buf);\n }\n } else if (event_code == LV_EVENT_RELEASED) {\n if (!b_reboot) {\n lv_label_set_text(objects.reboot_label, \"Press and hold for 5 seconds\");\n }\n }\n}" }, { "objID": "1dbd1b7e-7270-47f0-ee02-e80bdae287cf", @@ -58,7 +58,7 @@ { "objID": "316b04e4-a7de-4afc-c413-31f5f36d3843", "fileName": "vars.c", - "template": "#include \n//${eez-studio LVGL_INCLUDE}\n#include \"vars.h\"\n\nchar app_version[100] = { 0 };\nchar system_version[100] = { 0 };\nchar lvgl_version[32] = { 0 };\n\nconst char *get_var_app_version() {\n return app_version;\n}\n\nconst char *get_var_system_version() {\n return system_version;\n}\n\nconst char *get_var_lvgl_version() {\n if (lvgl_version[0] == '\\0') {\n char buf[32];\n sprintf(buf, \"%d.%d.%d\", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);\n \n \n strncpy(lvgl_version, buf, sizeof(lvgl_version) / sizeof(char));\n app_version[sizeof(lvgl_version) / sizeof(char) - 1] = 0;\n }\n return lvgl_version;\n}\n\nvoid set_var_app_version(const char *value) {\n strncpy(app_version, value, sizeof(app_version) / sizeof(char));\n app_version[sizeof(app_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_system_version(const char *value) {\n strncpy(system_version, value, sizeof(system_version) / sizeof(char));\n system_version[sizeof(system_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_lvgl_version(const char *value) {}" + "template": "#include \n//${eez-studio LVGL_INCLUDE}\n#include \"vars.h\"\n\nchar app_version[100] = { 0 };\nchar system_version[100] = { 0 };\nchar lvgl_version[32] = { 0 };\nchar main_screen[32] = \"home_screen\";\n\nconst char *get_var_app_version() {\n return app_version;\n}\n\nconst char *get_var_system_version() {\n return system_version;\n}\n\nconst char *get_var_lvgl_version() {\n if (lvgl_version[0] == '\\0') {\n char buf[32];\n sprintf(buf, \"%d.%d.%d\", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);\n \n \n strncpy(lvgl_version, buf, sizeof(lvgl_version) / sizeof(char));\n app_version[sizeof(lvgl_version) / sizeof(char) - 1] = 0;\n }\n return lvgl_version;\n}\n\nvoid set_var_app_version(const char *value) {\n strncpy(app_version, value, sizeof(app_version) / sizeof(char));\n app_version[sizeof(app_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_system_version(const char *value) {\n strncpy(system_version, value, sizeof(system_version) / sizeof(char));\n system_version[sizeof(system_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_lvgl_version(const char *value) {}\n\nvoid set_var_main_screen(const char *value) {\n strncpy(main_screen, value, sizeof(main_screen) / sizeof(char));\n main_screen[sizeof(main_screen) / sizeof(char) - 1] = 0;\n}\n\nconst char *get_var_main_screen() {\n return main_screen;\n}" }, { "objID": "cbe7cde1-8920-476a-b2a2-1761ae7451b0", @@ -140,6 +140,14 @@ "defaultValue": "\"\"", "persistent": false, "native": false + }, + { + "objID": "8a98241b-8720-417c-9ffe-6237387dd2fd", + "name": "mainScreen", + "type": "string", + "defaultValue": "false", + "persistent": false, + "native": false } ], "structures": [], @@ -6968,6 +6976,13 @@ "handlerType": "action", "action": "ResetConfig", "userData": 0 + }, + { + "objID": "1db00129-3a48-4fe9-8de4-8fb694a779ee", + "eventName": "RELEASED", + "handlerType": "action", + "action": "ResetConfig", + "userData": 0 } ], "leftUnit": "px", @@ -7608,11 +7623,18 @@ "userData": 0 }, { - "objID": "35cd8033-6cd0-4359-c995-e627dac3815c", + "objID": "3c264f23-8262-4045-f48a-724205f112ca", "eventName": "PRESSING", "handlerType": "action", "action": "Reboot", "userData": 0 + }, + { + "objID": "35cd8033-6cd0-4359-c995-e627dac3815c", + "eventName": "RELEASED", + "handlerType": "action", + "action": "Reboot", + "userData": 0 } ], "leftUnit": "px", diff --git a/internal/native/eez/src/ui/actions.c b/internal/native/eez/src/ui/actions.c index 3deb1f1c..dc30de4d 100644 --- a/internal/native/eez/src/ui/actions.c +++ b/internal/native/eez/src/ui/actions.c @@ -1,7 +1,8 @@ #include "actions.h" #include "screens.h" -#include "ui.h" #include +#include "ui.h" +#include "vars.h" int handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId) { lv_event_code_t event_code = lv_event_get_code(e); @@ -17,6 +18,15 @@ int handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId return 1; } +void handle_gesture_main_screen_switch(lv_event_t *e, lv_dir_t direction) { + const char *main_screen = get_var_main_screen(); + if (strcmp(main_screen, "home_screen") == 0) { + loadScreen(SCREEN_ID_HOME_SCREEN); + } else if (strcmp(main_screen, "no_network_screen") == 0) { + loadScreen(SCREEN_ID_NO_NETWORK_SCREEN); + } +} + void action_switch_to_menu(lv_event_t *e) { loadScreen(SCREEN_ID_MENU_SCREEN); } @@ -42,7 +52,7 @@ void action_switch_to_reboot(lv_event_t *e) { } void action_menu_screen_gesture(lv_event_t * e) { - handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_HOME_SCREEN); + handle_gesture_main_screen_switch(e, LV_DIR_RIGHT); } void action_menu_advanced_screen_gesture(lv_event_t * e) { @@ -64,6 +74,8 @@ void action_about_screen_gesture(lv_event_t * e) { // user_data doesn't seem to be working, so we use a global variable here static uint32_t t_reset_config; static uint32_t t_reboot; +static bool b_reboot = false; +static bool b_reset_config = false; const int RESET_CONFIG_HOLD_TIME = 10; const int REBOOT_HOLD_TIME = 5; @@ -80,7 +92,9 @@ void action_reset_config(lv_event_t * e) { lv_obj_add_flag(objects.reset_config_button, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(objects.reset_config_spinner, LV_OBJ_FLAG_HIDDEN); ui_call_rpc_handler("resetConfig", NULL); + b_reset_config = true; } else { + b_reset_config = false; char buf[100]; int remaining_time_seconds = remaining_time / 1000; if (remaining_time_seconds <= 1) { @@ -89,6 +103,10 @@ void action_reset_config(lv_event_t * e) { sprintf(buf, "Press and hold for %d seconds", remaining_time_seconds); lv_label_set_text(objects.reset_config_label, buf); } + } else if (event_code == LV_EVENT_RELEASED) { + if (!b_reset_config) { + lv_label_set_text(objects.reset_config_label, "Press and hold for 10 seconds"); + } } } @@ -103,7 +121,9 @@ void action_reboot(lv_event_t * e) { int remaining_time = REBOOT_HOLD_TIME * 1000 - lv_tick_elaps(t_reboot); if (remaining_time <= 0) { ui_call_rpc_handler("reboot", NULL); + b_reboot = false; } else { + b_reboot = false; char buf[100]; int remaining_time_seconds = remaining_time / 1000; if (remaining_time_seconds <= 1) { @@ -112,5 +132,9 @@ void action_reboot(lv_event_t * e) { sprintf(buf, "Press and hold for %d seconds", remaining_time_seconds); lv_label_set_text(objects.reboot_label, buf); } + } else if (event_code == LV_EVENT_RELEASED) { + if (!b_reboot) { + lv_label_set_text(objects.reboot_label, "Press and hold for 5 seconds"); + } } } \ No newline at end of file diff --git a/internal/native/eez/src/ui/screens.c b/internal/native/eez/src/ui/screens.c index 9ee7fc60..ce9809ce 100644 --- a/internal/native/eez/src/ui/screens.c +++ b/internal/native/eez/src/ui/screens.c @@ -1905,6 +1905,7 @@ void create_screen_reset_config_screen() { lv_obj_set_size(obj, LV_PCT(100), 50); lv_obj_add_event_cb(obj, action_reset_config, LV_EVENT_PRESSED, (void *)0); lv_obj_add_event_cb(obj, action_reset_config, LV_EVENT_PRESSING, (void *)0); + lv_obj_add_event_cb(obj, action_reset_config, LV_EVENT_RELEASED, (void *)0); lv_obj_set_style_bg_color(obj, lv_color_hex(0xffdc2626), LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_align(obj, LV_TEXT_ALIGN_LEFT, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_pad_right(obj, 13, LV_PART_MAIN | LV_STATE_DEFAULT); @@ -2088,6 +2089,7 @@ void create_screen_reboot_screen() { lv_obj_set_size(obj, LV_PCT(100), 50); lv_obj_add_event_cb(obj, action_reboot, LV_EVENT_PRESSED, (void *)0); lv_obj_add_event_cb(obj, action_reboot, LV_EVENT_PRESSING, (void *)0); + lv_obj_add_event_cb(obj, action_reboot, LV_EVENT_RELEASED, (void *)0); lv_obj_set_style_bg_color(obj, lv_color_hex(0xffdc2626), LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_align(obj, LV_TEXT_ALIGN_LEFT, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_pad_right(obj, 13, LV_PART_MAIN | LV_STATE_DEFAULT); diff --git a/internal/native/eez/src/ui/vars.c b/internal/native/eez/src/ui/vars.c index 7305622a..7d22d7a2 100644 --- a/internal/native/eez/src/ui/vars.c +++ b/internal/native/eez/src/ui/vars.c @@ -5,6 +5,7 @@ char app_version[100] = { 0 }; char system_version[100] = { 0 }; char lvgl_version[32] = { 0 }; +char main_screen[32] = "home_screen"; const char *get_var_app_version() { return app_version; @@ -36,4 +37,13 @@ void set_var_system_version(const char *value) { system_version[sizeof(system_version) / sizeof(char) - 1] = 0; } -void set_var_lvgl_version(const char *value) {} \ No newline at end of file +void set_var_lvgl_version(const char *value) {} + +void set_var_main_screen(const char *value) { + strncpy(main_screen, value, sizeof(main_screen) / sizeof(char)); + main_screen[sizeof(main_screen) / sizeof(char) - 1] = 0; +} + +const char *get_var_main_screen() { + return main_screen; +} \ No newline at end of file diff --git a/internal/native/eez/src/ui/vars.h b/internal/native/eez/src/ui/vars.h index 66be603d..7d9d5890 100644 --- a/internal/native/eez/src/ui/vars.h +++ b/internal/native/eez/src/ui/vars.h @@ -17,7 +17,8 @@ extern "C" { enum FlowGlobalVariables { FLOW_GLOBAL_VARIABLE_APP_VERSION = 0, FLOW_GLOBAL_VARIABLE_SYSTEM_VERSION = 1, - FLOW_GLOBAL_VARIABLE_LVGL_VERSION = 2 + FLOW_GLOBAL_VARIABLE_LVGL_VERSION = 2, + FLOW_GLOBAL_VARIABLE_MAIN_SCREEN = 3 }; // Native global variables @@ -28,6 +29,8 @@ extern const char *get_var_system_version(); extern void set_var_system_version(const char *value); extern const char *get_var_lvgl_version(); extern void set_var_lvgl_version(const char *value); +extern const char *get_var_main_screen(); +extern void set_var_main_screen(const char *value); #ifdef __cplusplus diff --git a/internal/native/lib/libjknative.a b/internal/native/lib/libjknative.a index 2c8a4dde..d3d42118 100644 Binary files a/internal/native/lib/libjknative.a and b/internal/native/lib/libjknative.a differ