From d647cdc02c703c7da01d66cd254905bea498de76 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Thu, 29 Aug 2019 20:13:10 +0200 Subject: [PATCH] Convert sheet switcher from sub menu to function. Handle null characters in sheet name. --- Firmware/menu.cpp | 20 ++++++++++++++------ Firmware/menu.h | 4 ++-- Firmware/ultralcd.cpp | 4 +--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 7839bbdc0..1b3830a79 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -203,9 +203,13 @@ void menu_format_sheet_E(const Sheet &sheet_E, SheetFormatBuffer &buffer) void menu_format_sheet_select_E(const Sheet &sheet_E, SheetFormatBuffer &buffer) { uint_least8_t index = sprintf_P(buffer.c,PSTR("%-9.9S["), _T(MSG_SHEET)); - eeprom_read_block(&(buffer.c[index]), sheet_E.name, 7); - buffer.c[index + 7] = ']'; - buffer.c[index + 8] = '\0'; + eeprom_read_block(&(buffer.c[index]), sheet_E.name, sizeof(sheet_E.name)/sizeof(sheet_E.name[0])); + for (const uint_least8_t start = index;index - start < sizeof(sheet_E.name)/sizeof(sheet_E.name[0]);++index) + { + if (buffer.c[index] == '\0') break; + } + buffer.c[index] = ']'; + buffer.c[index + 1] = '\0'; } static void menu_draw_item_select_sheet_E(char type_char, const Sheet &sheet) @@ -290,14 +294,18 @@ uint8_t menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu) return 0; } -uint8_t menu_item_submenu_select_sheet_E(const Sheet &sheet, menu_func_t submenu) +uint8_t menu_item_function_E(const Sheet &sheet, menu_func_t func) { if (menu_item == menu_line) { - if (lcd_draw_update) menu_draw_item_select_sheet_E(LCD_STR_ARROW_RIGHT[0], sheet); + if (lcd_draw_update) menu_draw_item_select_sheet_E(' ', sheet); if (menu_clicked && (lcd_encoder == menu_item)) { - menu_submenu(submenu); + menu_clicked = false; + lcd_consume_click(); + lcd_update_enabled = 0; + if (func) func(); + lcd_update_enabled = 1; return menu_item_ret(); } } diff --git a/Firmware/menu.h b/Firmware/menu.h index d9bbf876c..c07fe9848 100755 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -103,8 +103,8 @@ extern uint8_t menu_item_submenu_P(const char* str, menu_func_t submenu); #define MENU_ITEM_SUBMENU_E(sheet, submenu) do { if (menu_item_submenu_E(sheet, submenu)) return; } while (0) extern uint8_t menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu); -#define MENU_ITEM_SUBMENU_SELECT_SHEET_E(sheet, submenu) do { if (menu_item_submenu_select_sheet_E(sheet, submenu)) return; } while (0) -extern uint8_t menu_item_submenu_select_sheet_E(const Sheet &sheet, menu_func_t submenu); +#define MENU_ITEM_FUNCTION_E(sheet, submenu) do { if (menu_item_function_E(sheet, submenu)) return; } while (0) +extern uint8_t menu_item_function_E(const Sheet &sheet, menu_func_t func); #define MENU_ITEM_BACK_P(str) do { if (menu_item_back_P(str)) return; } while (0) extern uint8_t menu_item_back_P(const char* str); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index b3d202c51..f4fe1ee13 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6536,8 +6536,6 @@ static void change_sheet_from_menu() sheet = next_initialized_sheet(sheet); if (sheet >= 0) eeprom_update_byte(&(EEPROM_Sheets_base->active_sheet), sheet); - - menu_back(); } static void lcd_rename_sheet_menu() @@ -6716,7 +6714,7 @@ static void lcd_main_menu() const int8_t nextSheet = next_initialized_sheet(sheet); if ((nextSheet >= 0) && (sheet != nextSheet)) // show menu only if we have 2 or more sheets initialized { - MENU_ITEM_SUBMENU_SELECT_SHEET_E(EEPROM_Sheets_base->s[sheet], change_sheet_from_menu); + MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], change_sheet_from_menu); } } }