diff options
author | kliment <kliment.yanev@gmail.com> | 2011-11-16 07:22:49 -0800 |
---|---|---|
committer | kliment <kliment.yanev@gmail.com> | 2011-11-16 07:22:49 -0800 |
commit | bb28b03aa2c064aa2e9e4e0e21b937719ba48743 (patch) | |
tree | 29b324361e5ecbd3d726e7b560435f14511e86f6 | |
parent | 514eec1fee725648e30aec82db06f2ba5b53b98a (diff) | |
parent | fa1a0e7def0c3c0049953639cc17b8a21e8da163 (diff) |
Merge pull request #119 from pipakin/experimental
Block transfer
-rw-r--r-- | Sprinter/Configuration.h | 6 | ||||
-rw-r--r-- | Sprinter/Sprinter.pde | 106 |
2 files changed, 111 insertions, 1 deletions
diff --git a/Sprinter/Configuration.h b/Sprinter/Configuration.h index 950387a..be42e0b 100644 --- a/Sprinter/Configuration.h +++ b/Sprinter/Configuration.h @@ -50,9 +50,13 @@ const bool Z_ENDSTOP_INVERT = false; // Comment out (using // at the start of the line) to disable SD support: #define SDSUPPORT - //// ADVANCED SETTINGS - to tweak parameters +#ifdef SDSUPPORT + //Fast transfer chunk size (> 1024 is unstable, change at your own risk). + #define SD_FAST_XFER_CHUNK_SIZE 1024 +#endif + #include "thermistortables.h" // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 diff --git a/Sprinter/Sprinter.pde b/Sprinter/Sprinter.pde index bc8a2ac..1322b30 100644 --- a/Sprinter/Sprinter.pde +++ b/Sprinter/Sprinter.pde @@ -167,6 +167,9 @@ unsigned long stepper_inactive_time = 0; bool sdactive = false; bool savetosd = false; int16_t n; + char fastxferbuffer[SD_FAST_XFER_CHUNK_SIZE + 1]; + int lastxferchar; + long xferbytes; void initsd(){ sdactive = false; @@ -205,6 +208,102 @@ unsigned long stepper_inactive_time = 0; Serial.println("error writing to file"); } } + + void fast_xfer() + { + char *pstr; + boolean done = false; + + //force heater pins low + if(HEATER_0_PIN > -1) WRITE(HEATER_0_PIN,LOW); + if(HEATER_1_PIN > -1) WRITE(HEATER_1_PIN,LOW); + + lastxferchar = 1; + xferbytes = 0; + + pstr = strstr(strchr_pointer+4, " "); + + if(pstr == NULL) + { + Serial.println("invalid command"); + return; + } + + *pstr = '\0'; + + //check mode (currently only RAW is supported + if(strcmp(strchr_pointer+4, "RAW") != 0) + { + Serial.println("Invalid transfer codec"); + return; + }else{ + Serial.print("Selected codec: "); + Serial.println(strchr_pointer+4); + } + + if (!file.open(&root, pstr+1, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) + { + Serial.print("open failed, File: "); + Serial.print(pstr+1); + Serial.print("."); + }else{ + Serial.print("Writing to file: "); + Serial.println(pstr+1); + } + + Serial.println("ok"); + + //RAW transfer codec + //Host sends \0 then up to SD_FAST_XFER_CHUNK_SIZE then \0 + //when host is done, it sends \0\0. + //if a non \0 character is recieved at the beginning, host has failed somehow, kill the transfer. + + //read SD_FAST_XFER_CHUNK_SIZE bytes (or until \0 is recieved) + while(!done) + { + while(!Serial.available()) + { + } + if(Serial.peek() != 0) + { + //host has failed, this isn't a RAW chunk, it's an actual command + file.sync(); + file.close(); + return; + } + //clear the initial 0 + Serial.read(); + for(int i=0;i<SD_FAST_XFER_CHUNK_SIZE+1;i++) + { + while(!Serial.available()) + { + } + lastxferchar = Serial.read(); + //buffer the data... + fastxferbuffer[i] = lastxferchar; + + xferbytes++; + + if(lastxferchar == 0) + break; + } + + if(fastxferbuffer[0] != 0) + { + fastxferbuffer[SD_FAST_XFER_CHUNK_SIZE] = 0; + file.write(fastxferbuffer); + Serial.println("ok"); + }else{ + Serial.print("Wrote "); + Serial.print(xferbytes); + Serial.println(" bytes."); + done = true; + } + } + + file.sync(); + file.close(); + } #endif @@ -750,6 +849,13 @@ inline void process_commands() //processed in write to file routine above //savetosd = false; break; + case 30: //M30 - fast SD transfer + fast_xfer(); + break; + case 31: //M31 - high speed xfer capabilities + Serial.print("RAW:"); + Serial.println(SD_FAST_XFER_CHUNK_SIZE); + break; #endif case 42: //M42 -Change pin status via gcode if (code_seen('S')) |