summaryrefslogtreecommitdiff
path: root/Tonokip_Firmware
diff options
context:
space:
mode:
authorkliment <kliment.yanev@gmail.com>2011-04-06 23:56:39 +0200
committerkliment <kliment.yanev@gmail.com>2011-04-06 23:56:39 +0200
commit0f095d94d8553b5ef341602977ef727cc9fc81ce (patch)
treea44a3540b5603bba05b48f4d57ac4b44a25f9649 /Tonokip_Firmware
parent25d00d4147c5533eee9afde9b28e35e6b013c677 (diff)
SD write support. Safety check for step count.
Diffstat (limited to 'Tonokip_Firmware')
-rw-r--r--Tonokip_Firmware/Tonokip_Firmware.pde85
1 files changed, 73 insertions, 12 deletions
diff --git a/Tonokip_Firmware/Tonokip_Firmware.pde b/Tonokip_Firmware/Tonokip_Firmware.pde
index e441121..a0d48b4 100644
--- a/Tonokip_Firmware/Tonokip_Firmware.pde
+++ b/Tonokip_Firmware/Tonokip_Firmware.pde
@@ -53,7 +53,7 @@ unsigned long previous_micros=0, previous_micros_x=0, previous_micros_y=0, previ
unsigned long x_steps_to_take, y_steps_to_take, z_steps_to_take, e_steps_to_take;
float destination_x =0.0, destination_y = 0.0, destination_z = 0.0, destination_e = 0.0;
float current_x = 0.0, current_y = 0.0, current_z = 0.0, current_e = 0.0;
-float x_interval, y_interval, z_interval, e_interval; // for speed delay
+long x_interval, y_interval, z_interval, e_interval; // for speed delay
float feedrate = 1500, next_feedrate;
float time_for_move;
long gcode_N, gcode_LastN;
@@ -96,6 +96,7 @@ uint32_t filesize=0;
uint32_t sdpos=0;
bool sdmode=false;
bool sdactive=false;
+bool savetosd=false;
int16_t n;
void initsd(){
@@ -114,6 +115,28 @@ else
sdactive=true;
}
+
+inline void write_command(char *buf){
+ char* begin=buf;
+ char* npos=0;
+ char* end=buf+strlen(buf)-1;
+
+ file.writeError = false;
+ if((npos=strchr(buf, 'N')) != NULL){
+ begin = strchr(npos,' ')+1;
+ end =strchr(npos, '*')-1;
+ }
+ end[1]='\r';
+ end[2]='\n';
+ end[3]='\0';
+ //Serial.println(begin);
+ file.write(begin);
+ if (file.writeError){
+ Serial.println("error writing to file");
+ }
+}
+
+
#endif
@@ -121,7 +144,6 @@ void setup()
{
Serial.begin(BAUDRATE);
Serial.println("start");
-
for(int i=0;i<BUFSIZE;i++){
fromsd[i]=false;
}
@@ -181,8 +203,23 @@ void loop()
get_command();
if(buflen){
+#ifdef SDSUPPORT
+ if(savetosd){
+ if(strstr(cmdbuffer[bufindr],"M29")==NULL){
+ write_command(cmdbuffer[bufindr]);
+ file.sync();
+ Serial.println("ok");
+ }else{
+ file.close();
+ savetosd=false;
+ Serial.println("Done saving file.");
+ }
+ }else{
+ process_commands();
+ }
+#else
process_commands();
-
+#endif
buflen=(buflen-1);
bufindr=(bufindr+1)%BUFSIZE;
}
@@ -193,7 +230,6 @@ void loop()
}
-
inline void get_command()
{
while( Serial.available() > 0 && buflen<BUFSIZE) {
@@ -209,7 +245,6 @@ inline void get_command()
strchr_pointer = strchr(cmdbuffer[bufindw], 'N');
gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10));
if(gcode_N != gcode_LastN+1 && (strstr(cmdbuffer[bufindw], "M110") == NULL) ) {
- //if(gcode_N != gcode_LastN+1 && !code_seen("M110") ) { //Hmm, compile size is different between using this vs the line above even though it should be the same thing. Keeping old method.
Serial.print("Serial Error: Line Number is not Last Line Number+1, Last Line:");
Serial.println(gcode_LastN);
Serial.println(gcode_N);
@@ -261,6 +296,10 @@ inline void get_command()
switch((int)((strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)))){
case 0:
case 1:
+ #ifdef SDSUPPORT
+ if(savetosd)
+ break;
+ #endif
Serial.println("ok");
break;
default:
@@ -332,6 +371,7 @@ float xdiff=0,ydiff=0,zdiff=0,ediff=0;
inline void process_commands()
{
unsigned long codenum; //throw away variable
+ char *starpos=NULL;
if(code_seen('G'))
{
switch((int)code_value())
@@ -501,6 +541,27 @@ inline void process_commands()
Serial.println("Not SD printing");
}
break;
+ case 28: //M28 - Start SD write
+ file.close();
+ sdmode=false;
+ starpos=(strchr(strchr_pointer+4,'*'));
+ if(starpos!=NULL)
+ *starpos='\0';
+ if (!file.open(&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{
+ savetosd = true;
+ Serial.print("Writing to file: ");
+ Serial.println(strchr_pointer+4);
+ }
+ break;
+ case 29: //M29 - Stop SD write
+ //processed in write to file routine above
+ //savetosd=false;
+ break;
#endif
case 104: // M104
if (code_seen('S')) target_raw = temp2analog(code_value());
@@ -676,30 +737,30 @@ void linear_move(unsigned long x_steps_remaining, unsigned long y_steps_remainin
unsigned long y_interval_nanos;
unsigned int delta_z = z_steps_remaining;
unsigned long z_interval_nanos;
- float interval;
+ long interval;
boolean steep_y = delta_y > delta_x;// && delta_y > delta_e && delta_y > delta_z;
boolean steep_x = delta_x >= delta_y;// && delta_x > delta_e && delta_x > delta_z;
//boolean steep_z = delta_z > delta_x && delta_z > delta_y && delta_z > delta_e;
int error_x;
int error_y;
int error_z;
- float full_velocity_units = 0.3;
+ long full_velocity_units = 30;
unsigned long full_velocity_steps;
if(steep_y) {
error_x = delta_y / 2;
previous_micros_y=micros();
interval = y_interval;
- full_velocity_steps = full_velocity_units * y_steps_per_unit;
+ full_velocity_steps = full_velocity_units * y_steps_per_unit /100;
if (full_velocity_steps > y_steps_remaining) full_velocity_steps = y_steps_remaining;
} else if (steep_x) {
error_y = delta_x / 2;
previous_micros_x=micros();
interval = x_interval;
- full_velocity_steps = full_velocity_units * x_steps_per_unit;
+ full_velocity_steps = full_velocity_units * x_steps_per_unit /100;
if (full_velocity_steps > x_steps_remaining) full_velocity_steps = x_steps_remaining;
}
- float full_interval = interval;
+ long full_interval = interval;
unsigned long steps_done = 0;
unsigned int steps_acceleration_check = 100;
@@ -723,7 +784,7 @@ void linear_move(unsigned long x_steps_remaining, unsigned long y_steps_remainin
if(Y_MAX_PIN > -1) if(direction_y) if(digitalRead(Y_MAX_PIN) != ENDSTOPS_INVERTING) y_steps_remaining=0;
if(steep_y) {
timediff = micros() - previous_micros_y;
- while(timediff >= interval) {
+ while(timediff >= interval && y_steps_remaining>0) {
y_steps_remaining--; timediff-=interval;
error_x = error_x - delta_x;
do_y_step();
@@ -734,7 +795,7 @@ void linear_move(unsigned long x_steps_remaining, unsigned long y_steps_remainin
}
} else if (steep_x) {
timediff=micros() - previous_micros_x;
- while(timediff >= interval) {
+ while(timediff >= interval && x_steps_remaining>0) {
x_steps_remaining--; timediff-=interval;
error_y = error_y - delta_y;
do_x_step();