refactor zprobe probe return to be a method and returns to saved last_milestone so...
authorJim Morris <morris@wolfman.com>
Wed, 28 Sep 2016 05:30:43 +0000 (22:30 -0700)
committerJim Morris <morris@wolfman.com>
Wed, 28 Sep 2016 05:30:43 +0000 (22:30 -0700)
src/modules/communication/GcodeDispatch.cpp
src/modules/tools/zprobe/DeltaCalibrationStrategy.cpp
src/modules/tools/zprobe/DeltaGridStrategy.cpp
src/modules/tools/zprobe/ThreePointStrategy.cpp
src/modules/tools/zprobe/ZProbe.cpp
src/modules/tools/zprobe/ZProbe.h

index 019dc2f..bd437bf 100644 (file)
@@ -26,7 +26,6 @@
 #include "utils.h"
 #include "LPC17xx.h"
 
-#define return_error_on_unhandled_gcode_checksum    CHECKSUM("return_error_on_unhandled_gcode")
 #define panel_display_message_checksum CHECKSUM("display_message")
 #define panel_checksum             CHECKSUM("panel")
 
index c5e2bc1..ab92cfe 100644 (file)
@@ -153,8 +153,7 @@ float DeltaCalibrationStrategy::findBed()
 
     // find bed, run at slow rate so as to not hit bed hard
     float mm;
-    if(!zprobe->run_probe(mm, false)) return NAN;
-    zprobe->return_probe(mm);
+    if(!zprobe->run_probe_return(mm, zprobe->getSlowFeedrate())) return NAN;
 
     // leave the probe zprobe->getProbeHeight() above bed
     float dz= zprobe->getProbeHeight() - mm;
index 0c64d75..dff4d81 100644 (file)
@@ -423,10 +423,7 @@ float DeltaGridStrategy::findBed()
 
     // find bed at 0,0 run at slow rate so as to not hit bed hard
     float mm;
-    if(!zprobe->run_probe(mm, false)) return NAN;
-
-    // leave the probe zprobe->getProbeHeight() above bed
-    zprobe->return_probe(mm);
+    if(!zprobe->run_probe_return(mm, zprobe->getSlowFeedrate())) return NAN;
 
     float dz= zprobe->getProbeHeight() - mm;
     zprobe->coordinated_move(NAN, NAN, dz, zprobe->getFastFeedrate(), true); // relative move
index 65390df..b0bbc32 100644 (file)
@@ -279,7 +279,7 @@ bool ThreePointStrategy::doProbing(StreamOutput *stream)
 
     // find bed via probe
     float mm;
-    if(!zprobe->run_probe(mm)) return false;
+    if(!zprobe->run_probe(mm, zprobe->getSlowFeedrate())) return false;
 
     // TODO if using probe then we probably need to set Z to 0 at first probe point, but take into account probe offset from head
     THEROBOT->reset_axis_position(std::get<Z_AXIS>(this->probe_offsets), Z_AXIS);
index 961e68f..dc3843d 100644 (file)
@@ -174,7 +174,6 @@ bool ZProbe::run_probe(float& mm, float feedrate, float max_dist, bool reverse)
     };
 
     // move Z down
-    THEROBOT->disable_segmentation= true; // we must disable segmentation as this won't work with it enabled
     bool dir= (!reverse_z != reverse); // xor
     float delta[3]= {0,0,0};
     delta[Z_AXIS]= dir ? -maxz : maxz;
@@ -182,7 +181,6 @@ bool ZProbe::run_probe(float& mm, float feedrate, float max_dist, bool reverse)
 
     // wait until finished
     THECONVEYOR->wait_for_idle();
-    THEROBOT->disable_segmentation= false;
 
     // now see how far we moved, get delta in z we moved
     // NOTE this works for deltas as well as all three actuators move the same amount in Z
@@ -206,8 +204,14 @@ bool ZProbe::run_probe(float& mm, float feedrate, float max_dist, bool reverse)
     return probe_detected;
 }
 
-bool ZProbe::return_probe(float mm, bool reverse)
+// do probe then return to start position
+bool ZProbe::run_probe_return(float& mm, float feedrate, float max_dist, bool reverse)
 {
+    float save_pos[3];
+    THEROBOT->get_axis_position(save_pos);
+
+    bool ok= run_probe(mm, feedrate, max_dist, reverse);
+
     // move probe back to where it was
     float fr;
     if(this->return_feedrate != 0) { // use return_feedrate if set
@@ -220,28 +224,17 @@ bool ZProbe::return_probe(float mm, bool reverse)
     bool dir= ((mm < 0) != reverse_z); // xor
     if(reverse) dir= !dir;
 
-    float delta[3]= {0,0,0};
-    delta[Z_AXIS]= dir ? -mm : mm;
-    THEROBOT->delta_move(delta, fr, 3);
-
-    // wait until finished
-    THECONVEYOR->wait_for_idle();
+    // absolute move to starting position
+    coordinated_move(save_pos[0], save_pos[1], save_pos[2], fr, false);
 
-    return true;
+    return ok;
 }
 
 bool ZProbe::doProbeAt(float &mm, float x, float y)
 {
-    float s;
     // move to xy
     coordinated_move(x, y, NAN, getFastFeedrate());
-    if(!run_probe(s)) return false;
-
-    // return to original Z
-    return_probe(s);
-    mm = s;
-
-    return true;
+    return run_probe_return(mm, slow_feedrate);
 }
 
 float ZProbe::probeDistance(float x, float y)
@@ -271,40 +264,26 @@ void ZProbe::on_gcode_received(void *argument)
             // first wait for all moves to finish
             THEKERNEL->conveyor->wait_for_idle();
 
+            bool set_z= (gcode->has_letter('Z') && !is_rdelta);
             bool probe_result;
             bool reverse= (gcode->has_letter('R') && gcode->get_value('R') != 0); // specify to probe in reverse direction
             float rate= gcode->has_letter('F') ? gcode->get_value('F') / 60 : this->slow_feedrate;
             float mm;
-            probe_result = run_probe(mm, rate, -1, reverse);
+
+            // if not setting Z then return probe to where it started, otherwise leave it where it is
+            probe_result = (set_z ? run_probe(mm, rate, -1, reverse) : run_probe_return(mm, rate, -1, reverse));
 
             if(probe_result) {
-                // the result is in actuator coordinates and raw steps
+                // the result is in actuator coordinates moved
                 gcode->stream->printf("Z:%1.4f\n", mm);
 
-                // set the last probe position to the current actuator units
-                THEROBOT->set_last_probe_position(std::make_tuple(
-                    THEROBOT->actuators[X_AXIS]->get_current_position(),
-                    THEROBOT->actuators[Y_AXIS]->get_current_position(),
-                    THEROBOT->actuators[Z_AXIS]->get_current_position(),
-                    1));
-
-                // move back to where it started, unless a Z is specified (and not a rotary delta)
-                if(gcode->has_letter('Z') && !is_rdelta) {
-                    // set Z to the specified value, and leave probe where it is
+                if(set_z) {
+                    // set Z to the specified value
                     THEROBOT->reset_axis_position(gcode->get_value('Z'), Z_AXIS);
-
-                } else {
-                    // return to pre probe position
-                    return_probe(mm, reverse);
                 }
 
             } else {
                 gcode->stream->printf("ZProbe not triggered\n");
-                THEROBOT->set_last_probe_position(std::make_tuple(
-                    THEROBOT->actuators[X_AXIS]->get_current_position(),
-                    THEROBOT->actuators[Y_AXIS]->get_current_position(),
-                    THEROBOT->actuators[Z_AXIS]->get_current_position(),
-                    0));
             }
 
         } else {
index 7f4324a..558956e 100644 (file)
@@ -33,8 +33,7 @@ public:
     void on_gcode_received(void *argument);
 
     bool run_probe(float& mm, float feedrate, float max_dist= -1, bool reverse= false);
-    bool run_probe(float& mm, bool fast= false) { return run_probe(mm, fast ? this->fast_feedrate : this->slow_feedrate); }
-    bool return_probe(float mm, bool reverse= false);
+    bool run_probe_return(float& mm, float feedrate, float max_dist= -1, bool reverse= false);
     bool doProbeAt(float &mm, float x, float y);
     float probeDistance(float x, float y);