diff --git a/Grbl_Esp32/Custom/atari_1020.cpp b/Grbl_Esp32/Custom/atari_1020.cpp
index 5661ae6d..cf0fd270 100644
--- a/Grbl_Esp32/Custom/atari_1020.cpp
+++ b/Grbl_Esp32/Custom/atari_1020.cpp
@@ -212,16 +212,16 @@ void calc_solenoid(float penZ) {
A tool (pen) change is done by bumping the carriage against the right edge 3 times per
position change. Pen 1-4 is valid range.
*/
-void user_tool_change(uint8_t new_tool) {
+bool user_tool_change(uint8_t new_tool) {
uint8_t move_count;
char gcode_line[20];
protocol_buffer_synchronize(); // wait for all previous moves to complete
if ((new_tool < 1) || (new_tool > MAX_PEN_NUMBER)) {
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Requested Pen#%d is out of 1-4 range", new_tool);
- return;
+ return false;
}
if (new_tool == current_tool)
- return;
+ return true;
if (new_tool > current_tool)
move_count = BUMPS_PER_PEN_CHANGE * (new_tool - current_tool);
else
@@ -235,6 +235,8 @@ void user_tool_change(uint8_t new_tool) {
}
current_tool = new_tool;
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Change to Pen#%d", current_tool);
+
+ return true;
}
// move from current tool to next tool....
diff --git a/Grbl_Esp32/Custom/atc.cpp b/Grbl_Esp32/Custom/atc.cpp
index 32f13f09..30c87348 100644
--- a/Grbl_Esp32/Custom/atc.cpp
+++ b/Grbl_Esp32/Custom/atc.cpp
@@ -18,19 +18,19 @@
If you zero a tool on the work piece, all tools will use the delta determined by the
toolsetter to.
-
-
*/
-#define TOOL_GRAB_TIME 0.75 // seconds
+const int TOOL_COUNT = 4;
-// temporary struct....should be a class
+const float TOOL_GRAB_TIME = 0.75; // seconds. How long it takes to grab a tool
+
+// temporary struct....should maybe 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
+tool_t tool[TOOL_COUNT + 1]; // one setter, plus 4 tools
void go_above_tool(uint8_t tool_num);
void return_tool(uint8_t tool_num);
@@ -60,29 +60,36 @@ void machine_init() {
tool[3].mpos[X_AXIS] = 95.0;
tool[3].mpos[Y_AXIS] = 130.0;
tool[3].mpos[Z_AXIS] = -20.0;
+
+ tool[4].mpos[X_AXIS] = 125.0;
+ tool[4].mpos[Y_AXIS] = 130.0;
+ tool[4].mpos[Z_AXIS] = -20.0;
}
-/*
-
-*/
-void user_tool_change(uint8_t new_tool) {
+bool user_tool_change(uint8_t new_tool) {
char gcode_line[80];
- bool spindle_on = false;
- uint64_t spindle_delay;
+ bool spindle_was_on = false;
+ uint64_t spindle_spin_delay; // milliseconds
float saved_mpos[MAX_N_AXIS] = {};
- // save current position
- system_convert_array_steps_to_mpos(saved_mpos, sys_position);
+ if (new_tool == current_tool)
+ return true;
- protocol_buffer_synchronize(); // wait for all previous moves to complete
+ if (new_tool > TOOL_COUNT) {
+ grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC Tool out of range:%d", new_tool);
+ return false;
+ }
+
+ protocol_buffer_synchronize(); // wait for all previous moves to complete
+ system_convert_array_steps_to_mpos(saved_mpos, sys_position); // save current position so we can return
// 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;
+ spindle_was_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
+ spindle_spin_delay = esp_timer_get_time() + (spindle_delay_spindown->get() * 1000.0); // When has spindle stopped
}
return_tool(current_tool); // does nothing if current tool is 0
@@ -90,7 +97,7 @@ void user_tool_change(uint8_t new_tool) {
// if changing to tool 0...we are done.
if (new_tool == 0) {
current_tool = new_tool;
- return;
+ return true;
}
// TODO Check for G91...might not matter in G53
@@ -99,10 +106,10 @@ void user_tool_change(uint8_t 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) {
+ if (spindle_was_on) {
uint64_t current_time = esp_timer_get_time();
- if (current_time < spindle_delay) {
- vTaskDelay(spindle_delay - current_time);
+ if (current_time < spindle_spin_delay) {
+ vTaskDelay(spindle_spin_delay - current_time);
}
}
@@ -134,7 +141,7 @@ void user_tool_change(uint8_t new_tool) {
atc_tool_setter();
// is spindle on?
- if (spindle_on) {
+ if (spindle_was_on) {
sprintf(gcode_line, "M3\r"); //
gc_execute_line(gcode_line, CLIENT_INPUT);
}
@@ -144,13 +151,8 @@ void user_tool_change(uint8_t new_tool) {
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_m30() {
- grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "ATC M30");
+ return true;
}
// ============= Local functions ==================
diff --git a/Grbl_Esp32/Custom/custom_code_template.cpp b/Grbl_Esp32/Custom/custom_code_template.cpp
index 0560de47..eda7e2c3 100644
--- a/Grbl_Esp32/Custom/custom_code_template.cpp
+++ b/Grbl_Esp32/Custom/custom_code_template.cpp
@@ -46,13 +46,11 @@ 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.
*/
void machine_init() {}
-#endif
#ifdef USE_CUSTOM_HOMING
/*
@@ -125,7 +123,7 @@ void forward_kinematics(float* position) {
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) {}
+bool user_tool_change(uint8_t new_tool) {}
#if defined(MACRO_BUTTON_0_PIN) || defined(MACRO_BUTTON_1_PIN) || defined(MACRO_BUTTON_2_PIN)
/*
diff --git a/Grbl_Esp32/Custom/mpcnc_laser_module.cpp b/Grbl_Esp32/Custom/mpcnc_laser_module.cpp
index e65ce629..52b816c4 100644
--- a/Grbl_Esp32/Custom/mpcnc_laser_module.cpp
+++ b/Grbl_Esp32/Custom/mpcnc_laser_module.cpp
@@ -21,7 +21,6 @@
along with Grbl. If not, see .
*/
-#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.
@@ -32,4 +31,3 @@ void machine_init() {
pinMode(LVL_SHIFT_ENABLE, OUTPUT);
digitalWrite(LVL_SHIFT_ENABLE, HIGH);
}
-#endif
diff --git a/Grbl_Esp32/src/Error.cpp b/Grbl_Esp32/src/Error.cpp
index 149b0665..4d5c7687 100644
--- a/Grbl_Esp32/src/Error.cpp
+++ b/Grbl_Esp32/src/Error.cpp
@@ -61,6 +61,7 @@ std::map ErrorNames = {
{ Error::GcodeG43DynamicAxisError, "Gcode G43 dynamic axis error" },
{ Error::GcodeMaxValueExceeded, "Gcode max value exceeded" },
{ Error::PParamMaxExceeded, "P param max exceeded" },
+ { Error::ToolChangeError, "Tool change failed" },
{ Error::SdFailedMount, "SD failed mount" },
{ Error::SdFailedRead, "SD failed read" },
{ Error::SdFailedOpenDir, "SD failed to open directory" },
diff --git a/Grbl_Esp32/src/Error.h b/Grbl_Esp32/src/Error.h
index 09a54030..da3acf38 100644
--- a/Grbl_Esp32/src/Error.h
+++ b/Grbl_Esp32/src/Error.h
@@ -64,6 +64,7 @@ enum class Error : uint8_t {
GcodeG43DynamicAxisError = 37,
GcodeMaxValueExceeded = 38,
PParamMaxExceeded = 39,
+ ToolChangeError = 40,
SdFailedMount = 60, // SD Failed to mount
SdFailedRead = 61, // SD Failed to read file
SdFailedOpenDir = 62, // SD card failed to open directory
diff --git a/Grbl_Esp32/src/GCode.cpp b/Grbl_Esp32/src/GCode.cpp
index 324cec17..d780e092 100644
--- a/Grbl_Esp32/src/GCode.cpp
+++ b/Grbl_Esp32/src/GCode.cpp
@@ -1352,7 +1352,9 @@ 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) {
- user_tool_change(gc_state.tool); // (weak) should be user defined
+ if (!user_tool_change(gc_state.tool)) { // (weak) should be user defined
+ FAIL(Error::ToolChangeError);
+ }
}
// [7. Spindle control ]:
if (gc_state.modal.spindle != gc_block.modal.spindle) {
@@ -1599,7 +1601,7 @@ Error gc_execute_line(char* line, uint8_t client) {
return Error::Ok;
}
-__attribute__((weak)) void user_tool_change(uint8_t new_tool) {}
+__attribute__((weak)) bool user_tool_change(uint8_t new_tool) {}
/*
Not supported:
diff --git a/Grbl_Esp32/src/Grbl.cpp b/Grbl_Esp32/src/Grbl.cpp
index 7a29bc4f..ef8e98a5 100644
--- a/Grbl_Esp32/src/Grbl.cpp
+++ b/Grbl_Esp32/src/Grbl.cpp
@@ -43,9 +43,8 @@ void grbl_init() {
system_ini(); // Configure pinout pins and pin-change interrupt (Renamed due to conflict with esp32 files)
memset(sys_position, 0, sizeof(sys_position)); // Clear machine position.
-#ifdef USE_MACHINE_INIT
- machine_init(); // user supplied function for special initialization
-#endif
+ machine_init(); // (weak) should be user defined
+
// Initialize system state.
#ifdef FORCE_INITIALIZATION_ALARM
// Force Grbl into an ALARM state upon a power-cycle or hard reset.
@@ -117,6 +116,8 @@ void run_once() {
protocol_main_loop();
}
+__attribute__((weak)) void machine_init() {}
+
/*
setup() and loop() in the Arduino .ino implements this control flow:
diff --git a/Grbl_Esp32/src/Grbl.h b/Grbl_Esp32/src/Grbl.h
index 9d3d7d7e..7b01498e 100644
--- a/Grbl_Esp32/src/Grbl.h
+++ b/Grbl_Esp32/src/Grbl.h
@@ -92,7 +92,6 @@ const char* const GRBL_VERSION_BUILD = "20201101";
void grbl_init();
void run_once();
-// Called if USE_MACHINE_INIT is defined
void machine_init();
// Called if USE_CUSTOM_HOMING is defined
@@ -115,4 +114,4 @@ void user_defined_macro(uint8_t index);
// Called if USE_M30 is defined
void user_m30();
-void user_tool_change(uint8_t new_tool); // weak
+bool 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 22df5b29..bd9701ee 100644
--- a/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_ATC.h
+++ b/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_ATC.h
@@ -28,9 +28,6 @@
#define N_AXIS 3
-#define USE_MACHINE_INIT
-#define USE_M30 // use the user defined end of program
-
// === Special Features
// I2S (steppers & other output-only pins)
diff --git a/Grbl_Esp32/src/Machines/atari_1020.h b/Grbl_Esp32/src/Machines/atari_1020.h
index c1aafb33..1c225c16 100644
--- a/Grbl_Esp32/src/Machines/atari_1020.h
+++ b/Grbl_Esp32/src/Machines/atari_1020.h
@@ -140,7 +140,6 @@
#define ATARI_HOMING_ATTEMPTS 13
// tells grbl we have some special functions to call
-#define USE_MACHINE_INIT
#define USE_CUSTOM_HOMING
#define ATARI_TOOL_CHANGE_Z 5.0
#define USE_M30 // use the user defined end of program
diff --git a/Grbl_Esp32/src/Machines/midtbot.h b/Grbl_Esp32/src/Machines/midtbot.h
index 41e35c2a..2fd6991e 100644
--- a/Grbl_Esp32/src/Machines/midtbot.h
+++ b/Grbl_Esp32/src/Machines/midtbot.h
@@ -32,7 +32,6 @@
#define MIDTBOT // applies the geometry correction to the kinematics
#define USE_KINEMATICS // there are kinematic equations for this machine
#define USE_FWD_KINEMATICS // report in cartesian
-#define USE_MACHINE_INIT // There is some custom initialization for this machine
#define USE_CUSTOM_HOMING
#define SPINDLE_TYPE SpindleType::NONE
diff --git a/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h b/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h
index f7b02d29..0d78c90d 100644
--- a/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h
+++ b/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h
@@ -30,7 +30,6 @@
#define MACHINE_NAME "MPCNC_V1P2 with Laser Module"
// The laser module fires without a low signal. This keeps the enable on
-#define USE_MACHINE_INIT
#define LVL_SHIFT_ENABLE GPIO_NUM_32
#define CUSTOM_CODE_FILENAME "Custom/mpcnc_laser_module.cpp"
diff --git a/Grbl_Esp32/src/Machines/tapster_3.h b/Grbl_Esp32/src/Machines/tapster_3.h
index b4de2b1c..5896f682 100644
--- a/Grbl_Esp32/src/Machines/tapster_3.h
+++ b/Grbl_Esp32/src/Machines/tapster_3.h
@@ -27,7 +27,6 @@
#define USE_KINEMATICS // there are kinematic equations for this machine
#define USE_FWD_KINEMATICS // report in cartesian
-#define USE_MACHINE_INIT // There is some custom initialization for this machine
// ================== Delta Geometry ===========================
diff --git a/Grbl_Esp32/src/Machines/tapster_pro_6P_trinamic.h b/Grbl_Esp32/src/Machines/tapster_pro_6P_trinamic.h
index 6f88a816..88975f93 100644
--- a/Grbl_Esp32/src/Machines/tapster_pro_6P_trinamic.h
+++ b/Grbl_Esp32/src/Machines/tapster_pro_6P_trinamic.h
@@ -27,7 +27,6 @@
#define USE_RMT_STEPS // Use the RMT periferal to generate step pulses
#define USE_TRINAMIC // some Trinamic motors are used on this machine
#define USE_MACHINE_TRINAMIC_INIT // there is a machine specific setup for the drivers
-#define USE_MACHINE_INIT // There is some custom initialization for this machine
#define SEGMENT_LENGTH 0.5 // segment length in mm
#define KIN_ANGLE_CALC_OK 0
@@ -43,7 +42,6 @@
#define USE_KINEMATICS // there are kinematic equations for this machine
#define USE_FWD_KINEMATICS // report in cartesian
-#define USE_MACHINE_INIT // There is some custom initialization for this machine
// ================== Delta Geometry ===========================