1
0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2024-11-29 23:07:42 +00:00

Add card.longest_filename, more lcd_strlen updates

This commit is contained in:
Scott Lahteine 2018-07-17 17:33:01 -05:00
parent 036f25e159
commit 7e648f3721
6 changed files with 39 additions and 44 deletions

View File

@ -35,8 +35,6 @@
#include "power_loss_recovery.h" #include "power_loss_recovery.h"
#endif #endif
#define LONGEST_FILENAME (longFilename[0] ? longFilename : filename)
CardReader::CardReader() { CardReader::CardReader() {
#if ENABLED(SDCARD_SORT_ALPHA) #if ENABLED(SDCARD_SORT_ALPHA)
sort_count = 0; sort_count = 0;
@ -731,7 +729,7 @@ void CardReader::setroot() {
getfilename(i); getfilename(i);
#if ENABLED(SDSORT_DYNAMIC_RAM) #if ENABLED(SDSORT_DYNAMIC_RAM)
// Use dynamic method to copy long filename // Use dynamic method to copy long filename
sortnames[i] = strdup(LONGEST_FILENAME); sortnames[i] = strdup(longest_filename());
#if ENABLED(SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_CACHE_NAMES)
// When caching also store the short name, since // When caching also store the short name, since
// we're replacing the getfilename() behavior. // we're replacing the getfilename() behavior.
@ -740,10 +738,10 @@ void CardReader::setroot() {
#else #else
// Copy filenames into the static array // Copy filenames into the static array
#if SORTED_LONGNAME_MAXLEN != LONG_FILENAME_LENGTH #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'; sortnames[i][SORTED_LONGNAME_MAXLEN - 1] = '\0';
#else #else
strncpy(sortnames[i], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN); strncpy(sortnames[i], longest_filename(), SORTED_LONGNAME_MAXLEN);
#endif #endif
#if ENABLED(SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_CACHE_NAMES)
strcpy(sortshort[i], filename); strcpy(sortshort[i], filename);
@ -791,12 +789,12 @@ void CardReader::setroot() {
// throughout the loop. Slow if there are many. // throughout the loop. Slow if there are many.
#if DISABLED(SDSORT_USES_RAM) #if DISABLED(SDSORT_USES_RAM)
getfilename(o1); 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 #if HAS_FOLDER_SORTING
bool dir1 = filenameIsDir; bool dir1 = filenameIsDir;
#endif #endif
getfilename(o2); getfilename(o2);
char *name2 = LONGEST_FILENAME; // use the string in-place char *name2 = longest_filename(); // use the string in-place
#endif // !SDSORT_USES_RAM #endif // !SDSORT_USES_RAM
// Sort the current pair according to settings. // Sort the current pair according to settings.
@ -834,7 +832,7 @@ void CardReader::setroot() {
getfilename(0); getfilename(0);
#if ENABLED(SDSORT_DYNAMIC_RAM) #if ENABLED(SDSORT_DYNAMIC_RAM)
sortnames = new char*[1]; sortnames = new char*[1];
sortnames[0] = strdup(LONGEST_FILENAME); // malloc sortnames[0] = strdup(longest_filename()); // malloc
#if ENABLED(SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_CACHE_NAMES)
sortshort = new char*[1]; sortshort = new char*[1];
sortshort[0] = strdup(filename); // malloc sortshort[0] = strdup(filename); // malloc
@ -842,10 +840,10 @@ void CardReader::setroot() {
isDir = new uint8_t[1]; isDir = new uint8_t[1];
#else #else
#if SORTED_LONGNAME_MAXLEN != LONG_FILENAME_LENGTH #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'; sortnames[0][SORTED_LONGNAME_MAXLEN - 1] = '\0';
#else #else
strncpy(sortnames[0], LONGEST_FILENAME, SORTED_LONGNAME_MAXLEN); strncpy(sortnames[0], longest_filename(), SORTED_LONGNAME_MAXLEN);
#endif #endif
#if ENABLED(SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_CACHE_NAMES)
strcpy(sortshort[0], filename); strcpy(sortshort[0], filename);

View File

@ -114,6 +114,8 @@ public:
} }
#endif #endif
FORCE_INLINE char* longest_filename() { return longFilename[0] ? longFilename : filename; }
public: public:
bool saving, logging, sdprinting, cardOK, filenameIsDir; bool saving, logging, sdprinting, cardOK, filenameIsDir;
char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH]; char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH];

View File

@ -286,7 +286,7 @@ void process_lcd_p_command(const char* command) {
} }
else { else {
char message_buffer[MAX_CURLY_COMMAND]; char message_buffer[MAX_CURLY_COMMAND];
sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.filename); sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.longest_filename());
write_to_lcd(message_buffer); write_to_lcd(message_buffer);
write_to_lcd_P(PSTR("{SYS:BUILD}")); write_to_lcd_P(PSTR("{SYS:BUILD}"));
card.openAndPrintFile(card.filename); card.openAndPrintFile(card.filename);
@ -344,7 +344,7 @@ void process_lcd_s_command(const char* command) {
uint16_t file_count = card.get_num_Files(); uint16_t file_count = card.get_num_Files();
for (uint16_t i = 0; i < file_count; i++) { for (uint16_t i = 0; i < file_count; i++) {
card.getfilename(i); card.getfilename(i);
sprintf_P(message_buffer, card.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.filename); sprintf_P(message_buffer, card.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.longest_filename());
write_to_lcd(message_buffer); write_to_lcd(message_buffer);
} }

View File

@ -265,8 +265,8 @@ uint16_t max_display_update_time = 0;
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
void lcd_sdcard_menu(); void lcd_sdcard_menu();
void menu_action_sdfile(const char* filename, char* longFilename); void menu_action_sdfile(CardReader& theCard);
void menu_action_sddirectory(const char* filename, char* longFilename); void menu_action_sddirectory(CardReader& theCard);
#endif #endif
//////////////////////////////////////////// ////////////////////////////////////////////
@ -756,7 +756,7 @@ void lcd_reset_status() {
msg = paused; msg = paused;
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
else if (card.sdprinting) else if (card.sdprinting)
return lcd_setstatus(card.longFilename[0] ? card.longFilename : card.filename, true); return lcd_setstatus(card.longest_filename(), true);
#endif #endif
else if (print_job_timer.isRunning()) else if (print_job_timer.isRunning())
msg = printing; msg = printing;
@ -4031,9 +4031,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
#endif #endif
if (card.filenameIsDir) if (card.filenameIsDir)
MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename); MENU_ITEM(sddirectory, MSG_CARD_MENU, card);
else else
MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename); MENU_ITEM(sdfile, MSG_CARD_MENU, card);
} }
else { else {
MENU_ITEM_DUMMY(); MENU_ITEM_DUMMY();
@ -4954,19 +4954,17 @@ void lcd_quick_feedback(const bool clear_buttons) {
#if ENABLED(SDSUPPORT) #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) #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
last_sdfile_encoderPosition = encoderPosition; // Save which file was selected for later use last_sdfile_encoderPosition = encoderPosition; // Save which file was selected for later use
#endif #endif
UNUSED(longFilename); card.openAndPrintFile(theCard.filename);
card.openAndPrintFile(filename);
lcd_return_to_status(); lcd_return_to_status();
lcd_reset_status(); lcd_reset_status();
} }
void menu_action_sddirectory(const char* filename, char* longFilename) { void menu_action_sddirectory(CardReader& theCard) {
UNUSED(longFilename); card.chdir(theCard.filename);
card.chdir(filename);
encoderTopLine = 0; encoderTopLine = 0;
encoderPosition = 2 * ENCODER_STEPS_PER_MENU_ITEM; encoderPosition = 2 * ENCODER_STEPS_PER_MENU_ITEM;
screen_changed = true; screen_changed = true;

View File

@ -586,7 +586,7 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop
#if ENABLED(SDSUPPORT) #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); UNUSED(pstr);
lcd_implementation_mark_as_selected(row, isSelected); lcd_implementation_mark_as_selected(row, isSelected);
@ -594,23 +594,23 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop
if (!PAGE_CONTAINS(row_y1, row_y2)) return; if (!PAGE_CONTAINS(row_y1, row_y2)) return;
constexpr uint8_t maxlen = LCD_WIDTH - (START_COL) - 1; constexpr uint8_t maxlen = LCD_WIDTH - (START_COL) - 1;
const char *outstr = longFilename[0] ? longFilename : filename; const char *outstr = theCard.longest_filename();
if (longFilename[0]) { if (theCard.longFilename[0]) {
#if ENABLED(SCROLL_LONG_FILENAMES) #if ENABLED(SCROLL_LONG_FILENAMES)
if (isSelected) { if (isSelected) {
uint8_t name_hash = row; uint8_t name_hash = row;
for (uint8_t l = FILENAME_LENGTH; l--;) 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... if (filename_scroll_hash != name_hash) { // If the hash changed...
filename_scroll_hash = name_hash; // Save the new hash 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 filename_scroll_pos = 0; // Reset scroll to the start
lcd_status_update_delay = 8; // Don't scroll right away lcd_status_update_delay = 8; // Don't scroll right away
} }
outstr += filename_scroll_pos; outstr += filename_scroll_pos;
} }
#else #else
longFilename[maxlen] = '\0'; // cutoff at screen edge theCard.longFilename[maxlen] = '\0'; // cutoff at screen edge
#endif #endif
} }
@ -625,8 +625,8 @@ void lcd_implementation_clear() { } // Automatically cleared by Picture Loop
while (n) { --n; u8g.print(' '); } while (n) { --n; u8g.print(' '); }
} }
#define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false) #define lcd_implementation_drawmenu_sdfile(sel, row, pstr, theCard) _drawmenu_sd(sel, row, pstr, theCard, false)
#define lcd_implementation_drawmenu_sddirectory(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, true) #define lcd_implementation_drawmenu_sddirectory(sel, row, pstr, theCard) _drawmenu_sd(sel, row, pstr, theCard, true)
#endif // SDSUPPORT #endif // SDSUPPORT

View File

@ -995,11 +995,8 @@ static void lcd_implementation_status_screen() {
++slen; ++slen;
} }
#endif #endif
} }
#if ENABLED(ULTIPANEL) #if ENABLED(ULTIPANEL)
#if ENABLED(ADVANCED_PAUSE_FEATURE) #if ENABLED(ADVANCED_PAUSE_FEATURE)
@ -1090,29 +1087,29 @@ static void lcd_implementation_status_screen() {
#if ENABLED(SDSUPPORT) #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); UNUSED(pstr);
lcd.setCursor(0, row); lcd.setCursor(0, row);
lcd.print(sel ? '>' : ' '); lcd.print(sel ? '>' : ' ');
uint8_t n = LCD_WIDTH - concat; uint8_t n = LCD_WIDTH - concat;
const char *outstr = longFilename[0] ? longFilename : filename; const char *outstr = theCard.longest_filename();
if (longFilename[0]) { if (theCard.longFilename[0]) {
#if ENABLED(SCROLL_LONG_FILENAMES) #if ENABLED(SCROLL_LONG_FILENAMES)
if (sel) { if (sel) {
uint8_t name_hash = row; uint8_t name_hash = row;
for (uint8_t l = FILENAME_LENGTH; l--;) 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... if (filename_scroll_hash != name_hash) { // If the hash changed...
filename_scroll_hash = name_hash; // Save the new hash 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 filename_scroll_pos = 0; // Reset scroll to the start
lcd_status_update_delay = 8; // Don't scroll right away lcd_status_update_delay = 8; // Don't scroll right away
} }
outstr += filename_scroll_pos; outstr += filename_scroll_pos;
} }
#else #else
longFilename[n] = '\0'; // cutoff at screen edge theCard.longFilename[n] = '\0'; // cutoff at screen edge
#endif #endif
} }
@ -1126,12 +1123,12 @@ static void lcd_implementation_status_screen() {
lcd.print(post_char); lcd.print(post_char);
} }
static void lcd_implementation_drawmenu_sdfile(const bool sel, const uint8_t row, const char* pstr, const char* filename, char* const longFilename) { 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, filename, longFilename, 2, ' '); 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) { 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, filename, longFilename, 2, LCD_STR_FOLDER[0]); lcd_implementation_drawmenu_sd(sel, row, pstr, theCard, 2, LCD_STR_FOLDER[0]);
} }
#endif // SDSUPPORT #endif // SDSUPPORT