From 7ee6b1062e99bfa10216d48f757234f0c6219661 Mon Sep 17 00:00:00 2001 From: bdring Date: Fri, 6 Nov 2020 20:01:06 -0600 Subject: [PATCH] Basic functionality TODO - Deal with tool length offset - Deal with manual probe cycle --- Grbl_Esp32/Custom/atc.cpp | 204 +++++++++++++++++- Grbl_Esp32/Custom/custom_code_template.cpp | 2 - .../Custom/esp32_printer_controller.cpp | 183 ---------------- Grbl_Esp32/src/Config.h | 6 +- Grbl_Esp32/src/GCode.cpp | 11 +- Grbl_Esp32/src/Grbl.h | 3 +- .../src/Machines/6_pack_stepstick_XYZ_ATC.h | 54 +---- Grbl_Esp32/src/Machines/atari_1020.h | 1 - Grbl_Esp32/src/Machines/template.h | 4 - Grbl_Esp32/src/MotionControl.cpp | 1 - 10 files changed, 211 insertions(+), 258 deletions(-) delete mode 100644 Grbl_Esp32/Custom/esp32_printer_controller.cpp diff --git a/Grbl_Esp32/Custom/atc.cpp b/Grbl_Esp32/Custom/atc.cpp index 77b62b4c..3bfcbf6c 100644 --- a/Grbl_Esp32/Custom/atc.cpp +++ b/Grbl_Esp32/Custom/atc.cpp @@ -4,40 +4,222 @@ */ +#define TOOL_GRAB_TIME 0.75 // seconds +// temporary struct....should be a class +typedef struct { + float mpos[MAX_N_AXIS]; // the pickup location in machine coords + float offset[MAX_N_AXIS]; // the offset from the zero'd tool +} tool_t; +tool_t tool[5]; // one setter, plus 4 tools +void go_above_tool(uint8_t tool_num); +void return_tool(uint8_t tool_num); +void atc_tool_setter(); +bool set_ATC_open(bool open); + +uint8_t current_tool = 0; void machine_init() { grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC Machine Init"); -} + pinMode(ATC_RELEASE_PIN, OUTPUT); + + // the tool setter + tool[0].mpos[X_AXIS] = 5.0; + tool[0].mpos[Y_AXIS] = 130.0; + tool[0].mpos[Z_AXIS] = -12.0; + + tool[1].mpos[X_AXIS] = 35.0; + tool[1].mpos[Y_AXIS] = 130.0; + tool[1].mpos[Z_AXIS] = -20.0; + + tool[2].mpos[X_AXIS] = 65.0; + tool[2].mpos[Y_AXIS] = 130.0; + tool[2].mpos[Z_AXIS] = -20.0; + + tool[3].mpos[X_AXIS] = 95.0; + tool[3].mpos[Y_AXIS] = 130.0; + tool[3].mpos[Z_AXIS] = -20.0; +} /* */ void user_tool_change(uint8_t new_tool) { - char gcode_line[20]; + char gcode_line[80]; + bool spindle_on = false; + uint64_t spindle_delay; + float saved_mpos[MAX_N_AXIS] = {}; + + // save current position + system_convert_array_steps_to_mpos(saved_mpos, sys_position); - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC use tool %d", new_tool); protocol_buffer_synchronize(); // wait for all previous moves to complete + // is spindle on? Turn it off and determine when the spin down should be done. + if (gc_state.modal.spindle != SpindleState::Disable) { + spindle_on = true; + sprintf(gcode_line, "M5\r"); // + gc_execute_line(gcode_line, CLIENT_INPUT); + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC: %s", gcode_line); + spindle_delay = esp_timer_get_time() + (spindle_delay_spinup->get() * 1000.0); // When has spindle stopped + } + + return_tool(current_tool); // does nothing if current tool is 0 + + // if changing to tool 0...we are done. + if (new_tool == 0) { + current_tool = new_tool; + return; + } + + // TODO Check for G91...might not matter in G53 + + go_above_tool(new_tool); + protocol_buffer_synchronize(); // wait for motion to complete + + // if spindle was on has the spindle down period completed? If not wait. + if (spindle_on) { + uint64_t current_time = esp_timer_get_time(); + if (current_time < spindle_delay) { + vTaskDelay(spindle_delay - current_time); + } + } + + // open ATC + set_ATC_open(true); + + // drop down to tool + sprintf(gcode_line, "G53G0Z%0.3f\r", tool[new_tool].mpos[Z_AXIS]); // + gc_execute_line(gcode_line, CLIENT_INPUT); + protocol_buffer_synchronize(); // wait for it + + // Close ATC + set_ATC_open(false); + + // wait for grab to complete and settle + sprintf(gcode_line, "G4P%0.2f\r", TOOL_GRAB_TIME); // + gc_execute_line(gcode_line, CLIENT_INPUT); + + // raise to top of Z sprintf(gcode_line, "G53G0Z-1\r"); // - gc_execute_line(gcode_line, CLIENT_INPUT); - - sprintf(gcode_line, "G4P3.0"); // gc_execute_line(gcode_line, CLIENT_INPUT); - sprintf(gcode_line, "G0G0Z0"); // + // move to X Y in front of tool + sprintf(gcode_line, "G53G0X%0.3fY%0.3f\r", tool[new_tool].mpos[X_AXIS], tool[new_tool].mpos[Y_AXIS] - 20.0); // gc_execute_line(gcode_line, CLIENT_INPUT); + + current_tool = new_tool; + + atc_tool_setter(); + + // is spindle on? + if (spindle_on) { + sprintf(gcode_line, "M3\r"); // + gc_execute_line(gcode_line, CLIENT_INPUT); + } + + // return to saved mpos + sprintf(gcode_line, "G53G0X%0.3fY%0.3fZ%0.3f\r", saved_mpos[X_AXIS], saved_mpos[Y_AXIS], saved_mpos[Z_AXIS]); // + gc_execute_line(gcode_line, CLIENT_INPUT); + + // TODO wait for spinup } - // Polar coaster has macro buttons, this handles those button pushes. -void user_defined_macro(uint8_t index) { - -} +void user_defined_macro(uint8_t index) {} void user_m30() { grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC M30"); } + +// ============= Local functions ================== + +void go_above_tool(uint8_t tool_num) { + char gcode_line[80]; + + // raise up + sprintf(gcode_line, "G53G0Z-1"); + gc_execute_line(gcode_line, CLIENT_INPUT); + + // move in front + sprintf(gcode_line, "G53G0X%0.3fY%0.3f\r", tool[tool_num].mpos[X_AXIS], tool[tool_num].mpos[Y_AXIS] - 20.0); // + gc_execute_line(gcode_line, CLIENT_INPUT); + + // Move over tool + sprintf(gcode_line, "G53G0Y%0.3f\r", tool[tool_num].mpos[Y_AXIS]); // + gc_execute_line(gcode_line, CLIENT_INPUT); +} + +void return_tool(uint8_t tool_num) { + char gcode_line[80]; + + if (tool_num == 0) + return; + + go_above_tool(tool_num); + + // drop down to tool + sprintf(gcode_line, "G53G0Z%0.3f\r", tool[tool_num].mpos[Z_AXIS]); // + gc_execute_line(gcode_line, CLIENT_INPUT); + + // release tool + // open ATC + protocol_buffer_synchronize(); // wait for it + set_ATC_open(true); + + // wait + sprintf(gcode_line, "G4P0.5\r"); // + gc_execute_line(gcode_line, CLIENT_INPUT); + + // raise up + sprintf(gcode_line, "G53G0Z-1"); + gc_execute_line(gcode_line, CLIENT_INPUT); + + // close ATC + protocol_buffer_synchronize(); // wait for it + set_ATC_open(false); + + // move forward + sprintf(gcode_line, "G53G0X%0.3fY%0.3f\r", tool[tool_num].mpos[X_AXIS], tool[tool_num].mpos[Y_AXIS] - 20.0); // + gc_execute_line(gcode_line, CLIENT_INPUT); +} + +void atc_tool_setter() { + char gcode_line[80]; + float print_position[MAX_N_AXIS]; + + go_above_tool(0); + + // probe + sprintf(gcode_line, "G38.2F%0.3fZ%0.3f\r", 300.0, -15); // + gc_execute_line(gcode_line, CLIENT_INPUT); + protocol_buffer_synchronize(); + + system_convert_array_steps_to_mpos(print_position, sys_probe_position); + + // TODO was probe successful? + + // Get the Z height ... + tool[current_tool].offset[Z_AXIS] = print_position[Z_AXIS]; + + // raise up + sprintf(gcode_line, "G53G0Z-1"); + gc_execute_line(gcode_line, CLIENT_INPUT); + + // move forward + sprintf(gcode_line, "G53G0X%0.3fY%0.3f\r", tool[0].mpos[X_AXIS], tool[0].mpos[Y_AXIS] - 20.0); // + gc_execute_line(gcode_line, CLIENT_INPUT); +} + +bool set_ATC_open(bool open) { + // todo lots of safety checks + if (gc_state.modal.spindle != SpindleState::Disable) { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC Fail spindle on during change"); + return false; + } + digitalWrite(ATC_RELEASE_PIN, open); + return true; +} diff --git a/Grbl_Esp32/Custom/custom_code_template.cpp b/Grbl_Esp32/Custom/custom_code_template.cpp index bd468f6d..0560de47 100644 --- a/Grbl_Esp32/Custom/custom_code_template.cpp +++ b/Grbl_Esp32/Custom/custom_code_template.cpp @@ -121,13 +121,11 @@ void forward_kinematics(float* position) { } #endif -#ifdef USE_TOOL_CHANGE /* user_tool_change() is called when tool change gcode is received, to perform appropriate actions for your machine. */ void user_tool_change(uint8_t new_tool) {} -#endif #if defined(MACRO_BUTTON_0_PIN) || defined(MACRO_BUTTON_1_PIN) || defined(MACRO_BUTTON_2_PIN) /* diff --git a/Grbl_Esp32/Custom/esp32_printer_controller.cpp b/Grbl_Esp32/Custom/esp32_printer_controller.cpp deleted file mode 100644 index 6c2a8cd1..00000000 --- a/Grbl_Esp32/Custom/esp32_printer_controller.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - esp32_printer_controller.cpp (copy and use your machine name) - Part of Grbl_ESP32 - - copyright (c) 2020 - Bart Dring. This file was intended for use on the ESP32 - - ...add your date and name here. - - CPU. Do not use this with Grbl for atMega328P - - Grbl_ESP32 is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl_ESP32 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . - - ======================================================================= - -This is a template for user-defined C++ code functions. Grbl can be -configured to call some optional functions, enabled by #define statements -in the machine definition .h file. Implement the functions thus enabled -herein. The possible functions are listed and described below. - -To use this file, copy it to a name of your own choosing, and also copy -Machines/template.h to a similar name. - -Example: -Machines/my_machine.h -Custom/my_machine.cpp - -Edit machine.h to include your Machines/my_machine.h file - -Edit Machines/my_machine.h according to the instructions therein. - -Fill in the function definitions below for the functions that you have -enabled with USE_ defines in Machines/my_machine.h - -=============================================================================== - -*/ - -#ifdef USE_MACHINE_INIT -/* -machine_init() is called when Grbl_ESP32 first starts. You can use it to do any -special things your machine needs at startup. -*/ -# define STEPPERS_DISABLE_PIN_X 138 -# define STEPPERS_DISABLE_PIN_Y 134 -# define STEPPERS_DISABLE_PIN_Z 131 -# define STEPPERS_DISABLE_PIN_A 139 - -# define FAN1_PIN 13 -# define FAN2_PIN 142 -# define FAN3_PIN 143 - -# define BED_PIN 4 -# define NOZZLE_PIN 2 - -void machine_init() { - // Enable steppers - digitalWrite(STEPPERS_DISABLE_PIN_X, LOW); // enable - digitalWrite(STEPPERS_DISABLE_PIN_Y, LOW); // enable - digitalWrite(STEPPERS_DISABLE_PIN_Z, LOW); // enable - digitalWrite(STEPPERS_DISABLE_PIN_A, LOW); // enable - - // digitalWrite(FAN1_PIN, LOW); // comment out for JTAG debugging - - digitalWrite(FAN2_PIN, LOW); // disable - digitalWrite(FAN3_PIN, LOW); // disable - - digitalWrite(BED_PIN, LOW); // disable - digitalWrite(NOZZLE_PIN, LOW); // disable -} -#endif - -#ifdef USE_CUSTOM_HOMING -/* - (user_defined_homing) is called at the begining of the normal Grbl_ESP32 homing - sequence. If user_defined_homing() returns false, the rest of normal Grbl_ESP32 - homing is skipped if it returns false, other normal homing continues. For - example, if you need to manually prep the machine for homing, you could implement - user_defined_homing() to wait for some button to be pressed, then return true. -*/ -bool user_defined_homing(uint8_t cycle_mask) { - // True = done with homing, false = continue with normal Grbl_ESP32 homing - return true; -} -#endif - -#ifdef USE_KINEMATICS -/* - Inverse Kinematics converts X,Y,Z cartesian coordinate to the steps - on your "joint" motors. It requires the following three functions: -*/ - -/* - inverse_kinematics() looks at incoming move commands and modifies - them before Grbl_ESP32 puts them in the motion planner. - - Grbl_ESP32 processes arcs by converting them into tiny little line segments. - Kinematics in Grbl_ESP32 works the same way. Search for this function across - Grbl_ESP32 for examples. You are basically converting cartesian X,Y,Z... targets to - - target = an N_AXIS array of target positions (where the move is supposed to go) - pl_data = planner data (see the definition of this type to see what it is) - position = an N_AXIS array of where the machine is starting from for this move -*/ -void inverse_kinematics(float* target, plan_line_data_t* pl_data, float* position) { - // this simply moves to the target. Replace with your kinematics. - mc_line(target, pl_data); -} - -/* - kinematics_pre_homing() is called before normal homing - You can use it to do special homing or just to set stuff up - - cycle_mask is a bit mask of the axes being homed this time. -*/ -bool kinematics_pre_homing(uint8_t cycle_mask)) -{ - return false; // finish normal homing cycle -} - -/* - kinematics_post_homing() is called at the end of normal homing -*/ -void kinematics_post_homing() {} -#endif - -#ifdef USE_FWD_KINEMATICS -/* - The status command uses forward_kinematics() to convert - your motor positions to cartesian X,Y,Z... coordinates. - - Convert the N_AXIS array of motor positions to cartesian in your code. -*/ -void forward_kinematics(float* position) { - // position[X_AXIS] = - // position[Y_AXIS] = -} -#endif - -#ifdef USE_TOOL_CHANGE -/* - user_tool_change() is called when tool change gcode is received, - to perform appropriate actions for your machine. -*/ -void user_tool_change(uint8_t new_tool) {} -#endif - -#if defined(MACRO_BUTTON_0_PIN) || defined(MACRO_BUTTON_1_PIN) || defined(MACRO_BUTTON_2_PIN) -/* - options. user_defined_macro() is called with the button number to - perform whatever actions you choose. -*/ -void user_defined_macro(uint8_t index) {} -#endif - -#ifdef USE_M30 -/* - user_m30() is called when an M30 gcode signals the end of a gcode file. -*/ -void user_m30() {} -#endif - -#ifdef USE_MACHINE_TRINAMIC_INIT -/* - machine_triaminic_setup() replaces the normal setup of trinamic - drivers with your own code. For example, you could setup StallGuard -*/ -void machine_trinamic_setup() {} -#endif - -// If you add any additional functions specific to your machine that -// require calls from common code, guard their calls in the common code with -// #ifdef USE_WHATEVER and add function prototypes (also guarded) to grbl.h diff --git a/Grbl_Esp32/src/Config.h b/Grbl_Esp32/src/Config.h index 50b014f8..296c1ea5 100644 --- a/Grbl_Esp32/src/Config.h +++ b/Grbl_Esp32/src/Config.h @@ -96,11 +96,11 @@ const int MAX_N_AXIS = 6; //#define CONNECT_TO_SSID "your SSID" //#define SSID_PASSWORD "your SSID password" //CONFIGURE_EYECATCH_BEGIN (DO NOT MODIFY THIS LINE) -#define ENABLE_BLUETOOTH // enable bluetooth +//#define ENABLE_BLUETOOTH // enable bluetooth -#define ENABLE_SD_CARD // enable use of SD Card to run jobs +//#define ENABLE_SD_CARD // enable use of SD Card to run jobs -#define ENABLE_WIFI //enable wifi +//#define ENABLE_WIFI //enable wifi #if defined(ENABLE_WIFI) || defined(ENABLE_BLUETOOTH) # define WIFI_OR_BLUETOOTH diff --git a/Grbl_Esp32/src/GCode.cpp b/Grbl_Esp32/src/GCode.cpp index 21614a86..324cec17 100644 --- a/Grbl_Esp32/src/GCode.cpp +++ b/Grbl_Esp32/src/GCode.cpp @@ -488,10 +488,7 @@ Error gc_execute_line(char* line, uint8_t client) { break; case 6: // tool change gc_block.modal.tool_change = ToolChange::Enable; -#ifdef USE_TOOL_CHANGE - //user_tool_change(gc_state.tool); -#endif - mg_word_bit = ModalGroup::MM6; + mg_word_bit = ModalGroup::MM6; break; case 7: case 8: @@ -1355,9 +1352,7 @@ Error gc_execute_line(char* line, uint8_t client) { // gc_state.tool = gc_block.values.t; // [6. Change tool ]: NOT SUPPORTED if (gc_block.modal.tool_change == ToolChange::Enable) { -#ifdef USE_TOOL_CHANGE - user_tool_change(gc_state.tool); -#endif + user_tool_change(gc_state.tool); // (weak) should be user defined } // [7. Spindle control ]: if (gc_state.modal.spindle != gc_block.modal.spindle) { @@ -1604,6 +1599,8 @@ Error gc_execute_line(char* line, uint8_t client) { return Error::Ok; } +__attribute__((weak)) void user_tool_change(uint8_t new_tool) {} + /* Not supported: diff --git a/Grbl_Esp32/src/Grbl.h b/Grbl_Esp32/src/Grbl.h index 10275f4b..9d3d7d7e 100644 --- a/Grbl_Esp32/src/Grbl.h +++ b/Grbl_Esp32/src/Grbl.h @@ -115,5 +115,4 @@ void user_defined_macro(uint8_t index); // Called if USE_M30 is defined void user_m30(); -// Called if USE_TOOL_CHANGE is defined -void user_tool_change(uint8_t new_tool); +void user_tool_change(uint8_t new_tool); // weak diff --git a/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_ATC.h b/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_ATC.h index 1b7dcd4c..22df5b29 100644 --- a/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_ATC.h +++ b/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_ATC.h @@ -29,7 +29,6 @@ #define N_AXIS 3 #define USE_MACHINE_INIT -#define USE_TOOL_CHANGE #define USE_M30 // use the user defined end of program // === Special Features @@ -72,36 +71,6 @@ https://github.com/bdring/6-Pack_CNC_Controller/wiki/CNC-I-O-Module-List Click on each module to get example for using the modules in the sockets - -Socket #1 -#1 GPIO_NUM_33 -#2 GPIO_NUM_32 -#3 GPIO_NUM_35 (input only) -#4 GPIO_NUM_34 (input only) - -Socket #2 -#1 GPIO_NUM_2 -#2 GPIO_NUM_25 -#3 GPIO_NUM_39 (input only) -#4 GPIO_NUM_36 (input only) - -Socket #3 -#1 GPIO_NUM_26 -#2 GPIO_NUM_4 -#3 GPIO_NUM_16 -#4 GPIO_NUM_27 - -Socket #4 -#1 GPIO_NUM_14 -#2 GPIO_NUM_13 -#3 GPIO_NUM_15 -#4 GPIO_NUM_12 - -Socket #5 -#1 I2SO(24) (output only) -#2 I2SO(25) (output only) -#3 I2SO26) (output only) - */ @@ -110,21 +79,18 @@ Socket #5 #define X_LIMIT_PIN GPIO_NUM_33 #define Y_LIMIT_PIN GPIO_NUM_32 #define Z_LIMIT_PIN GPIO_NUM_35 +#define PROBE_PIN GPIO_NUM_34 +// 5V output CNC module in socket #4 +// https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-5V-Buffered-Output-Module +#define SPINDLE_TYPE SpindleType::PWM +#define SPINDLE_OUTPUT_PIN GPIO_NUM_12 +#define ATC_RELEASE_PIN GPIO_NUM_13 // optional +#define COOLANT_MIST_PIN GPIO_NUM_15 // optional +#define COOLANT_FLOOD_PIN GPIO_NUM_14 -// // 4x Input Module in Socket #2 -// // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module -// #define X_LIMIT_PIN GPIO_NUM_2 -// #define Y_LIMIT_PIN GPIO_NUM_25 -// #define Z_LIMIT_PIN GPIO_NUM_39 - -// // 4x Input Module in Socket #3 -// // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module -// #define CONTROL_CYCLE_START_PIN GPIO_NUM_26 -// #define CONTROL_FEED_HOLD_PIN GPIO_NUM_4 -// #define CONTROL_RESET_PIN GPIO_NUM_16 -// #define CONTROL_SAFETY_DOOR_PIN GPIO_NUM_27 -// //#define INVERT_CONTROL_PIN_MASK B0000 +#define DEFAULT_SPINDLE_DELAY_SPINUP 5.0 +#define DEFAULT_SPINDLE_DELAY_SPINDOWN 5.0 // ================= Setting Defaults ========================== #define DEFAULT_X_STEPS_PER_MM 800 diff --git a/Grbl_Esp32/src/Machines/atari_1020.h b/Grbl_Esp32/src/Machines/atari_1020.h index eecc2146..c1aafb33 100644 --- a/Grbl_Esp32/src/Machines/atari_1020.h +++ b/Grbl_Esp32/src/Machines/atari_1020.h @@ -142,7 +142,6 @@ // tells grbl we have some special functions to call #define USE_MACHINE_INIT #define USE_CUSTOM_HOMING -#define USE_TOOL_CHANGE #define ATARI_TOOL_CHANGE_Z 5.0 #define USE_M30 // use the user defined end of program diff --git a/Grbl_Esp32/src/Machines/template.h b/Grbl_Esp32/src/Machines/template.h index 7672d31f..3fc7fe61 100644 --- a/Grbl_Esp32/src/Machines/template.h +++ b/Grbl_Esp32/src/Machines/template.h @@ -196,10 +196,6 @@ // systems back to Cartesian form, for status reports. //#define USE_FWD_KINEMATICS -// USE_TOOL_CHANGE enables the user_tool_change() function -// that implements custom tool change procedures. -// #define USE_TOOL_CHANGE - // Any one of MACRO_BUTTON_0_PIN, MACRO_BUTTON_1_PIN, and MACRO_BUTTON_2_PIN // enables the user_defined_macro(number) function which // implements custom behavior at the press of a button diff --git a/Grbl_Esp32/src/MotionControl.cpp b/Grbl_Esp32/src/MotionControl.cpp index 5d725ac9..d7d981d0 100644 --- a/Grbl_Esp32/src/MotionControl.cpp +++ b/Grbl_Esp32/src/MotionControl.cpp @@ -408,7 +408,6 @@ GCUpdatePos mc_probe_cycle(float* target, plan_line_data_t* pl_data, uint8_t par return GCUpdatePos::None; // Nothing else to do but bail. } // Setup and queue probing motion. Auto cycle-start should not start the cycle. - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Found"); mc_line_kins(target, pl_data, gc_state.position); // Activate the probing state monitor in the stepper module. sys_probe_state = Probe::Active;