/* system.h - Header for system level commands and real-time processes Part of Grbl Copyright (c) 2014-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 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 . */ #ifndef system_h #define system_h #include "grbl.h" // 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. // NOTE: The system executor uses an unsigned 8-bit volatile variable (8 flag limit.) The default // 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. #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 #define EXEC_SAFETY_DOOR bit(5) // bitmask 00100000 #define EXEC_MOTION_CANCEL bit(6) // bitmask 01000000 // 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:) #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 #define EXEC_ALARM_HOMING_FAIL bit(5) // bitmask 00100000 // 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. #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 flags. Used in various ways to manage suspend states and procedures. #define SUSPEND_DISABLE 0 // Must be zero. #define SUSPEND_HOLD_COMPLETE bit(0) // Indicates initial feed hold is complete. #define SUSPEND_RESTART_RETRACT bit(1) // Flag to indicate a retract from a restore parking motion. #define SUSPEND_RETRACT_COMPLETE bit(2) // (Safety door only) Indicates retraction and de-energizing is complete. #define SUSPEND_INITIATE_RESTORE bit(3) // (Safety door only) Flag to initiate resume procedures from a cycle start. #define SUSPEND_RESTORE_COMPLETE bit(4) // (Safety door only) Indicates ready to resume normal operation. #define SUSPEND_SAFETY_DOOR_AJAR bit(5) // Indicates suspend was initiated by a safety door state. #define SUSPEND_MOTION_CANCEL bit(6) // Indicates a canceled resume motion. Currently used by probing routine. // Define step segment generator state flags. #define STEP_CONTROL_NORMAL_OP 0 // #define STEP_CONTROL_RECOMPUTE_ACTIVE_BLOCK bit(0) #define STEP_CONTROL_END_MOTION bit(1) #define STEP_CONTROL_EXECUTE_HOLD bit(2) #define STEP_CONTROL_EXECUTE_PARK bit(3) // Define control pin index for Grbl internal use. Pin maps may change, but these values don't. #ifdef ENABLE_SAFETY_DOOR_INPUT_PIN #define N_CONTROL_PIN 4 #define CONTROL_PIN_INDEX_SAFETY_DOOR bit(0) #define CONTROL_PIN_INDEX_RESET bit(1) #define CONTROL_PIN_INDEX_FEED_HOLD bit(2) #define CONTROL_PIN_INDEX_CYCLE_START bit(3) #else #define N_CONTROL_PIN 3 #define CONTROL_PIN_INDEX_RESET bit(0) #define CONTROL_PIN_INDEX_FEED_HOLD bit(1) #define CONTROL_PIN_INDEX_CYCLE_START bit(2) #endif // 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. uint8_t suspend; // System suspend bitflag variable that manages holds, cancels, and safety door. uint8_t soft_limit; // Tracks soft limit errors for the state machine (Boolean) uint8_t step_control; 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. int32_t probe_position[N_AXIS]; // Last probe position in machine coordinates and steps. uint8_t probe_succeeded; // Tracks if last probing cycle was successful. uint8_t homing_axis_lock; // Locks axes when limits engage. Used as an axis motion mask in the stepper ISR. } system_t; extern system_t sys; volatile uint8_t sys_probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR. volatile uint8_t sys_rt_exec_state; // Global realtime executor bitflag variable for state management. See EXEC bitmasks. volatile uint8_t sys_rt_exec_alarm; // Global realtime executor bitflag variable for setting various alarms. // Initialize the serial protocol void system_init(); // Returns bitfield of control pin states, organized by CONTROL_PIN_INDEX. (1=triggered, 0=not triggered). uint8_t system_control_get_state(); // Returns if safety door is open or closed, based on pin state. uint8_t system_check_safety_door_ajar(); // 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); // 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); // Special handlers for setting and clearing Grbl's real-time execution flags. void system_set_exec_state_flag(uint8_t mask); void system_clear_exec_state_flag(uint8_t mask); void system_set_exec_alarm_flag(uint8_t mask); void system_clear_exec_alarm_flag(uint8_t mask); #endif