Fix bug: diveToFile breaks M23 (#13865)
This commit is contained in:
parent
e5438a9a03
commit
c369477cb0
4 changed files with 42 additions and 11 deletions
|
@ -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 a new issue