From 869cee74e6cdca8caccd281daf2f45cc8e1944b7 Mon Sep 17 00:00:00 2001 From: Bernhard Kubicek Date: Sat, 19 Nov 2011 14:34:27 +0100 Subject: [PATCH] host-based sd card printing seems now to work with folders --- Marlin/cardreader.pde | 101 ++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/Marlin/cardreader.pde b/Marlin/cardreader.pde index 77a8f692b..4c869e427 100644 --- a/Marlin/cardreader.pde +++ b/Marlin/cardreader.pde @@ -64,7 +64,7 @@ void CardReader::lsDive(char *prepend,SdFile parent) strcat(path,lfilename); strcat(path,"/"); - Serial.print(path); + //Serial.print(path); SdFile dir; if(!dir.open(parent,lfilename, O_READ)) @@ -81,30 +81,33 @@ void CardReader::lsDive(char *prepend,SdFile parent) } - if (p.name[0] == DIR_NAME_FREE) break; - if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.'|| p.name[0] == '_') continue; - if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue; - - - if(p.name[8]!='G') continue; - if(p.name[9]=='~') continue; - //if(cnt++!=nr) continue; - createFilename(filename,p); - if(lsAction==LS_SerialPrint) - { - SERIAL_PROTOCOL(prepend); - SERIAL_PROTOCOLLN(filename); - } - else if(lsAction==LS_Count) - { - nrFiles++; - } - else if(lsAction==LS_GetFilename) + else { - if(cnt==nrFiles) - return; - cnt++; + if (p.name[0] == DIR_NAME_FREE) break; + if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.'|| p.name[0] == '_') continue; + if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue; + + if(p.name[8]!='G') continue; + if(p.name[9]=='~') continue; + //if(cnt++!=nr) continue; + createFilename(filename,p); + if(lsAction==LS_SerialPrint) + { + SERIAL_PROTOCOL(prepend); + SERIAL_PROTOCOLLN(filename); + } + else if(lsAction==LS_Count) + { + nrFiles++; + } + else if(lsAction==LS_GetFilename) + { + if(cnt==nrFiles) + return; + cnt++; + + } } } } @@ -180,17 +183,57 @@ void CardReader::openFile(char* name,bool read) { if(!cardOK) return; - - file.close(); sdprinting = false; + + + SdFile myDir; + curDir=&root; + char *fname=name; + + char *dirname_start,*dirname_end; + dirname_start=strchr(name,'/')+1; + while(dirname_start!=NULL) + { + dirname_end=strchr(dirname_start,'/'); + //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name)); + //SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end-name)); + if(dirname_end!=NULL && dirname_end>dirname_start) + { + char subdirname[13]; + strncpy(subdirname, dirname_start, dirname_end-dirname_start); + subdirname[dirname_end-dirname_start]=0; + SERIAL_ECHOLN(subdirname); + if(!myDir.open(curDir,subdirname,O_READ)) + { + SERIAL_PROTOCOLPGM("open failed, File: "); + SERIAL_PROTOCOL(subdirname); + SERIAL_PROTOCOLLNPGM("."); + return; + } + else + SERIAL_ECHOLN("dive ok"); + + curDir=&myDir; + dirname_start=dirname_end+1; + } + else // the reminder after all /fsa/fdsa/ is the filename + { + fname=dirname_start; + //SERIAL_ECHOLN("remaider"); + //SERIAL_ECHOLN(fname); + break; + } + + } + if(read) { - if (file.open(&root, name, O_READ)) + if (file.open(curDir, fname, O_READ)) { filesize = file.fileSize(); SERIAL_PROTOCOLPGM("File opened:"); - SERIAL_PROTOCOL(name); + SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLPGM(" Size:"); SERIAL_PROTOCOLLN(filesize); sdpos = 0; @@ -204,10 +247,10 @@ void CardReader::openFile(char* name,bool read) } else { //write - if (!file.open(&root, name, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) + if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { SERIAL_PROTOCOLPGM("open failed, File: "); - SERIAL_PROTOCOL(name); + SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLNPGM("."); } else