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