kopia lustrzana https://github.com/gnea/grbl
				
				
				
			
		
			
				
	
	
		
			145 wiersze
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			145 wiersze
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
/*
 | 
						|
  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 <http://www.gnu.org/licenses/>.
 | 
						|
*/
 | 
						|
 | 
						|
#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
 |