Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
gcode.h
00001 /* 00002 gcode.h - rs274/ngc parser. 00003 Part of Grbl 00004 00005 Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC 00006 Copyright (c) 2009-2011 Simen Svale Skogsrud 00007 00008 Grbl is free software: you can redistribute it and/or modify 00009 it under the terms of the GNU General Public License as published by 00010 the Free Software Foundation, either version 3 of the License, or 00011 (at your option) any later version. 00012 00013 Grbl is distributed in the hope that it will be useful, 00014 but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 GNU General Public License for more details. 00017 00018 You should have received a copy of the GNU General Public License 00019 along with Grbl. If not, see <http://www.gnu.org/licenses/>. 00020 */ 00021 00022 #ifndef gcode_h 00023 #define gcode_h 00024 00025 00026 // Define modal group internal numbers for checking multiple command violations and tracking the 00027 // type of command that is called in the block. A modal group is a group of g-code commands that are 00028 // mutually exclusive, or cannot exist on the same line, because they each toggle a state or execute 00029 // a unique motion. These are defined in the NIST RS274-NGC v3 g-code standard, available online, 00030 // and are similar/identical to other g-code interpreters by manufacturers (Haas,Fanuc,Mazak,etc). 00031 // NOTE: Modal group define values must be sequential and starting from zero. 00032 #define MODAL_GROUP_G0 0 // [G4,G10,G28,G28.1,G30,G30.1,G53,G92,G92.1] Non-modal 00033 #define MODAL_GROUP_G1 1 // [G0,G1,G2,G3,G38.2,G38.3,G38.4,G38.5,G80] Motion 00034 #define MODAL_GROUP_G2 2 // [G17,G18,G19] Plane selection 00035 #define MODAL_GROUP_G3 3 // [G90,G91] Distance mode 00036 #define MODAL_GROUP_G4 4 // [G91.1] Arc IJK distance mode 00037 #define MODAL_GROUP_G5 5 // [G93,G94] Feed rate mode 00038 #define MODAL_GROUP_G6 6 // [G20,G21] Units 00039 #define MODAL_GROUP_G7 7 // [G40] Cutter radius compensation mode. G41/42 NOT SUPPORTED. 00040 #define MODAL_GROUP_G8 8 // [G43.1,G49] Tool length offset 00041 #define MODAL_GROUP_G12 9 // [G54,G55,G56,G57,G58,G59] Coordinate system selection 00042 #define MODAL_GROUP_G13 10 // [G61] Control mode 00043 00044 #define MODAL_GROUP_M4 11 // [M0,M1,M2,M30] Stopping 00045 #define MODAL_GROUP_M7 12 // [M3,M4,M5] Spindle turning 00046 #define MODAL_GROUP_M8 13 // [M7,M8,M9] Coolant control 00047 #define MODAL_GROUP_M9 14 // [M56] Override control 00048 00049 // Define command actions for within execution-type modal groups (motion, stopping, non-modal). Used 00050 // internally by the parser to know which command to execute. 00051 // NOTE: Some macro values are assigned specific values to make g-code state reporting and parsing 00052 // compile a litte smaller. Necessary due to being completely out of flash on the 328p. Although not 00053 // ideal, just be careful with values that state 'do not alter' and check both report.c and gcode.c 00054 // to see how they are used, if you need to alter them. 00055 00056 // Modal Group G0: Non-modal actions 00057 #define NON_MODAL_NO_ACTION 0 // (Default: Must be zero) 00058 #define NON_MODAL_DWELL 4 // G4 (Do not alter value) 00059 #define NON_MODAL_SET_COORDINATE_DATA 10 // G10 (Do not alter value) 00060 #define NON_MODAL_GO_HOME_0 28 // G28 (Do not alter value) 00061 #define NON_MODAL_SET_HOME_0 38 // G28.1 (Do not alter value) 00062 #define NON_MODAL_GO_HOME_1 30 // G30 (Do not alter value) 00063 #define NON_MODAL_SET_HOME_1 40 // G30.1 (Do not alter value) 00064 #define NON_MODAL_ABSOLUTE_OVERRIDE 53 // G53 (Do not alter value) 00065 #define NON_MODAL_SET_COORDINATE_OFFSET 92 // G92 (Do not alter value) 00066 #define NON_MODAL_RESET_COORDINATE_OFFSET 102 //G92.1 (Do not alter value) 00067 00068 // Modal Group G1: Motion modes 00069 #define MOTION_MODE_SEEK 0 // G0 (Default: Must be zero) 00070 #define MOTION_MODE_LINEAR 1 // G1 (Do not alter value) 00071 #define MOTION_MODE_CW_ARC 2 // G2 (Do not alter value) 00072 #define MOTION_MODE_CCW_ARC 3 // G3 (Do not alter value) 00073 #define MOTION_MODE_PROBE_TOWARD 140 // G38.2 (Do not alter value) 00074 #define MOTION_MODE_PROBE_TOWARD_NO_ERROR 141 // G38.3 (Do not alter value) 00075 #define MOTION_MODE_PROBE_AWAY 142 // G38.4 (Do not alter value) 00076 #define MOTION_MODE_PROBE_AWAY_NO_ERROR 143 // G38.5 (Do not alter value) 00077 #define MOTION_MODE_NONE 80 // G80 (Do not alter value) 00078 00079 // Modal Group G2: Plane select 00080 #define PLANE_SELECT_XY 0 // G17 (Default: Must be zero) 00081 #define PLANE_SELECT_ZX 1 // G18 (Do not alter value) 00082 #define PLANE_SELECT_YZ 2 // G19 (Do not alter value) 00083 00084 // Modal Group G3: Distance mode 00085 #define DISTANCE_MODE_ABSOLUTE 0 // G90 (Default: Must be zero) 00086 #define DISTANCE_MODE_INCREMENTAL 1 // G91 (Do not alter value) 00087 00088 // Modal Group G4: Arc IJK distance mode 00089 #define DISTANCE_ARC_MODE_INCREMENTAL 0 // G91.1 (Default: Must be zero) 00090 00091 // Modal Group M4: Program flow 00092 #define PROGRAM_FLOW_RUNNING 0 // (Default: Must be zero) 00093 #define PROGRAM_FLOW_PAUSED 3 // M0 00094 #define PROGRAM_FLOW_OPTIONAL_STOP 1 // M1 NOTE: Not supported, but valid and ignored. 00095 #define PROGRAM_FLOW_COMPLETED_M2 2 // M2 (Do not alter value) 00096 #define PROGRAM_FLOW_COMPLETED_M30 30 // M30 (Do not alter value) 00097 00098 // Modal Group G5: Feed rate mode 00099 #define FEED_RATE_MODE_UNITS_PER_MIN 0 // G94 (Default: Must be zero) 00100 #define FEED_RATE_MODE_INVERSE_TIME 1 // G93 (Do not alter value) 00101 00102 // Modal Group G6: Units mode 00103 #define UNITS_MODE_MM 0 // G21 (Default: Must be zero) 00104 #define UNITS_MODE_INCHES 1 // G20 (Do not alter value) 00105 00106 // Modal Group G7: Cutter radius compensation mode 00107 #define CUTTER_COMP_DISABLE 0 // G40 (Default: Must be zero) 00108 00109 // Modal Group G13: Control mode 00110 #define CONTROL_MODE_EXACT_PATH 0 // G61 (Default: Must be zero) 00111 00112 // Modal Group M7: Spindle control 00113 #define SPINDLE_DISABLE 0 // M5 (Default: Must be zero) 00114 #define SPINDLE_ENABLE_CW PL_COND_FLAG_SPINDLE_CW // M3 (NOTE: Uses planner condition bit flag) 00115 #define SPINDLE_ENABLE_CCW PL_COND_FLAG_SPINDLE_CCW // M4 (NOTE: Uses planner condition bit flag) 00116 00117 // Modal Group M8: Coolant control 00118 #define COOLANT_DISABLE 0 // M9 (Default: Must be zero) 00119 #define COOLANT_FLOOD_ENABLE PL_COND_FLAG_COOLANT_FLOOD // M8 (NOTE: Uses planner condition bit flag) 00120 #define COOLANT_MIST_ENABLE PL_COND_FLAG_COOLANT_MIST // M7 (NOTE: Uses planner condition bit flag) 00121 00122 // Modal Group G8: Tool length offset 00123 #define TOOL_LENGTH_OFFSET_CANCEL 0 // G49 (Default: Must be zero) 00124 #define TOOL_LENGTH_OFFSET_ENABLE_DYNAMIC 1 // G43.1 00125 00126 // Modal Group M9: Override control 00127 #ifdef DEACTIVATE_PARKING_UPON_INIT 00128 #define OVERRIDE_DISABLED 0 // (Default: Must be zero) 00129 #define OVERRIDE_PARKING_MOTION 1 // M56 00130 #else 00131 #define OVERRIDE_PARKING_MOTION 0 // M56 (Default: Must be zero) 00132 #define OVERRIDE_DISABLED 1 // Parking disabled. 00133 #endif 00134 00135 // Modal Group G12: Active work coordinate system 00136 // N/A: Stores coordinate system value (54-59) to change to. 00137 00138 // Define parameter word mapping. 00139 #define WORD_F 0 00140 #define WORD_I 1 00141 #define WORD_J 2 00142 #define WORD_K 3 00143 #define WORD_L 4 00144 #define WORD_N 5 00145 #define WORD_P 6 00146 #define WORD_R 7 00147 #define WORD_S 8 00148 #define WORD_T 9 00149 #define WORD_X 10 00150 #define WORD_Y 11 00151 #define WORD_Z 12 00152 00153 // Define g-code parser position updating flags 00154 #define GC_UPDATE_POS_TARGET 0 // Must be zero 00155 #define GC_UPDATE_POS_SYSTEM 1 00156 #define GC_UPDATE_POS_NONE 2 00157 00158 // Define probe cycle exit states and assign proper position updating. 00159 #define GC_PROBE_FOUND GC_UPDATE_POS_SYSTEM 00160 #define GC_PROBE_ABORT GC_UPDATE_POS_NONE 00161 #define GC_PROBE_FAIL_INIT GC_UPDATE_POS_NONE 00162 #define GC_PROBE_FAIL_END GC_UPDATE_POS_TARGET 00163 #ifdef SET_CHECK_MODE_PROBE_TO_START 00164 #define GC_PROBE_CHECK_MODE GC_UPDATE_POS_NONE 00165 #else 00166 #define GC_PROBE_CHECK_MODE GC_UPDATE_POS_TARGET 00167 #endif 00168 00169 // Define gcode parser flags for handling special cases. 00170 #define GC_PARSER_NONE 0 // Must be zero. 00171 #define GC_PARSER_JOG_MOTION bit(0) 00172 #define GC_PARSER_CHECK_MANTISSA bit(1) 00173 #define GC_PARSER_ARC_IS_CLOCKWISE bit(2) 00174 #define GC_PARSER_PROBE_IS_AWAY bit(3) 00175 #define GC_PARSER_PROBE_IS_NO_ERROR bit(4) 00176 #define GC_PARSER_LASER_FORCE_SYNC bit(5) 00177 #define GC_PARSER_LASER_DISABLE bit(6) 00178 #define GC_PARSER_LASER_ISMOTION bit(7) 00179 00180 00181 // NOTE: When this struct is zeroed, the above defines set the defaults for the system. 00182 typedef struct { 00183 uint8_t motion; // {G0,G1,G2,G3,G38.2,G80} 00184 uint8_t feed_rate; // {G93,G94} 00185 uint8_t units; // {G20,G21} 00186 uint8_t distance; // {G90,G91} 00187 // uint8_t distance_arc; // {G91.1} NOTE: Don't track. Only default supported. 00188 uint8_t plane_select; // {G17,G18,G19} 00189 // uint8_t cutter_comp; // {G40} NOTE: Don't track. Only default supported. 00190 uint8_t tool_length; // {G43.1,G49} 00191 uint8_t coord_select; // {G54,G55,G56,G57,G58,G59} 00192 // uint8_t control; // {G61} NOTE: Don't track. Only default supported. 00193 uint8_t program_flow; // {M0,M1,M2,M30} 00194 uint8_t coolant; // {M7,M8,M9} 00195 uint8_t spindle; // {M3,M4,M5} 00196 uint8_t override; // {M56} 00197 } gc_modal_t; 00198 00199 typedef struct { 00200 float f; // Feed 00201 float ijk[3]; // I,J,K Axis arc offsets 00202 uint8_t l; // G10 or canned cycles parameters 00203 int32_t n; // Line number 00204 float p; // G10 or dwell parameters 00205 // float q; // G82 peck drilling 00206 float r; // Arc radius 00207 float s; // Spindle speed 00208 uint8_t t; // Tool selection 00209 float xyz[3]; // X,Y,Z Translational axes 00210 } gc_values_t; 00211 00212 00213 typedef struct { 00214 gc_modal_t modal; 00215 00216 float spindle_speed; // RPM 00217 float feed_rate; // Millimeters/min 00218 uint8_t tool; // Tracks tool number. NOT USED. 00219 int32_t line_number; // Last line number sent 00220 00221 float position[N_AXIS]; // Where the interpreter considers the tool to be at this point in the code 00222 00223 float coord_system[N_AXIS]; // Current work coordinate system (G54+). Stores offset from absolute machine 00224 // position in mm. Loaded from EEPROM when called. 00225 float coord_offset[N_AXIS]; // Retains the G92 coordinate offset (work coordinates) relative to 00226 // machine zero in mm. Non-persistent. Cleared upon reset and boot. 00227 float tool_length_offset; // Tracks tool length offset value when enabled. 00228 } parser_state_t; 00229 extern parser_state_t gc_state; 00230 00231 00232 typedef struct { 00233 uint8_t non_modal_command; 00234 gc_modal_t modal; 00235 gc_values_t values; 00236 } parser_block_t; 00237 00238 00239 // Initialize the parser 00240 void gc_init(); 00241 00242 // Execute one block of rs275/ngc/g-code 00243 uint8_t gc_execute_line(char *line); 00244 00245 // Set g-code parser position. Input in steps. 00246 void gc_sync_position(); 00247 00248 #endif
Generated on Tue Jul 12 2022 20:45:31 by
1.7.2