diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index b63629edf..7fa177460 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -14,10 +14,14 @@ extern int32_t lcd_encoder; +#define MENU_DEPTH_MAX 4 -menu_record_t menu_stack[MENU_DEPTH_MAX]; +static menu_record_t menu_stack[MENU_DEPTH_MAX]; uint8_t menu_data[MENU_DATA_SIZE]; +#ifndef __AVR__ +#error "menu_data is non-portable to non 8bit processor" +#endif uint8_t menu_depth = 0; @@ -33,6 +37,8 @@ uint8_t menu_leaving = 0; menu_func_t menu_menu = 0; +static_assert(sizeof(menu_data)>= sizeof(menu_data_edit_t),"menu_data_edit_t doesn't fit into menu_data"); + void menu_goto(menu_func_t menu, const uint32_t encoder, const bool feedback, bool reset_menu_state) { @@ -296,15 +302,6 @@ void menu_draw_float13(char chr, const char* str, float val) lcd_printf_P(menu_fmt_float13, chr, str, spaces, val); } -typedef struct -{ - //Variables used when editing values. - const char* editLabel; - void* editValue; - int32_t minEditValue; - int32_t maxEditValue; -} menu_data_edit_t; - void _menu_edit_int3(void) { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); diff --git a/Firmware/menu.h b/Firmware/menu.h index 06c901035..af6f38969 100644 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -4,9 +4,7 @@ #include -#define MENU_DEPTH_MAX 4 #define MENU_DATA_SIZE 32 -#define MENU_DATA_EDIT_SIZE 12 //Function pointer to menu functions. typedef void (*menu_func_t)(void); @@ -17,7 +15,14 @@ typedef struct int8_t position; } menu_record_t; -extern menu_record_t menu_stack[MENU_DEPTH_MAX]; +typedef struct +{ + //Variables used when editing values. + const char* editLabel; + void* editValue; + int32_t minEditValue; + int32_t maxEditValue; +} menu_data_edit_t; extern uint8_t menu_data[MENU_DATA_SIZE]; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index ee81f5a6b..b447f428f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2090,9 +2090,7 @@ static void lcd_support_menu() uint8_t ip[4]; // 4bytes char ip_str[3*4+3+1]; // 16bytes } _menu_data_t; -#if (22 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0 || lcd_draw_update == 2) { @@ -2421,6 +2419,7 @@ static void lcd_menu_AutoLoadFilament() } else { + static_assert(sizeof(menu_data)>=sizeof(ShortTimer), "ShortTimer doesn't fit into menu_data"); ShortTimer* ptimer = (ShortTimer*)&(menu_data[0]); if (!ptimer->running()) ptimer->start(); lcd_set_cursor(0, 0); @@ -2537,9 +2536,7 @@ static void _lcd_move(const char *name, int axis, int min, int max) bool initialized; // 1byte bool endstopsEnabledPrevious; // 1byte } _menu_data_t; -#if (2 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (!_md->initialized) { @@ -2743,9 +2740,7 @@ static void _lcd_babystep(int axis, const char *msg) int babystepMem[3]; // 6bytes float babystepMemMM[3]; // 12bytes } _menu_data_t; -#if (19 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0) { @@ -2826,16 +2821,14 @@ static void lcd_babystep_z() typedef struct { // 12bytes + 9bytes = 21bytes total - uint8_t reserved[MENU_DATA_EDIT_SIZE]; //12 bytes reserved for number editing functions + menu_data_edit_t reserved; //12 bytes reserved for number editing functions int8_t status; // 1byte int16_t left; // 2byte int16_t right; // 2byte int16_t front; // 2byte int16_t rear; // 2byte } _menu_data_adjust_bed_t; -#if (21 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif +static_assert(sizeof(menu_data)>= sizeof(_menu_data_adjust_bed_t),"_menu_data_adjust_bed_t doesn't fit into menu_data"); void lcd_adjust_bed_reset(void) { @@ -5671,16 +5664,14 @@ static void lcd_colorprint_change() { static void lcd_tune_menu() { typedef struct - { // 3bytes total - // To recognize, whether the menu has been just initialized. - int8_t status; // 1byte - // Backup of extrudemultiply, to recognize, that the value has been changed and - // it needs to be applied. - int16_t extrudemultiply; // 2byte + { + menu_data_edit_t reserved; //!< reserved for number editing functions + int8_t status; //!< To recognize, whether the menu has been just initialized. + //! Backup of extrudemultiply, to recognize, that the value has been changed and + //! it needs to be applied. + int16_t extrudemultiply; } _menu_data_t; -#if (3 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0) {