Sergey Pastor / grbl1
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers system.h Source File

system.h

00001 /*
00002   system.h - Header for system level commands and real-time processes
00003   Part of Grbl
00004 
00005   Copyright (c) 2014-2016 Sungeun K. Jeon for Gnea Research LLC
00006 
00007   Grbl is free software: you can redistribute it and/or modify
00008   it under the terms of the GNU General Public License as published by
00009   the Free Software Foundation, either version 3 of the License, or
00010   (at your option) any later version.
00011 
00012   Grbl is distributed in the hope that it will be useful,
00013   but WITHOUT ANY WARRANTY; without even the implied warranty of
00014   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015   GNU General Public License for more details.
00016 
00017   You should have received a copy of the GNU General Public License
00018   along with Grbl.  If not, see <http://www.gnu.org/licenses/>.
00019 */
00020 
00021 #ifndef system_h
00022 #define system_h
00023 
00024 #include "grbl.h"
00025 
00026 // Define system executor bit map. Used internally by realtime protocol as realtime command flags,
00027 // which notifies the main program to execute the specified realtime command asynchronously.
00028 // NOTE: The system executor uses an unsigned 8-bit volatile variable (8 flag limit.) The default
00029 // flags are always false, so the realtime protocol only needs to check for a non-zero value to
00030 // know when there is a realtime command to execute.
00031 #define EXEC_STATUS_REPORT  bit(0) // bitmask 00000001
00032 #define EXEC_CYCLE_START    bit(1) // bitmask 00000010
00033 #define EXEC_CYCLE_STOP     bit(2) // bitmask 00000100
00034 #define EXEC_FEED_HOLD      bit(3) // bitmask 00001000
00035 #define EXEC_RESET          bit(4) // bitmask 00010000
00036 #define EXEC_SAFETY_DOOR    bit(5) // bitmask 00100000
00037 #define EXEC_MOTION_CANCEL  bit(6) // bitmask 01000000
00038 #define EXEC_SLEEP          bit(7) // bitmask 10000000
00039 
00040 // Alarm executor codes. Valid values (1-255). Zero is reserved.
00041 #define EXEC_ALARM_HARD_LIMIT           1
00042 #define EXEC_ALARM_SOFT_LIMIT           2
00043 #define EXEC_ALARM_ABORT_CYCLE          3
00044 #define EXEC_ALARM_PROBE_FAIL_INITIAL   4
00045 #define EXEC_ALARM_PROBE_FAIL_CONTACT   5
00046 #define EXEC_ALARM_HOMING_FAIL_RESET    6
00047 #define EXEC_ALARM_HOMING_FAIL_DOOR     7
00048 #define EXEC_ALARM_HOMING_FAIL_PULLOFF  8
00049 #define EXEC_ALARM_HOMING_FAIL_APPROACH 9
00050 
00051 // Override bit maps. Realtime bitflags to control feed, rapid, spindle, and coolant overrides.
00052 // Spindle/coolant and feed/rapids are separated into two controlling flag variables.
00053 #define EXEC_FEED_OVR_RESET         bit(0)
00054 #define EXEC_FEED_OVR_COARSE_PLUS   bit(1)
00055 #define EXEC_FEED_OVR_COARSE_MINUS  bit(2)
00056 #define EXEC_FEED_OVR_FINE_PLUS     bit(3)
00057 #define EXEC_FEED_OVR_FINE_MINUS    bit(4)
00058 #define EXEC_RAPID_OVR_RESET        bit(5)
00059 #define EXEC_RAPID_OVR_MEDIUM       bit(6)
00060 #define EXEC_RAPID_OVR_LOW          bit(7)
00061 // #define EXEC_RAPID_OVR_EXTRA_LOW   bit(*) // *NOT SUPPORTED*
00062 
00063 #define EXEC_SPINDLE_OVR_RESET         bit(0)
00064 #define EXEC_SPINDLE_OVR_COARSE_PLUS   bit(1)
00065 #define EXEC_SPINDLE_OVR_COARSE_MINUS  bit(2)
00066 #define EXEC_SPINDLE_OVR_FINE_PLUS     bit(3)
00067 #define EXEC_SPINDLE_OVR_FINE_MINUS    bit(4)
00068 #define EXEC_SPINDLE_OVR_STOP          bit(5)
00069 #define EXEC_COOLANT_FLOOD_OVR_TOGGLE  bit(6)
00070 #define EXEC_COOLANT_MIST_OVR_TOGGLE   bit(7)
00071 
00072 // Define system state bit map. The state variable primarily tracks the individual functions
00073 // of Grbl to manage each without overlapping. It is also used as a messaging flag for
00074 // critical events.
00075 #define STATE_IDLE          0      // Must be zero. No flags.
00076 #define STATE_ALARM         bit(0) // In alarm state. Locks out all g-code processes. Allows settings access.
00077 #define STATE_CHECK_MODE    bit(1) // G-code check mode. Locks out planner and motion only.
00078 #define STATE_HOMING        bit(2) // Performing homing cycle
00079 #define STATE_CYCLE         bit(3) // Cycle is running or motions are being executed.
00080 #define STATE_HOLD          bit(4) // Active feed hold
00081 #define STATE_JOG           bit(5) // Jogging mode.
00082 #define STATE_SAFETY_DOOR   bit(6) // Safety door is ajar. Feed holds and de-energizes system.
00083 #define STATE_SLEEP         bit(7) // Sleep state.
00084 
00085 // Define system suspend flags. Used in various ways to manage suspend states and procedures.
00086 #define SUSPEND_DISABLE           0      // Must be zero.
00087 #define SUSPEND_HOLD_COMPLETE     bit(0) // Indicates initial feed hold is complete.
00088 #define SUSPEND_RESTART_RETRACT   bit(1) // Flag to indicate a retract from a restore parking motion.
00089 #define SUSPEND_RETRACT_COMPLETE  bit(2) // (Safety door only) Indicates retraction and de-energizing is complete.
00090 #define SUSPEND_INITIATE_RESTORE  bit(3) // (Safety door only) Flag to initiate resume procedures from a cycle start.
00091 #define SUSPEND_RESTORE_COMPLETE  bit(4) // (Safety door only) Indicates ready to resume normal operation.
00092 #define SUSPEND_SAFETY_DOOR_AJAR  bit(5) // Tracks safety door state for resuming.
00093 #define SUSPEND_MOTION_CANCEL     bit(6) // Indicates a canceled resume motion. Currently used by probing routine.
00094 #define SUSPEND_JOG_CANCEL        bit(7) // Indicates a jog cancel in process and to reset buffers when complete.
00095 
00096 // Define step segment generator state flags.
00097 #define STEP_CONTROL_NORMAL_OP            0  // Must be zero.
00098 #define STEP_CONTROL_END_MOTION           bit(0)
00099 #define STEP_CONTROL_EXECUTE_HOLD         bit(1)
00100 #define STEP_CONTROL_EXECUTE_SYS_MOTION   bit(2)
00101 #define STEP_CONTROL_UPDATE_SPINDLE_PWM   bit(3)
00102 
00103 // Define control pin index for Grbl internal use. Pin maps may change, but these values don't.
00104 #ifdef ENABLE_SAFETY_DOOR_INPUT_PIN
00105   #define N_CONTROL_PIN 4
00106   #define CONTROL_PIN_INDEX_SAFETY_DOOR   bit(0)
00107   #define CONTROL_PIN_INDEX_RESET         bit(1)
00108   #define CONTROL_PIN_INDEX_FEED_HOLD     bit(2)
00109   #define CONTROL_PIN_INDEX_CYCLE_START   bit(3)
00110 #else
00111   #define N_CONTROL_PIN 3
00112   #define CONTROL_PIN_INDEX_RESET         bit(0)
00113   #define CONTROL_PIN_INDEX_FEED_HOLD     bit(1)
00114   #define CONTROL_PIN_INDEX_CYCLE_START   bit(2)
00115 #endif
00116 
00117 // Define spindle stop override control states.
00118 #define SPINDLE_STOP_OVR_DISABLED       0  // Must be zero.
00119 #define SPINDLE_STOP_OVR_ENABLED        bit(0)
00120 #define SPINDLE_STOP_OVR_INITIATE       bit(1)
00121 #define SPINDLE_STOP_OVR_RESTORE        bit(2)
00122 #define SPINDLE_STOP_OVR_RESTORE_CYCLE  bit(3)
00123 
00124 
00125 // Define global system variables
00126 typedef struct {
00127   uint8_t state;               // Tracks the current system state of Grbl.
00128   uint8_t abort;               // System abort flag. Forces exit back to main loop for reset.             
00129   uint8_t suspend;             // System suspend bitflag variable that manages holds, cancels, and safety door.
00130   uint8_t soft_limit;          // Tracks soft limit errors for the state machine. (boolean)
00131   uint8_t step_control;        // Governs the step segment generator depending on system state.
00132   uint8_t probe_succeeded;     // Tracks if last probing cycle was successful.
00133   uint8_t homing_axis_lock;    // Locks axes when limits engage. Used as an axis motion mask in the stepper ISR.
00134   uint8_t f_override;          // Feed rate override value in percent
00135   uint8_t r_override;          // Rapids override value in percent
00136   uint8_t spindle_speed_ovr;   // Spindle speed value in percent
00137   uint8_t spindle_stop_ovr;    // Tracks spindle stop override states
00138   uint8_t report_ovr_counter;  // Tracks when to add override data to status reports.
00139   uint8_t report_wco_counter;  // Tracks when to add work coordinate offset data to status reports.
00140     #ifdef ENABLE_PARKING_OVERRIDE_CONTROL
00141         uint8_t override_ctrl;     // Tracks override control states.
00142     #endif
00143     #ifdef VARIABLE_SPINDLE
00144     float spindle_speed;
00145   #endif
00146 } system_t;
00147 extern system_t sys;
00148 
00149 // NOTE: These position variables may need to be declared as volatiles, if problems arise.
00150 extern int32_t sys_position[N_AXIS];      // Real-time machine (aka home) position vector in steps.
00151 extern int32_t sys_probe_position[N_AXIS]; // Last probe position in machine coordinates and steps.
00152 
00153 extern volatile uint8_t sys_probe_state;   // Probing state value.  Used to coordinate the probing cycle with stepper ISR.
00154 extern volatile uint8_t sys_rt_exec_state;   // Global realtime executor bitflag variable for state management. See EXEC bitmasks.
00155 extern volatile uint8_t sys_rt_exec_alarm;   // Global realtime executor bitflag variable for setting various alarms.
00156 extern volatile uint8_t sys_rt_exec_motion_override; // Global realtime executor bitflag variable for motion-based overrides.
00157 extern volatile uint8_t sys_rt_exec_accessory_override; // Global realtime executor bitflag variable for spindle/coolant overrides.
00158 
00159 #ifdef DEBUG
00160   #define EXEC_DEBUG_REPORT  bit(0)
00161     extern volatile uint8_t sys_rt_exec_debug;
00162 #endif
00163 
00164 // Initialize the serial protocol
00165 void system_init();
00166 
00167 // Returns bitfield of control pin states, organized by CONTROL_PIN_INDEX. (1=triggered, 0=not triggered).
00168 uint8_t system_control_get_state();
00169 
00170 // Returns if safety door is open or closed, based on pin state.
00171 uint8_t system_check_safety_door_ajar();
00172 
00173 // Executes an internal system command, defined as a string starting with a '$'
00174 uint8_t system_execute_line(char *line);
00175 
00176 // Execute the startup script lines stored in EEPROM upon initialization
00177 void system_execute_startup(char *line);
00178 
00179 
00180 void system_flag_wco_change();
00181 
00182 // Returns machine position of axis 'idx'. Must be sent a 'step' array.
00183 float system_convert_axis_steps_to_mpos(int32_t *steps, uint8_t idx);
00184 
00185 // Updates a machine 'position' array based on the 'step' array sent.
00186 void system_convert_array_steps_to_mpos(float *position, int32_t *steps);
00187 
00188 // CoreXY calculation only. Returns x or y-axis "steps" based on CoreXY motor steps.
00189 #ifdef COREXY
00190   int32_t system_convert_corexy_to_x_axis_steps(int32_t *steps);
00191   int32_t system_convert_corexy_to_y_axis_steps(int32_t *steps);
00192 #endif
00193 
00194 // Checks and reports if target array exceeds machine travel limits.
00195 uint8_t system_check_travel_limits(float *target);
00196 
00197 // Special handlers for setting and clearing Grbl's real-time execution flags.
00198 void system_set_exec_state_flag(uint8_t mask);
00199 void system_clear_exec_state_flag(uint8_t mask);
00200 void system_set_exec_alarm(uint8_t code);
00201 void system_clear_exec_alarm();
00202 void system_set_exec_motion_override_flag(uint8_t mask);
00203 void system_set_exec_accessory_override_flag(uint8_t mask);
00204 void system_clear_exec_motion_overrides();
00205 void system_clear_exec_accessory_overrides();
00206 
00207 
00208 #endif