Merge pull request #119 from pipakin/experimental

Block transfer
This commit is contained in:
kliment 2011-11-16 07:22:49 -08:00
commit bb28b03aa2
2 changed files with 111 additions and 1 deletions

View file

@ -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

View file

@ -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'))