minimize SD card reads when using SDCARD_SORT_ALPHA (Re-ARM board)
Because of the Re-ARM card's pinout there is only one SPI connected to the RepRap Discount Full Graphic LCD display. The LCD responds to ANY SCK transitions no matter if it's enable is inactive. The result is garbage (usually bars) on the LCD display whenever there is SD card activity. This code minimizes this by only accessing the SD card when changing directory levels if : SDCARD_SORT_ALPHA is enabled SDSORT_USES_RAM is true SDSORT_CACHE_NAMES is true The code changes result in file names being pulled from the ALPHA SORT memory array rather than the SD card. The code also gives the file count and file index functions their own variables. When they shared a common variable the index function sometimes resulted in the file count being short by 1. ======================================================================= cardreader.cpp & pins_RAMPS_RE_ARM.h changes Added another condition to cardreader.cpp to enable getting file names only from RAM. pins_RAMPS_RE_ARM.h : Added comments about the SD card accesses and the LCD display Combined all versions into this one.
This commit is contained in:
parent
84a11cfedc
commit
76da81c1de
@ -74,9 +74,12 @@ char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters
|
|||||||
/**
|
/**
|
||||||
* Dive into a folder and recurse depth-first to perform a pre-set operation lsAction:
|
* Dive into a folder and recurse depth-first to perform a pre-set operation lsAction:
|
||||||
* LS_Count - Add +1 to nrFiles for every file within the parent
|
* LS_Count - Add +1 to nrFiles for every file within the parent
|
||||||
* LS_GetFilename - Get the filename of the file indexed by nrFiles
|
* LS_GetFilename - Get the filename of the file indexed by nrFile_index
|
||||||
* LS_SerialPrint - Print the full path and size of each file to serial output
|
* LS_SerialPrint - Print the full path and size of each file to serial output
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
uint16_t nrFile_index;
|
||||||
|
|
||||||
void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/) {
|
void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/) {
|
||||||
dir_t p;
|
dir_t p;
|
||||||
uint8_t cnt = 0;
|
uint8_t cnt = 0;
|
||||||
@ -130,7 +133,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
|
|||||||
|
|
||||||
if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue;
|
if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue;
|
||||||
|
|
||||||
switch (lsAction) {
|
switch (lsAction) { // 1 based file count
|
||||||
case LS_Count:
|
case LS_Count:
|
||||||
nrFiles++;
|
nrFiles++;
|
||||||
break;
|
break;
|
||||||
@ -148,7 +151,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
|
|||||||
if (match != NULL) {
|
if (match != NULL) {
|
||||||
if (strcasecmp(match, filename) == 0) return;
|
if (strcasecmp(match, filename) == 0) return;
|
||||||
}
|
}
|
||||||
else if (cnt == nrFiles) return;
|
else if (cnt == nrFile_index) return; // 0 based index
|
||||||
cnt++;
|
cnt++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -596,7 +599,7 @@ void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) {
|
|||||||
#endif // SDSORT_CACHE_NAMES
|
#endif // SDSORT_CACHE_NAMES
|
||||||
curDir = &workDir;
|
curDir = &workDir;
|
||||||
lsAction = LS_GetFilename;
|
lsAction = LS_GetFilename;
|
||||||
nrFiles = nr;
|
nrFile_index = nr;
|
||||||
curDir->rewind();
|
curDir->rewind();
|
||||||
lsDive("", *curDir, match);
|
lsDive("", *curDir, match);
|
||||||
}
|
}
|
||||||
@ -861,6 +864,13 @@ void CardReader::updir() {
|
|||||||
|
|
||||||
#endif // SDCARD_SORT_ALPHA
|
#endif // SDCARD_SORT_ALPHA
|
||||||
|
|
||||||
|
#if (ENABLED(SDCARD_SORT_ALPHA) && SDSORT_USES_RAM && SDSORT_CACHE_NAMES)
|
||||||
|
// if true - don't need to access the SD card for file names
|
||||||
|
uint16_t CardReader::get_num_Files() {return nrFiles;}
|
||||||
|
#else
|
||||||
|
uint16_t CardReader::get_num_Files() {return getnrfilenames(); }
|
||||||
|
#endif
|
||||||
|
|
||||||
void CardReader::printingHasFinished() {
|
void CardReader::printingHasFinished() {
|
||||||
stepper.synchronize();
|
stepper.synchronize();
|
||||||
file.close();
|
file.close();
|
||||||
|
@ -69,6 +69,8 @@ public:
|
|||||||
void updir();
|
void updir();
|
||||||
void setroot();
|
void setroot();
|
||||||
|
|
||||||
|
uint16_t get_num_Files();
|
||||||
|
|
||||||
#if ENABLED(SDCARD_SORT_ALPHA)
|
#if ENABLED(SDCARD_SORT_ALPHA)
|
||||||
void presort();
|
void presort();
|
||||||
void getfilename_sorted(const uint16_t nr);
|
void getfilename_sorted(const uint16_t nr);
|
||||||
|
@ -3507,7 +3507,7 @@ void kill_screen(const char* lcd_msg) {
|
|||||||
void lcd_sdcard_menu() {
|
void lcd_sdcard_menu() {
|
||||||
ENCODER_DIRECTION_MENUS();
|
ENCODER_DIRECTION_MENUS();
|
||||||
if (!lcdDrawUpdate && !lcd_clicked) return; // nothing to do (so don't thrash the SD card)
|
if (!lcdDrawUpdate && !lcd_clicked) return; // nothing to do (so don't thrash the SD card)
|
||||||
const uint16_t fileCnt = card.getnrfilenames();
|
const uint16_t fileCnt = card.get_num_Files();
|
||||||
START_MENU();
|
START_MENU();
|
||||||
MENU_BACK(MSG_MAIN);
|
MENU_BACK(MSG_MAIN);
|
||||||
card.getWorkDirName();
|
card.getWorkDirName();
|
||||||
@ -3520,6 +3520,7 @@ void kill_screen(const char* lcd_msg) {
|
|||||||
MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir);
|
MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fileCnt) {
|
||||||
for (uint16_t i = 0; i < fileCnt; i++) {
|
for (uint16_t i = 0; i < fileCnt; i++) {
|
||||||
if (_menuLineNr == _thisItemNr) {
|
if (_menuLineNr == _thisItemNr) {
|
||||||
const uint16_t nr =
|
const uint16_t nr =
|
||||||
@ -3543,6 +3544,7 @@ void kill_screen(const char* lcd_msg) {
|
|||||||
MENU_ITEM_DUMMY();
|
MENU_ITEM_DUMMY();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
END_MENU();
|
END_MENU();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user