From ee5dda4a33dee716e302c82599c19461bfae78db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sun, 16 May 2021 20:34:09 +0200 Subject: [PATCH] Issue #25: Add update menu to GUI --- stm-firmware/ui/gui.c | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/stm-firmware/ui/gui.c b/stm-firmware/ui/gui.c index aa98ae8..5b79eb3 100644 --- a/stm-firmware/ui/gui.c +++ b/stm-firmware/ui/gui.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -607,6 +608,84 @@ static void gui_menu_constant_temperature_driver_setup(struct lcd_menu *menu, en } } +static void gui_update_firmware(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void *parent) +{ + static void *my_parent; + static SlList *file_list = NULL; + static int error; + enum button_state button; + static uint32_t currently_selected_file; + uint32_t previously_selected_file; + static uint32_t list_length; + const char *fname; + int16_t rotary; + + if (entry_type == MENU_ENTRY_FIRST_ENTER) { + my_parent = parent; + error = 0; + list_length = 0; + if (file_list) + sl_list_free_full(file_list, delete_file_list_entry); + file_list = load_file_list_from_sdcard(&error, "*.hex"); + if (error) { + if (file_list) + sl_list_free_full(file_list, delete_file_list_entry); + file_list = NULL; + } else { + list_length = sl_list_length(file_list); + } + currently_selected_file = 0; + menu_display_clear(menu); + } + + if (menu_get_button_ready_state(menu)) { + button = menu_get_button_state(menu); + rotary = menu_get_rotary_delta(menu); + + if (error) { + menu_lcd_output(menu, 0, "Error reading"); + menu_lcd_output(menu, 1, "file list"); + if (button == BUTTON_LONG || button == BUTTON_SHORT_RELEASED) + menu_entry_dropback(menu, my_parent); + } else { + previously_selected_file = currently_selected_file; + + /* Display the list */ + if (rotary <= -4) { + menu_ack_rotary_delta(menu); + if (currently_selected_file > 0) { + currently_selected_file--; + } + } else if (rotary >= 4) { + menu_ack_rotary_delta(menu); + if (currently_selected_file < (list_length - 1)) { + currently_selected_file++; + } + } + + if (entry_type == MENU_ENTRY_FIRST_ENTER || + previously_selected_file != currently_selected_file) { + fname = sl_list_nth(file_list, currently_selected_file)->data; + menu_lcd_output(menu, 0, "Select File:"); + if (fname) + menu_lcd_output(menu, 1, fname); + } + if (button == BUTTON_SHORT_RELEASED) { + fname = sl_list_nth(file_list, currently_selected_file)->data; + menu_display_clear(menu); + sl_list_free_full(file_list, delete_file_list_entry); + file_list = NULL; + + updater_update_from_file(fname); + } else if (button == BUTTON_LONG) { + sl_list_free_full(file_list, delete_file_list_entry); + file_list = NULL; + menu_entry_dropback(menu, my_parent); + } + } + } +} + static void gui_menu_root_entry(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void *parent) { (void)parent; @@ -618,6 +697,7 @@ static void gui_menu_root_entry(struct lcd_menu *menu, enum menu_entry_func_entr "Monitoring", "Error Flags", "About", + "Update", NULL }; static const menu_func_t root_entry_funcs[] = { @@ -626,6 +706,7 @@ static void gui_menu_root_entry(struct lcd_menu *menu, enum menu_entry_func_entr gui_menu_monitor, gui_menu_err_flags, gui_menu_about, + gui_update_firmware, }; enum button_state push_button; int16_t rot_delta; -- 2.47.0