From 3c579bf738faa18ed6c2c146ee704e4205a1909f Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 08:50:05 +0200 Subject: [PATCH 1/6] Fix fullscreen message lcd_update handling --- Firmware/lcd.cpp | 1 + Firmware/ultralcd.cpp | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 972080631..4220ad0a9 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -702,6 +702,7 @@ void lcd_update(uint8_t lcdDrawUpdateOverride) void lcd_update_enable(uint8_t enabled) { + // printf_P(PSTR("lcd_update_enable(%u -> %u)\n"), lcd_update_enabled, enabled); if (lcd_update_enabled != enabled) { lcd_update_enabled = enabled; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 9b3453962..b96c48d68 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3131,8 +3131,6 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) if (msg_next == NULL) { KEEPALIVE_STATE(IN_HANDLER); lcd_set_custom_characters(); - lcd_update_enable(true); - lcd_update(2); return; } else { From 3a5bc0462ac44a57f8bc75f4cafc91c87f46038b Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 08:50:47 +0200 Subject: [PATCH 2/6] Do not call lcd_update recursively when running presort with many files --- Firmware/ultralcd.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index b96c48d68..84a0d706d 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -363,9 +363,10 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) if (menu_clicked && (lcd_encoder == menu_item)) { menu_clicked = false; - lcd_update_enabled = 0; + lcd_consume_click(); + lcd_update_enabled = false; menu_action_sddirectory(str_fn); - lcd_update_enabled = 1; + lcd_update_enabled = true; /* return */ menu_item_ret(); return 1; } @@ -384,8 +385,11 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) } if (menu_clicked && (lcd_encoder == menu_item)) { + menu_clicked = false; lcd_consume_click(); + lcd_update_enabled = false; menu_action_sdfile(str_fn); + lcd_update_enabled = true; /* return */ menu_item_ret(); return 1; } @@ -6387,7 +6391,9 @@ void lcd_sdcard_menu() if (card.presort_flag == true) //used to force resorting if sorting type is changed. { card.presort_flag = false; + lcd_update_enabled = false; card.presort(); + lcd_update_enabled = true; } _md->fileCnt = card.getnrfilenames(); _md->sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); From a96e60c24112bdbd0c43313a3c43bab8f75d8cd3 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 09:20:03 +0200 Subject: [PATCH 3/6] Do not call lcd_update after presorting --- Firmware/cardreader.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 101c421c1..4e9df733a 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -984,14 +984,11 @@ void CardReader::presort() { } } - lcd_update(2); KEEPALIVE_STATE(NOT_BUSY); } void CardReader::flush_presort() { - if (sort_count > 0) { - sort_count = 0; - } + sort_count = 0; } #endif // SDCARD_SORT_ALPHA From ae1815dc52543eb3d7f264891b3aafbfddbd916b Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 09:48:19 +0200 Subject: [PATCH 4/6] When over the SD limit, continue from the last sorted file This gives a significant speed boost when just above the sorting limit, while only costing 2 bytes of ram --- Firmware/cardreader.cpp | 12 +++++++++++- Firmware/cardreader.h | 4 +++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 4e9df733a..630b0cbd1 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -779,7 +779,15 @@ void CardReader::getfilename_sorted(const uint16_t nr, uint8_t sdSort) { if (nr < sort_count) getfilename_simple(sort_entries[(sdSort == SD_SORT_ALPHA) ? (sort_count - nr - 1) : nr]); else - getfilename(nr); + getfilename_afterMaxSorting(nr); +} + +void CardReader::getfilename_afterMaxSorting(uint16_t entry, const char * const match/*=NULL*/) +{ + curDir = &workDir; + nrFiles = entry - sort_count + 1; + curDir->seekSet(lastSortedFilePosition << 5); + lsDive("", *curDir, match, LS_GetFilename); } /** @@ -830,6 +838,7 @@ void CardReader::presort() { LongTimer sortingSpeedtestTimer; sortingSpeedtestTimer.start(); #endif //SORTING_SPEEDTEST + lastSortedFilePosition = position >> 5; // By default re-read the names from SD for every compare // retaining only two filenames at a time. This is very @@ -989,6 +998,7 @@ void CardReader::presort() { void CardReader::flush_presort() { sort_count = 0; + lastSortedFilePosition = 0; } #endif // SDCARD_SORT_ALPHA diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index 3d3054557..0ccde2323 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -64,6 +64,7 @@ public: #ifdef SDCARD_SORT_ALPHA void presort(); void getfilename_sorted(const uint16_t nr, uint8_t sdSort); + void getfilename_afterMaxSorting(uint16_t entry, const char * const match = NULL); #endif FORCE_INLINE bool isFileOpen() { return file.isOpen(); } @@ -98,8 +99,8 @@ public: int lastnr; //last number of the autostart; #ifdef SDCARD_SORT_ALPHA bool presort_flag; - char dir_names[MAX_DIR_DEPTH][9]; #endif // SDCARD_SORT_ALPHA + char dir_names[MAX_DIR_DEPTH][9]; private: SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; uint16_t workDirDepth; @@ -108,6 +109,7 @@ private: #ifdef SDCARD_SORT_ALPHA uint16_t sort_count; // Count of sorted items in the current directory uint16_t sort_entries[SDSORT_LIMIT]; + uint16_t lastSortedFilePosition; #endif // SDCARD_SORT_ALPHA From 8bb451129d351b334e712323290b6cf0f122a093 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 21:44:54 +0200 Subject: [PATCH 5/6] Remove compiler bug workaround These lines had to be done like that because gcc 5.4.0 would throw a segmentation fault when linking. With gcc 7.3.0, this is no longer an issue --- Firmware/ultralcd.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 84a0d706d..04b3d669b 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -367,8 +367,7 @@ uint8_t menu_item_sddir(const char* str_fn, char* str_fnl) lcd_update_enabled = false; menu_action_sddirectory(str_fn); lcd_update_enabled = true; - /* return */ menu_item_ret(); - return 1; + return menu_item_ret(); } } menu_item++; @@ -390,8 +389,7 @@ static uint8_t menu_item_sdfile(const char* str_fn, char* str_fnl) lcd_update_enabled = false; menu_action_sdfile(str_fn); lcd_update_enabled = true; - /* return */ menu_item_ret(); - return 1; + return menu_item_ret(); } } menu_item++; From 510c8746196a73f92247020997344acc65ec8797 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 21:48:04 +0200 Subject: [PATCH 6/6] Fix scrolling timing issue when the menu is rendering very slowly --- Firmware/ultralcd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 04b3d669b..3ed89f9f4 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6396,6 +6396,7 @@ void lcd_sdcard_menu() _md->fileCnt = card.getnrfilenames(); _md->sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); _md->menuState = _standard; + _md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state. } // FALLTHRU case _standard: //normal menu structure. @@ -6405,7 +6406,7 @@ void lcd_sdcard_menu() _md->lcd_scrollTimer.start(); lcd_draw_update = 1; } - if (_md->lcd_scrollTimer.expired(500) && (_md->row != -1)) //switch to the scrolling state on timeout if a file/dir is selected. + if ((lcd_draw_update == 0) && _md->lcd_scrollTimer.expired(500) && (_md->row != -1)) //switch to the scrolling state on timeout if a file/dir is selected. { _md->menuState = _scrolling; _md->offset = 0;