From b3a587f5a4b82f4fb6a360354fae5f057efcf0e5 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 20 Nov 2019 20:25:51 +0200 Subject: [PATCH 1/9] SD first attempt. Broken --- Firmware/lcd.cpp | 1 + Firmware/lcd.h | 2 + Firmware/menu.cpp | 19 ++++++ Firmware/menu.h | 4 ++ Firmware/ultralcd.cpp | 140 ++++++++++++++++++++---------------------- 5 files changed, 94 insertions(+), 72 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 3e39312c1..d7c90b266 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -645,6 +645,7 @@ lcd_lcdupdate_func_t lcd_lcdupdate_func = 0; static ShortTimer buttonBlanking; ShortTimer longPressTimer; LongTimer lcd_timeoutToStatus; +ShortTimer lcd_scrollTimer; //! @brief Was button clicked? diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 790c0a955..f4ea6a6f7 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -102,6 +102,8 @@ extern uint8_t lcd_update_enabled; extern LongTimer lcd_timeoutToStatus; +extern ShortTimer lcd_scrollTimer; + extern uint32_t lcd_next_update_millis; extern uint8_t lcd_status_update_delay; diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 38f5d4e80..0ea1c636c 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -111,6 +111,15 @@ static void menu_back_no_reset(void) } } +void menu_back_no_feedback(void) +{ + if (menu_depth > 0) + { + menu_depth--; + menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, false, true); + } +} + void menu_back_if_clicked(void) { if (lcd_clicked()) @@ -146,6 +155,16 @@ static void menu_submenu_no_reset(menu_func_t submenu) } } +void menu_submenu_scroll(menu_func_t submenu) +{ + if (menu_depth < MENU_DEPTH_MAX) + { + menu_stack[menu_depth].menu = menu_menu; + menu_stack[menu_depth++].position = lcd_encoder; + menu_goto(submenu, menu_row, false, true); + } +} + uint8_t menu_item_ret(void) { lcd_beeper_quick_feedback(); diff --git a/Firmware/menu.h b/Firmware/menu.h index a9526c318..88d962949 100755 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -78,12 +78,16 @@ extern void menu_end(void); extern void menu_back(void); extern void menu_back(uint8_t nLevel); +extern void menu_back_no_feedback(void); + extern void menu_back_if_clicked(void); extern void menu_back_if_clicked_fb(void); extern void menu_submenu(menu_func_t submenu); +extern void menu_submenu_scroll(menu_func_t submenu); + extern uint8_t menu_item_ret(void); //extern int menu_draw_item_printf_P(char type_char, const char* format, ...); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 2ed8d5de4..0a574877b 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -46,8 +46,8 @@ #include "first_lay_cal.h" -int scrollstuff = 0; -char longFilenameOLD[LONG_FILENAME_LENGTH]; +//filename scrolling +const char* scrollPointer; static void lcd_sd_updir(); @@ -313,7 +313,53 @@ bool bSettings; // flag (i.e. 'fake parameter' const char STR_SEPARATOR[] PROGMEM = "------------"; +static void lcd_filename_scroll() //this is a submenu +{ + typedef struct + { + int8_t status; + int encoderInitial; + } _menu_data_t; + 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) + { + _md->status = 1; + _md->encoderInitial = lcd_encoder_diff / ENCODER_PULSES_PER_STEP; + lcd_scrollTimer.start(); + } + if (LCD_CLICKED || (_md->encoderInitial != (lcd_encoder_diff / ENCODER_PULSES_PER_STEP))) //go back to sd_menu. + { + lcd_scrollTimer.stop(); + // menu_depth--; + // menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position + lcd_encoder_diff / ENCODER_PULSES_PER_STEP, false, true); + menu_back_no_feedback(); + } + if(lcd_scrollTimer.expired(300)) + { + uint8_t i = LCD_WIDTH - 1; + lcd_set_cursor(0, lcd_encoder); + lcd_print('>'); + for (; i != 0; i--) + { + char c = *(scrollPointer + LCD_WIDTH - i); + if (c == '\0') break; //stop at the end of the string + else + { + lcd_print(c); + lcd_scrollTimer.start(); + } + } + if (i != 0) //adds spaces if string is incomplete or at the end (instead of null). + { + lcd_space(i); + } + scrollPointer++; + } +} + +/* static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* filename, char* longFilename) { char c; @@ -372,21 +418,17 @@ static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* while(n--) lcd_print(' '); } -static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* filename, char* longFilename) +*/ +static void lcd_implementation_drawmenu_sdfile(uint8_t row, char* longFilename) { char c; uint8_t n = LCD_WIDTH - 1; lcd_set_cursor(0, row); - lcd_print(' '); - if (longFilename[0] != '\0') - { - filename = longFilename; - longFilename[LCD_WIDTH-1] = '\0'; - } - while( ((c = *filename) != '\0') && (n>0) ) + lcd_print((lcd_encoder == menu_item)?'>':' '); + while( ((c = *longFilename) != '\0') && (n>0) ) { lcd_print(c); - filename++; + longFilename++; n--; } while(n--) @@ -441,9 +483,7 @@ static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* fil //#define MENU_ITEM_SDDIR(str, str_fn, str_fnl) MENU_ITEM(sddirectory, str, str_fn, str_fnl) //extern uint8_t menu_item_sddir(const char* str, const char* str_fn, char* str_fnl); -#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) -//extern uint8_t menu_item_sdfile(const char* str, const char* str_fn, char* str_fnl); +#define MENU_ITEM_SDFILE(str_fn, str_fnl) do { if (menu_item_sdfile(str_fn, str_fnl)) return; } while (0) uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) @@ -496,60 +536,18 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) #endif //NEW_SD_MENU } -static uint8_t menu_item_sdfile(const char* -#ifdef NEW_SD_MENU - str -#endif //NEW_SD_MENU - ,const char* str_fn, char* str_fnl) +static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) { -#ifdef NEW_SD_MENU -// printf_P(PSTR("menu sdfile\n")); -// str_fnl[19] = 0; -// printf_P(PSTR("menu file %d '%s' '%s'\n"), menu_row, str_fn, str_fnl); - if (menu_item == menu_line) - { - if (lcd_draw_update) - { -// printf_P(PSTR("menu file %d %d '%s'\n"), menu_row, menuData.sdcard_menu.viewState, str_fnl[0]?str_fnl:str_fn); - lcd_set_cursor(0, menu_row); -/* if (lcd_encoder == menu_item) - { - lcd_printf_P(PSTR("%c%-19s"), (lcd_encoder == menu_item)?'>':' ', (str_fnl[0]?str_fnl:str_fn) + 1); - if (menuData.sdcard_menu.viewState == 0) - { - menuData.sdcard_menu.viewState++; - lcd_printf_P(PSTR("%c%-19s"), (lcd_encoder == menu_item)?'>':' ', (str_fnl[0]?str_fnl:str_fn) + 1); - } - else if (menuData.sdcard_menu.viewState == 1) - { - lcd_printf_P(PSTR("%c%-19s"), (lcd_encoder == menu_item)?'>':' ', (str_fnl[0]?str_fnl:str_fn) + 2); - } - } - else*/ - { - str_fnl[19] = 0; - lcd_printf_P(PSTR("%c%-19s"), (lcd_encoder == menu_item)?'>':' ', str_fnl[0]?str_fnl:str_fn); - } - -// int cnt = lcd_printf_P(PSTR("%c%-19s"), (lcd_encoder == menu_item)?'>':' ', str_fnl); -// int cnt = lcd_printf_P(PSTR("%cTESTIK.gcode"), (lcd_encoder == menu_item)?'>':' '); - } - if (menu_clicked && (lcd_encoder == menu_item)) - { - return menu_item_ret(); - } - } - menu_item++; - return 0; -#else //NEW_SD_MENU if (menu_item == menu_line) { if (lcd_draw_update) { + scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; if (lcd_encoder == menu_item) - lcd_implementation_drawmenu_sdfile_selected(menu_row, str_fn, str_fnl); - else - lcd_implementation_drawmenu_sdfile(menu_row, str_fn, str_fnl); + { + if (lcd_scrollTimer.expired(1000)) menu_submenu_scroll(lcd_filename_scroll); + } + else lcd_implementation_drawmenu_sdfile(menu_row, str_fnl); } if (menu_clicked && (lcd_encoder == menu_item)) { @@ -560,7 +558,6 @@ static uint8_t menu_item_sdfile(const char* } menu_item++; return 0; -#endif //NEW_SD_MENU } // Print temperature (nozzle/bed) (9 chars total) @@ -727,7 +724,7 @@ void lcdui_print_time(void) //Print status line on status screen void lcdui_print_status_line(void) { - if (IS_SD_PRINTING) +/* if (IS_SD_PRINTING) { if (strcmp(longFilenameOLD, (card.longFilename[0] ? card.longFilename : card.filename)) != 0) { @@ -735,7 +732,7 @@ void lcdui_print_status_line(void) sprintf_P(longFilenameOLD, PSTR("%s"), (card.longFilename[0] ? card.longFilename : card.filename)); scrollstuff = 0; } - } + } */ if (heating_status) { // If heating flag, show progress of heating @@ -780,7 +777,7 @@ void lcdui_print_status_line(void) } else if ((IS_SD_PRINTING) && (custom_message_type == CustomMsg::Status)) { // If printing from SD, show what we are printing - if(strlen(longFilenameOLD) > LCD_WIDTH) + /* if(strlen(longFilenameOLD) > LCD_WIDTH) { int inters = 0; int gh = scrollstuff; @@ -806,7 +803,7 @@ void lcdui_print_status_line(void) else { lcd_printf_P(PSTR("%-20s"), longFilenameOLD); - } + } */ } else { // Otherwise check for other special events @@ -4275,7 +4272,7 @@ static void prusa_stat_printinfo() SERIAL_ECHO("][FEM:"); SERIAL_ECHO(itostr3(feedmultiply)); SERIAL_ECHO("][FNM:"); - SERIAL_ECHO(longFilenameOLD); + SERIAL_ECHO(card.longFilename); SERIAL_ECHO("][TIM:"); if (starttime != 0) { @@ -7279,7 +7276,7 @@ void lcd_sdcard_menu() return; // nothing to do (so don't thrash the SD card) uint16_t fileCnt = card.getnrfilenames(); - + lcd_scrollTimer.start(); MENU_BEGIN(); MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK)); // i.e. default menu-item / menu-item after card insertion card.getWorkDirName(); @@ -7309,11 +7306,10 @@ void lcd_sdcard_menu() #else card.getfilename(nr); #endif - if (card.filenameIsDir) MENU_ITEM_SDDIR(card.filename, card.longFilename); - else - MENU_ITEM_SDFILE(_T(MSG_CARD_MENU), card.filename, card.longFilename); + else + MENU_ITEM_SDFILE(card.filename, card.longFilename); } else { MENU_ITEM_DUMMY(); } From 8f901d261339abba522d9db44d7d4be52a6b08a2 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Thu, 21 Nov 2019 14:58:13 +0200 Subject: [PATCH 2/9] Temporary fix --- Firmware/ultralcd.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0a574877b..a0323841f 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -419,7 +419,7 @@ static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* lcd_print(' '); } */ -static void lcd_implementation_drawmenu_sdfile(uint8_t row, char* longFilename) +static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename) { char c; uint8_t n = LCD_WIDTH - 1; @@ -547,13 +547,14 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) { if (lcd_scrollTimer.expired(1000)) menu_submenu_scroll(lcd_filename_scroll); } - else lcd_implementation_drawmenu_sdfile(menu_row, str_fnl); + else lcd_implementation_drawmenu_sdfile(menu_row, scrollPointer); } if (menu_clicked && (lcd_encoder == menu_item)) { lcd_consume_click(); menu_action_sdfile(str_fn); - return menu_item_ret(); + // return menu_item_ret(); + return 1; } } menu_item++; From 6538262e758198987923200a2db41933022cd7c6 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Thu, 21 Nov 2019 19:04:45 +0200 Subject: [PATCH 3/9] First build that actually works --- Firmware/menu.cpp | 7 ++++--- Firmware/menu.h | 2 +- Firmware/ultralcd.cpp | 46 ++++++++++++++++++++++++++++--------------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 0ea1c636c..bfb018e81 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -54,6 +54,7 @@ void menu_goto(menu_func_t menu, const uint32_t encoder, const bool feedback, bo // Resets the global shared C union. // This ensures, that the menu entered will find out, that it shall initialize itself. memset(&menu_data, 0, sizeof(menu_data)); + menu_entering = 1; //next menu that supports entering will clear this flag on first enter. Used for initializing some menus only one time. } if (feedback) lcd_quick_feedback(); } @@ -111,12 +112,12 @@ static void menu_back_no_reset(void) } } -void menu_back_no_feedback(void) +void menu_back_scroll(int scrollback) { if (menu_depth > 0) { - menu_depth--; - menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, false, true); + menu_depth--; + menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position + scrollback, false, true); } } diff --git a/Firmware/menu.h b/Firmware/menu.h index 88d962949..b354bb97f 100755 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -78,7 +78,7 @@ extern void menu_end(void); extern void menu_back(void); extern void menu_back(uint8_t nLevel); -extern void menu_back_no_feedback(void); +extern void menu_back_scroll(int scrollback); extern void menu_back_if_clicked(void); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a0323841f..dfc0da43f 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -326,25 +326,30 @@ static void lcd_filename_scroll() //this is a submenu if (_md->status == 0) { _md->status = 1; - _md->encoderInitial = lcd_encoder_diff / ENCODER_PULSES_PER_STEP; + _md->encoderInitial = lcd_encoder; lcd_scrollTimer.start(); } - if (LCD_CLICKED || (_md->encoderInitial != (lcd_encoder_diff / ENCODER_PULSES_PER_STEP))) //go back to sd_menu. + if (LCD_CLICKED || (_md->encoderInitial != lcd_encoder)) //go back to sd_menu. { - lcd_scrollTimer.stop(); + lcd_scrollTimer.start(); // menu_depth--; // menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position + lcd_encoder_diff / ENCODER_PULSES_PER_STEP, false, true); - menu_back_no_feedback(); + menu_back_scroll(lcd_encoder - _md->encoderInitial); } - if(lcd_scrollTimer.expired(300)) + if(lcd_scrollTimer.expired(200) && (scrollPointer != NULL)) { uint8_t i = LCD_WIDTH - 1; - lcd_set_cursor(0, lcd_encoder); + lcd_set_cursor(0, _md->encoderInitial = lcd_encoder); lcd_print('>'); for (; i != 0; i--) { - char c = *(scrollPointer + LCD_WIDTH - i); - if (c == '\0') break; //stop at the end of the string + char c = *(scrollPointer + ((LCD_WIDTH - 1) - i)); + if (c == '\0') + { + scrollPointer = NULL; //invalidate string + lcd_scrollTimer.stop(); + break; //stop at the end of the string + } else { lcd_print(c); @@ -424,7 +429,9 @@ static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFile char c; uint8_t n = LCD_WIDTH - 1; lcd_set_cursor(0, row); - lcd_print((lcd_encoder == menu_item)?'>':' '); + if (lcd_encoder == menu_item) lcd_print('>'); + else lcd_print(' '); + // lcd_print((lcd_encoder == menu_item)?'>':' '); while( ((c = *longFilename) != '\0') && (n>0) ) { lcd_print(c); @@ -540,12 +547,14 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) { if (menu_item == menu_line) { - if (lcd_draw_update) + if (lcd_draw_update || !lcd_scrollTimer.running()) { scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; - if (lcd_encoder == menu_item) + if (lcd_encoder == menu_item && !lcd_scrollTimer.running()) { - if (lcd_scrollTimer.expired(1000)) menu_submenu_scroll(lcd_filename_scroll); + // lcd_beeper_quick_feedback(); + menu_submenu_scroll(lcd_filename_scroll); + return 1; } else lcd_implementation_drawmenu_sdfile(menu_row, scrollPointer); } @@ -7272,12 +7281,17 @@ void lcd_sdcard_menu() presort_flag = false; card.presort(); } - if (lcd_draw_update == 0 && LCD_CLICKED == 0) - //_delay(100); + if (!lcd_scrollTimer.running()) lcd_scrollTimer.start(); + bool scrollEnter = lcd_scrollTimer.expired(500); + if (lcd_draw_update == 0 && LCD_CLICKED == 0 && !scrollEnter && !menu_entering) return; // nothing to do (so don't thrash the SD card) uint16_t fileCnt = card.getnrfilenames(); - - lcd_scrollTimer.start(); + if (menu_entering) + { + menu_entering = 0; //clear entering flag + lcd_draw_update = 1; //draw lines again + } + if (!scrollEnter) lcd_scrollTimer.start(); MENU_BEGIN(); MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK)); // i.e. default menu-item / menu-item after card insertion card.getWorkDirName(); From 8a806bceea6e0514cb52a33803ee607f29337f33 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Thu, 21 Nov 2019 21:32:52 +0200 Subject: [PATCH 4/9] SDDIR --- Firmware/menu.cpp | 2 +- Firmware/ultralcd.cpp | 178 +++++++++--------------------------------- 2 files changed, 36 insertions(+), 144 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index bfb018e81..16ba86ea7 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -162,7 +162,7 @@ void menu_submenu_scroll(menu_func_t submenu) { menu_stack[menu_depth].menu = menu_menu; menu_stack[menu_depth++].position = lcd_encoder; - menu_goto(submenu, menu_row, false, true); + menu_goto(submenu, 0, false, false); } } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index dfc0da43f..ab7e38302 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -313,33 +313,32 @@ bool bSettings; // flag (i.e. 'fake parameter' const char STR_SEPARATOR[] PROGMEM = "------------"; +typedef struct +{ + int8_t status; + bool isDir = 0; + uint8_t row = 0; +} _menu_data_scroll_t; +static_assert(sizeof(menu_data)>= sizeof(_menu_data_scroll_t),"_menu_data_scroll_t doesn't fit into menu_data"); + static void lcd_filename_scroll() //this is a submenu { - typedef struct - { - int8_t status; - int encoderInitial; - } _menu_data_t; - 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]); + _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); if (_md->status == 0) { _md->status = 1; - _md->encoderInitial = lcd_encoder; lcd_scrollTimer.start(); } - if (LCD_CLICKED || (_md->encoderInitial != lcd_encoder)) //go back to sd_menu. + if (LCD_CLICKED || (lcd_encoder != 0)) //go back to sd_menu. { lcd_scrollTimer.start(); - // menu_depth--; - // menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position + lcd_encoder_diff / ENCODER_PULSES_PER_STEP, false, true); - menu_back_scroll(lcd_encoder - _md->encoderInitial); + menu_back_scroll(lcd_encoder); } if(lcd_scrollTimer.expired(200) && (scrollPointer != NULL)) { uint8_t i = LCD_WIDTH - 1; - lcd_set_cursor(0, _md->encoderInitial = lcd_encoder); + lcd_set_cursor(0, _md->row); lcd_print('>'); for (; i != 0; i--) { @@ -363,75 +362,12 @@ static void lcd_filename_scroll() //this is a submenu scrollPointer++; } } - -/* -static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* filename, char* longFilename) -{ - char c; - int enc_dif = lcd_encoder_diff / ENCODER_PULSES_PER_STEP; - uint8_t n = LCD_WIDTH - 1; - - for(uint_least8_t g = 0; g<4;g++){ - lcd_set_cursor(0, g); - lcd_print(' '); - } - lcd_set_cursor(0, row); - lcd_print('>'); - - if (longFilename[0] == '\0') - { - longFilename = filename; - } - - int i = 1; - int j = 0; - char* longFilenameTMP = longFilename; - - while((c = *longFilenameTMP) != '\0') - { - lcd_set_cursor(i, row); - lcd_print(c); - i++; - longFilenameTMP++; - if(i==LCD_WIDTH){ - i=1; - j++; - longFilenameTMP = longFilename + j; - n = LCD_WIDTH - 1; - for(int g = 0; g<300 ;g++){ - manage_heater(); - if(LCD_CLICKED || ( enc_dif != (lcd_encoder_diff / ENCODER_PULSES_PER_STEP))){ - longFilenameTMP = longFilename; - *(longFilenameTMP + LCD_WIDTH - 2) = '\0'; - i = 1; - j = 0; - break; - }else{ - if (j == 1) _delay_ms(3); //wait around 1.2 s to start scrolling text - _delay_ms(1); //then scroll with redrawing every 300 ms - } - - } - } - } - if(c!='\0'){ - lcd_set_cursor(i, row); - lcd_print(c); - i++; - } - n=n-i+1; - while(n--) - lcd_print(' '); -} -*/ static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename) { char c; uint8_t n = LCD_WIDTH - 1; lcd_set_cursor(0, row); - if (lcd_encoder == menu_item) lcd_print('>'); - else lcd_print(' '); - // lcd_print((lcd_encoder == menu_item)?'>':' '); + lcd_print((lcd_encoder == menu_item)?'>':' '); while( ((c = *longFilename) != '\0') && (n>0) ) { lcd_print(c); @@ -441,43 +377,17 @@ static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFile while(n--) lcd_print(' '); } -static void lcd_implementation_drawmenu_sddirectory_selected(uint8_t row, const char* filename, char* longFilename) +static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* longFilename) { char c; uint8_t n = LCD_WIDTH - 2; lcd_set_cursor(0, row); - lcd_print('>'); - lcd_print(LCD_STR_FOLDER[0]); - if (longFilename[0] != '\0') - { - filename = longFilename; - longFilename[LCD_WIDTH-2] = '\0'; - } - while( ((c = *filename) != '\0') && (n>0) ) + lcd_print((lcd_encoder == menu_item)?'>':' '); + lcd_print(LCD_STR_FOLDER[0]); + while( ((c = *longFilename) != '\0') && (n>0) ) { lcd_print(c); - filename++; - n--; - } - while(n--) - lcd_print(' '); -} -static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* filename, char* longFilename) -{ - char c; - uint8_t n = LCD_WIDTH - 2; - lcd_set_cursor(0, row); - lcd_print(' '); - lcd_print(LCD_STR_FOLDER[0]); - if (longFilename[0] != '\0') - { - filename = longFilename; - longFilename[LCD_WIDTH-2] = '\0'; - } - while( ((c = *filename) != '\0') && (n>0) ) - { - lcd_print(c); - filename++; + longFilename++; n--; } while(n--) @@ -487,46 +397,26 @@ static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* fil #define MENU_ITEM_SDDIR(str_fn, str_fnl) do { if (menu_item_sddir(str_fn, str_fnl)) return; } while (0) -//#define MENU_ITEM_SDDIR(str, str_fn, str_fnl) MENU_ITEM(sddirectory, str, str_fn, str_fnl) -//extern uint8_t menu_item_sddir(const char* str, const char* str_fn, char* str_fnl); - #define MENU_ITEM_SDFILE(str_fn, str_fnl) do { if (menu_item_sdfile(str_fn, str_fnl)) return; } while (0) uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) { -#ifdef NEW_SD_MENU -// str_fnl[18] = 0; -// printf_P(PSTR("menu dir %d '%s' '%s'\n"), menu_row, str_fn, str_fnl); if (menu_item == menu_line) { - if (lcd_draw_update) + if (lcd_draw_update || !lcd_scrollTimer.running()) { - lcd_set_cursor(0, menu_row); - int cnt = lcd_printf_P(PSTR("%c%c%-18s"), (lcd_encoder == menu_item)?'>':' ', LCD_STR_FOLDER[0], str_fnl[0]?str_fnl:str_fn); -// int cnt = lcd_printf_P(PSTR("%c%c%-18s"), (lcd_encoder == menu_item)?'>':' ', LCD_STR_FOLDER[0], str_fn); - } - if (menu_clicked && (lcd_encoder == menu_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); - lcd_encoder = 0; - return menu_item_ret(); - } - } - menu_item++; - return 0; -#else //NEW_SD_MENU - if (menu_item == menu_line) - { - if (lcd_draw_update) - { - if (lcd_encoder == menu_item) - lcd_implementation_drawmenu_sddirectory_selected(menu_row, str_fn, str_fnl); - else - lcd_implementation_drawmenu_sddirectory(menu_row, str_fn, str_fnl); + scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; + if (lcd_encoder == menu_item && !lcd_scrollTimer.running()) + { + // lcd_beeper_quick_feedback(); + _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); + _md->isDir = 1; + _md->row = menu_row; + menu_submenu_scroll(lcd_filename_scroll); + return 1; + } + else lcd_implementation_drawmenu_sddirectory(menu_row, scrollPointer); } if (menu_clicked && (lcd_encoder == menu_item)) { @@ -534,13 +424,12 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) lcd_update_enabled = 0; menu_action_sddirectory(str_fn); lcd_update_enabled = 1; - return menu_item_ret(); + // return menu_item_ret(); + return 1; } } menu_item++; return 0; - -#endif //NEW_SD_MENU } static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) @@ -553,6 +442,9 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) if (lcd_encoder == menu_item && !lcd_scrollTimer.running()) { // lcd_beeper_quick_feedback(); + _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); + _md->isDir = 0; + _md->row = menu_row; menu_submenu_scroll(lcd_filename_scroll); return 1; } From fdab70fa3a2627173f9e60159db3c86d12e01a9b Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 22 Nov 2019 14:39:21 +0200 Subject: [PATCH 5/9] Dir fixes --- Firmware/cardreader.cpp | 1 + Firmware/ultralcd.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 3c01bf84b..7d64286e5 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -960,6 +960,7 @@ void CardReader::presort() { lcd_set_degree(); lcd_clear(); #endif + lcd_scrollTimer.start(); lcd_update(2); KEEPALIVE_STATE(NOT_BUSY); lcd_timeoutToStatus.start(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index ab7e38302..c4bbb94cc 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -337,12 +337,13 @@ static void lcd_filename_scroll() //this is a submenu } if(lcd_scrollTimer.expired(200) && (scrollPointer != NULL)) { - uint8_t i = LCD_WIDTH - 1; + uint8_t i = LCD_WIDTH - ((_md->isDir)?2:1); lcd_set_cursor(0, _md->row); lcd_print('>'); + if (_md->isDir) lcd_print(LCD_STR_FOLDER[0]); for (; i != 0; i--) { - char c = *(scrollPointer + ((LCD_WIDTH - 1) - i)); + char c = *(scrollPointer + ((LCD_WIDTH - ((_md->isDir)?2:1)) - i)); if (c == '\0') { scrollPointer = NULL; //invalidate string @@ -414,7 +415,7 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) _md->isDir = 1; _md->row = menu_row; menu_submenu_scroll(lcd_filename_scroll); - return 1; + return 1; //stop menu generation early } else lcd_implementation_drawmenu_sddirectory(menu_row, scrollPointer); } @@ -424,7 +425,7 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) lcd_update_enabled = 0; menu_action_sddirectory(str_fn); lcd_update_enabled = 1; - // return menu_item_ret(); + /* return */ menu_item_ret(); return 1; } } @@ -454,7 +455,7 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) { lcd_consume_click(); menu_action_sdfile(str_fn); - // return menu_item_ret(); + /* return */ menu_item_ret(); return 1; } } From 2fd192a95d853d8371876a425271b330b734aaa2 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 22 Nov 2019 20:14:55 +0200 Subject: [PATCH 6/9] Set scroll delay to 300ms --- Firmware/ultralcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index c4bbb94cc..f51765499 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -335,7 +335,7 @@ static void lcd_filename_scroll() //this is a submenu lcd_scrollTimer.start(); menu_back_scroll(lcd_encoder); } - if(lcd_scrollTimer.expired(200) && (scrollPointer != NULL)) + if(lcd_scrollTimer.expired(300) && (scrollPointer != NULL)) { uint8_t i = LCD_WIDTH - ((_md->isDir)?2:1); lcd_set_cursor(0, _md->row); From 273d834b19d3927e7008aec4b47d71d0a8c05b47 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 22 Nov 2019 20:27:24 +0200 Subject: [PATCH 7/9] Fix card removal --- Firmware/ultralcd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index f51765499..a4ce454ff 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8759,6 +8759,8 @@ void menu_lcd_lcdupdate_func(void) { if(menu_menu==lcd_sdcard_menu) menu_back(); + else if (menu_menu==lcd_filename_scroll) + menu_back(2); //back 2 levels. Exit lcd_filename_scroll and lcd sd_card_menu card.release(); LCD_MESSAGERPGM(_i("Card removed"));////MSG_SD_REMOVED } From d40656e3ca683f00d1e2286fd21c192b049dd4e9 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 24 Nov 2019 19:16:22 +0200 Subject: [PATCH 8/9] Small changes to rendering --- Firmware/menu.cpp | 2 +- Firmware/ultralcd.cpp | 39 ++++++++++++++++++--------------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 16ba86ea7..63b15bd53 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -54,8 +54,8 @@ void menu_goto(menu_func_t menu, const uint32_t encoder, const bool feedback, bo // Resets the global shared C union. // This ensures, that the menu entered will find out, that it shall initialize itself. memset(&menu_data, 0, sizeof(menu_data)); - menu_entering = 1; //next menu that supports entering will clear this flag on first enter. Used for initializing some menus only one time. } + menu_entering = 1; //next menu that supports entering will clear this flag on first enter. Used for initializing some menus only one time. if (feedback) lcd_quick_feedback(); } else diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a4ce454ff..6e118eba6 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -46,10 +46,6 @@ #include "first_lay_cal.h" -//filename scrolling -const char* scrollPointer; - - static void lcd_sd_updir(); static void lcd_mesh_bed_leveling_settings(); @@ -315,27 +311,24 @@ const char STR_SEPARATOR[] PROGMEM = "------------"; typedef struct { - int8_t status; + uint8_t offset = 0; bool isDir = 0; uint8_t row = 0; + const char* scrollPointer; } _menu_data_scroll_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_scroll_t),"_menu_data_scroll_t doesn't fit into menu_data"); static void lcd_filename_scroll() //this is a submenu { _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); - - if (_md->status == 0) + if (menu_entering) { - _md->status = 1; + menu_entering = 0; //clear entering flag lcd_scrollTimer.start(); } - if (LCD_CLICKED || (lcd_encoder != 0)) //go back to sd_menu. - { - lcd_scrollTimer.start(); - menu_back_scroll(lcd_encoder); - } - if(lcd_scrollTimer.expired(300) && (scrollPointer != NULL)) + bool rewindFlag = LCD_CLICKED || (lcd_encoder != 0); //go back to sd_menu. + if (rewindFlag == 1) _md->offset = 0; + if (lcd_scrollTimer.expired(300) || rewindFlag) { uint8_t i = LCD_WIDTH - ((_md->isDir)?2:1); lcd_set_cursor(0, _md->row); @@ -343,10 +336,9 @@ static void lcd_filename_scroll() //this is a submenu if (_md->isDir) lcd_print(LCD_STR_FOLDER[0]); for (; i != 0; i--) { - char c = *(scrollPointer + ((LCD_WIDTH - ((_md->isDir)?2:1)) - i)); + char c = *(_md->scrollPointer + _md->offset +((LCD_WIDTH - ((_md->isDir)?2:1)) - i)); if (c == '\0') { - scrollPointer = NULL; //invalidate string lcd_scrollTimer.stop(); break; //stop at the end of the string } @@ -360,7 +352,12 @@ static void lcd_filename_scroll() //this is a submenu { lcd_space(i); } - scrollPointer++; + _md->offset++; + } + if (rewindFlag) //go back to sd_menu. + { + lcd_scrollTimer.start(); + menu_back_scroll(lcd_encoder); } } static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename) @@ -407,17 +404,17 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) { if (lcd_draw_update || !lcd_scrollTimer.running()) { - scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; if (lcd_encoder == menu_item && !lcd_scrollTimer.running()) { // lcd_beeper_quick_feedback(); _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); _md->isDir = 1; _md->row = menu_row; + _md->scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; menu_submenu_scroll(lcd_filename_scroll); return 1; //stop menu generation early } - else lcd_implementation_drawmenu_sddirectory(menu_row, scrollPointer); + else lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); } if (menu_clicked && (lcd_encoder == menu_item)) { @@ -439,17 +436,17 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) { if (lcd_draw_update || !lcd_scrollTimer.running()) { - scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; if (lcd_encoder == menu_item && !lcd_scrollTimer.running()) { // lcd_beeper_quick_feedback(); _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); _md->isDir = 0; _md->row = menu_row; + _md->scrollPointer = (str_fnl[0] == '\0') ? str_fn : str_fnl; menu_submenu_scroll(lcd_filename_scroll); return 1; } - else lcd_implementation_drawmenu_sdfile(menu_row, scrollPointer); + else lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); } if (menu_clicked && (lcd_encoder == menu_item)) { From f0f7db57ea3f807e7ab410f9e173461ead898609 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 17 Dec 2019 00:44:47 +0200 Subject: [PATCH 9/9] Fist attempt at "saved position SD menu" --- Firmware/cardreader.cpp | 144 ++++++---------------------------------- Firmware/cardreader.h | 35 +--------- Firmware/ultralcd.cpp | 31 +++------ Firmware/ultralcd.h | 2 + 4 files changed, 34 insertions(+), 178 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index dbe751a08..e78c083e3 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -416,6 +416,7 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru getfilename(0, fname); lcd_setstatus(longFilename[0] ? longFilename : fname); lcd_setstatus("SD-PRINTING "); + scrollstuff = 0; } else { @@ -689,12 +690,20 @@ void CardReader::updir() * Get the name of a file in the current directory by sort-index */ void CardReader::getfilename_sorted(const uint16_t nr) { - getfilename( - #if SDSORT_GCODE - sort_alpha && - #endif - (nr < sort_count) ? sort_order[nr] : nr - ); + if (nr < sort_count) + getfilename_simple( + #if SDSORT_GCODE + sort_alpha && + #endif + sort_positions[sort_order[nr]] + ); + else + getfilename( + #if SDSORT_GCODE + sort_alpha && + #endif + nr + ); } /** @@ -730,44 +739,10 @@ void CardReader::presort() { fileCnt = SDSORT_LIMIT; } lcd_clear(); - #if !SDSORT_USES_RAM - lcd_set_progress(); - #endif + lcd_set_progress(); lcd_puts_at_P(0, 1, _i("Sorting files"));////MSG_SORTING c=20 r=1 - // Sort order is always needed. May be static or dynamic. - #if SDSORT_DYNAMIC_RAM - sort_order = new uint8_t[fileCnt]; - #endif - - // Use RAM to store the entire directory during pre-sort. - // SDSORT_LIMIT should be set to prevent over-allocation. - #if SDSORT_USES_RAM - - // If using dynamic ram for names, allocate on the heap. - #if SDSORT_CACHE_NAMES - #if SDSORT_DYNAMIC_RAM - sortshort = new char*[fileCnt]; - sortnames = new char*[fileCnt]; - #endif - #elif SDSORT_USES_STACK - char sortnames[fileCnt][LONG_FILENAME_LENGTH]; - uint16_t modification_time[fileCnt]; - uint16_t modification_date[fileCnt]; - #endif - - // Folder sorting needs 1 bit per entry for flags. - #if HAS_FOLDER_SORTING - #if SDSORT_DYNAMIC_RAM - isDir = new uint8_t[(fileCnt + 7) >> 3]; - #elif SDSORT_USES_STACK - uint8_t isDir[(fileCnt + 7) >> 3]; - #endif - #endif - - #else // !SDSORT_USES_RAM - - uint32_t positions[fileCnt]; + // uint32_t positions[fileCnt]; // By default re-read the names from SD for every compare // retaining only two filenames at a time. This is very @@ -776,7 +751,6 @@ void CardReader::presort() { uint16_t modification_time_bckp; uint16_t modification_date_bckp; - #endif position = 0; if (fileCnt > 1) { // Init sort order. @@ -784,37 +758,8 @@ void CardReader::presort() { if (!IS_SD_INSERTED) return; manage_heater(); sort_order[i] = i; - positions[i] = position; + sort_positions[i] = position; getfilename(i); - // If using RAM then read all filenames now. - #if SDSORT_USES_RAM - getfilename(i); - #if SDSORT_DYNAMIC_RAM - // Use dynamic method to copy long filename - sortnames[i] = strdup(LONGEST_FILENAME); - #if SDSORT_CACHE_NAMES - // When caching also store the short name, since - // we're replacing the getfilename() behavior. - sortshort[i] = strdup(filename); - #endif - #else - // Copy filenames into the static array - strcpy(sortnames[i], LONGEST_FILENAME); - modification_time[i] = modificationTime; - modification_date[i] = modificationDate; - #if SDSORT_CACHE_NAMES - strcpy(sortshort[i], filename); - #endif - #endif - // char out[30]; - // sprintf_P(out, PSTR("---- %i %s %s"), i, filenameIsDir ? "D" : " ", sortnames[i]); - // SERIAL_ECHOLN(out); - #if HAS_FOLDER_SORTING - const uint16_t bit = i & 0x07, ind = i >> 3; - if (bit == 0) isDir[ind] = 0x00; - if (filenameIsDir) isDir[ind] |= _BV(bit); - #endif - #endif } #ifdef QUICKSORT @@ -824,41 +769,18 @@ void CardReader::presort() { uint16_t total = 0.5*(fileCnt - 1)*(fileCnt); // Compare names from the array or just the two buffered names - #if SDSORT_USES_RAM - #define _SORT_CMP_NODIR() (strcasecmp(sortnames[o1], sortnames[o2]) > 0) - #define _SORT_CMP_TIME_NODIR() (((modification_date[o1] == modification_date[o2]) && (modification_time[o1] < modification_time[o2])) || \ - (modification_date[o1] < modification_date [o2])) - #else #define _SORT_CMP_NODIR() (strcasecmp(name1, name2) > 0) //true if lowercase(name1) > lowercase(name2) - #define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp > modificationTime)) || \ - (modification_date_bckp > modificationDate)) - - #endif + #define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp > modificationTime)) || (modification_date_bckp > modificationDate)) #if HAS_FOLDER_SORTING - #if SDSORT_USES_RAM - // Folder sorting needs an index and bit to test for folder-ness. - const uint8_t ind1 = o1 >> 3, bit1 = o1 & 0x07, - ind2 = o2 >> 3, bit2 = o2 & 0x07; - #define _SORT_CMP_DIR(fs) \ - (((isDir[ind1] & _BV(bit1)) != 0) == ((isDir[ind2] & _BV(bit2)) != 0) \ - ? _SORT_CMP_NODIR() \ - : (isDir[fs > 0 ? ind1 : ind2] & (fs > 0 ? _BV(bit1) : _BV(bit2))) != 0) - #define _SORT_CMP_TIME_DIR(fs) \ - (((isDir[ind1] & _BV(bit1)) != 0) == ((isDir[ind2] & _BV(bit2)) != 0) \ - ? _SORT_CMP_TIME_NODIR() \ - : (isDir[fs > 0 ? ind1 : ind2] & (fs > 0 ? _BV(bit1) : _BV(bit2))) != 0) - #else #define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs > 0 ? dir1 : !dir1)) #define _SORT_CMP_TIME_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_TIME_NODIR() : (fs < 0 ? dir1 : !dir1)) #endif - #endif for (uint16_t i = fileCnt; --i;) { if (!IS_SD_INSERTED) return; bool didSwap = false; - #if !SDSORT_USES_RAM //show progresss bar only if slow sorting method is used int8_t percent = (counter * 100) / total;//((counter * 100) / pow((fileCnt-1),2)); for (int column = 0; column < 20; column++) { if (column < (percent / 5)) @@ -868,7 +790,6 @@ void CardReader::presort() { } } counter++; - #endif //MYSERIAL.println(int(i)); for (uint16_t j = 0; j < i; ++j) { @@ -880,14 +801,14 @@ void CardReader::presort() { // throughout the loop. Slow if there are many. #if !SDSORT_USES_RAM counter++; - getfilename_simple(positions[o1]); + getfilename_simple(sort_positions[o1]); strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it) modification_date_bckp = modificationDate; modification_time_bckp = modificationTime; #if HAS_FOLDER_SORTING bool dir1 = filenameIsDir; #endif - getfilename_simple(positions[o2]); + getfilename_simple(sort_positions[o2]); char *name2 = LONGEST_FILENAME; // use the string in-place #endif // !SDSORT_USES_RAM @@ -909,32 +830,9 @@ void CardReader::presort() { if (!didSwap) break; } //end of bubble sort loop #endif - // Using RAM but not keeping names around - #if (SDSORT_USES_RAM && !SDSORT_CACHE_NAMES) - #if SDSORT_DYNAMIC_RAM - for (uint16_t i = 0; i < fileCnt; ++i) free(sortnames[i]); - #if HAS_FOLDER_SORTING - free(isDir); - #endif - #endif - #endif } else { sort_order[0] = 0; - #if (SDSORT_USES_RAM && SDSORT_CACHE_NAMES) - getfilename(0); - #if SDSORT_DYNAMIC_RAM - sortnames = new char*[1]; - sortnames[0] = strdup(LONGEST_FILENAME); // malloc - sortshort = new char*[1]; - sortshort[0] = strdup(filename); // malloc - isDir = new uint8_t[1]; - #else - strcpy(sortnames[0], LONGEST_FILENAME); - strcpy(sortshort[0], filename); - #endif - isDir[0] = filenameIsDir ? 0x01 : 0x00; - #endif } sort_count = fileCnt; diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index 9a7d0f697..c51829043 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -93,39 +93,8 @@ private: //bool sort_reverse; // Flag to enable / disable reverse sorting #endif - // By default the sort index is static - #if SDSORT_DYNAMIC_RAM - uint8_t *sort_order; - #else - uint8_t sort_order[SDSORT_LIMIT]; - #endif - // Cache filenames to speed up SD menus. - #if SDSORT_USES_RAM - - // If using dynamic ram for names, allocate on the heap. - #if SDSORT_CACHE_NAMES - #if SDSORT_DYNAMIC_RAM - char **sortshort, **sortnames; - #else - char sortshort[SDSORT_LIMIT][FILENAME_LENGTH]; - char sortnames[SDSORT_LIMIT][FILENAME_LENGTH]; - #endif - #elif !SDSORT_USES_STACK - char sortnames[SDSORT_LIMIT][FILENAME_LENGTH]; - uint16_t modification_time[SDSORT_LIMIT]; - uint16_t modification_date[SDSORT_LIMIT]; - #endif - - // Folder sorting uses an isDir array when caching items. - #if HAS_FOLDER_SORTING - #if SDSORT_DYNAMIC_RAM - uint8_t *isDir; - #elif (SDSORT_CACHE_NAMES) || !(SDSORT_USES_STACK) - uint8_t isDir[(SDSORT_LIMIT + 7) >> 3]; - #endif - #endif - - #endif // SDSORT_USES_RAM + uint8_t sort_order[SDSORT_LIMIT]; // By default the sort index is static. + uint32_t sort_positions[SDSORT_LIMIT]; #endif // SDCARD_SORT_ALPHA diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1d7dd6d51..9df980222 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -57,7 +57,7 @@ static void lcd_mesh_bed_leveling_settings(); static void lcd_backlight_menu(); int8_t ReInitLCD = 0; - +uint8_t scrollstuff = 0; int8_t SilentModeMenu = SILENT_MODE_OFF; uint8_t SilentModeMenu_MMU = 1; //activate mmu unit stealth mode @@ -325,6 +325,7 @@ typedef struct bool isDir = 0; uint8_t row = 0; const char* scrollPointer; + uint16_t fileCnt; } _menu_data_scroll_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_scroll_t),"_menu_data_scroll_t doesn't fit into menu_data"); @@ -634,16 +635,6 @@ void lcdui_print_time(void) //Print status line on status screen void lcdui_print_status_line(void) { -/* if (IS_SD_PRINTING) - { - if (strcmp(longFilenameOLD, (card.longFilename[0] ? card.longFilename : card.filename)) != 0) - { - memset(longFilenameOLD, '\0', strlen(longFilenameOLD)); - sprintf_P(longFilenameOLD, PSTR("%s"), (card.longFilename[0] ? card.longFilename : card.filename)); - scrollstuff = 0; - } - } */ - if (heating_status) { // If heating flag, show progress of heating heating_status_counter++; @@ -687,7 +678,8 @@ void lcdui_print_status_line(void) } else if ((IS_SD_PRINTING) && (custom_message_type == CustomMsg::Status)) { // If printing from SD, show what we are printing - /* if(strlen(longFilenameOLD) > LCD_WIDTH) + const char* longFilenameOLD = (card.longFilename[0] ? card.longFilename : card.filename); + if(strlen(longFilenameOLD) > LCD_WIDTH) { int inters = 0; int gh = scrollstuff; @@ -713,7 +705,7 @@ void lcdui_print_status_line(void) else { lcd_printf_P(PSTR("%-20s"), longFilenameOLD); - } */ + } } else { // Otherwise check for other special events @@ -7292,11 +7284,12 @@ void lcd_sdcard_menu() bool scrollEnter = lcd_scrollTimer.expired(500); if (lcd_draw_update == 0 && LCD_CLICKED == 0 && !scrollEnter && !menu_entering) return; // nothing to do (so don't thrash the SD card) - uint16_t fileCnt = card.getnrfilenames(); + _menu_data_scroll_t* _md = (_menu_data_scroll_t*)&(menu_data[0]); if (menu_entering) { menu_entering = 0; //clear entering flag lcd_draw_update = 1; //draw lines again + _md->fileCnt = card.getnrfilenames(); } if (!scrollEnter) lcd_scrollTimer.start(); MENU_BEGIN(); @@ -7311,17 +7304,11 @@ void lcd_sdcard_menu() MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); } - for (uint16_t i = 0; i < fileCnt; i++) + for (uint16_t i = 0; i < _md->fileCnt; i++) { if (menu_item == menu_line) { - const uint16_t nr = ((sdSort == SD_SORT_NONE) || farm_mode || (sdSort == SD_SORT_TIME)) ? (fileCnt - 1 - i) : i; - /*#ifdef SDCARD_RATHERRECENTFIRST - #ifndef SDCARD_SORT_ALPHA - fileCnt - 1 - - #endif - #endif - i;*/ + const uint16_t nr = ((sdSort == SD_SORT_NONE) || farm_mode || (sdSort == SD_SORT_TIME)) ? (_md->fileCnt - 1 - i) : i; #ifdef SDCARD_SORT_ALPHA if (sdSort == SD_SORT_NONE) card.getfilename(nr); else card.getfilename_sorted(nr); diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 9e0c35b00..174491e1e 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -144,6 +144,8 @@ extern uint8_t SilentModeMenu_MMU; extern bool cancel_heatup; extern bool isPrintPaused; +extern uint8_t scrollstuff; + void lcd_ignore_click(bool b=true); void lcd_commands();