2014-01-11 04:22:10 +01:00
|
|
|
/*
|
|
|
|
system.h - Header for system level commands and real-time processes
|
2015-02-16 01:36:08 +01:00
|
|
|
Part of Grbl
|
2014-01-11 04:22:10 +01:00
|
|
|
|
2015-01-15 06:14:52 +01:00
|
|
|
Copyright (c) 2014-2015 Sungeun K. Jeon
|
2014-01-11 04:22:10 +01:00
|
|
|
|
|
|
|
Grbl 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 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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef system_h
|
|
|
|
#define system_h
|
|
|
|
|
2015-02-10 16:25:09 +01:00
|
|
|
#include "grbl.h"
|
2014-01-11 04:22:10 +01:00
|
|
|
|
2015-01-15 06:14:52 +01:00
|
|
|
// Define system executor bit map. Used internally by realtime protocol as realtime command flags,
|
|
|
|
// which notifies the main program to execute the specified realtime command asynchronously.
|
2014-01-11 04:22:10 +01:00
|
|
|
// NOTE: The system executor uses an unsigned 8-bit volatile variable (8 flag limit.) The default
|
2015-01-15 06:14:52 +01:00
|
|
|
// flags are always false, so the realtime protocol only needs to check for a non-zero value to
|
|
|
|
// know when there is a realtime command to execute.
|
2014-01-11 04:22:10 +01:00
|
|
|
#define EXEC_STATUS_REPORT bit(0) // bitmask 00000001
|
|
|
|
#define EXEC_CYCLE_START bit(1) // bitmask 00000010
|
|
|
|
#define EXEC_CYCLE_STOP bit(2) // bitmask 00000100
|
|
|
|
#define EXEC_FEED_HOLD bit(3) // bitmask 00001000
|
|
|
|
#define EXEC_RESET bit(4) // bitmask 00010000
|
2015-02-12 05:19:00 +01:00
|
|
|
#define EXEC_SAFETY_DOOR bit(5) // bitmask 00100000
|
|
|
|
#define EXEC_MOTION_CANCEL bit(6) // bitmask 01000000
|
2015-01-15 06:14:52 +01:00
|
|
|
|
|
|
|
// Alarm executor bit map.
|
|
|
|
// NOTE: EXEC_CRITICAL_EVENT is an optional flag that must be set with an alarm flag. When enabled,
|
|
|
|
// this halts Grbl into an infinite loop until the user aknowledges the problem and issues a soft-
|
|
|
|
// reset command. For example, a hard limit event needs this type of halt and aknowledgement.
|
|
|
|
#define EXEC_CRITICAL_EVENT bit(0) // bitmask 00000001 (SPECIAL FLAG. See NOTE:)
|
2015-02-13 22:50:07 +01:00
|
|
|
#define EXEC_ALARM_HARD_LIMIT bit(1) // bitmask 00000010
|
|
|
|
#define EXEC_ALARM_SOFT_LIMIT bit(2) // bitmask 00000100
|
|
|
|
#define EXEC_ALARM_ABORT_CYCLE bit(3) // bitmask 00001000
|
|
|
|
#define EXEC_ALARM_PROBE_FAIL bit(4) // bitmask 00010000
|
2015-02-16 01:36:08 +01:00
|
|
|
#define EXEC_ALARM_HOMING_FAIL bit(5) // bitmask 00100000
|
2014-01-11 04:22:10 +01:00
|
|
|
|
|
|
|
// Define system state bit map. The state variable primarily tracks the individual functions
|
|
|
|
// of Grbl to manage each without overlapping. It is also used as a messaging flag for
|
|
|
|
// critical events.
|
2015-02-12 05:19:00 +01:00
|
|
|
#define STATE_IDLE 0 // Must be zero. No flags.
|
|
|
|
#define STATE_ALARM bit(0) // In alarm state. Locks out all g-code processes. Allows settings access.
|
|
|
|
#define STATE_CHECK_MODE bit(1) // G-code check mode. Locks out planner and motion only.
|
|
|
|
#define STATE_HOMING bit(2) // Performing homing cycle
|
|
|
|
#define STATE_CYCLE bit(3) // Cycle is running or motions are being executed.
|
|
|
|
#define STATE_HOLD bit(4) // Active feed hold
|
|
|
|
#define STATE_SAFETY_DOOR bit(5) // Safety door is ajar. Feed holds and de-energizes system.
|
|
|
|
#define STATE_MOTION_CANCEL bit(6) // Motion cancel by feed hold and return to idle.
|
|
|
|
|
|
|
|
// Define system suspend states.
|
|
|
|
#define SUSPEND_DISABLE 0 // Must be zero.
|
|
|
|
#define SUSPEND_ENABLE_HOLD bit(0) // Enabled. Indicates the cycle is active and currently undergoing a hold.
|
|
|
|
#define SUSPEND_ENABLE_READY bit(1) // Ready to resume with a cycle start command.
|
|
|
|
#define SUSPEND_ENERGIZE bit(2) // Re-energizes output before resume.
|
|
|
|
#define SUSPEND_MOTION_CANCEL bit(3) // Cancels resume motion. Used by probing routine.
|
2014-01-11 04:22:10 +01:00
|
|
|
|
2014-02-25 21:19:52 +01:00
|
|
|
|
2014-01-11 04:22:10 +01:00
|
|
|
// Define global system variables
|
|
|
|
typedef struct {
|
|
|
|
uint8_t abort; // System abort flag. Forces exit back to main loop for reset.
|
|
|
|
uint8_t state; // Tracks the current state of Grbl.
|
2015-02-12 05:19:00 +01:00
|
|
|
uint8_t suspend; // System suspend flag. Allows only realtime commands. Used primarily for holds.
|
2015-01-15 06:14:52 +01:00
|
|
|
|
|
|
|
volatile uint8_t rt_exec_state; // Global realtime executor bitflag variable for state management. See EXEC bitmasks.
|
|
|
|
volatile uint8_t rt_exec_alarm; // Global realtime executor bitflag variable for setting various alarms.
|
2014-10-02 04:22:16 +02:00
|
|
|
|
2014-01-11 04:22:10 +01:00
|
|
|
int32_t position[N_AXIS]; // Real-time machine (aka home) position vector in steps.
|
|
|
|
// NOTE: This may need to be a volatile variable, if problems arise.
|
2014-10-02 04:22:16 +02:00
|
|
|
|
|
|
|
uint8_t homing_axis_lock; // Locks axes when limits engage. Used as an axis motion mask in the stepper ISR.
|
G38.2 probe feature rough draft installed. Working but needs testing.
- G38.2 straight probe now supported. Rough draft. May be tweaked more
as testing ramps up.
- G38.2 requires at least one axis word. Multiple axis words work too.
When commanded, the probe cycle will move at the last ‘F’ feed rate
specified in a straight line.
- During a probe cycle: If the probe pin goes low (normal high), Grbl
will record that immediate position and engage a feed hold. Meaning
that the CNC machine will move a little past the probe switch point, so
keep federates low to stop sooner. Once stopped, Grbl will issue a move
to go back to the recorded probe trigger point.
- During a probe cycle: If the probe switch does not engage by the time
the machine has traveled to its target coordinates, Grbl will issue an
ALARM and the user will be forced to reset Grbl. (Currently G38.3 probe
without error isn’t supported, but would be easy to implement later.)
- After a successful probe, Grbl will send a feedback message
containing the recorded probe coordinates in the machine coordinate
system. This is as the g-code standard on probe parameters specifies.
- The recorded probe parameters are retained in Grbl memory and can be
viewed with the ‘$#’ print parameters command. Upon a power-cycle, not
a soft-reset, Grbl will re-zero these values.
- Moved ‘$#’ command to require IDLE or ALARM mode, because it accesses
EEPROM to fetch the coordinate system offsets.
- Updated the Grbl version to v0.9d.
- The probe cycle is subject to change upon testing or user-feedback.
2014-03-01 06:03:26 +01:00
|
|
|
volatile uint8_t probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR.
|
|
|
|
int32_t probe_position[N_AXIS]; // Last probe position in machine coordinates and steps.
|
2014-10-02 04:22:16 +02:00
|
|
|
uint8_t probe_succeeded; // Tracks if last probing cycle was successful.
|
2014-01-11 04:22:10 +01:00
|
|
|
} system_t;
|
|
|
|
extern system_t sys;
|
|
|
|
|
|
|
|
|
|
|
|
// Initialize the serial protocol
|
|
|
|
void system_init();
|
|
|
|
|
2015-02-12 05:19:00 +01:00
|
|
|
// Returns if safety door is open or closed, based on pin state.
|
|
|
|
uint8_t system_check_safety_door_ajar();
|
|
|
|
|
2014-01-11 04:22:10 +01:00
|
|
|
// Executes an internal system command, defined as a string starting with a '$'
|
|
|
|
uint8_t system_execute_line(char *line);
|
|
|
|
|
|
|
|
// Execute the startup script lines stored in EEPROM upon initialization
|
|
|
|
void system_execute_startup(char *line);
|
|
|
|
|
2015-01-15 06:14:52 +01:00
|
|
|
// Returns machine position of axis 'idx'. Must be sent a 'step' array.
|
|
|
|
float system_convert_axis_steps_to_mpos(int32_t *steps, uint8_t idx);
|
|
|
|
|
|
|
|
// Updates a machine 'position' array based on the 'step' array sent.
|
|
|
|
void system_convert_array_steps_to_mpos(float *position, int32_t *steps);
|
|
|
|
|
2014-01-11 04:22:10 +01:00
|
|
|
#endif
|