|
@@ -302,26 +302,33 @@ void CardReader::openLogFile(char* name) {
|
302
|
302
|
openFile(name, false);
|
303
|
303
|
}
|
304
|
304
|
|
|
305
|
+void appendAtom(SdFile &file, char *& dst, uint8_t &cnt) {
|
|
306
|
+ file.getFilename(dst);
|
|
307
|
+ while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; }
|
|
308
|
+ if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; }
|
|
309
|
+}
|
|
310
|
+
|
305
|
311
|
void CardReader::getAbsFilename(char *t) {
|
306
|
|
- uint8_t cnt = 0;
|
307
|
|
- *t = '/'; t++; cnt++;
|
308
|
|
- for (uint8_t i = 0; i < workDirDepth; i++) {
|
309
|
|
- workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
|
310
|
|
- while (*t && cnt < MAXPATHNAMELENGTH) { t++; cnt++; } //crawl counter forward.
|
|
312
|
+ *t++ = '/'; // Root folder
|
|
313
|
+ uint8_t cnt = 1;
|
|
314
|
+
|
|
315
|
+ for (uint8_t i = 0; i < workDirDepth; i++) // Loop to current work dir
|
|
316
|
+ appendAtom(workDirParents[i], t, cnt);
|
|
317
|
+
|
|
318
|
+ if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH)) {
|
|
319
|
+ appendAtom(file, t, cnt);
|
|
320
|
+ --t;
|
311
|
321
|
}
|
312
|
|
- if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH))
|
313
|
|
- file.getFilename(t);
|
314
|
|
- else
|
315
|
|
- t[0] = 0;
|
|
322
|
+ *t = '\0';
|
316
|
323
|
}
|
317
|
324
|
|
318
|
|
-void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
|
|
325
|
+void CardReader::openFile(char* name, const bool read, const bool subcall/*=false*/) {
|
319
|
326
|
|
320
|
327
|
if (!cardOK) return;
|
321
|
328
|
|
322
|
329
|
uint8_t doing = 0;
|
323
|
|
- if (push_current) {
|
324
|
330
|
if (isFileOpen()) { // Replacing current file or doing a subroutine
|
|
331
|
+ if (subcall) {
|
325
|
332
|
if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
|
326
|
333
|
SERIAL_ERROR_START();
|
327
|
334
|
SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
|
|
@@ -343,7 +350,11 @@ void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
|
343
|
350
|
else
|
344
|
351
|
doing = 1;
|
345
|
352
|
}
|
346
|
|
- else { // Opening fresh file
|
|
353
|
+ else if (subcall) { // Returning from a subcall?
|
|
354
|
+ SERIAL_ECHO_START();
|
|
355
|
+ SERIAL_ECHOLNPGM("END SUBROUTINE");
|
|
356
|
+ }
|
|
357
|
+ else { // Opening fresh file
|
347
|
358
|
doing = 2;
|
348
|
359
|
file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
|
349
|
360
|
}
|
|
@@ -592,20 +603,20 @@ uint16_t CardReader::getnrfilenames() {
|
592
|
603
|
}
|
593
|
604
|
|
594
|
605
|
void CardReader::chdir(const char * relpath) {
|
595
|
|
- SdFile newfile;
|
|
606
|
+ SdFile newDir;
|
596
|
607
|
SdFile *parent = &root;
|
597
|
608
|
|
598
|
609
|
if (workDir.isOpen()) parent = &workDir;
|
599
|
610
|
|
600
|
|
- if (!newfile.open(*parent, relpath, O_READ)) {
|
|
611
|
+ if (!newDir.open(*parent, relpath, O_READ)) {
|
601
|
612
|
SERIAL_ECHO_START();
|
602
|
613
|
SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
|
603
|
614
|
SERIAL_ECHOLN(relpath);
|
604
|
615
|
}
|
605
|
616
|
else {
|
|
617
|
+ workDir = newDir;
|
606
|
618
|
if (workDirDepth < MAX_DIR_DEPTH)
|
607
|
|
- workDirParents[workDirDepth++] = *parent;
|
608
|
|
- workDir = newfile;
|
|
619
|
+ workDirParents[workDirDepth++] = workDir;
|
609
|
620
|
#if ENABLED(SDCARD_SORT_ALPHA)
|
610
|
621
|
presort();
|
611
|
622
|
#endif
|
|
@@ -613,8 +624,8 @@ void CardReader::chdir(const char * relpath) {
|
613
|
624
|
}
|
614
|
625
|
|
615
|
626
|
void CardReader::updir() {
|
616
|
|
- if (workDirDepth > 0) {
|
617
|
|
- workDir = workDirParents[--workDirDepth];
|
|
627
|
+ if (workDirDepth > 0) { // At least 1 dir has been saved
|
|
628
|
+ workDir = --workDirDepth ? workDirParents[workDirDepth] : root; // Use parent, or root if none
|
618
|
629
|
#if ENABLED(SDCARD_SORT_ALPHA)
|
619
|
630
|
presort();
|
620
|
631
|
#endif
|