Преглед на файлове

Menu optimalization - SDcard menu - initial implementation for async variant

Robert Pelnar преди 5 години
родител
ревизия
e2ff00b05f
променени са 2 файла, в които са добавени 112 реда и са изтрити 43 реда
  1. 7 2
      Firmware/Marlin.h
  2. 105 41
      Firmware/ultralcd.cpp

+ 7 - 2
Firmware/Marlin.h

@@ -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();
 

+ 105 - 41
Firmware/ultralcd.cpp

@@ -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 {