Lot of refactoring for the future. CoreXY support.
- Rudimentary CoreXY kinematics support. Didn’t test, but homing and feed holds should work. See config.h. Please report successes and issues as we find bugs. - G40 (disable cutter comp) is now “supported”. Meaning that Grbl will no longer issue an error when typically sent in g-code program header. - Refactored coolant and spindle state setting into separate functions for future features. - Configuration option for fixing homing behavior when there are two limit switches on the same axis sharing an input pin. - Created a new “grbl.h” that will eventually be used as the main include file for Grbl. Also will help simply uploading through the Arduino IDE - Separated out the alarms execution flags from the realtime (used be called runtime) execution flag variable. Now reports exactly what caused the alarm. Expandable for new alarms later on. - Refactored the homing cycle to support CoreXY. - Applied @EliteEng updates to Mega2560 support. Some pins were reconfigured. - Created a central step to position and vice versa function. Needed for non-traditional cartesian machines. Should make it easier later. - Removed the new CPU map for the Uno. No longer going to used. There will be only one configuration to keep things uniform.
This commit is contained in:
93
protocol.c
93
protocol.c
@ -2,7 +2,7 @@
|
||||
protocol.c - controls Grbl execution protocol and procedures
|
||||
Part of Grbl v0.9
|
||||
|
||||
Copyright (c) 2012-2014 Sungeun K. Jeon
|
||||
Copyright (c) 2012-2015 Sungeun K. Jeon
|
||||
|
||||
Grbl is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -43,7 +43,7 @@ static char line[LINE_BUFFER_SIZE]; // Line to be executed. Zero-terminated.
|
||||
// such as settings, initiating the homing cycle, and toggling switch states.
|
||||
static void protocol_execute_line(char *line)
|
||||
{
|
||||
protocol_execute_runtime(); // Runtime command check point.
|
||||
protocol_execute_realtime(); // Runtime command check point.
|
||||
if (sys.abort) { return; } // Bail to calling function upon system abort
|
||||
|
||||
if (line[0] == 0) {
|
||||
@ -160,7 +160,7 @@ void protocol_main_loop()
|
||||
// completed. In either case, auto-cycle start, if enabled, any queued moves.
|
||||
protocol_auto_cycle_start();
|
||||
|
||||
protocol_execute_runtime(); // Runtime command check point.
|
||||
protocol_execute_realtime(); // Runtime command check point.
|
||||
if (sys.abort) { return; } // Bail to main() program loop to reset system.
|
||||
|
||||
}
|
||||
@ -172,50 +172,52 @@ void protocol_main_loop()
|
||||
// Executes run-time commands, when required. This is called from various check points in the main
|
||||
// program, primarily where there may be a while loop waiting for a buffer to clear space or any
|
||||
// point where the execution time from the last check point may be more than a fraction of a second.
|
||||
// This is a way to execute runtime commands asynchronously (aka multitasking) with grbl's g-code
|
||||
// This is a way to execute realtime commands asynchronously (aka multitasking) with grbl's g-code
|
||||
// parsing and planning functions. This function also serves as an interface for the interrupts to
|
||||
// set the system runtime flags, where only the main program handles them, removing the need to
|
||||
// set the system realtime flags, where only the main program handles them, removing the need to
|
||||
// define more computationally-expensive volatile variables. This also provides a controlled way to
|
||||
// execute certain tasks without having two or more instances of the same task, such as the planner
|
||||
// recalculating the buffer upon a feedhold or override.
|
||||
// NOTE: The sys.execute variable flags are set by any process, step or serial interrupts, pinouts,
|
||||
// NOTE: The sys.rt_exec_state variable flags are set by any process, step or serial interrupts, pinouts,
|
||||
// limit switches, or the main program.
|
||||
void protocol_execute_runtime()
|
||||
void protocol_execute_realtime()
|
||||
{
|
||||
uint8_t rt_exec = sys.execute; // Copy to avoid calling volatile multiple times
|
||||
uint8_t rt_exec; // Temp variable to avoid calling volatile multiple times.
|
||||
|
||||
// Check and execute alarms.
|
||||
rt_exec = sys.rt_exec_alarm; // Copy volatile sys.rt_exec_alarm.
|
||||
if (rt_exec) { // Enter only if any bit flag is true
|
||||
|
||||
// System alarm. Everything has shutdown by something that has gone severely wrong. Report
|
||||
// the source of the error to the user. If critical, Grbl disables by entering an infinite
|
||||
// loop until system reset/abort.
|
||||
if (rt_exec & (EXEC_ALARM | EXEC_CRIT_EVENT)) {
|
||||
sys.state = STATE_ALARM; // Set system alarm state
|
||||
|
||||
// Critical events. Hard/soft limit events identified by both critical event and alarm exec
|
||||
// flags. Probe fail is identified by the critical event exec flag only.
|
||||
if (rt_exec & EXEC_CRIT_EVENT) {
|
||||
if (rt_exec & EXEC_ALARM) { report_alarm_message(ALARM_LIMIT_ERROR); }
|
||||
else { report_alarm_message(ALARM_PROBE_FAIL); }
|
||||
report_feedback_message(MESSAGE_CRITICAL_EVENT);
|
||||
bit_false_atomic(sys.execute,EXEC_RESET); // Disable any existing reset
|
||||
do {
|
||||
// Nothing. Block EVERYTHING until user issues reset or power cycles. Hard limits
|
||||
// typically occur while unattended or not paying attention. Gives the user time
|
||||
// to do what is needed before resetting, like killing the incoming stream. The
|
||||
// same could be said about soft limits. While the position is not lost, the incoming
|
||||
// stream could be still engaged and cause a serious crash if it continues afterwards.
|
||||
} while (bit_isfalse(sys.execute,EXEC_RESET));
|
||||
|
||||
// Standard alarm event. Only abort during motion qualifies.
|
||||
} else {
|
||||
// Runtime abort command issued during a cycle, feed hold, or homing cycle. Message the
|
||||
// user that position may have been lost and set alarm state to enable the alarm lockout
|
||||
// to indicate the possible severity of the problem.
|
||||
report_alarm_message(ALARM_ABORT_CYCLE);
|
||||
}
|
||||
bit_false_atomic(sys.execute,(EXEC_ALARM | EXEC_CRIT_EVENT));
|
||||
}
|
||||
sys.state = STATE_ALARM; // Set system alarm state
|
||||
if (rt_exec & EXEC_ALARM_HARD_LIMIT) {
|
||||
report_alarm_message(ALARM_HARD_LIMIT_ERROR);
|
||||
} else if (rt_exec & EXEC_ALARM_SOFT_LIMIT) {
|
||||
report_alarm_message(ALARM_SOFT_LIMIT_ERROR);
|
||||
} else if (rt_exec & EXEC_ALARM_ABORT_CYCLE) {
|
||||
report_alarm_message(ALARM_ABORT_CYCLE);
|
||||
} else if (rt_exec & EXEC_ALARM_PROBE_FAIL) {
|
||||
report_alarm_message(ALARM_PROBE_FAIL);
|
||||
}
|
||||
// Halt everything upon a critical event flag. Currently hard and soft limits flag this.
|
||||
if (rt_exec & EXEC_CRITICAL_EVENT) {
|
||||
report_feedback_message(MESSAGE_CRITICAL_EVENT);
|
||||
bit_false_atomic(sys.rt_exec_state,EXEC_RESET); // Disable any existing reset
|
||||
do {
|
||||
// Nothing. Block EVERYTHING until user issues reset or power cycles. Hard limits
|
||||
// typically occur while unattended or not paying attention. Gives the user time
|
||||
// to do what is needed before resetting, like killing the incoming stream. The
|
||||
// same could be said about soft limits. While the position is not lost, the incoming
|
||||
// stream could be still engaged and cause a serious crash if it continues afterwards.
|
||||
} while (bit_isfalse(sys.rt_exec_state,EXEC_RESET));
|
||||
}
|
||||
bit_false_atomic(sys.rt_exec_alarm,0xFF); // Clear all alarm flags
|
||||
}
|
||||
|
||||
// Check amd execute realtime commands
|
||||
rt_exec = sys.rt_exec_state; // Copy volatile sys.rt_exec_state.
|
||||
if (rt_exec) { // Enter only if any bit flag is true
|
||||
// Execute system abort.
|
||||
if (rt_exec & EXEC_RESET) {
|
||||
sys.abort = true; // Only place this is set true.
|
||||
@ -225,7 +227,7 @@ void protocol_execute_runtime()
|
||||
// Execute and serial print status
|
||||
if (rt_exec & EXEC_STATUS_REPORT) {
|
||||
report_realtime_status();
|
||||
bit_false_atomic(sys.execute,EXEC_STATUS_REPORT);
|
||||
bit_false_atomic(sys.rt_exec_state,EXEC_STATUS_REPORT);
|
||||
}
|
||||
|
||||
// Execute a feed hold with deceleration, only during cycle.
|
||||
@ -238,7 +240,7 @@ void protocol_execute_runtime()
|
||||
st_prep_buffer();
|
||||
sys.auto_start = false; // Disable planner auto start upon feed hold.
|
||||
}
|
||||
bit_false_atomic(sys.execute,EXEC_FEED_HOLD);
|
||||
bit_false_atomic(sys.rt_exec_state,EXEC_FEED_HOLD);
|
||||
}
|
||||
|
||||
// Execute a cycle start by starting the stepper interrupt begin executing the blocks in queue.
|
||||
@ -253,24 +255,23 @@ void protocol_execute_runtime()
|
||||
sys.auto_start = false; // Reset auto start per settings.
|
||||
}
|
||||
}
|
||||
bit_false_atomic(sys.execute,EXEC_CYCLE_START);
|
||||
bit_false_atomic(sys.rt_exec_state,EXEC_CYCLE_START);
|
||||
}
|
||||
|
||||
// Reinitializes the cycle plan and stepper system after a feed hold for a resume. Called by
|
||||
// runtime command execution in the main program, ensuring that the planner re-plans safely.
|
||||
// realtime command execution in the main program, ensuring that the planner re-plans safely.
|
||||
// NOTE: Bresenham algorithm variables are still maintained through both the planner and stepper
|
||||
// cycle reinitializations. The stepper path should continue exactly as if nothing has happened.
|
||||
// NOTE: EXEC_CYCLE_STOP is set by the stepper subsystem when a cycle or feed hold completes.
|
||||
if (rt_exec & EXEC_CYCLE_STOP) {
|
||||
if ( plan_get_current_block() ) { sys.state = STATE_QUEUED; }
|
||||
else { sys.state = STATE_IDLE; }
|
||||
bit_false_atomic(sys.execute,EXEC_CYCLE_STOP);
|
||||
bit_false_atomic(sys.rt_exec_state,EXEC_CYCLE_STOP);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Overrides flag byte (sys.override) and execution should be installed here, since they
|
||||
// are runtime and require a direct and controlled interface to the main stepper program.
|
||||
// are realtime and require a direct and controlled interface to the main stepper program.
|
||||
|
||||
// Reload step segment buffer
|
||||
if (sys.state & (STATE_CYCLE | STATE_HOLD | STATE_HOMING)) { st_prep_buffer(); }
|
||||
@ -287,7 +288,7 @@ void protocol_buffer_synchronize()
|
||||
// Check and set auto start to resume cycle after synchronize and caller completes.
|
||||
if (sys.state == STATE_CYCLE) { sys.auto_start = true; }
|
||||
while (plan_get_current_block() || (sys.state == STATE_CYCLE)) {
|
||||
protocol_execute_runtime(); // Check and execute run-time commands
|
||||
protocol_execute_realtime(); // Check and execute run-time commands
|
||||
if (sys.abort) { return; } // Check for system abort
|
||||
}
|
||||
}
|
||||
@ -303,4 +304,4 @@ void protocol_buffer_synchronize()
|
||||
// NOTE: This function is called from the main loop and mc_line() only and executes when one of
|
||||
// two conditions exist respectively: There are no more blocks sent (i.e. streaming is finished,
|
||||
// single commands), or the planner buffer is full and ready to go.
|
||||
void protocol_auto_cycle_start() { if (sys.auto_start) { bit_true_atomic(sys.execute, EXEC_CYCLE_START); } }
|
||||
void protocol_auto_cycle_start() { if (sys.auto_start) { bit_true_atomic(sys.rt_exec_state, EXEC_CYCLE_START); } }
|
||||
|
Reference in New Issue
Block a user