if(buflen)
{
#ifdef SDSUPPORT
- if(card.savetosd)
+ if(card.saving)
{
if(strstr(cmdbuffer[bufindr],"M29") == NULL)
{
case 2:
case 3:
#ifdef SDSUPPORT
- if(card.savetosd)
+ if(card.saving)
break;
#endif //SDSUPPORT
Serial.println("ok");
}
}
#ifdef SDSUPPORT
- if(!card.sdmode || serial_count!=0){
+ if(!card.sdprinting || serial_count!=0){
return;
}
- while( card.filesize > card.sdpos && buflen < BUFSIZE) {
- short n = card.file.read();
- serial_char = (char)n;
- if(serial_char == '\n' || serial_char == '\r' || serial_char == ':' || serial_count >= (MAX_CMD_SIZE - 1) || n == -1)
+ while( !card.eof() && buflen < BUFSIZE) {
+
+ serial_char = card.get();
+ if(serial_char == '\n' || serial_char == '\r' || serial_char == ':' || serial_count >= (MAX_CMD_SIZE - 1))
{
- card.sdpos = card.file.curPosition();
- if(card.sdpos >= card.filesize){
- card.sdmode = false;
+
+ if(card.eof()){
+ card.sdprinting = false;
Serial.println("echo: Done printing file");
stoptime=millis();
char time[30];
case 20: // M20 - list SD card
Serial.println("Begin file list");
- card.root.ls();
+ card.ls();
Serial.println("End file list");
break;
case 21: // M21 - init SD card
- card.sdmode = false;
+
card.initsd();
break;
case 22: //M22 - release SD card
- card.sdmode = false;
- card.sdactive = false;
+ card.release();
+
break;
case 23: //M23 - Select file
- if(card.sdactive){
- card.sdmode = false;
- card.file.close();
- starpos = (strchr(strchr_pointer + 4,'*'));
- if(starpos!=NULL)
- *(starpos-1)='\0';
- if (card.file.open(&card.root, strchr_pointer + 4, O_READ)) {
- Serial.print("File opened:");
- Serial.print(strchr_pointer + 4);
- Serial.print(" Size:");
- Serial.println(card.file.fileSize());
- card.sdpos = 0;
- card.filesize = card.file.fileSize();
- Serial.println("File selected");
- }
- else{
- Serial.println("file.open failed");
- }
- }
+ starpos = (strchr(strchr_pointer + 4,'*'));
+ if(starpos!=NULL)
+ *(starpos-1)='\0';
+ card.selectFile(strchr_pointer + 4);
break;
case 24: //M24 - Start SD print
- if(card.sdactive){
- card.sdmode = true;
- starttime=millis();
- }
+ card.startFileprint();
+ starttime=millis();
break;
case 25: //M25 - Pause SD print
- if(card.sdmode){
- card.sdmode = false;
- }
+ card.pauseSDPrint();
break;
case 26: //M26 - Set SD index
- if(card.sdactive && code_seen('S')){
- card.sdpos = code_value_long();
- card.file.seekSet(card.sdpos);
+ if(card.cardOK && code_seen('S')){
+ card.setIndex(code_value_long());
+
}
break;
case 27: //M27 - Get SD status
- if(card.sdactive){
- Serial.print("SD printing byte ");
- Serial.print(card.sdpos);
- Serial.print("/");
- Serial.println(card.filesize);
- }
- else{
- Serial.println("Not SD printing");
- }
+ card.getStatus();
break;
case 28: //M28 - Start SD write
- if(card.sdactive){
- char* npos = 0;
- card.file.close();
- card.sdmode = false;
- starpos = (strchr(strchr_pointer + 4,'*'));
- if(starpos != NULL){
- npos = strchr(cmdbuffer[bufindr], 'N');
- strchr_pointer = strchr(npos,' ') + 1;
- *(starpos-1) = '\0';
- }
- if (!card.file.open(&card.root, strchr_pointer+4, O_CREAT | O_APPEND | O_WRITE | O_TRUNC))
- {
- Serial.print("open failed, File: ");
- Serial.print(strchr_pointer + 4);
- Serial.print(".");
- }
- else{
- card.savetosd = true;
- Serial.print("Writing to file: ");
- Serial.println(strchr_pointer + 4);
- }
+ starpos = (strchr(strchr_pointer + 4,'*'));
+ if(starpos != NULL){
+ char* npos = strchr(cmdbuffer[bufindr], 'N');
+ strchr_pointer = strchr(npos,' ') + 1;
+ *(starpos-1) = '\0';
}
+ card.startFilewrite(strchr_pointer+4);
+
break;
case 29: //M29 - Stop SD write
//processed in write to file routine above
- //savetosd = false;
+ //card,saving = false;
break;
#endif //SDSUPPORT
void checkautostart(bool x);
void closefile();
+ void release();
+ void startFileprint();
+ void startFilewrite(char *name);
+ void pauseSDPrint();
+ void getStatus();
+
+ void selectFile(char* name);
void getfilename(const uint8_t nr);
uint8_t getnrfilenames();
+
+
+ inline void ls() {root.ls();};
+ inline bool eof() { sdpos = file.curPosition();return sdpos>=filesize ;};
+ inline char get() { int16_t n = file.read(); return (n!=-1)?(char)n:'\n';};
+ inline void setIndex(long index) {sdpos = index;file.seekSet(index);};
public:
- bool savetosd;
+ bool saving;
+ bool sdprinting ;
+ bool cardOK ;
+ char filename[11];
+private:
+ SdFile root;
+ Sd2Card card;
+ SdVolume volume;
SdFile file;
uint32_t filesize;
+ //int16_t n;
+ unsigned long autostart_atmillis;
uint32_t sdpos ;
- bool sdmode ;
- SdFile root;
- bool sdactive ;
- char filename[11];
-private:
- Sd2Card card;
- SdVolume volume;
-
- //int16_t n;
- unsigned long autostart_atmillis;
- bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
+ bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
};
#endif //SDSUPPORT
{
filesize = 0;
sdpos = 0;
- sdmode = false;
- sdactive = false;
- savetosd = false;
+ sdprinting = false;
+ cardOK = false;
+ saving = false;
autostart_atmillis=0;
autostart_stilltocheck=true; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware.
void CardReader::initsd()
{
- sdactive = false;
+ cardOK = false;
#if SDSS >- 1
if(root.isOpen())
root.close();
}
else
{
- sdactive = true;
+ cardOK = true;
SERIAL_ECHOLN("SD card ok");
}
#endif //SDSS
}
+void CardReader::release()
+{
+ sdprinting = false;
+ cardOK = false;
+}
+
+void CardReader::startFileprint()
+{
+ if(cardOK)
+ {
+ sdprinting = true;
+
+ }
+}
+
+void CardReader::pauseSDPrint()
+{
+ if(sdprinting)
+ {
+ sdprinting = false;
+ }
+}
+
+void CardReader::selectFile(char* name)
+{
+ if(cardOK){
+ sdprinting = false;
+ file.close();
+
+ if (file.open(&root, name, O_READ)) {
+ Serial.print("File opened:");
+ Serial.print(name);
+ Serial.print(" Size:");
+ filesize = file.fileSize();
+ Serial.println(filesize);
+ sdpos = 0;
+
+ Serial.println("File selected");
+ }
+ else{
+ Serial.println("file.open failed");
+ }
+ }
+}
+void CardReader::startFilewrite(char *name)
+{
+ if(cardOK)
+ {
+
+ file.close();
+ sdprinting = false;
+
+ if (!file.open(&root, name, O_CREAT | O_APPEND | O_WRITE | O_TRUNC))
+ {
+ Serial.print("open failed, File: ");
+ Serial.print(name);
+ Serial.print(".");
+ }
+ else{
+ saving = true;
+ Serial.print("Writing to file: ");
+ Serial.println(name);
+ }
+ }
+}
+
+void CardReader::getStatus()
+{
+ if(cardOK){
+ Serial.print("SD printing byte ");
+ Serial.print(sdpos);
+ Serial.print("/");
+ Serial.println(filesize);
+ }
+ else{
+ Serial.println("Not SD printing");
+ }
+}
void CardReader::write_command(char *buf)
{
char* begin = buf;
return;
}
autostart_stilltocheck=false;
- if(!sdactive)
+ if(!cardOK)
{
initsd();
- if(!sdactive) //fail
+ if(!cardOK) //fail
return;
}
static int lastnr=0;
void CardReader::closefile()
{
- file.sync();
+ file.sync();
file.close();
- savetosd = false;
+ saving = false;
}
void CardReader::getfilename(const uint8_t nr)