diff options
author | kliment <kliment.yanev@gmail.com> | 2011-04-06 23:56:39 +0200 |
---|---|---|
committer | kliment <kliment.yanev@gmail.com> | 2011-04-06 23:56:39 +0200 |
commit | 0f095d94d8553b5ef341602977ef727cc9fc81ce (patch) | |
tree | a44a3540b5603bba05b48f4d57ac4b44a25f9649 /Tonokip_Firmware | |
parent | 25d00d4147c5533eee9afde9b28e35e6b013c677 (diff) |
SD write support. Safety check for step count.
Diffstat (limited to 'Tonokip_Firmware')
-rw-r--r-- | Tonokip_Firmware/Tonokip_Firmware.pde | 85 |
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(); |