diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 78b870c5d0..77ab6749ed 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -277,8 +277,8 @@ uint16_t max_display_update_time = 0; #if ENABLED(SDSUPPORT) void lcd_sdcard_menu(); - void menu_action_sdfile(const char* filename, char* longFilename); - void menu_action_sddirectory(const char* filename, char* longFilename); + void menu_action_sdfile(CardReader &theCard); + void menu_action_sddirectory(CardReader &theCard); #endif //////////////////////////////////////////// @@ -768,7 +768,7 @@ void lcd_reset_status() { msg = paused; #if ENABLED(SDSUPPORT) else if (card.sdprinting) - return lcd_setstatus(card.longFilename[0] ? card.longFilename : card.filename, true); + return lcd_setstatus(card.longest_filename(), true); #endif else if (print_job_timer.isRunning()) msg = printing; @@ -1002,9 +1002,9 @@ void lcd_quick_feedback(const bool clear_buttons) { bar_percent = constrain(bar_percent, 0, 100); encoderPosition = 0; lcd_implementation_drawmenu_static(0, PSTR(MSG_PROGRESS_BAR_TEST), true, true); - lcd.setCursor((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2); - lcd.print(itostr3(bar_percent)); lcd.write('%'); - lcd.setCursor(0, LCD_HEIGHT - 1); lcd_draw_progress_bar(bar_percent); + lcd_moveto((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2); + lcd_put_u8str(int(bar_percent)); lcd_put_wchar('%'); + lcd_moveto(0, LCD_HEIGHT - 1); lcd_draw_progress_bar(bar_percent); } void _progress_bar_test() { @@ -2938,7 +2938,7 @@ void lcd_quick_feedback(const bool clear_buttons) { destination[manual_move_axis] += manual_move_offset; // Reset for the next move - manual_move_offset = 0.0; + manual_move_offset = 0; manual_move_axis = (int8_t)NO_AXIS; // DELTA and SCARA machines use segmented moves, which could fill the planner during the call to @@ -4042,9 +4042,9 @@ void lcd_quick_feedback(const bool clear_buttons) { #endif if (card.filenameIsDir) - MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename); + MENU_ITEM(sddirectory, MSG_CARD_MENU, card); else - MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename); + MENU_ITEM(sdfile, MSG_CARD_MENU, card); } else { MENU_ITEM_DUMMY(); @@ -4965,19 +4965,17 @@ void lcd_quick_feedback(const bool clear_buttons) { #if ENABLED(SDSUPPORT) - void menu_action_sdfile(const char* filename, char* longFilename) { + void menu_action_sdfile(CardReader &theCard) { #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) last_sdfile_encoderPosition = encoderPosition; // Save which file was selected for later use #endif - UNUSED(longFilename); - card.openAndPrintFile(filename); + card.openAndPrintFile(theCard.filename); lcd_return_to_status(); lcd_reset_status(); } - void menu_action_sddirectory(const char* filename, char* longFilename) { - UNUSED(longFilename); - card.chdir(filename); + void menu_action_sddirectory(CardReader &theCard) { + card.chdir(theCard.filename); encoderTopLine = 0; encoderPosition = 2 * ENCODER_STEPS_PER_MENU_ITEM; screen_changed = true; diff --git a/Marlin/src/lcd/ultralcd_impl_DOGM.h b/Marlin/src/lcd/ultralcd_impl_DOGM.h index 1cba49b4b2..f624afab11 100644 --- a/Marlin/src/lcd/ultralcd_impl_DOGM.h +++ b/Marlin/src/lcd/ultralcd_impl_DOGM.h @@ -518,7 +518,7 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop #if ENABLED(SDSUPPORT) - static void _drawmenu_sd(const bool isSelected, const uint8_t row, const char* const pstr, const char* filename, char* const longFilename, const bool isDir) { + static void _drawmenu_sd(const bool isSelected, const uint8_t row, const char* const pstr, CardReader &theCard, const bool isDir) { UNUSED(pstr); lcd_implementation_mark_as_selected(row, isSelected); @@ -526,23 +526,23 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop if (!PAGE_CONTAINS(row_y1, row_y2)) return; constexpr uint8_t maxlen = LCD_WIDTH - (START_COL) - 1; - const char *outstr = longFilename[0] ? longFilename : filename; - if (longFilename[0]) { + const char *outstr = theCard.longest_filename(); + if (theCard.longFilename[0]) { #if ENABLED(SCROLL_LONG_FILENAMES) if (isSelected) { uint8_t name_hash = row; for (uint8_t l = FILENAME_LENGTH; l--;) - name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ filename[l]; // rotate, xor + name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ theCard.filename[l]; // rotate, xor if (filename_scroll_hash != name_hash) { // If the hash changed... filename_scroll_hash = name_hash; // Save the new hash - filename_scroll_max = MAX(0, utf8_strlen(longFilename) - maxlen); // Update the scroll limit + filename_scroll_max = MAX(0, utf8_strlen(theCard.longFilename) - maxlen); // Update the scroll limit filename_scroll_pos = 0; // Reset scroll to the start lcd_status_update_delay = 8; // Don't scroll right away } outstr += filename_scroll_pos; } #else - longFilename[maxlen] = '\0'; // cutoff at screen edge + theCard.longFilename[maxlen] = '\0'; // cutoff at screen edge #endif } @@ -554,8 +554,8 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } } - #define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false) - #define lcd_implementation_drawmenu_sddirectory(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, true) + #define lcd_implementation_drawmenu_sdfile(sel, row, pstr, theCard) _drawmenu_sd(sel, row, pstr, theCard, false) + #define lcd_implementation_drawmenu_sddirectory(sel, row, pstr, theCard) _drawmenu_sd(sel, row, pstr, theCard, true) #endif // SDSUPPORT diff --git a/Marlin/src/lcd/ultralcd_impl_HD44780.h b/Marlin/src/lcd/ultralcd_impl_HD44780.h index 4ea2fdc22b..61437f5c3f 100644 --- a/Marlin/src/lcd/ultralcd_impl_HD44780.h +++ b/Marlin/src/lcd/ultralcd_impl_HD44780.h @@ -926,29 +926,29 @@ static void lcd_implementation_status_screen() { #if ENABLED(SDSUPPORT) - static void lcd_implementation_drawmenu_sd(const bool sel, const uint8_t row, const char* const pstr, const char* filename, char* const longFilename, const uint8_t concat, const char post_char) { + static void lcd_implementation_drawmenu_sd(const bool sel, const uint8_t row, const char* const pstr, CardReader &theCard, const uint8_t concat, const char post_char) { UNUSED(pstr); lcd_moveto(0, row); lcd_put_wchar(sel ? '>' : ' '); uint8_t n = LCD_WIDTH - concat; - const char *outstr = longFilename[0] ? longFilename : filename; - if (longFilename[0]) { + const char *outstr = theCard.longest_filename(); + if (theCard.longFilename[0]) { #if ENABLED(SCROLL_LONG_FILENAMES) if (sel) { uint8_t name_hash = row; for (uint8_t l = FILENAME_LENGTH; l--;) - name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ filename[l]; // rotate, xor + name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ theCard.filename[l]; // rotate, xor if (filename_scroll_hash != name_hash) { // If the hash changed... filename_scroll_hash = name_hash; // Save the new hash - filename_scroll_max = MAX(0, utf8_strlen(longFilename) - n); // Update the scroll limit + filename_scroll_max = MAX(0, utf8_strlen(theCard.longFilename) - n); // Update the scroll limit filename_scroll_pos = 0; // Reset scroll to the start lcd_status_update_delay = 8; // Don't scroll right away } outstr += filename_scroll_pos; } #else - longFilename[n] = '\0'; // cutoff at screen edge + theCard.longFilename[n] = '\0'; // cutoff at screen edge #endif } @@ -960,12 +960,12 @@ static void lcd_implementation_status_screen() { lcd_put_wchar(post_char); } - static void lcd_implementation_drawmenu_sdfile(const bool sel, const uint8_t row, const char* pstr, const char* filename, char* const longFilename) { - lcd_implementation_drawmenu_sd(sel, row, pstr, filename, longFilename, 2, ' '); + static void lcd_implementation_drawmenu_sdfile(const bool sel, const uint8_t row, const char* pstr, CardReader &theCard) { + lcd_implementation_drawmenu_sd(sel, row, pstr, theCard, 2, ' '); } - static void lcd_implementation_drawmenu_sddirectory(const bool sel, const uint8_t row, const char* pstr, const char* filename, char* const longFilename) { - lcd_implementation_drawmenu_sd(sel, row, pstr, filename, longFilename, 2, LCD_STR_FOLDER[0]); + static void lcd_implementation_drawmenu_sddirectory(const bool sel, const uint8_t row, const char* pstr, CardReader &theCard) { + lcd_implementation_drawmenu_sd(sel, row, pstr, theCard, 2, LCD_STR_FOLDER[0]); } #endif // SDSUPPORT diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 70e1abb8e0..9ba018a2cf 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -43,8 +43,6 @@ #include -#define LONGEST_FILENAME (longFilename[0] ? longFilename : filename) - CardReader::CardReader() { #if ENABLED(SDCARD_SORT_ALPHA) sort_count = 0; @@ -771,7 +769,7 @@ void CardReader::setroot() { getfilename(i); #if ENABLED(SDSORT_DYNAMIC_RAM) // Use dynamic method to copy long filename - sortnames[i] = strdup(LONGEST_FILENAME); + sortnames[i] = strdup(longest_filename()); #if ENABLED(SDSORT_CACHE_NAMES) // When caching also store the short name, since // we're replacing the getfilename() behavior. @@ -780,10 +778,10 @@ void CardReader::setroot() { #else // Copy filenames into the static array #if SORTED_LONGNAME_MAXLEN != LONG_FILENAME_LENGTH - strncpy(sortnames[i], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN); + strncpy(sortnames[i], longest_filename(), SORTED_LONGNAME_MAXLEN); sortnames[i][SORTED_LONGNAME_MAXLEN - 1] = '\0'; #else - strncpy(sortnames[i], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN); + strncpy(sortnames[i], longest_filename(), SORTED_LONGNAME_MAXLEN); #endif #if ENABLED(SDSORT_CACHE_NAMES) strcpy(sortshort[i], filename); @@ -831,12 +829,12 @@ void CardReader::setroot() { // throughout the loop. Slow if there are many. #if DISABLED(SDSORT_USES_RAM) getfilename(o1); - strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it) + strcpy(name1, longest_filename()); // save (or getfilename below will trounce it) #if HAS_FOLDER_SORTING bool dir1 = filenameIsDir; #endif getfilename(o2); - char *name2 = LONGEST_FILENAME; // use the string in-place + char *name2 = longest_filename(); // use the string in-place #endif // !SDSORT_USES_RAM // Sort the current pair according to settings. @@ -874,7 +872,7 @@ void CardReader::setroot() { getfilename(0); #if ENABLED(SDSORT_DYNAMIC_RAM) sortnames = new char*[1]; - sortnames[0] = strdup(LONGEST_FILENAME); // malloc + sortnames[0] = strdup(longest_filename()); // malloc #if ENABLED(SDSORT_CACHE_NAMES) sortshort = new char*[1]; sortshort[0] = strdup(filename); // malloc @@ -882,10 +880,10 @@ void CardReader::setroot() { isDir = new uint8_t[1]; #else #if SORTED_LONGNAME_MAXLEN != LONG_FILENAME_LENGTH - strncpy(sortnames[0], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN); + strncpy(sortnames[0], longest_filename(), SORTED_LONGNAME_MAXLEN); sortnames[0][SORTED_LONGNAME_MAXLEN - 1] = '\0'; #else - strncpy(sortnames[0], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN); + strncpy(sortnames[0], longest_filename(), SORTED_LONGNAME_MAXLEN); #endif #if ENABLED(SDSORT_CACHE_NAMES) strcpy(sortshort[0], filename); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 73352e920f..8e29bd9a6f 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -144,6 +144,8 @@ public: } #endif + FORCE_INLINE char* longest_filename() { return longFilename[0] ? longFilename : filename; } + public: bool saving, logging, sdprinting, cardOK, filenameIsDir; char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH];