Menu optimalization - SDcard menu - initial implementation for async variant

This commit is contained in:
Robert Pelnar 2018-07-09 12:44:19 +02:00
parent bd5b51c7e4
commit e2ff00b05f
2 changed files with 112 additions and 43 deletions

View file

@ -229,13 +229,18 @@ bool IsStopped();
//put an ASCII command at the end of the current buffer.
void enquecommand(const char *cmd, bool from_progmem = false);
//put an ASCII command at the end of the current buffer, read from flash
#define enquecommand_P(cmd) enquecommand(cmd, true)
//put an ASCII command at the begin of the current buffer
void enquecommand_front(const char *cmd, bool from_progmem = false);
//put an ASCII command at the end of the current buffer, read from flash
#define enquecommand_P(cmd) enquecommand(cmd, true)
//put an ASCII command at the begin of the current buffer, read from flash
#define enquecommand_front_P(cmd) enquecommand_front(cmd, true)
void repeatcommand_front();
// Remove all lines from the command queue.
void cmdqueue_reset();

View file

@ -117,6 +117,10 @@ union MenuData
bool initialized;
bool endstopsEnabledPrevious;
} _lcd_moveMenu;
struct sdcard_menu_t
{
uint8_t viewState;
} sdcard_menu;
};
// State of the currently active menu.
@ -295,6 +299,7 @@ static void menu_action_setting_edit_callback_long5(const char* pstr, unsigned l
uint8_t _lineNr = 0;
uint8_t _menuItemNr = 0;
uint8_t _drawLineNr = 0;
bool wasClicked = false;
#define MENU_ITEM(type, label, args...) do { \
@ -468,6 +473,20 @@ void menu_submenu(menuFunc_t submenu)
menuStack.push(currentMenu, encoderPosition);
lcd_goto_menu(submenu);
}
uint8_t menu_item_ret(void)
{
lcd_implementation_quick_feedback();
lcdDrawUpdate = 2;
button_pressed = false;
return 1;
}
uint8_t menu_enc_is_at_item(void)
{
return ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr);
}
/*
int menu_item_printf_P(char type_char, const char* format, ...)
{
@ -490,14 +509,7 @@ int menu_item_printf_P(char type_char, const char* format, ...)
int menu_draw_item_puts_P(char type_char, const char* str)
{
lcd.setCursor(0, _drawLineNr);
// if ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
// lcd.print('>');
// else
// lcd.print(' ');
int cnt = lcd_printf_P(_N("%c%-18S%c"), ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)?'>':' ', str, type_char);
// for (cnt++ < 18; i++)
// lcd.print(' ');
// lcd.print(type_char);
int cnt = lcd_printf_P(_N("%c%-18S%c"), menu_enc_is_at_item()?'>':' ', str, type_char);
return cnt;
}
@ -507,34 +519,26 @@ inline void menu_item_dummy(void)
_menuItemNr++;
}
uint8_t menu_item_ret(void)
{
lcd_implementation_quick_feedback();
lcdDrawUpdate = 2;
button_pressed = false;
return 1;
}
#define MENU_ITEM_TEXT_P(str) if (menu_item_text_P(str)) return
#define MENU_ITEM_TEXT_P(str) do { if (menu_item_text_P(str)) return; } while (0)
uint8_t menu_item_text_P(const char* str)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_draw_item_puts_P(' ', str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
if (wasClicked && menu_enc_is_at_item())
return menu_item_ret();
}
_menuItemNr++;
return 0;
}
#define MENU_ITEM_SUBMENU_P(str, submenu) if (menu_item_submenu_P(str, submenu)) return
#define MENU_ITEM_SUBMENU_P(str, submenu) do { if (menu_item_submenu_P(str, submenu)) return; } while (0)
uint8_t menu_item_submenu_P(const char* str, menuFunc_t submenu)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
if (wasClicked && menu_enc_is_at_item())
{
menuStack.push(currentMenu, encoderPosition);
lcd_goto_menu(submenu, 0, false, true);
@ -545,13 +549,13 @@ uint8_t menu_item_submenu_P(const char* str, menuFunc_t submenu)
return 0;
}
#define MENU_ITEM_BACK_P(str) if (menu_item_back_P(str)) return
#define MENU_ITEM_BACK_P(str) do { if (menu_item_back_P(str)) return; } while (0)
uint8_t menu_item_back_P(const char* str)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_draw_item_puts_P(LCD_STR_UPLEVEL[0], str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
if (wasClicked && menu_enc_is_at_item())
{
MenuStack::Record record = menuStack.pop();
lcd_goto_menu(record.menu, false, true);
@ -563,13 +567,13 @@ uint8_t menu_item_back_P(const char* str)
return 0;
}
#define MENU_ITEM_FUNCTION_P(str, func) if (menu_item_function_P(str, func)) return
#define MENU_ITEM_FUNCTION_P(str, func) do { if (menu_item_function_P(str, func)) return; } while (0)
uint8_t menu_item_function_P(const char* str, menuFunc_t func)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_draw_item_puts_P(' ', str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
if (wasClicked && menu_enc_is_at_item())
{
if (func) func();
return menu_item_ret();
@ -579,13 +583,13 @@ uint8_t menu_item_function_P(const char* str, menuFunc_t func)
return 0;
}
#define MENU_ITEM_GCODE_P(str, str_gcode) if (menu_item_gcode_P(str, str_gcode)) return
#define MENU_ITEM_GCODE_P(str, str_gcode) do { if (menu_item_gcode_P(str, str_gcode)) return; } while (0)
uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
{
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate) menu_draw_item_puts_P(' ', str);
if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr)
if (wasClicked && menu_enc_is_at_item())
{
if (str_gcode) enquecommand_P(str_gcode);
return menu_item_ret();
@ -595,18 +599,76 @@ uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
return 0;
}
//#define MENU_ITEM_SDDIR_P(str, str_fn, str_desc) if (menu_item_sddir_P(str, str_fn, str_desc)) return
#define MENU_ITEM_SDDIR_P(str, str_fn, str_desc) MENU_ITEM(sddirectory, str, str_fn, str_desc)
uint8_t menu_item_sddir_P(const char* str, const char* str_fn, char* str_desc)
//#define MENU_ITEM_SDDIR(str, str_fn, str_fnl) do { if (menu_item_sddir(str, str_fn, str_fnl)) return; } while (0)
#define MENU_ITEM_SDDIR(str, str_fn, str_fnl) MENU_ITEM(sddirectory, str, str_fn, str_fnl)
uint8_t menu_item_sddir(const char* str, const char* str_fn, char* str_fnl)
{
// str_fnl[18] = 0;
// printf_P(_N("menu dir %d '%s' '%s'\n"), _drawLineNr, str_fn, str_fnl);
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate)
{
lcd.setCursor(0, _drawLineNr);
int cnt = lcd_printf_P(_N("%c%c%-18s"), menu_enc_is_at_item()?'>':' ', LCD_STR_FOLDER[0], str_fnl[0]?str_fnl:str_fn);
// int cnt = lcd_printf_P(_N("%c%c%-18s"), menu_enc_is_at_item()?'>':' ', LCD_STR_FOLDER[0], str_fn);
}
if (wasClicked && menu_enc_is_at_item())
{
uint8_t depth = (uint8_t)card.getWorkDirDepth();
strcpy(dir_names[depth], str_fn);
// printf_P(PSTR("%s\n"), dir_names[depth]);
card.chdir(str_fn);
encoderPosition = 0;
return menu_item_ret();
}
}
_menuItemNr++;
return 0;
}
//#define MENU_ITEM_SDFILE_P(str, str_fn, str_desc) if (menu_item_sdfile_P(str, str_fn, str_desc)) return
#define MENU_ITEM_SDFILE_P(str, str_fn, str_desc) MENU_ITEM(sdfile, str, str_fn, str_desc)
uint8_t menu_item_sdfile_P(const char* str, const char* str_fn, char* str_desc)
//#define MENU_ITEM_SDFILE(str, str_fn, str_fnl) do { if (menu_item_sdfile(str, str_fn, str_fnl)) return; } while (0)
#define MENU_ITEM_SDFILE(str, str_fn, str_fnl) MENU_ITEM(sdfile, str, str_fn, str_fnl)
uint8_t menu_item_sdfile(const char* str, const char* str_fn, char* str_fnl)
{
// printf_P(_N("menu sdfile\n"));
// str_fnl[19] = 0;
// printf_P(_N("menu file %d '%s' '%s'\n"), _drawLineNr, str_fn, str_fnl);
if (_menuItemNr == _lineNr)
{
if (lcdDrawUpdate)
{
// printf_P(_N("menu file %d %d '%s'\n"), _drawLineNr, menuData.sdcard_menu.viewState, str_fnl[0]?str_fnl:str_fn);
lcd.setCursor(0, _drawLineNr);
/* if (menu_enc_is_at_item())
{
lcd_printf_P(_N("%c%-19s"), menu_enc_is_at_item()?'>':' ', (str_fnl[0]?str_fnl:str_fn) + 1);
if (menuData.sdcard_menu.viewState == 0)
{
menuData.sdcard_menu.viewState++;
lcd_printf_P(_N("%c%-19s"), menu_enc_is_at_item()?'>':' ', (str_fnl[0]?str_fnl:str_fn) + 1);
}
else if (menuData.sdcard_menu.viewState == 1)
{
lcd_printf_P(_N("%c%-19s"), menu_enc_is_at_item()?'>':' ', (str_fnl[0]?str_fnl:str_fn) + 2);
}
}
else*/
{
str_fnl[19] = 0;
lcd_printf_P(_N("%c%-19s"), menu_enc_is_at_item()?'>':' ', str_fnl[0]?str_fnl:str_fn);
}
// int cnt = lcd_printf_P(_N("%c%-19s"), menu_enc_is_at_item()?'>':' ', str_fnl);
// int cnt = lcd_printf_P(_N("%cTESTIK.gcode"), menu_enc_is_at_item()?'>':' ');
}
if (wasClicked && menu_enc_is_at_item())
{
return menu_item_ret();
}
}
_menuItemNr++;
return 0;
}
@ -4322,11 +4384,11 @@ static void lcd_settings_menu()
#ifdef TMC2130
if(!farm_mode)
{
if (SilentModeMenu == SILENT_MODE_NORMAL) MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_OFF), lcd_silent_mode_set);
if (SilentModeMenu == SILENT_MODE_NORMAL) { MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_OFF), lcd_silent_mode_set); }
else MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_ON), lcd_silent_mode_set);
if (SilentModeMenu == SILENT_MODE_NORMAL)
{
if (CrashDetectMenu == 0) MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_OFF), lcd_crash_mode_set);
if (CrashDetectMenu == 0) { MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_OFF), lcd_crash_mode_set); }
else MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_ON), lcd_crash_mode_set);
}
else MENU_ITEM_SUBMENU_P(_T(MSG_CRASHDETECT_NA), lcd_crash_mode_info);
@ -5648,10 +5710,10 @@ static void lcd_main_menu()
#endif
if (card.filenameIsDir)
{
MENU_ITEM_SDDIR_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDDIR(_T(MSG_CARD_MENU), card.filename, card.longFilename);
} else {
MENU_ITEM_SDFILE_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDFILE(_T(MSG_CARD_MENU), card.filename, card.longFilename);
@ -6059,6 +6121,7 @@ void getFileDescription(char *name, char *description) {
void lcd_sdcard_menu()
{
printf_P(_N("menu sd\n"));
uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT);
int tempScrool = 0;
if (presort_flag == true) {
@ -6070,6 +6133,7 @@ void lcd_sdcard_menu()
return; // nothing to do (so don't thrash the SD card)
uint16_t fileCnt = card.getnrfilenames();
MENU_BEGIN();
MENU_ITEM_BACK_P(_T(MSG_MAIN));
card.getWorkDirName();
@ -6101,9 +6165,9 @@ void lcd_sdcard_menu()
#endif
if (card.filenameIsDir)
MENU_ITEM_SDDIR_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDDIR(_T(MSG_CARD_MENU), card.filename, card.longFilename);
else
MENU_ITEM_SDFILE_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDFILE(_T(MSG_CARD_MENU), card.filename, card.longFilename);
} else {
MENU_ITEM_DUMMY();
}
@ -6163,11 +6227,11 @@ void lcd_sdcard_menu()
#endif
if (card.filenameIsDir)
{
MENU_ITEM_SDDIR_P(_T(MSG_CARD_MENU), card.filename, card.longFilename);
MENU_ITEM_SDDIR(_T(MSG_CARD_MENU), card.filename, card.longFilename);
}
else {
MENU_ITEM_SDFILE_P(_T(MSG_CARD_MENU), card.filename, description[i]);
MENU_ITEM_SDFILE(_T(MSG_CARD_MENU), card.filename, description[i]);
}
}
else {