Fix bug: diveToFile breaks M23 (#13865)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							e5438a9a03
						
					
				
				
					commit
					c369477cb0
				
			| @@ -392,7 +392,6 @@ void PrintJobRecovery::resume() { | ||||
|  | ||||
|   // Resume the SD file from the last position | ||||
|   char *fn = info.sd_filename; | ||||
|   while (*fn == '/') fn++; | ||||
|   sprintf_P(cmd, PSTR("M23 %s"), fn); | ||||
|   gcode.process_subcommands_now(cmd); | ||||
|   sprintf_P(cmd, PSTR("M24 S%ld T%ld"), info.sdpos, info.print_job_elapsed); | ||||
|   | ||||
| @@ -29,6 +29,8 @@ | ||||
|  | ||||
| /** | ||||
|  * M23: Open a file | ||||
|  * | ||||
|  * The path is relative to the root directory | ||||
|  */ | ||||
| void GcodeSuite::M23() { | ||||
|   // Simplify3D includes the size, so zero out all spaces (#7227) | ||||
|   | ||||
| @@ -461,7 +461,7 @@ void CardReader::openFile(char * const path, const bool read, const bool subcall | ||||
|   stopSDPrint(); | ||||
|  | ||||
|   SdFile *curDir; | ||||
|   const char * const fname = diveToFile(curDir, path, false); | ||||
|   const char * const fname = diveToFile(curDir, path); | ||||
|   if (!fname) return; | ||||
|  | ||||
|   if (read) { | ||||
| @@ -501,7 +501,7 @@ void CardReader::removeFile(const char * const name) { | ||||
|   //stopSDPrint(); | ||||
|  | ||||
|   SdFile *curDir; | ||||
|   const char * const fname = diveToFile(curDir, name, false); | ||||
|   const char * const fname = diveToFile(curDir, name); | ||||
|   if (!fname) return; | ||||
|  | ||||
|   if (file.remove(curDir, fname)) { | ||||
| @@ -641,15 +641,31 @@ uint16_t CardReader::getnrfilenames() { | ||||
|  * | ||||
|  * A NULL result indicates an unrecoverable error. | ||||
|  */ | ||||
| const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, const bool echo) { | ||||
|   SdFile myDir; | ||||
|   if (path[0] != '/') { curDir = &workDir; return path; } | ||||
| const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, const bool echo/*=false*/) { | ||||
|   // Track both parent and subfolder | ||||
|   static SdFile newDir1, newDir2; | ||||
|   SdFile *sub = &newDir1, *startDir; | ||||
|  | ||||
|   const char *dirname_start = path; | ||||
|   char echo_fn[105]; | ||||
|    | ||||
|   if (path[0] == '/') {  | ||||
|     curDir = &root; | ||||
|   const char *dirname_start = &path[1]; | ||||
|     workDirDepth = 0; | ||||
|     dirname_start++; | ||||
|   } | ||||
|   else | ||||
|     curDir = &workDir;  | ||||
|  | ||||
|   startDir = curDir; | ||||
|  | ||||
|   // Start dive | ||||
|   while (dirname_start) { | ||||
|     // Find next sub | ||||
|     char * const dirname_end = strchr(dirname_start, '/'); | ||||
|     if (dirname_end <= dirname_start) break; | ||||
|  | ||||
|     // Set subDirName | ||||
|     const uint8_t len = dirname_end - dirname_start; | ||||
|     char dosSubdirname[len + 1]; | ||||
|     strncpy(dosSubdirname, dirname_start, len); | ||||
| @@ -657,11 +673,25 @@ const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, con | ||||
|  | ||||
|     if (echo) SERIAL_ECHOLN(dosSubdirname); | ||||
|  | ||||
|     if (!myDir.open(curDir, dosSubdirname, O_READ)) { | ||||
|     // Open curDir | ||||
|     if (!sub->open(curDir, dosSubdirname, O_READ)) { | ||||
|       SERIAL_ECHOLNPAIR(MSG_SD_OPEN_FILE_FAIL, dosSubdirname, "."); | ||||
|       return NULL; | ||||
|     } | ||||
|     curDir = &myDir; | ||||
|  | ||||
|     // Close curDir if not at starting-point | ||||
|     if (curDir != startDir) curDir->close(); | ||||
|  | ||||
|     // curDir now subDir | ||||
|     curDir = sub; | ||||
|  | ||||
|     // Update workDirParents and workDirDepth | ||||
|     if (workDirDepth < MAX_DIR_DEPTH) workDirParents[workDirDepth++] = *curDir; | ||||
|  | ||||
|     // Point sub pointer to unused newDir | ||||
|     sub = (curDir != &newDir1) ? &newDir1 : &newDir2; | ||||
|  | ||||
|     // dirname_start point to next sub | ||||
|     dirname_start = dirname_end + 1; | ||||
|   } | ||||
|   return dirname_start; | ||||
|   | ||||
| @@ -88,7 +88,7 @@ public: | ||||
|   static int8_t updir(); | ||||
|   static void setroot(); | ||||
|  | ||||
|   static const char* diveToFile(SdFile*& curDir, const char * const path, const bool echo); | ||||
|   static const char* diveToFile(SdFile*& curDir, const char * const path, const bool echo=false); | ||||
|  | ||||
|   static uint16_t get_num_Files(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user