Commit fe9d3978 authored by MagoKimbra's avatar MagoKimbra

Update Marlin_main.cpp

parent ea45c20d
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
#include "Marlin.h" #include "Marlin.h"
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
#if Z_MIN_PIN == -1
#error "You must have a Z_MIN endstop in order to enable Auto Bed Leveling feature!!! Z_MIN_PIN must point to a valid hardware pin."
#endif
#include "vector_3.h" #include "vector_3.h"
#ifdef AUTO_BED_LEVELING_GRID #ifdef AUTO_BED_LEVELING_GRID
#include "qr_solve.h" #include "qr_solve.h"
...@@ -777,7 +780,7 @@ void get_command() ...@@ -777,7 +780,7 @@ void get_command()
if(strchr(cmdbuffer[bufindw], 'N') != NULL) if(strchr(cmdbuffer[bufindw], 'N') != NULL)
{ {
strchr_pointer = strchr(cmdbuffer[bufindw], 'N'); strchr_pointer = strchr(cmdbuffer[bufindw], 'N');
gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10)); gcode_N = (strtol(strchr_pointer + 1, NULL, 10));
if(gcode_N != gcode_LastN+1 && (strstr_P(cmdbuffer[bufindw], PSTR("M110")) == NULL) ) if(gcode_N != gcode_LastN+1 && (strstr_P(cmdbuffer[bufindw], PSTR("M110")) == NULL) )
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
...@@ -796,7 +799,7 @@ void get_command() ...@@ -796,7 +799,7 @@ void get_command()
while(cmdbuffer[bufindw][count] != '*') checksum = checksum^cmdbuffer[bufindw][count++]; while(cmdbuffer[bufindw][count] != '*') checksum = checksum^cmdbuffer[bufindw][count++];
strchr_pointer = strchr(cmdbuffer[bufindw], '*'); strchr_pointer = strchr(cmdbuffer[bufindw], '*');
if( (int)(strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)) != checksum) if( (int)(strtod(strchr_pointer + 1, NULL)) != checksum)
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORPGM(MSG_ERR_CHECKSUM_MISMATCH); SERIAL_ERRORPGM(MSG_ERR_CHECKSUM_MISMATCH);
...@@ -834,7 +837,7 @@ void get_command() ...@@ -834,7 +837,7 @@ void get_command()
if((strchr(cmdbuffer[bufindw], 'G') != NULL)) if((strchr(cmdbuffer[bufindw], 'G') != NULL))
{ {
strchr_pointer = strchr(cmdbuffer[bufindw], 'G'); strchr_pointer = strchr(cmdbuffer[bufindw], 'G');
switch((int)((strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)))) switch((int)((strtod(strchr_pointer + 1, NULL))))
{ {
case 0: case 0:
case 1: case 1:
...@@ -927,12 +930,12 @@ void get_command() ...@@ -927,12 +930,12 @@ void get_command()
float code_value() float code_value()
{ {
return (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL)); return (strtod(strchr_pointer + 1, NULL));
} }
long code_value_long() long code_value_long()
{ {
return (strtol(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL, 10)); return (strtol(strchr_pointer + 1, NULL, 10));
} }
bool code_seen(char code) bool code_seen(char code)
...@@ -1963,20 +1966,15 @@ void refresh_cmd_timeout(void) ...@@ -1963,20 +1966,15 @@ void refresh_cmd_timeout(void)
***************************** G-Code Functions ******************************** ***************************** G-Code Functions ********************************
*******************************************************************************/ *******************************************************************************/
// G0-G1: Coordinated movement of X Y Z E axes // G0-G1: Coordinated movement of X Y Z E axes
void gcode_G0_G1() inline void gcode_G0_G1() {
{ if (!Stopped) {
if (!Stopped)
{
get_coordinates(); // For X Y Z E F get_coordinates(); // For X Y Z E F
#ifdef FWRETRACT #ifdef FWRETRACT
if (autoretract_enabled) if (autoretract_enabled) {
{ if (!(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) {
if (!(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E'))
{
float echange = destination[E_AXIS] - current_position[E_AXIS]; float echange = destination[E_AXIS] - current_position[E_AXIS];
// Is this move an attempt to retract or recover? // Is this move an attempt to retract or recover?
if ((echange < -MIN_RETRACT && !retracted) || (echange > MIN_RETRACT && retracted)) if ((echange < -MIN_RETRACT && !retracted) || (echange > MIN_RETRACT && retracted)) {
{
current_position[E_AXIS] = destination[E_AXIS]; // hide the slicer-generated retract/recover from calculations current_position[E_AXIS] = destination[E_AXIS]; // hide the slicer-generated retract/recover from calculations
plan_set_e_position(current_position[E_AXIS]); // AND from the planner plan_set_e_position(current_position[E_AXIS]); // AND from the planner
retract(!retracted); retract(!retracted);
...@@ -1991,29 +1989,25 @@ void gcode_G0_G1() ...@@ -1991,29 +1989,25 @@ void gcode_G0_G1()
// G2: Clockwise Arc // G2: Clockwise Arc
// G3: Counter Clockwise Arc // G3: Counter Clockwise Arc
void gcode_G2_G3(bool clockwise) inline void gcode_G2_G3(bool clockwise) {
{ if (!Stopped) {
if (!Stopped)
{
get_arc_coordinates(); get_arc_coordinates();
prepare_arc_move(clockwise); prepare_arc_move(clockwise);
} }
} }
// G4: Dwell S<seconds> or P<milliseconds> // G4: Dwell S<seconds> or P<milliseconds>
void gcode_G4() inline void gcode_G4() {
{
unsigned long codenum; unsigned long codenum;
LCD_MESSAGEPGM(MSG_DWELL); LCD_MESSAGEPGM(MSG_DWELL);
if (code_seen('P')) codenum = code_value(); // milliseconds to wait if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait
if (code_seen('S')) codenum = code_value() * 1000; // seconds to wait if (code_seen('S')) codenum = code_value_long() * 1000; // seconds to wait
st_synchronize(); st_synchronize();
codenum += millis(); // keep track of when we started waiting codenum += millis(); // keep track of when we started waiting
previous_millis_cmd = millis(); previous_millis_cmd = millis();
while(millis() < codenum) while(millis() < codenum) {
{
manage_heater(); manage_heater();
manage_inactivity(); manage_inactivity();
lcd_update(); lcd_update();
...@@ -2023,11 +2017,9 @@ void gcode_G4() ...@@ -2023,11 +2017,9 @@ void gcode_G4()
#ifdef FWRETRACT #ifdef FWRETRACT
// G10 - Retract filament according to settings of M207 // G10 - Retract filament according to settings of M207
// G11 - Recover filament according to settings of M208 // G11 - Recover filament according to settings of M208
void gcode_G10_G11(bool doRetract=false) inline void gcode_G10_G11(bool doRetract=false) {
{
#if EXTRUDERS > 1 #if EXTRUDERS > 1
if (doRetract) if (doRetract) {
{
retracted_swap[active_extruder] = (code_seen('S') && code_value_long() == 1); // checks for swap retract argument retracted_swap[active_extruder] = (code_seen('S') && code_value_long() == 1); // checks for swap retract argument
} }
#endif #endif
...@@ -2040,8 +2032,7 @@ void gcode_G4() ...@@ -2040,8 +2032,7 @@ void gcode_G4()
#endif //FWRETRACT #endif //FWRETRACT
// G28: Home all axes, one at a time // G28: Home all axes, one at a time
void gcode_G28() inline void gcode_G28() {
{
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all levelling data) plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all levelling data)
#endif //ENABLE_AUTO_BED_LEVELING #endif //ENABLE_AUTO_BED_LEVELING
...@@ -2060,8 +2051,7 @@ void gcode_G28() ...@@ -2060,8 +2051,7 @@ void gcode_G28()
home_all_axis = !((code_seen(axis_codes[X_AXIS])) || (code_seen(axis_codes[Y_AXIS])) || (code_seen(axis_codes[Z_AXIS])) || (code_seen(axis_codes[E_AXIS]))); home_all_axis = !((code_seen(axis_codes[X_AXIS])) || (code_seen(axis_codes[Y_AXIS])) || (code_seen(axis_codes[Z_AXIS])) || (code_seen(axis_codes[E_AXIS])));
#ifdef NPR2 #ifdef NPR2
if((home_all_axis) || (code_seen(axis_codes[E_AXIS]))) if((home_all_axis) || (code_seen(axis_codes[E_AXIS]))) {
{
active_driver = active_extruder = 1; active_driver = active_extruder = 1;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -200, COLOR_HOMERATE, active_extruder, active_driver); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -200, COLOR_HOMERATE, active_extruder, active_driver);
st_synchronize(); st_synchronize();
...@@ -2099,8 +2089,7 @@ void gcode_G28() ...@@ -2099,8 +2089,7 @@ void gcode_G28()
#if defined(CARTESIAN) || defined(COREXY) || defined(SCARA) #if defined(CARTESIAN) || defined(COREXY) || defined(SCARA)
#if Z_HOME_DIR > 0 // If homing away from BED do Z first #if Z_HOME_DIR > 0 // If homing away from BED do Z first
if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) {
{
HOMEAXIS(Z); HOMEAXIS(Z);
} }
#endif #endif
...@@ -2172,10 +2161,8 @@ void gcode_G28() ...@@ -2172,10 +2161,8 @@ void gcode_G28()
if((home_all_axis) || (code_seen(axis_codes[Y_AXIS]))) HOMEAXIS(Y); if((home_all_axis) || (code_seen(axis_codes[Y_AXIS]))) HOMEAXIS(Y);
if(code_seen(axis_codes[X_AXIS])) if(code_seen(axis_codes[X_AXIS])) {
{ if(code_value_long() != 0) {
if(code_value_long() != 0)
{
#ifdef SCARA #ifdef SCARA
current_position[X_AXIS]=code_value(); current_position[X_AXIS]=code_value();
#else #else
...@@ -2184,8 +2171,7 @@ void gcode_G28() ...@@ -2184,8 +2171,7 @@ void gcode_G28()
} }
} }
if (code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0) if (code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0) {
{
#ifdef SCARA #ifdef SCARA
current_position[Y_AXIS]=code_value(); current_position[Y_AXIS]=code_value();
#else #else
...@@ -2195,19 +2181,15 @@ void gcode_G28() ...@@ -2195,19 +2181,15 @@ void gcode_G28()
#if Z_HOME_DIR < 0 // If homing towards BED do Z last #if Z_HOME_DIR < 0 // If homing towards BED do Z last
#ifndef Z_SAFE_HOMING #ifndef Z_SAFE_HOMING
if (code_seen('M')) // Manual G28 if (code_seen('M')) { // Manual G28
{
#ifdef ULTIPANEL #ifdef ULTIPANEL
if(home_all_axis) if(home_all_axis) {
{
boolean zig = true; boolean zig = true;
int xGridSpacing = (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION); int xGridSpacing = (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION);
int yGridSpacing = (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION); int yGridSpacing = (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION);
for (int yProbe=FRONT_PROBE_BED_POSITION; yProbe <= BACK_PROBE_BED_POSITION; yProbe += yGridSpacing) for (int yProbe=FRONT_PROBE_BED_POSITION; yProbe <= BACK_PROBE_BED_POSITION; yProbe += yGridSpacing) {
{
int xProbe, xInc; int xProbe, xInc;
if (zig) // zig if (zig) { // zig
{
xProbe = LEFT_PROBE_BED_POSITION; xProbe = LEFT_PROBE_BED_POSITION;
xInc = xGridSpacing; xInc = xGridSpacing;
zig = false; zig = false;
...@@ -2218,8 +2200,7 @@ void gcode_G28() ...@@ -2218,8 +2200,7 @@ void gcode_G28()
xInc = -xGridSpacing; xInc = -xGridSpacing;
zig = true; zig = true;
} }
for (int xCount=0; xCount < 2; xCount++) for (int xCount=0; xCount < 2; xCount++) {
{
destination[X_AXIS] = xProbe; destination[X_AXIS] = xProbe;
destination[Y_AXIS] = yProbe; destination[Y_AXIS] = yProbe;
destination[Z_AXIS] = 5 * home_dir(Z_AXIS) * (-1); destination[Z_AXIS] = 5 * home_dir(Z_AXIS) * (-1);
...@@ -2233,13 +2214,11 @@ void gcode_G28() ...@@ -2233,13 +2214,11 @@ void gcode_G28()
HOMEAXIS(Z); HOMEAXIS(Z);
lcd_setstatus("Press button "); lcd_setstatus("Press button ");
boolean beepbutton=true; boolean beepbutton=true;
while(!lcd_clicked()) while(!lcd_clicked()) {
{
manage_heater(); manage_heater();
manage_inactivity(); manage_inactivity();
lcd_update(); lcd_update();
if(beepbutton) if(beepbutton) {
{
#if BEEPER > 0 #if BEEPER > 0
SET_OUTPUT(BEEPER); SET_OUTPUT(BEEPER);
WRITE(BEEPER,HIGH); WRITE(BEEPER,HIGH);
...@@ -2278,12 +2257,11 @@ void gcode_G28() ...@@ -2278,12 +2257,11 @@ void gcode_G28()
HOMEAXIS(Z); HOMEAXIS(Z);
} }
#else // Z Safe mode activated. #else // Z Safe mode activated.
if(home_all_axis) if (home_all_axis) {
{
destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER); destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER);
destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER); destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER);
destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1); // Set destination away from bed destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); // Set destination away from bed
feedrate = XY_TRAVEL_SPEED; feedrate = XY_TRAVEL_SPEED / 60;
current_position[Z_AXIS] = 0; current_position[Z_AXIS] = 0;
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
...@@ -2295,31 +2273,26 @@ void gcode_G28() ...@@ -2295,31 +2273,26 @@ void gcode_G28()
HOMEAXIS(Z); HOMEAXIS(Z);
} }
// Let's see if X and Y are homed and probe is inside bed area. // Let's see if X and Y are homed and probe is inside bed area.
if(code_seen(axis_codes[Z_AXIS])) if (code_seen(axis_codes[Z_AXIS])) {
{ if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS])
{
float cpx = current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER, float cpx = current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER,
cpy = current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER; cpy = current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER;
if (cpx >= X_MIN_POS && cpx <= X_MAX_POS && cpy >= Y_MIN_POS && cpy <= Y_MAX_POS) if (cpx >= X_MIN_POS && cpx <= X_MAX_POS && cpy >= Y_MIN_POS && cpy <= Y_MAX_POS) {
{
current_position[Z_AXIS] = 0; current_position[Z_AXIS] = 0;
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1); // Set destination away from bed destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); // Set destination away from bed
feedrate = max_feedrate[Z_AXIS]; feedrate = max_feedrate[Z_AXIS];
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder, active_driver); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder, active_driver);
st_synchronize(); st_synchronize();
HOMEAXIS(Z); HOMEAXIS(Z);
} }
else else {
{
LCD_MESSAGEPGM(MSG_ZPROBE_OUT); LCD_MESSAGEPGM(MSG_ZPROBE_OUT);
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT); SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT);
} }
} }
else else {
{
LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN);
...@@ -2328,13 +2301,12 @@ void gcode_G28() ...@@ -2328,13 +2301,12 @@ void gcode_G28()
#endif //Z_SAFE_HOMING #endif //Z_SAFE_HOMING
#endif //Z_HOME_DIR < 0 #endif //Z_HOME_DIR < 0
if (code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0) current_position[Z_AXIS] = code_value() + add_homing[Z_AXIS]; if (code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0)
current_position[Z_AXIS] = code_value() + add_homing[Z_AXIS];
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) if (home_all_axis || code_seen(axis_codes[Z_AXIS]))
{
current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative) current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative)
}
#endif //ENABLE_AUTO_BED_LEVELING #endif //ENABLE_AUTO_BED_LEVELING
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
#endif // defined(CARTESIAN) || defined(COREXY) || defined(SCARA) #endif // defined(CARTESIAN) || defined(COREXY) || defined(SCARA)
...@@ -2342,7 +2314,7 @@ void gcode_G28() ...@@ -2342,7 +2314,7 @@ void gcode_G28()
#ifdef SCARA #ifdef SCARA
calculate_delta(current_position); calculate_delta(current_position);
plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]); plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
#endif SCARA #endif //SCARA
#ifdef ENDSTOPS_ONLY_FOR_HOMING #ifdef ENDSTOPS_ONLY_FOR_HOMING
enable_endstops(false); enable_endstops(false);
...@@ -2357,25 +2329,20 @@ void gcode_G28() ...@@ -2357,25 +2329,20 @@ void gcode_G28()
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
// G29: Detailed Z-Probe, probes the bed at 3 or more points. // G29: Detailed Z-Probe, probes the bed at 3 or more points.
// Will fail if the printer has not been homed with G28. // Will fail if the printer has not been homed with G28.
void gcode_G29() inline void gcode_G29() {
{
float x_tmp, y_tmp, z_tmp, real_z; float x_tmp, y_tmp, z_tmp, real_z;
#if Z_MIN_PIN == -1
#error "You must have a Z_MIN endstop in order to enable Auto Bed Leveling feature!!! Z_MIN_PIN must point to a valid hardware pin."
#endif
// Prevent user from running a G29 without first homing in X and Y // Prevent user from running a G29 without first homing in X and Y
if (! (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) ) if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS])) {
{
LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN);
return; // abort G29, since we don't know where we are return;
} }
#ifdef Z_PROBE_SLED #ifdef Z_PROBE_SLED
dock_sled(false); dock_sled(false);
#endif // Z_PROBE_SLED #endif //Z_PROBE_SLED
st_synchronize(); st_synchronize();
// make sure the bed_level_rotation_matrix is identity or the planner will get it incorrectly // make sure the bed_level_rotation_matrix is identity or the planner will get it incorrectly
...@@ -2405,8 +2372,7 @@ void gcode_G28() ...@@ -2405,8 +2372,7 @@ void gcode_G28()
if (code_seen('B')) b_probe_bed_position = code_value(); if (code_seen('B')) b_probe_bed_position = code_value();
if (code_seen('A')) a_bed_leveling_points = code_value(); if (code_seen('A')) a_bed_leveling_points = code_value();
if((f_probe_bed_position == b_probe_bed_position) || (r_probe_bed_position == l_probe_bed_position)) if((f_probe_bed_position == b_probe_bed_position) || (r_probe_bed_position == l_probe_bed_position)) {
{
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_EMPTY_PLANE); SERIAL_ERRORLNPGM(MSG_EMPTY_PLANE);
return; return;
...@@ -2430,43 +2396,37 @@ void gcode_G28() ...@@ -2430,43 +2396,37 @@ void gcode_G28()
int probePointCounter = 0; int probePointCounter = 0;
bool zig = true; bool zig = true;
for (int yProbe=f_probe_bed_position; yProbe <= b_probe_bed_position; yProbe += yGridSpacing) for (int yProbe=f_probe_bed_position; yProbe <= b_probe_bed_position; yProbe += yGridSpacing) {
{
int xProbe, xInc; int xProbe, xInc;
if (zig) //zig if (zig) { //zig
{
xProbe = l_probe_bed_position; xProbe = l_probe_bed_position;
//xEnd = RIGHT_PROBE_BED_POSITION; //xEnd = RIGHT_PROBE_BED_POSITION;
xInc = xGridSpacing; xInc = xGridSpacing;
zig = false; zig = false;
} }
else //zag else { //zag
{
xProbe = r_probe_bed_position; xProbe = r_probe_bed_position;
//xEnd = LEFT_PROBE_BED_POSITION; //xEnd = LEFT_PROBE_BED_POSITION;
xInc = -xGridSpacing; xInc = -xGridSpacing;
zig = true; zig = true;
} }
for (int xCount=0; xCount < a_bed_leveling_points; xCount++) for (int xCount=0; xCount < a_bed_leveling_points; xCount++) {
{
float z_before; float z_before;
if (probePointCounter == 0) if (probePointCounter == 0) {
{
// raise before probing // raise before probing
z_before = Z_RAISE_BEFORE_PROBING; z_before = Z_RAISE_BEFORE_PROBING;
} }
else else {
{
// raise extruder // raise extruder
z_before = current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS; z_before = current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS;
} }
float measured_z = probe_pt(xProbe, yProbe, z_before); float measured_z = probe_pt(xProbe, yProbe, z_before);
eqnBVector[probePointCounter] = measured_z; eqnBVector[probePointCounter] = measured_z;
eqnAMatrix[probePointCounter + 0*a_bed_leveling_points*a_bed_leveling_points] = xProbe; eqnAMatrix[probePointCounter + 0 * a_bed_leveling_points * a_bed_leveling_points] = xProbe;
eqnAMatrix[probePointCounter + 1*a_bed_leveling_points*a_bed_leveling_points] = yProbe; eqnAMatrix[probePointCounter + 1 * a_bed_leveling_points * a_bed_leveling_points] = yProbe;
eqnAMatrix[probePointCounter + 2*a_bed_leveling_points*a_bed_leveling_points] = 1; eqnAMatrix[probePointCounter + 2 * a_bed_leveling_points * a_bed_leveling_points] = 1;
probePointCounter++; probePointCounter++;
xProbe += xInc; xProbe += xInc;
} }
...@@ -2474,7 +2434,7 @@ void gcode_G28() ...@@ -2474,7 +2434,7 @@ void gcode_G28()
clean_up_after_endstop_move(); clean_up_after_endstop_move();
// solve lsq problem // solve lsq problem
double *plane_equation_coefficients = qr_solve(a_bed_leveling_points*a_bed_leveling_points, 3, eqnAMatrix, eqnBVector); double *plane_equation_coefficients = qr_solve(a_bed_leveling_points * a_bed_leveling_points, 3, eqnAMatrix, eqnBVector);
SERIAL_PROTOCOLPGM("Eqn coefficients: a: "); SERIAL_PROTOCOLPGM("Eqn coefficients: a: ");
SERIAL_PROTOCOL(plane_equation_coefficients[0]); SERIAL_PROTOCOL(plane_equation_coefficients[0]);
...@@ -2522,8 +2482,7 @@ void gcode_G28() ...@@ -2522,8 +2482,7 @@ void gcode_G28()
} }
#ifndef Z_PROBE_SLED #ifndef Z_PROBE_SLED
void gcode_G30() inline void gcode_G30() {
{
engage_z_probe(); //Engage Z Servo endstop if available engage_z_probe(); //Engage Z Servo endstop if available
st_synchronize(); st_synchronize();
// TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorrectly // TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorrectly
...@@ -2549,16 +2508,12 @@ void gcode_G28() ...@@ -2549,16 +2508,12 @@ void gcode_G28()
#ifdef DELTA #ifdef DELTA
// G29: Delta Z-Probe, probes the bed at more points. // G29: Delta Z-Probe, probes the bed at more points.
void gcode_G29() inline void gcode_G29() {
{ if (code_seen('D')) {
if (code_seen('D'))
{
SERIAL_ECHOLN("Current bed level array values:"); SERIAL_ECHOLN("Current bed level array values:");
SERIAL_EOL; SERIAL_EOL;
for (int y = 0; y < 7; y++) for (int y = 0; y < 7; y++) {
{ for (int x = 0; x < 7; x++) {
for (int x = 0; x < 7; x++)
{
SERIAL_PROTOCOL_F(bed_level[x][y], 3); SERIAL_PROTOCOL_F(bed_level[x][y], 3);
SERIAL_PROTOCOLPGM(" "); SERIAL_PROTOCOLPGM(" ");
} }
...@@ -2581,24 +2536,19 @@ void gcode_G28() ...@@ -2581,24 +2536,19 @@ void gcode_G28()
} }
// G30: Delta AutoCalibration // G30: Delta AutoCalibration
void gcode_G30() inline void gcode_G30() {
{
int iterations; int iterations;
//Zero the bed level array //Zero the bed level array
for (int y = 0; y < 7; y++) for (int y = 0; y < 7; y++) {
{ for (int x = 0; x < 7; x++) {
for (int x = 0; x < 7; x++)
{
bed_level[x][y] = 0.0; bed_level[x][y] = 0.0;
} }
} }
if (code_seen('C')) if (code_seen('C')) {
{
//Show carriage positions //Show carriage positions
SERIAL_ECHOLN("Carriage Positions for last scan:"); SERIAL_ECHOLN("Carriage Positions for last scan:");
for(int8_t i=0; i < 7; i++) for(int8_t i=0; i < 7; i++) {
{
SERIAL_ECHO("["); SERIAL_ECHO("[");
SERIAL_ECHO(saved_positions[i][X_AXIS]); SERIAL_ECHO(saved_positions[i][X_AXIS]);
SERIAL_ECHO(", "); SERIAL_ECHO(", ");
...@@ -2610,13 +2560,11 @@ void gcode_G28() ...@@ -2610,13 +2560,11 @@ void gcode_G28()
return; return;
} }
if (code_seen('F')) if (code_seen('F')) {
{
probing_feedrate=code_value(); probing_feedrate=code_value();
} }
if (code_seen('X') and code_seen('Y')) if (code_seen('X') and code_seen('Y')) {
{
//Probe specified X,Y point //Probe specified X,Y point
float x = code_seen('X') ? code_value():0.00; float x = code_seen('X') ? code_value():0.00;
float y = code_seen('Y') ? code_value():0.00; float y = code_seen('Y') ? code_value():0.00;
...@@ -2647,8 +2595,7 @@ void gcode_G28() ...@@ -2647,8 +2595,7 @@ void gcode_G28()
saved_feedmultiply = feedmultiply; saved_feedmultiply = feedmultiply;
feedmultiply = 100; feedmultiply = 100;
if (code_seen('A')) if (code_seen('A')) {
{
SERIAL_ECHOLN("Starting Auto Calibration.."); SERIAL_ECHOLN("Starting Auto Calibration..");
LCD_MESSAGEPGM("Auto Calibration..."); LCD_MESSAGEPGM("Auto Calibration...");
if (code_value() != 0) ac_prec = code_value(); if (code_value() != 0) ac_prec = code_value();
...@@ -2657,10 +2604,8 @@ void gcode_G28() ...@@ -2657,10 +2604,8 @@ void gcode_G28()
SERIAL_ECHOLN("mm"); SERIAL_ECHOLN("mm");
//Zero the bedlevel array in case this affects bed probing //Zero the bedlevel array in case this affects bed probing
for (int y = 0; y >=6; y++) for (int y = 0; y >=6; y++) {
{ for (int x = 0; x >=6; y++) {
for (int x = 0; x >=6; y++)
{
bed_level[x][y] = 0.0; bed_level[x][y] = 0.0;
} }
} }
...@@ -2675,8 +2620,7 @@ void gcode_G28() ...@@ -2675,8 +2620,7 @@ void gcode_G28()
//Show calibration report //Show calibration report
calibration_report(); calibration_report();
if (code_seen('A')) if (code_seen('A')) {
{
iterations = 100; //Maximum number of iterations iterations = 100; //Maximum number of iterations
int loopcount = 1; int loopcount = 1;
float adj_r_target, adj_dr_target; float adj_r_target, adj_dr_target;
...@@ -2690,8 +2634,7 @@ void gcode_G28() ...@@ -2690,8 +2634,7 @@ void gcode_G28()
boolean adj_dr_allowed = true; boolean adj_dr_allowed = true;
float h_endstop = -100, l_endstop = 100; float h_endstop = -100, l_endstop = 100;
float probe_error, ftemp; float probe_error, ftemp;
if (code_seen('D')) if (code_seen('D')) {
{
delta_diagonal_rod = code_value(); delta_diagonal_rod = code_value();
adj_dr_allowed = false; adj_dr_allowed = false;
SERIAL_ECHOPAIR("Using diagional rod length: ", delta_diagonal_rod); SERIAL_ECHOPAIR("Using diagional rod length: ", delta_diagonal_rod);
...@@ -2706,8 +2649,7 @@ void gcode_G28() ...@@ -2706,8 +2649,7 @@ void gcode_G28()
if (bed_level_z + endstop_adj[2] > h_endstop) h_endstop = bed_level_z + endstop_adj[2]; if (bed_level_z + endstop_adj[2] > h_endstop) h_endstop = bed_level_z + endstop_adj[2];
if (bed_level_z + endstop_adj[2] < l_endstop) l_endstop = bed_level_z + endstop_adj[2]; if (bed_level_z + endstop_adj[2] < l_endstop) l_endstop = bed_level_z + endstop_adj[2];
if (h_endstop - l_endstop > 3) if (h_endstop - l_endstop > 3) {
{
SERIAL_ECHOLN("The position of the endstop switches on this printer are not within limits"); SERIAL_ECHOLN("The position of the endstop switches on this printer are not within limits");
SERIAL_ECHOLN("Adjust endstop switches so that they are within 3mm Z-height of each other"); SERIAL_ECHOLN("Adjust endstop switches so that they are within 3mm Z-height of each other");
SERIAL_EOL; SERIAL_EOL;
...@@ -2726,31 +2668,26 @@ void gcode_G28() ...@@ -2726,31 +2668,26 @@ void gcode_G28()
return; return;
} }
if (code_seen('D')) if (code_seen('D')) {
{
//Fix diagonal rod at specified length (do not adjust) //Fix diagonal rod at specified length (do not adjust)
delta_diagonal_rod = code_value(); delta_diagonal_rod = code_value();
adj_dr_allowed = false; adj_dr_allowed = false;
} }
do do {
{
SERIAL_ECHO("Iteration: "); SERIAL_ECHO("Iteration: ");
SERIAL_ECHO(loopcount); SERIAL_ECHO(loopcount);
SERIAL_EOL; SERIAL_EOL;
if ((bed_level_c > 3) or (bed_level_c < -3)) if ((bed_level_c > 3) or (bed_level_c < -3)) {
{
//Build height is not set correctly .. //Build height is not set correctly ..
max_pos[Z_AXIS] -= bed_level_c + 2; max_pos[Z_AXIS] -= bed_level_c + 2;
set_delta_constants(); set_delta_constants();
SERIAL_ECHOPAIR("Adjusting Z-Height to: ", max_pos[Z_AXIS]); SERIAL_ECHOPAIR("Adjusting Z-Height to: ", max_pos[Z_AXIS]);
SERIAL_ECHOLN(" mm.."); SERIAL_ECHOLN(" mm..");
} }
else else {
{ if ((bed_level_x < -ac_prec) or (bed_level_x > ac_prec) or (bed_level_y < -ac_prec) or (bed_level_y > ac_prec) or (bed_level_z < -ac_prec) or (bed_level_z > ac_prec)) {
if ((bed_level_x < -ac_prec) or (bed_level_x > ac_prec) or (bed_level_y < -ac_prec) or (bed_level_y > ac_prec) or (bed_level_z < -ac_prec) or (bed_level_z > ac_prec))
{
//Endstop req adjustment //Endstop req adjustment
SERIAL_ECHOLN("Adjusting Endstop.."); SERIAL_ECHOLN("Adjusting Endstop..");
endstop_adj[0] += bed_level_x / 1.05; endstop_adj[0] += bed_level_x / 1.05;
...@@ -2759,15 +2696,12 @@ void gcode_G28() ...@@ -2759,15 +2696,12 @@ void gcode_G28()
//Check that no endstop adj values are > 0 (not allowed).. if they are, reduce the build height to compensate. //Check that no endstop adj values are > 0 (not allowed).. if they are, reduce the build height to compensate.
h_endstop = 0; h_endstop = 0;
for(int x=0; x < 3; x++) for(int x=0; x < 3; x++) {
{
if (endstop_adj[x] > h_endstop) h_endstop = endstop_adj[x]; if (endstop_adj[x] > h_endstop) h_endstop = endstop_adj[x];
} }
if (h_endstop > 0) if (h_endstop > 0) {
{
//Reduce build height and adjust endstop //Reduce build height and adjust endstop
for(int x=0; x < 3; x++) for(int x=0; x < 3; x++) {
{
endstop_adj[x] -= h_endstop + 2; endstop_adj[x] -= h_endstop + 2;
} }
max_pos[Z_AXIS] -= h_endstop + 2; max_pos[Z_AXIS] -= h_endstop + 2;
...@@ -2776,8 +2710,7 @@ void gcode_G28() ...@@ -2776,8 +2710,7 @@ void gcode_G28()
SERIAL_ECHOLN(" mm.."); SERIAL_ECHOLN(" mm..");
} }
} }
else else {
{
SERIAL_ECHOLN("Endstop: OK"); SERIAL_ECHOLN("Endstop: OK");
adj_r_target = (bed_level_x + bed_level_y + bed_level_z) / 3; adj_r_target = (bed_level_x + bed_level_y + bed_level_z) / 3;
adj_dr_target = (bed_level_ox + bed_level_oy + bed_level_oz) / 3; adj_dr_target = (bed_level_ox + bed_level_oy + bed_level_oz) / 3;
...@@ -2789,19 +2722,16 @@ void gcode_G28() ...@@ -2789,19 +2722,16 @@ void gcode_G28()
else adj_dr_done = false; else adj_dr_done = false;
if ((bed_level_x != bed_level_ox) or (bed_level_y != bed_level_oy) or (bed_level_z != bed_level_oz)) adj_tower_done = false; if ((bed_level_x != bed_level_ox) or (bed_level_y != bed_level_oy) or (bed_level_z != bed_level_oz)) adj_tower_done = false;
else adj_tower_done = true; else adj_tower_done = true;
if ((adj_r_done == false) or (adj_dr_done == false) or (adj_tower_done == false)) if ((adj_r_done == false) or (adj_dr_done == false) or (adj_tower_done == false)) {
{
//delta geometry adjustment required //delta geometry adjustment required
SERIAL_ECHOLN("Adjusting Delta Geometry.."); SERIAL_ECHOLN("Adjusting Delta Geometry..");
//set initial direction and magnitude for delta radius & diagonal rod adjustment //set initial direction and magnitude for delta radius & diagonal rod adjustment
if (adj_r == 0) if (adj_r == 0) {
{
if (adj_r_target > bed_level_c) adj_r = 1; if (adj_r_target > bed_level_c) adj_r = 1;
else adj_r = -1; else adj_r = -1;
} }
if (adj_dr == 0) if (adj_dr == 0) {
{
if (adj_r_target > adj_dr_target) adj_dr = 1; if (adj_r_target > adj_dr_target) adj_dr = 1;
else adj_dr = -1; else adj_dr = -1;
} }
...@@ -2810,11 +2740,9 @@ void gcode_G28() ...@@ -2810,11 +2740,9 @@ void gcode_G28()
adj_AlphaA = adj_AlphaB = adj_AlphaC = 0; adj_AlphaA = adj_AlphaB = adj_AlphaC = 0;
adj_RadiusA = adj_RadiusB = adj_RadiusC = 0; adj_RadiusA = adj_RadiusB = adj_RadiusC = 0;
do do {
{
//Apply adjustments //Apply adjustments
if (adj_r_done == false) if (adj_r_done == false) {
{
SERIAL_ECHOPAIR("Adjusting Delta Radius (",delta_radius); SERIAL_ECHOPAIR("Adjusting Delta Radius (",delta_radius);
SERIAL_ECHOPAIR(" -> ", delta_radius + adj_r); SERIAL_ECHOPAIR(" -> ", delta_radius + adj_r);
SERIAL_ECHOLN(")"); SERIAL_ECHOLN(")");
...@@ -2822,8 +2750,7 @@ void gcode_G28() ...@@ -2822,8 +2750,7 @@ void gcode_G28()
} }
if (adj_dr_allowed == false) adj_dr_done = true; if (adj_dr_allowed == false) adj_dr_done = true;
if (adj_dr_done == false) if (adj_dr_done == false) {
{
SERIAL_ECHOPAIR("Adjusting Diagonal Rod Length (",delta_diagonal_rod); SERIAL_ECHOPAIR("Adjusting Diagonal Rod Length (",delta_diagonal_rod);
SERIAL_ECHOPAIR(" -> ", delta_diagonal_rod + adj_dr); SERIAL_ECHOPAIR(" -> ", delta_diagonal_rod + adj_dr);
SERIAL_ECHOLN(")"); SERIAL_ECHOLN(")");
...@@ -2843,8 +2770,7 @@ void gcode_G28() ...@@ -2843,8 +2770,7 @@ void gcode_G28()
calibration_report(); calibration_report();
//Check to see if auto calc is complete to within limits.. //Check to see if auto calc is complete to within limits..
if (adj_dr_allowed == true) if (adj_dr_allowed == true) {
{
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec) if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec) and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec) and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
...@@ -2853,8 +2779,7 @@ void gcode_G28() ...@@ -2853,8 +2779,7 @@ void gcode_G28()
and (bed_level_oy >= -ac_prec) and (bed_level_oy <= ac_prec) and (bed_level_oy >= -ac_prec) and (bed_level_oy <= ac_prec)
and (bed_level_oz >= -ac_prec) and (bed_level_oz <= ac_prec)) loopcount = iterations; and (bed_level_oz >= -ac_prec) and (bed_level_oz <= ac_prec)) loopcount = iterations;
} }
else else {
{
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec) if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec) and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec) and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
...@@ -2883,24 +2808,21 @@ void gcode_G28() ...@@ -2883,24 +2808,21 @@ void gcode_G28()
else equalCA = false; else equalCA = false;
#ifdef DEBUG_MESSAGES #ifdef DEBUG_MESSAGES
if (equalAB == true) if (equalAB == true) {
{
SERIAL_ECHOPAIR("Tower AB Equal (A=",radiusErrorA); SERIAL_ECHOPAIR("Tower AB Equal (A=",radiusErrorA);
SERIAL_ECHOPAIR(" B=",radiusErrorB); SERIAL_ECHOPAIR(" B=",radiusErrorB);
SERIAL_ECHOLN(")"); SERIAL_ECHOLN(")");
} }
else SERIAL_ECHOLN("equalAB=false"); else SERIAL_ECHOLN("equalAB=false");
if (equalBC == true) if (equalBC == true) {
{
SERIAL_ECHOPAIR("Tower BC Equal (B=",radiusErrorB); SERIAL_ECHOPAIR("Tower BC Equal (B=",radiusErrorB);
SERIAL_ECHOPAIR(" C=",radiusErrorC); SERIAL_ECHOPAIR(" C=",radiusErrorC);
SERIAL_ECHOLN(")"); SERIAL_ECHOLN(")");
} }
else SERIAL_ECHOLN("equalBC=false"); else SERIAL_ECHOLN("equalBC=false");
if (equalCA == true) if (equalCA == true) {
{
SERIAL_ECHOPAIR("Tower CA Equal (C=",radiusErrorC); SERIAL_ECHOPAIR("Tower CA Equal (C=",radiusErrorC);
SERIAL_ECHOPAIR(" A=",radiusErrorA); SERIAL_ECHOPAIR(" A=",radiusErrorA);
SERIAL_ECHOLN(")"); SERIAL_ECHOLN(")");
...@@ -2908,8 +2830,7 @@ void gcode_G28() ...@@ -2908,8 +2830,7 @@ void gcode_G28()
else SERIAL_ECHOLN("equalCA=false"); else SERIAL_ECHOLN("equalCA=false");
#endif //DEBUG_MESSAGES #endif //DEBUG_MESSAGES
if ((equalAB == true) and (equalBC == true) and (equalCA == true)) if ((equalAB == true) and (equalBC == true) and (equalCA == true)) {
{
// all tower radius out by the same amount (within 0.02) - allow adjustment with delta rod length // all tower radius out by the same amount (within 0.02) - allow adjustment with delta rod length
#ifdef DEBUG_MESSAGES #ifdef DEBUG_MESSAGES
SERIAL_ECHOLN("All tower radius errors equal"); SERIAL_ECHOLN("All tower radius errors equal");
...@@ -2917,12 +2838,10 @@ void gcode_G28() ...@@ -2917,12 +2838,10 @@ void gcode_G28()
adj_RadiusA = adj_RadiusB = adj_RadiusC = 0; adj_RadiusA = adj_RadiusB = adj_RadiusC = 0;
} }
if ((equalAB == true) and (equalBC == false) and (equalCA == false)) if ((equalAB == true) and (equalBC == false) and (equalCA == false)) {
{
//Tower C radius error.. adjust it //Tower C radius error.. adjust it
SERIAL_ECHOLN("TowerC Radius error - adjusting"); SERIAL_ECHOLN("TowerC Radius error - adjusting");
if (adj_RadiusC == 0) if (adj_RadiusC == 0) {
{
if (bed_level_z < bed_level_oz) adj_RadiusC = 0.5; if (bed_level_z < bed_level_oz) adj_RadiusC = 0.5;
if (bed_level_z > bed_level_oz) adj_RadiusC = -0.5; if (bed_level_z > bed_level_oz) adj_RadiusC = -0.5;
#ifdef DEBUG_MESSAGES #ifdef DEBUG_MESSAGES
...@@ -2932,12 +2851,10 @@ void gcode_G28() ...@@ -2932,12 +2851,10 @@ void gcode_G28()
} }
} }
if ((equalBC == true) and (equalAB == false) and (equalCA == false)) if ((equalBC == true) and (equalAB == false) and (equalCA == false)) {
{
//Tower A radius error .. adjust it //Tower A radius error .. adjust it
SERIAL_ECHOLN("TowerA Radius error - adjusting"); SERIAL_ECHOLN("TowerA Radius error - adjusting");
if (adj_RadiusA == 0) if (adj_RadiusA == 0) {
{
if (bed_level_x < bed_level_ox) adj_RadiusA = 0.5; if (bed_level_x < bed_level_ox) adj_RadiusA = 0.5;
if (bed_level_x > bed_level_ox) adj_RadiusA = -0.5; if (bed_level_x > bed_level_ox) adj_RadiusA = -0.5;
#ifdef DEBUG_MESSAGES #ifdef DEBUG_MESSAGES
...@@ -2947,12 +2864,10 @@ void gcode_G28() ...@@ -2947,12 +2864,10 @@ void gcode_G28()
} }
} }
if ((equalCA == true) and (equalAB == false) and (equalBC == false)) if ((equalCA == true) and (equalAB == false) and (equalBC == false)) {
{
//Tower B radius error .. adjust it //Tower B radius error .. adjust it
SERIAL_ECHOLN("TowerB Radius error - adjusting"); SERIAL_ECHOLN("TowerB Radius error - adjusting");
if (adj_RadiusB == 0) if (adj_RadiusB == 0) {
{
if (bed_level_y < bed_level_oy) adj_RadiusB = 0.5; if (bed_level_y < bed_level_oy) adj_RadiusB = 0.5;
if (bed_level_y > bed_level_oy) adj_RadiusB = -0.5; if (bed_level_y > bed_level_oy) adj_RadiusB = -0.5;
#ifdef DEBUG_MESSAGES #ifdef DEBUG_MESSAGES
...@@ -2962,14 +2877,12 @@ void gcode_G28() ...@@ -2962,14 +2877,12 @@ void gcode_G28()
} }
} }
if (((adj_r > 0) and (bed_level_c > adj_r_target)) or ((adj_r < 0) and (bed_level_c < adj_r_target))) if (((adj_r > 0) and (bed_level_c > adj_r_target)) or ((adj_r < 0) and (bed_level_c < adj_r_target))) {
{
//overshot target .. reverse & scale down //overshot target .. reverse & scale down
adj_r = -(adj_r / 2); adj_r = -(adj_r / 2);
} }
if (((adj_dr > 0) and (adj_dr_target > adj_r_target)) or ((adj_dr < 0) and (adj_dr_target < adj_r_target))) if (((adj_dr > 0) and (adj_dr_target > adj_r_target)) or ((adj_dr < 0) and (adj_dr_target < adj_r_target))) {
{
//overshot target .. reverse & scale down //overshot target .. reverse & scale down
adj_dr = -(adj_dr / 2); adj_dr = -(adj_dr / 2);
} }
...@@ -3026,15 +2939,13 @@ void gcode_G28() ...@@ -3026,15 +2939,13 @@ void gcode_G28()
#endif #endif
} while (((adj_r_done == false) or (adj_dr_done = false)) and (loopcount < iterations)); } while (((adj_r_done == false) or (adj_dr_done = false)) and (loopcount < iterations));
} }
else else {
{
SERIAL_ECHOLN("Delta Geometry: OK"); SERIAL_ECHOLN("Delta Geometry: OK");
} }
} }
} }
if (loopcount < iterations) if (loopcount < iterations) {
{
home_delta_axis(); home_delta_axis();
//probe bed and display report //probe bed and display report
...@@ -3042,8 +2953,7 @@ void gcode_G28() ...@@ -3042,8 +2953,7 @@ void gcode_G28()
calibration_report(); calibration_report();
//Check to see if autocalc is complete to within limits.. //Check to see if autocalc is complete to within limits..
if (adj_dr_allowed == true) if (adj_dr_allowed == true) {
{
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec) if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec) and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec) and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
...@@ -3052,8 +2962,7 @@ void gcode_G28() ...@@ -3052,8 +2962,7 @@ void gcode_G28()
and (bed_level_oy >= -ac_prec) and (bed_level_oy <= ac_prec) and (bed_level_oy >= -ac_prec) and (bed_level_oy <= ac_prec)
and (bed_level_oz >= -ac_prec) and (bed_level_oz <= ac_prec)) loopcount = iterations; and (bed_level_oz >= -ac_prec) and (bed_level_oz <= ac_prec)) loopcount = iterations;
} }
else else {
{
if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec) if ((bed_level_x >= -ac_prec) and (bed_level_x <= ac_prec)
and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec) and (bed_level_y >= -ac_prec) and (bed_level_y <= ac_prec)
and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec) and (bed_level_z >= -ac_prec) and (bed_level_z <= ac_prec)
...@@ -3086,8 +2995,7 @@ void gcode_G28() ...@@ -3086,8 +2995,7 @@ void gcode_G28()
#endif // DELTA #endif // DELTA
// G60: Store in memory actual position // G60: Store in memory actual position
void gcode_G60() inline void gcode_G60() {
{
lastpos[X_AXIS]=current_position[X_AXIS]; lastpos[X_AXIS]=current_position[X_AXIS];
lastpos[Y_AXIS]=current_position[Y_AXIS]; lastpos[Y_AXIS]=current_position[Y_AXIS];
lastpos[Z_AXIS]=current_position[Z_AXIS]; lastpos[Z_AXIS]=current_position[Z_AXIS];
...@@ -3100,16 +3008,12 @@ void gcode_G60() ...@@ -3100,16 +3008,12 @@ void gcode_G60()
} }
// G61: move to X Y Z in memory // G61: move to X Y Z in memory
void gcode_G61() inline void gcode_G61() {
{ for(int8_t i=0; i < NUM_AXIS; i++) {
for(int8_t i=0; i < NUM_AXIS; i++) if(code_seen(axis_codes[i])) {
{
if(code_seen(axis_codes[i]))
{
destination[i] = (float)code_value() + lastpos[i]; destination[i] = (float)code_value() + lastpos[i];
} }
else else {
{
destination[i] = current_position[i]; destination[i] = current_position[i];
} }
} }
...@@ -3119,8 +3023,7 @@ void gcode_G61() ...@@ -3119,8 +3023,7 @@ void gcode_G61()
//SERIAL_ECHOPAIR(" Move to E: ", destination[E_AXIS]); //SERIAL_ECHOPAIR(" Move to E: ", destination[E_AXIS]);
//SERIAL_EOL; //SERIAL_EOL;
if(code_seen('F')) if(code_seen('F')) {
{
next_feedrate = code_value(); next_feedrate = code_value();
if(next_feedrate > 0.0) feedrate = next_feedrate; if(next_feedrate > 0.0) feedrate = next_feedrate;
} }
...@@ -3129,21 +3032,16 @@ void gcode_G61() ...@@ -3129,21 +3032,16 @@ void gcode_G61()
} }
// G92: Set current position to given X Y Z E // G92: Set current position to given X Y Z E
void gcode_G92() inline void gcode_G92() {
{
if (!code_seen(axis_codes[E_AXIS])) st_synchronize(); if (!code_seen(axis_codes[E_AXIS])) st_synchronize();
for (int i=0; i < NUM_AXIS; i++) for (int i=0; i < NUM_AXIS; i++) {
{ if (code_seen(axis_codes[i])) {
if (code_seen(axis_codes[i])) if (i == E_AXIS) {
{
if (i == E_AXIS)
{
current_position[i] = code_value(); current_position[i] = code_value();
plan_set_e_position(current_position[E_AXIS]); plan_set_e_position(current_position[E_AXIS]);
} }
else else {
{
#ifdef SCARA #ifdef SCARA
current_position[i] = code_value() + ((i != X_AXIS && i != Y_AXIS) ? add_homing[i] : 0); current_position[i] = code_value() + ((i != X_AXIS && i != Y_AXIS) ? add_homing[i] : 0);
#else #else
...@@ -3158,54 +3056,42 @@ void gcode_G92() ...@@ -3158,54 +3056,42 @@ void gcode_G92()
#ifdef ULTIPANEL #ifdef ULTIPANEL
// M0: Unconditional stop - Wait for user button press on LCD // M0: Unconditional stop - Wait for user button press on LCD
// M1: Conditional stop - Wait for user button press on LCD // M1: Conditional stop - Wait for user button press on LCD
void gcode_M0_M1() inline void gcode_M0_M1() {
{
unsigned long codenum; //throw away variable
char *starpos = NULL;
char *src = strchr_pointer + 2; char *src = strchr_pointer + 2;
codenum = 0; unsigned long codenum = 0;
bool hasP = false, hasS = false; bool hasP = false, hasS = false;
if (code_seen('P')) if (code_seen('P')) {
{
codenum = code_value(); // milliseconds to wait codenum = code_value(); // milliseconds to wait
hasP = codenum > 0; hasP = codenum > 0;
} }
if (code_seen('S')) if (code_seen('S')) {
{
codenum = code_value() * 1000; // seconds to wait codenum = code_value() * 1000; // seconds to wait
hasS = codenum > 0; hasS = codenum > 0;
} }
starpos = strchr(src, '*'); char* starpos = strchr(src, '*');
if (starpos != NULL) *(starpos) = '\0'; if (starpos != NULL) *(starpos) = '\0';
while (*src == ' ') ++src; while (*src == ' ') ++src;
if (!hasP && !hasS && *src != '\0') if (!hasP && !hasS && *src != '\0')
{
lcd_setstatus(src); lcd_setstatus(src);
}
else else
{
LCD_MESSAGEPGM(MSG_USERWAIT); LCD_MESSAGEPGM(MSG_USERWAIT);
}
lcd_ignore_click(); lcd_ignore_click();
st_synchronize(); st_synchronize();
refresh_cmd_timeout(); previous_millis_cmd = millis();
if (codenum > 0) if (codenum > 0) {
{ codenum += previous_millis_cmd; // keep track of when we started waiting
codenum += millis(); // keep track of when we started waiting while(millis() < codenum && !lcd_clicked()) {
while(millis() < codenum && !lcd_clicked())
{
manage_heater(); manage_heater();
manage_inactivity(); manage_inactivity();
lcd_update(); lcd_update();
} }
lcd_ignore_click(false); lcd_ignore_click(false);
} }
else else {
{ if (!lcd_detected()) return;
while(!lcd_clicked()) while (!lcd_clicked()) {
{
manage_heater(); manage_heater();
manage_inactivity(); manage_inactivity();
lcd_update(); lcd_update();
...@@ -3220,26 +3106,21 @@ void gcode_G92() ...@@ -3220,26 +3106,21 @@ void gcode_G92()
#ifdef LASERBEAM #ifdef LASERBEAM
// M3: S - Setting laser beam // M3: S - Setting laser beam
void gcode_M3() inline void gcode_M3() {
{ if(code_seen('S')) {
if(code_seen('S'))
{
laser_ttl_modulation = constrain(code_value(),0,255); laser_ttl_modulation = constrain(code_value(),0,255);
} }
else else {
{
laser_ttl_modulation=0; laser_ttl_modulation=0;
} }
} }
// M4: Turn on laser beam // M4: Turn on laser beam
void gcode_M4() inline void gcode_M4() {
{
WRITE(LASER_PWR_PIN, HIGH); WRITE(LASER_PWR_PIN, HIGH);
laser_ttl_modulation = 0; laser_ttl_modulation = 0;
} }
// M5: Turn off laser beam // M5: Turn off laser beam
void gcode_M5() inline void gcode_M5() {
{
WRITE(LASER_PWR_PIN, LOW); WRITE(LASER_PWR_PIN, LOW);
laser_ttl_modulation=0; laser_ttl_modulation=0;
} }
...@@ -3247,40 +3128,33 @@ void gcode_G92() ...@@ -3247,40 +3128,33 @@ void gcode_G92()
#if defined(ENABLE_AUTO_BED_LEVELING) && defined(Z_PROBE_REPEATABILITY_TEST) #if defined(ENABLE_AUTO_BED_LEVELING) && defined(Z_PROBE_REPEATABILITY_TEST)
//M49: Z-Probe repeatability //M49: Z-Probe repeatability
void gcode_M49() inline void gcode_M49() {
{
#if Z_MIN_PIN == -1 #if Z_MIN_PIN == -1
#error "You must have a Z_MIN endstop in order to enable calculation of Z-Probe repeatability." #error "You must have a Z_MIN endstop in order to enable calculation of Z-Probe repeatability."
#endif #endif
double sum = 0.0, mean = 0.0, sigma = 0.0; double sum = 0.0, mean = 0.0, sigma = 0.0, sample_set[50];
double sample_set[50];
int verbose_level = 1, n = 0, j, n_samples = 10, n_legs = 0, engage_probe_for_each_reading = 0; int verbose_level = 1, n = 0, j, n_samples = 10, n_legs = 0, engage_probe_for_each_reading = 0;
double X_current, Y_current, Z_current; double X_current, Y_current, Z_current;
double X_probe_location, Y_probe_location, Z_start_location, ext_position; double X_probe_location, Y_probe_location, Z_start_location, ext_position;
if (code_seen('V') || code_seen('v')) if (code_seen('V') || code_seen('v')) {
{
verbose_level = code_value(); verbose_level = code_value();
if (verbose_level<0 || verbose_level>4 ) if (verbose_level < 0 || verbose_level > 4) {
{ SERIAL_PROTOCOLPGM("?Verbose Level not plausible (0-4).\n");
SERIAL_PROTOCOLPGM("?Verbose Level not plausible.\n");
return; return;
} }
} }
if (verbose_level > 0) if (verbose_level > 0) {
{
SERIAL_PROTOCOLPGM("M49 Z-Probe Repeatability test. Version 2.00\n"); SERIAL_PROTOCOLPGM("M49 Z-Probe Repeatability test. Version 2.00\n");
SERIAL_PROTOCOLPGM("Full support at: http://3dprintboard.com/forum.php\n"); SERIAL_PROTOCOLPGM("Full support at: http://3dprintboard.com/forum.php\n");
} }
if (code_seen('n')) if (code_seen('n')) {
{
n_samples = code_value(); n_samples = code_value();
if (n_samples<4 || n_samples>50 ) if (n_samples < 4 || n_samples > 50) {
{ SERIAL_PROTOCOLPGM("?Specified sample size not plausible (4-50).\n");
SERIAL_PROTOCOLPGM("?Specified sample size not plausable.\n");
return; return;
} }
} }
...@@ -3291,35 +3165,30 @@ void gcode_G92() ...@@ -3291,35 +3165,30 @@ void gcode_G92()
Z_start_location = st_get_position_mm(Z_AXIS) + Z_RAISE_BEFORE_PROBING; Z_start_location = st_get_position_mm(Z_AXIS) + Z_RAISE_BEFORE_PROBING;
ext_position = st_get_position_mm(E_AXIS); ext_position = st_get_position_mm(E_AXIS);
if (code_seen('E') || code_seen('e')) engage_probe_for_each_reading++; if (code_seen('E') || code_seen('e'))
engage_probe_for_each_reading++;
if (code_seen('X') || code_seen('x')) if (code_seen('X') || code_seen('x')) {
{ X_probe_location = code_value() - X_PROBE_OFFSET_FROM_EXTRUDER;
X_probe_location = code_value() - X_PROBE_OFFSET_FROM_EXTRUDER; if (X_probe_location < X_MIN_POS || X_probe_location > X_MAX_POS) {
if (X_probe_location<X_MIN_POS || X_probe_location>X_MAX_POS)
{
SERIAL_PROTOCOLPGM("?Specified X position out of range.\n"); SERIAL_PROTOCOLPGM("?Specified X position out of range.\n");
return; return;
} }
} }
if (code_seen('Y') || code_seen('y')) if (code_seen('Y') || code_seen('y')) {
{
Y_probe_location = code_value() - Y_PROBE_OFFSET_FROM_EXTRUDER; Y_probe_location = code_value() - Y_PROBE_OFFSET_FROM_EXTRUDER;
if (Y_probe_location<Y_MIN_POS || Y_probe_location>Y_MAX_POS) if (Y_probe_location < Y_MIN_POS || Y_probe_location > Y_MAX_POS) {
{
SERIAL_PROTOCOLPGM("?Specified Y position out of range.\n"); SERIAL_PROTOCOLPGM("?Specified Y position out of range.\n");
return; return;
} }
} }
if (code_seen('L') || code_seen('l')) if (code_seen('L') || code_seen('l')) {
{
n_legs = code_value(); n_legs = code_value();
if (n_legs == 1) n_legs = 2; if (n_legs == 1) n_legs = 2;
if (n_legs<0 || n_legs>15) if (n_legs < 0 || n_legs > 15) {
{ SERIAL_PROTOCOLPGM("?Specified number of legs in movement not plausible (0-15).\n");
SERIAL_PROTOCOLPGM("?Specified number of legs in movement not plausible.\n");
return; return;
} }
} }
...@@ -3330,10 +3199,7 @@ void gcode_G92() ...@@ -3330,10 +3199,7 @@ void gcode_G92()
st_synchronize(); st_synchronize();
plan_bed_level_matrix.set_to_identity(); plan_bed_level_matrix.set_to_identity();
plan_buffer_line( X_current, Y_current, Z_start_location, plan_buffer_line( X_current, Y_current, Z_start_location, ext_position, homing_feedrate[Z_AXIS]/60, active_extruder, active_driver);
ext_position,
homing_feedrate[Z_AXIS]/60,
active_extruder, active_driver);
st_synchronize(); st_synchronize();
// //
...@@ -3341,7 +3207,8 @@ void gcode_G92() ...@@ -3341,7 +3207,8 @@ void gcode_G92()
// get us close to the bed. If the Z-Axis is far from the bed, we don't want to // get us close to the bed. If the Z-Axis is far from the bed, we don't want to
// use that as a starting point for each probe. // use that as a starting point for each probe.
// //
if (verbose_level > 2) SERIAL_PROTOCOL("Positioning probe for the test.\n"); if (verbose_level > 2)
SERIAL_PROTOCOL("Positioning probe for the test.\n");
plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, ext_position, homing_feedrate[X_AXIS]/60, active_extruder, active_driver); plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, ext_position, homing_feedrate[X_AXIS]/60, active_extruder, active_driver);
st_synchronize(); st_synchronize();
...@@ -3370,55 +3237,49 @@ void gcode_G92() ...@@ -3370,55 +3237,49 @@ void gcode_G92()
if (engage_probe_for_each_reading) retract_z_probe(); if (engage_probe_for_each_reading) retract_z_probe();
for (n=0; n<n_samples; n++) for (n=0; n < n_samples; n++) {
{
do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Make sure we are at the probe location
if (n_legs)
{
double radius=0.0, theta=0.0, x_sweep, y_sweep;
int rotational_direction, l;
rotational_direction = (unsigned long) millis() & 0x0001; // clockwise or counter clockwise
radius = (unsigned long) millis() % (long) (X_MAX_LENGTH/4); // limit how far out to go
theta = (float) ((unsigned long) millis() % (long) 360) / (360./(2*3.1415926)); // turn into radians
//SERIAL_ECHOPAIR("starting radius: ",radius); do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Make sure we are at the probe location
//SERIAL_ECHOPAIR(" theta: ",theta);
//SERIAL_ECHOPAIR(" direction: ",rotational_direction);
//SERIAL_PROTOCOLLNPGM("");
for( l=0; l<n_legs-1; l++) if (n_legs) {
{ double radius=0.0, theta=0.0, x_sweep, y_sweep;
if (rotational_direction==1) theta += (float) ((unsigned long) millis() % (long) 20) / (360.0/(2*3.1415926)); // turn into radians int l;
else theta -= (float) ((unsigned long) millis() % (long) 20) / (360.0/(2*3.1415926)); // turn into radians int rotational_direction = (unsigned long) millis() & 0x0001; // clockwise or counter clockwise
radius = (unsigned long)millis() % (long)(X_MAX_LENGTH / 4); // limit how far out to go
theta = (float)((unsigned long)millis() % 360L) / (360. / (2 * 3.1415926)); // turn into radians
radius += (float) ( ((long) ((unsigned long) millis() % (long) 10)) - 5); //SERIAL_ECHOPAIR("starting radius: ",radius);
if (radius < 0.0) radius = -radius; //SERIAL_ECHOPAIR(" theta: ",theta);
//SERIAL_ECHOPAIR(" direction: ",rotational_direction);
//SERIAL_PROTOCOLLNPGM("");
X_current = X_probe_location + cos(theta) * radius; float dir = rotational_direction ? 1 : -1;
Y_current = Y_probe_location + sin(theta) * radius; for (l = 0; l < n_legs - 1; l++) {
theta += dir * (float)((unsigned long)millis() % 20L) / (360.0/(2*3.1415926)); // turn into radians
if (X_current < X_MIN_POS) X_current = X_MIN_POS; // Make sure our X & Y are sane radius += (float)(((long)((unsigned long) millis() % 10L)) - 5L);
if (X_current > X_MAX_POS) X_current = X_MAX_POS; if (radius < 0.0) radius = -radius;
if (Y_current < Y_MIN_POS) Y_current = Y_MIN_POS; // Make sure our X & Y are sane X_current = X_probe_location + cos(theta) * radius;
if (Y_current > Y_MAX_POS) Y_current = Y_MAX_POS; Y_current = Y_probe_location + sin(theta) * radius;
if (verbose_level > 3) // Make sure our X & Y are sane
{ X_current = constrain(X_current, X_MIN_POS, X_MAX_POS);
SERIAL_ECHOPAIR("x: ", X_current); Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS);
SERIAL_ECHOPAIR("y: ", Y_current);
SERIAL_PROTOCOLLNPGM("");
}
do_blocking_move_to( X_current, Y_current, Z_current ); if (verbose_level > 3) {
SERIAL_ECHOPAIR("x: ", X_current);
SERIAL_ECHOPAIR("y: ", Y_current);
SERIAL_PROTOCOLLNPGM("");
} }
do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Go back to the probe location
do_blocking_move_to( X_current, Y_current, Z_current );
} }
do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Go back to the probe location
}
if (engage_probe_for_each_reading) if (engage_probe_for_each_reading) {
{ engage_z_probe();
engage_z_probe();
delay(1000); delay(1000);
} }
...@@ -3431,25 +3292,18 @@ void gcode_G92() ...@@ -3431,25 +3292,18 @@ void gcode_G92()
// Get the current mean for the data points we have so far // Get the current mean for the data points we have so far
// //
sum = 0.0; sum = 0.0;
for (j=0; j<=n; j++) for (j=0; j<=n; j++) sum += sample_set[j];
{
sum = sum + sample_set[j];
}
mean = sum / (double (n+1)); mean = sum / (double (n+1));
// //
// Now, use that mean to calculate the standard deviation for the // Now, use that mean to calculate the standard deviation for the
// data points we have so far // data points we have so far
// //
sum = 0.0; sum = 0.0;
for (j=0; j<=n; j++) for (j=0; j<=n; j++) sum += (sample_set[j]-mean) * (sample_set[j]-mean);
{ sigma = sqrt( sum / (double (n+1)) );
sum = sum + (sample_set[j]-mean) * (sample_set[j]-mean);
}
sigma = sqrt( sum / (double (n+1)));
if (verbose_level > 1) if (verbose_level > 1) {
{
SERIAL_PROTOCOL(n+1); SERIAL_PROTOCOL(n+1);
SERIAL_PROTOCOL(" of "); SERIAL_PROTOCOL(" of ");
SERIAL_PROTOCOL(n_samples); SERIAL_PROTOCOL(n_samples);
...@@ -3457,21 +3311,20 @@ void gcode_G92() ...@@ -3457,21 +3311,20 @@ void gcode_G92()
SERIAL_PROTOCOL_F(current_position[Z_AXIS], 6); SERIAL_PROTOCOL_F(current_position[Z_AXIS], 6);
} }
if (verbose_level > 2) if (verbose_level > 2) {
{
SERIAL_PROTOCOL(" mean: "); SERIAL_PROTOCOL(" mean: ");
SERIAL_PROTOCOL_F(mean,6); SERIAL_PROTOCOL_F(mean,6);
SERIAL_PROTOCOL(" sigma: "); SERIAL_PROTOCOL(" sigma: ");
SERIAL_PROTOCOL_F(sigma,6); SERIAL_PROTOCOL_F(sigma,6);
} }
if (verbose_level > 0) SERIAL_PROTOCOLPGM("\n"); if (verbose_level > 0)
SERIAL_PROTOCOLPGM("\n");
plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder, active_driver); plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder, active_driver);
st_synchronize(); st_synchronize();
if (engage_probe_for_each_reading) if (engage_probe_for_each_reading) {
{
retract_z_probe(); retract_z_probe();
delay(1000); delay(1000);
} }
...@@ -3482,8 +3335,7 @@ void gcode_G92() ...@@ -3482,8 +3335,7 @@ void gcode_G92()
clean_up_after_endstop_move(); clean_up_after_endstop_move();
if (verbose_level > 0) if (verbose_level > 0) {
{
SERIAL_PROTOCOLPGM("Mean: "); SERIAL_PROTOCOLPGM("Mean: ");
SERIAL_PROTOCOL_F(mean, 6); SERIAL_PROTOCOL_F(mean, 6);
SERIAL_PROTOCOLPGM("\n"); SERIAL_PROTOCOLPGM("\n");
...@@ -3497,22 +3349,15 @@ void gcode_G92() ...@@ -3497,22 +3349,15 @@ void gcode_G92()
#ifdef FILAMENTCHANGEENABLE #ifdef FILAMENTCHANGEENABLE
//M600: Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] //M600: Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
void gcode_M600() inline void gcode_M600() {
{
float target[NUM_AXIS]; float target[NUM_AXIS];
for (int i=0; i<NUM_AXIS; i++) target[i] = lastpos[i] = current_position[i]; for (int i=0; i < NUM_AXIS; i++) target[i] = lastpos[i] = current_position[i];
//retract by E //retract by E
if(code_seen('E')) if(code_seen('E')) target[E_AXIS] += code_value();
{ #ifdef FILAMENTCHANGE_FIRSTRETRACT
target[E_AXIS]+= code_value(); else target[E_AXIS] += FILAMENTCHANGE_FIRSTRETRACT;
} #endif
else
{
#ifdef FILAMENTCHANGE_FIRSTRETRACT
target[E_AXIS]+= FILAMENTCHANGE_FIRSTRETRACT;
#endif
}
#ifdef DELTA #ifdef DELTA
calculate_delta(target); calculate_delta(target);
...@@ -3522,16 +3367,10 @@ void gcode_G92() ...@@ -3522,16 +3367,10 @@ void gcode_G92()
#endif #endif
//lift Z //lift Z
if(code_seen('Z')) if (code_seen('Z')) target[Z_AXIS] += code_value();
{ #ifdef FILAMENTCHANGE_ZADD
target[Z_AXIS]+= code_value(); else target[Z_AXIS] += FILAMENTCHANGE_ZADD;
} #endif
else
{
#ifdef FILAMENTCHANGE_ZADD
target[Z_AXIS]+= FILAMENTCHANGE_ZADD;
#endif
}
#ifdef DELTA #ifdef DELTA
calculate_delta(target); calculate_delta(target);
...@@ -3541,26 +3380,15 @@ void gcode_G92() ...@@ -3541,26 +3380,15 @@ void gcode_G92()
#endif #endif
//move xy //move xy
if(code_seen('X')) if (code_seen('X')) target[X_AXIS] = code_value();
{ #ifdef FILAMENTCHANGE_XPOS
target[X_AXIS]= code_value(); else target[X_AXIS] = FILAMENTCHANGE_XPOS;
} #endif
else
{ if (code_seen('Y')) target[Y_AXIS] = code_value();
#ifdef FILAMENTCHANGE_XPOS #ifdef FILAMENTCHANGE_YPOS
target[X_AXIS]= FILAMENTCHANGE_XPOS; else target[Y_AXIS] = FILAMENTCHANGE_YPOS;
#endif #endif
}
if(code_seen('Y'))
{
target[Y_AXIS]= code_value();
}
else
{
#ifdef FILAMENTCHANGE_YPOS
target[Y_AXIS]= FILAMENTCHANGE_YPOS;
#endif
}
#ifdef DELTA #ifdef DELTA
calculate_delta(target); calculate_delta(target);
...@@ -3569,16 +3397,10 @@ void gcode_G92() ...@@ -3569,16 +3397,10 @@ void gcode_G92()
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder, active_driver); plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder, active_driver);
#endif #endif
if(code_seen('L')) if (code_seen('L')) target[E_AXIS] += code_value();
{ #ifdef FILAMENTCHANGE_FINALRETRACT
target[E_AXIS]+= code_value(); else target[E_AXIS] += FILAMENTCHANGE_FINALRETRACT;
} #endif
else
{
#ifdef FILAMENTCHANGE_FINALRETRACT
target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ;
#endif
}
#ifdef DELTA #ifdef DELTA
calculate_delta(target); calculate_delta(target);
...@@ -3593,15 +3415,13 @@ void gcode_G92() ...@@ -3593,15 +3415,13 @@ void gcode_G92()
disable_e(); disable_e();
delay(100); delay(100);
LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE); LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE);
uint8_t cnt=0; uint8_t cnt = 0;
while(!lcd_clicked()) while (!lcd_clicked()) {
{
cnt++; cnt++;
manage_heater(); manage_heater();
manage_inactivity(true); manage_inactivity(true);
lcd_update(); lcd_update();
if(cnt==0) if (cnt == 0) {
{
#if BEEPER > 0 #if BEEPER > 0
SET_OUTPUT(BEEPER); SET_OUTPUT(BEEPER);
WRITE(BEEPER,HIGH); WRITE(BEEPER,HIGH);
...@@ -3610,29 +3430,24 @@ void gcode_G92() ...@@ -3610,29 +3430,24 @@ void gcode_G92()
delay(3); delay(3);
#else #else
#if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS) #if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
lcd_buzz(1000/6,100); lcd_buzz(1000/6, 100);
#else #else
lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS,LCD_FEEDBACK_FREQUENCY_HZ); lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);
#endif #endif
#endif #endif
} }
} }
//return to normal //return to normal
if(code_seen('L')) if (code_seen('L')) target[E_AXIS] -= code_value();
{ #ifdef FILAMENTCHANGE_FINALRETRACT
target[E_AXIS]+= -code_value(); else target[E_AXIS] -= FILAMENTCHANGE_FINALRETRACT;
} #endif
else
{
#ifdef FILAMENTCHANGE_FINALRETRACT
target[E_AXIS]+=(-1)*FILAMENTCHANGE_FINALRETRACT ;
#endif
}
#if defined(PAUSE_PIN) && PAUSE_PIN > -1 #if defined(PAUSE_PIN) && PAUSE_PIN > -1
paused = false; paused = false;
#endif #endif
current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding current_position[E_AXIS] = target[E_AXIS]; //the long retract of L is compensated by manual filament feeding
plan_set_e_position(current_position[E_AXIS]); plan_set_e_position(current_position[E_AXIS]);
#ifdef DELTA #ifdef DELTA
...@@ -3648,90 +3463,70 @@ void gcode_G92() ...@@ -3648,90 +3463,70 @@ void gcode_G92()
#endif //FILAMENTCHANGEENABLE #endif //FILAMENTCHANGEENABLE
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
void gcode_M666() inline void gcode_M666() {
{ if (code_seen('P')) {
if (code_seen('P'))
{
zprobe_zoffset = code_value(); zprobe_zoffset = code_value();
} }
if (code_seen('L')) if (code_seen('L')) {
{
SERIAL_ECHOPAIR("P (Z-Probe Offset):", zprobe_zoffset); SERIAL_ECHOPAIR("P (Z-Probe Offset):", zprobe_zoffset);
SERIAL_EOL; SERIAL_EOL;
} }
} }
#elif defined(DELTA) #elif defined(DELTA)
void gcode_M666() inline void gcode_M666() {
{ if ( !(code_seen('P'))) {
if ( !(code_seen('P'))) for(int8_t i=0; i < 3; i++) {
{
for(int8_t i=0; i < 3; i++)
{
if (code_seen(axis_codes[i])) endstop_adj[i] = code_value(); if (code_seen(axis_codes[i])) endstop_adj[i] = code_value();
} }
} }
if (code_seen('A')) if (code_seen('A')) {
{
tower_adj[0] = code_value(); tower_adj[0] = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('B')) if (code_seen('B')) {
{
tower_adj[1] = code_value(); tower_adj[1] = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('C')) if (code_seen('C')) {
{
tower_adj[2] = code_value(); tower_adj[2] = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('I')) if (code_seen('I')) {
{
tower_adj[3] = code_value(); tower_adj[3] = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('J')) if (code_seen('J')) {
{
tower_adj[4] = code_value(); tower_adj[4] = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('K')) if (code_seen('K')) {
{
tower_adj[5] = code_value(); tower_adj[5] = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('R')) if (code_seen('R')) {
{
delta_radius = code_value(); delta_radius = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('D')) if (code_seen('D')) {
{
delta_diagonal_rod = code_value(); delta_diagonal_rod = code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('H')) if (code_seen('H')) {
{
max_pos[Z_AXIS]= code_value(); max_pos[Z_AXIS]= code_value();
set_delta_constants(); set_delta_constants();
} }
if (code_seen('P')) if (code_seen('P')) {
{
float pz = code_value(); float pz = code_value();
if (!(code_seen(axis_codes[0]) || code_seen(axis_codes[1]) || code_seen(axis_codes[2]))) // Allow direct set of Z offset without an axis code if (!(code_seen(axis_codes[0]) || code_seen(axis_codes[1]) || code_seen(axis_codes[2]))) { // Allow direct set of Z offset without an axis code
{
z_probe_offset[Z_AXIS]= pz; z_probe_offset[Z_AXIS]= pz;
} }
else else {
{ for(int8_t i=0; i < 3; i++) {
for(int8_t i=0; i < 3; i++)
{
if (code_seen(axis_codes[i])) z_probe_offset[i] = code_value(); if (code_seen(axis_codes[i])) z_probe_offset[i] = code_value();
} }
} }
} }
if (code_seen('L')) if (code_seen('L')) {
{
SERIAL_ECHOLN("Current Delta geometry values:"); SERIAL_ECHOLN("Current Delta geometry values:");
SERIAL_ECHOPAIR("X (Endstop Adj): ",endstop_adj[0]); SERIAL_ECHOPAIR("X (Endstop Adj): ",endstop_adj[0]);
SERIAL_EOL; SERIAL_EOL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment