Merge pull request #4900 from thinkyhead/rc_g38_changes
Cleanup of G38.2 / G38.3
This commit is contained in:
		| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -209,6 +209,11 @@ void manage_inactivity(bool ignore_stepper_queue = false); | ||||
|  | ||||
| #endif // !MIXING_EXTRUDER | ||||
|  | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   extern bool G38_move,        // flag to tell the interrupt handler that a G38 command is being run | ||||
|               G38_endstop_hit; // flag from the interrupt handler to indicate if the endstop went active | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * The axis order in all axis related arrays is X, Y, Z, E | ||||
|  */ | ||||
|   | ||||
| @@ -117,6 +117,7 @@ | ||||
|  * G30 - Single Z probe, probes bed at current XY location. | ||||
|  * G31 - Dock sled (Z_PROBE_SLED only) | ||||
|  * G32 - Undock sled (Z_PROBE_SLED only) | ||||
|  * G38 - Probe target - similar to G28 except it uses the Z_MIN endstop for all three axes | ||||
|  * G90 - Use Absolute Coordinates | ||||
|  * G91 - Use Relative Coordinates | ||||
|  * G92 - Set current position to coordinates given | ||||
| @@ -276,6 +277,11 @@ | ||||
|   TWIBus i2c; | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   bool G38_move = false, | ||||
|        G38_endstop_hit = false; | ||||
| #endif | ||||
|  | ||||
| bool Running = true; | ||||
|  | ||||
| uint8_t marlin_debug_flags = DEBUG_NONE; | ||||
| @@ -2325,6 +2331,7 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|  | ||||
| #endif // AUTO_BED_LEVELING_BILINEAR | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Home an individual linear axis | ||||
|  */ | ||||
| @@ -4158,6 +4165,94 @@ inline void gcode_G28() { | ||||
|  | ||||
| #endif // HAS_BED_PROBE | ||||
|  | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|  | ||||
|   static bool G38_run_probe() { | ||||
|  | ||||
|     bool G38_pass_fail = false; | ||||
|  | ||||
|     // Get direction of move and retract | ||||
|     float retract_mm[XYZ]; | ||||
|     LOOP_XYZ(i) { | ||||
|       float dist = destination[i] - current_position[i]; | ||||
|       retract_mm[i] = fabs(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm(i) * (dist > 0 ? -1 : 1); | ||||
|     } | ||||
|  | ||||
|     stepper.synchronize();  // wait until the machine is idle | ||||
|  | ||||
|     // Move until destination reached or target hit | ||||
|     endstops.enable(true); | ||||
|     G38_move = true; | ||||
|     G38_endstop_hit = false; | ||||
|     prepare_move_to_destination(); | ||||
|     stepper.synchronize(); | ||||
|     G38_move = false; | ||||
|  | ||||
|     endstops.hit_on_purpose(); | ||||
|     set_current_from_steppers_for_axis(ALL_AXES); | ||||
|     SYNC_PLAN_POSITION_KINEMATIC(); | ||||
|  | ||||
|     // Only do remaining moves if target was hit | ||||
|     if (G38_endstop_hit) { | ||||
|  | ||||
|       G38_pass_fail = true; | ||||
|  | ||||
|       // Move away by the retract distance | ||||
|       set_destination_to_current(); | ||||
|       LOOP_XYZ(i) destination[i] += retract_mm[i]; | ||||
|       endstops.enable(false); | ||||
|       prepare_move_to_destination(); | ||||
|       stepper.synchronize(); | ||||
|  | ||||
|       feedrate_mm_s /= 4; | ||||
|  | ||||
|       // Bump the target more slowly | ||||
|       LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2; | ||||
|  | ||||
|       endstops.enable(true); | ||||
|       G38_move = true; | ||||
|       prepare_move_to_destination(); | ||||
|       stepper.synchronize(); | ||||
|       G38_move = false; | ||||
|  | ||||
|       set_current_from_steppers_for_axis(ALL_AXES); | ||||
|       SYNC_PLAN_POSITION_KINEMATIC(); | ||||
|     } | ||||
|  | ||||
|     endstops.hit_on_purpose(); | ||||
|     endstops.not_homing(); | ||||
|     return G38_pass_fail; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * G38.2 - probe toward workpiece, stop on contact, signal error if failure | ||||
|    * G38.3 - probe toward workpiece, stop on contact | ||||
|    * | ||||
|    * Like G28 except uses Z min endstop for all axes | ||||
|    */ | ||||
|   inline void gcode_G38(bool is_38_2) { | ||||
|     // Get X Y Z E F | ||||
|     gcode_get_destination(); | ||||
|  | ||||
|     setup_for_endstop_or_probe_move(); | ||||
|  | ||||
|     // If any axis has enough movement, do the move | ||||
|     LOOP_XYZ(i) | ||||
|       if (fabs(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) { | ||||
|         if (!code_seen('F')) feedrate_mm_s = homing_feedrate_mm_s[i]; | ||||
|         // If G38.2 fails throw an error | ||||
|         if (!G38_run_probe() && is_38_2) { | ||||
|           SERIAL_ERROR_START; | ||||
|           SERIAL_ERRORLNPGM("Failed to reach target"); | ||||
|         } | ||||
|         break; | ||||
|       } | ||||
|  | ||||
|     clean_up_after_endstop_or_probe_move(); | ||||
|   } | ||||
|  | ||||
| #endif // G38_PROBE_TARGET | ||||
|  | ||||
| /** | ||||
|  * G92: Set current position to given X Y Z E | ||||
|  */ | ||||
| @@ -7279,6 +7374,11 @@ void process_next_command() { | ||||
|   // Skip spaces to get the numeric part | ||||
|   while (*cmd_ptr == ' ') cmd_ptr++; | ||||
|  | ||||
|   // Allow for decimal point in command | ||||
|   #if ENABLED(G38_PROBE_TARGET) | ||||
|     uint8_t subcode = 0; | ||||
|   #endif | ||||
|  | ||||
|   uint16_t codenum = 0; // define ahead of goto | ||||
|  | ||||
|   // Bail early if there's no code | ||||
| @@ -7291,6 +7391,15 @@ void process_next_command() { | ||||
|     cmd_ptr++; | ||||
|   } while (NUMERIC(*cmd_ptr)); | ||||
|  | ||||
|   // Allow for decimal point in command | ||||
|   #if ENABLED(G38_PROBE_TARGET) | ||||
|     if (*cmd_ptr == '.') { | ||||
|       cmd_ptr++; | ||||
|       while (NUMERIC(*cmd_ptr)) | ||||
|         subcode = (subcode * 10) + (*cmd_ptr++ - '0'); | ||||
|     } | ||||
|   #endif | ||||
|  | ||||
|   // Skip all spaces to get to the first argument, or nul | ||||
|   while (*cmd_ptr == ' ') cmd_ptr++; | ||||
|  | ||||
| @@ -7391,6 +7500,13 @@ void process_next_command() { | ||||
|         #endif // Z_PROBE_SLED | ||||
|       #endif // HAS_BED_PROBE | ||||
|  | ||||
|       #if ENABLED(G38_PROBE_TARGET) | ||||
|         case 38: // G38.2 & G38.3 | ||||
|           if (subcode == 2 || subcode == 3) | ||||
|             gcode_G38(subcode == 2); | ||||
|           break; | ||||
|       #endif | ||||
|  | ||||
|       case 90: // G90 | ||||
|         relative_mode = false; | ||||
|         break; | ||||
|   | ||||
| @@ -851,6 +851,17 @@ | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * G38 Probe Target | ||||
|  */ | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #if !HAS_BED_PROBE | ||||
|     #error "G38_PROBE_TARGET requires a bed probe." | ||||
|   #elif !IS_CARTESIAN | ||||
|     #error "G38_PROBE_TARGET requires a Cartesian machine." | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * Make sure only one display is enabled | ||||
|  * | ||||
|   | ||||
| @@ -243,14 +243,28 @@ void Endstops::update() { | ||||
|   // COPY_BIT: copy the value of COPY_BIT to BIT in bits | ||||
|   #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT)) | ||||
|  | ||||
|   #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ | ||||
|   #define _UPDATE_ENDSTOP(AXIS,MINMAX,CODE) do { \ | ||||
|       UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \ | ||||
|       if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \ | ||||
|         _ENDSTOP_HIT(AXIS); \ | ||||
|         stepper.endstop_triggered(_AXIS(AXIS)); \ | ||||
|         CODE; \ | ||||
|       } \ | ||||
|     } while(0) | ||||
|  | ||||
|   #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN)  // If G38 command then check Z_MIN for every axis and every direction   | ||||
|  | ||||
|     #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ | ||||
|         _UPDATE_ENDSTOP(AXIS,MINMAX,NOOP); \ | ||||
|         if (G38_move) _UPDATE_ENDSTOP(Z, MIN, G38_endstop_hit = true); \ | ||||
|       } while(0) | ||||
|  | ||||
|   #else	 | ||||
|  | ||||
|     #define UPDATE_ENDSTOP(AXIS,MINMAX) _UPDATE_ENDSTOP(AXIS,MINMAX,NOOP) | ||||
|  | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(COREXY) || ENABLED(COREXZ) | ||||
|     // Head direction in -X axis for CoreXY and CoreXZ bots. | ||||
|     // If DeltaA == -DeltaB, the movement is only in Y or Z axis | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -538,6 +538,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 3 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -540,6 +540,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -534,6 +534,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -534,6 +534,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -534,6 +534,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -539,6 +539,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -534,6 +534,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
| @@ -532,6 +532,12 @@ | ||||
| // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. | ||||
| //#define BEZIER_CURVE_SUPPORT | ||||
|  | ||||
| // G38.2 and G38.3 Probe Target | ||||
| //#define G38_PROBE_TARGET | ||||
| #if ENABLED(G38_PROBE_TARGET) | ||||
|   #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) | ||||
| #endif | ||||
|  | ||||
| // Moves (or segments) with fewer steps than this will be joined with the next move | ||||
| #define MIN_STEPS_PER_SEGMENT 6 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user