From b803b2a2ddb8df531ab84e6dfed393604b7360a0 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 26 Nov 2019 11:29:57 +0200 Subject: [PATCH 1/8] Another first implementation --- Firmware/Configuration_adv.h | 1 + Firmware/cardreader.cpp | 55 +++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index dd77c91c6..3e7e74a17 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -236,6 +236,7 @@ #define SD_SORT_TIME 0 #define SD_SORT_ALPHA 1 #define SD_SORT_NONE 2 + #define SHELLSORT #define SDSORT_LIMIT 100 // Maximum number of sorted items (10-256). #define FOLDER_SORTING -1 // -1=above 0=none 1=below diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 3c01bf84b..026f5ca0d 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -830,7 +830,55 @@ void CardReader::presort() { #ifdef QUICKSORT quicksort(0, fileCnt - 1); -#else //Qicksort not defined, use Bubble Sort +#elif defined(SHELLSORT) + +#define _SORT_CMP_NODIR() (strcasecmp(name2, name1) > 0) +#define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp < modificationTime)) || (modification_date_bckp < modificationDate)) +#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)) + + for (int16_t gap = fileCnt/2; gap > 0; gap /= 2) + { + for (int16_t i = gap; i < fileCnt; i++) + { + if (!IS_SD_INSERTED) return; + manage_heater(); + uint8_t orderBckp = sort_order[i]; + getfilename_simple(positions[orderBckp]); + 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 + + int16_t j = i; + getfilename_simple(positions[sort_order[j - gap]]); + char *name2 = LONGEST_FILENAME; // use the string in-place + #if HAS_FOLDER_SORTING + for (; j >= gap && ((sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && _SORT_CMP_DIR(FOLDER_SORTING)));) + #else + for (; j >= gap && ((sdSort == SD_SORT_TIME && _SORT_CMP_TIME_NODIR()) || (sdSort == SD_SORT_ALPHA && _SORT_CMP_NODIR()));) + #endif + { + sort_order[j] = sort_order[j - gap]; + j -= gap; + for (uint16_t z = 0; z < fileCnt; z++) + { + printf_P(PSTR("%2u "), sort_order[z]); + } + printf_P(PSTR("i%2d j%2d gap%2d orderBckp%2d"), i, j, gap, orderBckp); + MYSERIAL.println(); + if (j < gap) break; + getfilename_simple(positions[sort_order[j - gap]]); + name2 = LONGEST_FILENAME; // use the string in-place + } + sort_order[j] = orderBckp; + } + } + + +#else //Bubble Sort uint32_t counter = 0; uint16_t total = 0.5*(fileCnt - 1)*(fileCnt); @@ -884,6 +932,11 @@ void CardReader::presort() { //MYSERIAL.println(int(i)); for (uint16_t j = 0; j < i; ++j) { if (!IS_SD_INSERTED) return; + for (uint16_t z = 0; z < fileCnt; z++) + { + printf_P(PSTR("%2u "), sort_order[z]); + } + MYSERIAL.println(); manage_heater(); const uint16_t o1 = sort_order[j], o2 = sort_order[j + 1]; From f87b5a2be7dbe3cbe87975fab48fdb30e2856c73 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 26 Nov 2019 12:18:11 +0200 Subject: [PATCH 2/8] SORTING_DUMP --- Firmware/cardreader.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 026f5ca0d..0c780cd90 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -863,12 +863,13 @@ void CardReader::presort() { { sort_order[j] = sort_order[j - gap]; j -= gap; + #ifdef SORTING_DUMP for (uint16_t z = 0; z < fileCnt; z++) { printf_P(PSTR("%2u "), sort_order[z]); } - printf_P(PSTR("i%2d j%2d gap%2d orderBckp%2d"), i, j, gap, orderBckp); - MYSERIAL.println(); + printf_P(PSTR("i%2d j%2d gap%2d orderBckp%2d\n"), i, j, gap, orderBckp); + #endif if (j < gap) break; getfilename_simple(positions[sort_order[j - gap]]); name2 = LONGEST_FILENAME; // use the string in-place @@ -932,11 +933,13 @@ void CardReader::presort() { //MYSERIAL.println(int(i)); for (uint16_t j = 0; j < i; ++j) { if (!IS_SD_INSERTED) return; - for (uint16_t z = 0; z < fileCnt; z++) - { - printf_P(PSTR("%2u "), sort_order[z]); - } - MYSERIAL.println(); + #ifdef SORTING_DUMP + for (uint16_t z = 0; z < fileCnt; z++) + { + printf_P(PSTR("%2u "), sort_order[z]); + } + MYSERIAL.println(); + #endif manage_heater(); const uint16_t o1 = sort_order[j], o2 = sort_order[j + 1]; From 960f4a88edc59a7c8f4de1b90b9ef71063f63c0a Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 26 Nov 2019 13:36:05 +0200 Subject: [PATCH 3/8] Status bar, lcd optimization, compile warning fix --- Firmware/cardreader.cpp | 30 ++++++++++++++++++++---------- Firmware/lcd.cpp | 15 --------------- Firmware/lcd.h | 1 - Firmware/ultralcd.cpp | 11 +---------- Firmware/ultralcd.h | 3 --- 5 files changed, 21 insertions(+), 39 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 0c780cd90..d8d6f0638 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -741,9 +741,6 @@ void CardReader::presort() { fileCnt = SDSORT_LIMIT; } lcd_clear(); - #if !SDSORT_USES_RAM - lcd_set_progress(); - #endif 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. @@ -837,11 +834,26 @@ void CardReader::presort() { #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)) - for (int16_t gap = fileCnt/2; gap > 0; gap /= 2) + uint16_t counter = 0; + uint16_t total = 0; + for (uint16_t i = fileCnt/2; i > 0; i /= 2) total += fileCnt - i; //total runs for progress bar + + for (uint16_t gap = fileCnt/2; gap > 0; gap /= 2) { - for (int16_t i = gap; i < fileCnt; i++) + for (uint16_t i = gap; i < fileCnt; i++) { if (!IS_SD_INSERTED) return; + + int8_t percent = (counter * 100) / total; + for (int column = 0; column < 20; column++) { + if (column < (percent / 5)) + { + lcd_set_cursor(column, 2); + lcd_print('\xFF'); //simple progress bar + } + } + counter++; + manage_heater(); uint8_t orderBckp = sort_order[i]; getfilename_simple(positions[orderBckp]); @@ -852,7 +864,7 @@ void CardReader::presort() { bool dir1 = filenameIsDir; #endif - int16_t j = i; + uint16_t j = i; getfilename_simple(positions[sort_order[j - gap]]); char *name2 = LONGEST_FILENAME; // use the string in-place #if HAS_FOLDER_SORTING @@ -878,7 +890,6 @@ void CardReader::presort() { } } - #else //Bubble Sort uint32_t counter = 0; uint16_t total = 0.5*(fileCnt - 1)*(fileCnt); @@ -924,7 +935,7 @@ void CardReader::presort() { if (column < (percent / 5)) { lcd_set_cursor(column, 2); - lcd_print('\x01'); //simple progress bar + lcd_print('\xFF'); //simple progress bar } } counter++; @@ -1010,10 +1021,9 @@ void CardReader::presort() { for (int column = 0; column <= 19; column++) { lcd_set_cursor(column, 2); - lcd_print('\x01'); //simple progress bar + lcd_print('\xFF'); //simple progress bar } _delay(300); - lcd_set_degree(); lcd_clear(); #endif lcd_update(2); diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 3e39312c1..ecb25c2a8 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -957,21 +957,6 @@ void lcd_set_custom_characters_arrows(void) lcd_createChar_P(1, lcd_chardata_arrdown); } -const uint8_t lcd_chardata_progress[8] PROGMEM = { - B11111, - B11111, - B11111, - B11111, - B11111, - B11111, - B11111, - B11111}; - -void lcd_set_custom_characters_progress(void) -{ - lcd_createChar_P(1, lcd_chardata_progress); -} - const uint8_t lcd_chardata_arr2down[8] PROGMEM = { B00000, B00000, diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 790c0a955..cd180a441 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -201,7 +201,6 @@ private: extern void lcd_set_custom_characters(void); extern void lcd_set_custom_characters_arrows(void); -extern void lcd_set_custom_characters_progress(void); extern void lcd_set_custom_characters_nextpage(void); extern void lcd_set_custom_characters_degree(void); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 2ed8d5de4..e8c268984 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4590,17 +4590,10 @@ static void lcd_fsensor_state_set() } #endif //FILAMENT_SENSOR - -#if !SDSORT_USES_RAM void lcd_set_degree() { lcd_set_custom_characters_degree(); } -void lcd_set_progress() { - lcd_set_custom_characters_progress(); -} -#endif - #if (LANG_MODE != 0) void menu_setlang(unsigned char lang) @@ -8665,7 +8658,6 @@ static void lcd_connect_printer() { int i = 0; int t = 0; - lcd_set_custom_characters_progress(); lcd_puts_at_P(0, 0, _i("Connect printer to")); lcd_puts_at_P(0, 1, _i("monitoring or hold")); lcd_puts_at_P(0, 2, _i("the knob to continue")); @@ -8682,12 +8674,11 @@ static void lcd_connect_printer() { i = 0; lcd_puts_at_P(0, 3, PSTR(" ")); } - if (i!=0) lcd_puts_at_P((i * 20) / (NC_BUTTON_LONG_PRESS * 10), 3, "\x01"); + if (i!=0) lcd_puts_at_P((i * 20) / (NC_BUTTON_LONG_PRESS * 10), 3, "\xFF"); if (i == NC_BUTTON_LONG_PRESS * 10) { no_response = false; } } - lcd_set_custom_characters_degree(); lcd_update_enable(true); lcd_update(2); } diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index cdddb9cfe..01f598aea 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -213,10 +213,7 @@ void lcd_temp_calibration_set(); void display_loading(); -#if !SDSORT_USES_RAM void lcd_set_degree(); -void lcd_set_progress(); -#endif void lcd_language(); From a7f2e640e0d15649445928971ad2eaf5db5b1893 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 26 Nov 2019 13:57:08 +0200 Subject: [PATCH 4/8] Put folders at the beginning --- Firmware/cardreader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index d8d6f0638..9f97c800e 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -831,8 +831,8 @@ void CardReader::presort() { #define _SORT_CMP_NODIR() (strcasecmp(name2, name1) > 0) #define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp < modificationTime)) || (modification_date_bckp < modificationDate)) -#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)) +#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)) uint16_t counter = 0; uint16_t total = 0; From f5bdbcc0bd91679ec5964bac162c949b28a2c28f Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 26 Nov 2019 14:10:44 +0200 Subject: [PATCH 5/8] Cleanup file compare statement --- Firmware/cardreader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 9f97c800e..26e63b879 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -868,9 +868,9 @@ void CardReader::presort() { getfilename_simple(positions[sort_order[j - gap]]); char *name2 = LONGEST_FILENAME; // use the string in-place #if HAS_FOLDER_SORTING - for (; j >= gap && ((sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && _SORT_CMP_DIR(FOLDER_SORTING)));) + for (; j >= gap && ((sdSort == SD_SORT_TIME)?(_SORT_CMP_TIME_DIR(FOLDER_SORTING)):(_SORT_CMP_DIR(FOLDER_SORTING)));) #else - for (; j >= gap && ((sdSort == SD_SORT_TIME && _SORT_CMP_TIME_NODIR()) || (sdSort == SD_SORT_ALPHA && _SORT_CMP_NODIR()));) + for (; j >= gap && ((sdSort == SD_SORT_TIME)?(_SORT_CMP_TIME_NODIR()):(_SORT_CMP_NODIR()));) #endif { sort_order[j] = sort_order[j - gap]; From 66e51aa29831c17b4986d294adc362f1c948b6d0 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 26 Nov 2019 15:49:45 +0200 Subject: [PATCH 6/8] Folder sorting finished --- Firmware/cardreader.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 26e63b879..1bbfca023 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -831,8 +831,10 @@ void CardReader::presort() { #define _SORT_CMP_NODIR() (strcasecmp(name2, name1) > 0) #define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp < modificationTime)) || (modification_date_bckp < modificationDate)) -#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)) +#if HAS_FOLDER_SORTING +#define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs > 0 ? filenameIsDir : !filenameIsDir)) +#define _SORT_CMP_TIME_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_TIME_NODIR() : (fs < 0 ? filenameIsDir : !filenameIsDir)) +#endif uint16_t counter = 0; uint16_t total = 0; From 11ba616d7363747eaaba350793fe484d48439228 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 27 Nov 2019 11:03:34 +0200 Subject: [PATCH 7/8] Define for dumping sorting process --- Firmware/Configuration_adv.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 3e7e74a17..d2a7221c5 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -237,6 +237,7 @@ #define SD_SORT_ALPHA 1 #define SD_SORT_NONE 2 #define SHELLSORT + // #define SORTING_DUMP #define SDSORT_LIMIT 100 // Maximum number of sorted items (10-256). #define FOLDER_SORTING -1 // -1=above 0=none 1=below From 7753750fa76482a775d838ceed9a242c1dde260b Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 27 Nov 2019 17:31:47 +0200 Subject: [PATCH 8/8] Change for to while --- Firmware/cardreader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 1bbfca023..d925f2cb3 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -870,9 +870,9 @@ void CardReader::presort() { getfilename_simple(positions[sort_order[j - gap]]); char *name2 = LONGEST_FILENAME; // use the string in-place #if HAS_FOLDER_SORTING - for (; j >= gap && ((sdSort == SD_SORT_TIME)?(_SORT_CMP_TIME_DIR(FOLDER_SORTING)):(_SORT_CMP_DIR(FOLDER_SORTING)));) + while (j >= gap && ((sdSort == SD_SORT_TIME)?_SORT_CMP_TIME_DIR(FOLDER_SORTING):_SORT_CMP_DIR(FOLDER_SORTING))) #else - for (; j >= gap && ((sdSort == SD_SORT_TIME)?(_SORT_CMP_TIME_NODIR()):(_SORT_CMP_NODIR()));) + while (j >= gap && ((sdSort == SD_SORT_TIME)?_SORT_CMP_TIME_NODIR():_SORT_CMP_NODIR())) #endif { sort_order[j] = sort_order[j - gap];