gnea\grbl-Mega  1.0f
Source Code Documentation ( Internal Workings )
settings.c
Go to the documentation of this file.
1 /*
2  settings.c - eeprom configuration handling
3  Part of Grbl
4 
5  Copyright (c) 2011-2016 Sungeun K. Jeon for Gnea Research LLC
6  Copyright (c) 2009-2011 Simen Svale Skogsrud
7 
8  Grbl is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  Grbl is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with Grbl. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "grbl.h"
23 
25 
27 void settings_store_startup_line(uint8_t n, char *line)
28 {
29  #ifdef FORCE_BUFFER_SYNC_DURING_EEPROM_WRITE
31  #endif
32  uint32_t addr = n*(LINE_BUFFER_SIZE+1)+EEPROM_ADDR_STARTUP_BLOCK;
34 }
35 
37 //
39 void settings_store_build_info(char *line)
40 {
41 // Build info can only be stored when state is IDLE.
43 }
44 
46 void settings_write_coord_data(uint8_t coord_select, float *coord_data)
47 {
48  #ifdef FORCE_BUFFER_SYNC_DURING_EEPROM_WRITE
50  #endif
51  uint32_t addr = coord_select*(sizeof(float)*N_AXIS+1) + EEPROM_ADDR_PARAMETERS;
52  memcpy_to_eeprom_with_checksum(addr,(char*)coord_data, sizeof(float)*N_AXIS);
53 }
54 
56 //
59 {
62 }
63 
65 void settings_restore(uint8_t restore_flag) {
66  if (restore_flag & SETTINGS_RESTORE_DEFAULTS) {
67  settings.pulse_microseconds = DEFAULT_STEP_PULSE_MICROSECONDS;
68  settings.stepper_idle_lock_time = DEFAULT_STEPPER_IDLE_LOCK_TIME;
69  settings.step_invert_mask = DEFAULT_STEPPING_INVERT_MASK;
70  settings.dir_invert_mask = DEFAULT_DIRECTION_INVERT_MASK;
71  settings.status_report_mask = DEFAULT_STATUS_REPORT_MASK;
72  settings.junction_deviation = DEFAULT_JUNCTION_DEVIATION;
73  settings.arc_tolerance = DEFAULT_ARC_TOLERANCE;
74 
75  settings.rpm_max = DEFAULT_SPINDLE_RPM_MAX;
76  settings.rpm_min = DEFAULT_SPINDLE_RPM_MIN;
77 
78  settings.homing_dir_mask = DEFAULT_HOMING_DIR_MASK;
79  settings.homing_feed_rate = DEFAULT_HOMING_FEED_RATE;
80  settings.homing_seek_rate = DEFAULT_HOMING_SEEK_RATE;
81  settings.homing_debounce_delay = DEFAULT_HOMING_DEBOUNCE_DELAY;
82  settings.homing_pulloff = DEFAULT_HOMING_PULLOFF;
83 
84  settings.flags = 0;
85  if (DEFAULT_REPORT_INCHES) { settings.flags |= BITFLAG_REPORT_INCHES; }
86  if (DEFAULT_LASER_MODE) { settings.flags |= BITFLAG_LASER_MODE; }
87  if (DEFAULT_INVERT_ST_ENABLE) { settings.flags |= BITFLAG_INVERT_ST_ENABLE; }
88  if (DEFAULT_HARD_LIMIT_ENABLE) { settings.flags |= BITFLAG_HARD_LIMIT_ENABLE; }
89  if (DEFAULT_HOMING_ENABLE) { settings.flags |= BITFLAG_HOMING_ENABLE; }
90  if (DEFAULT_SOFT_LIMIT_ENABLE) { settings.flags |= BITFLAG_SOFT_LIMIT_ENABLE; }
91  if (DEFAULT_INVERT_LIMIT_PINS) { settings.flags |= BITFLAG_INVERT_LIMIT_PINS; }
92  if (DEFAULT_INVERT_PROBE_PIN) { settings.flags |= BITFLAG_INVERT_PROBE_PIN; }
93 
94  settings.steps_per_mm[X_AXIS] = DEFAULT_X_STEPS_PER_MM;
95  settings.steps_per_mm[Y_AXIS] = DEFAULT_Y_STEPS_PER_MM;
96  settings.steps_per_mm[Z_AXIS] = DEFAULT_Z_STEPS_PER_MM;
97  settings.max_rate[X_AXIS] = DEFAULT_X_MAX_RATE;
98  settings.max_rate[Y_AXIS] = DEFAULT_Y_MAX_RATE;
99  settings.max_rate[Z_AXIS] = DEFAULT_Z_MAX_RATE;
100  settings.acceleration[X_AXIS] = DEFAULT_X_ACCELERATION;
101  settings.acceleration[Y_AXIS] = DEFAULT_Y_ACCELERATION;
102  settings.acceleration[Z_AXIS] = DEFAULT_Z_ACCELERATION;
103  settings.max_travel[X_AXIS] = (-DEFAULT_X_MAX_TRAVEL);
104  settings.max_travel[Y_AXIS] = (-DEFAULT_Y_MAX_TRAVEL);
105  settings.max_travel[Z_AXIS] = (-DEFAULT_Z_MAX_TRAVEL);
106 
108  }
109 
110  if (restore_flag & SETTINGS_RESTORE_PARAMETERS) {
111  uint8_t idx;
112  float coord_data[N_AXIS];
113  memset(&coord_data, 0, sizeof(coord_data));
114  for (idx=0; idx <= SETTING_INDEX_NCOORD; idx++) { settings_write_coord_data(idx, coord_data); }
115  }
116 
117  if (restore_flag & SETTINGS_RESTORE_STARTUP_LINES) {
118  #if N_STARTUP_LINE > 0
121  #endif
122  #if N_STARTUP_LINE > 1
125  #endif
126  }
127 
128  if (restore_flag & SETTINGS_RESTORE_BUILD_INFO) {
131  }
132 }
133 
135 uint8_t settings_read_startup_line(uint8_t n, char *line)
136 {
137  uint32_t addr = n*(LINE_BUFFER_SIZE+1)+EEPROM_ADDR_STARTUP_BLOCK;
138  if (!(memcpy_from_eeprom_with_checksum((char*)line, addr, LINE_BUFFER_SIZE))) {
139 // Reset line with default value
140  line[0] = 0;
142  return(false);
143  }
144  return(true);
145 }
146 
148 uint8_t settings_read_build_info(char *line)
149 {
151 // Reset line with default value
152  line[0] = 0;
154  return(false);
155  }
156  return(true);
157 }
158 
160 uint8_t settings_read_coord_data(uint8_t coord_select, float *coord_data)
161 {
162  uint32_t addr = coord_select*(sizeof(float)*N_AXIS+1) + EEPROM_ADDR_PARAMETERS;
163  if (!(memcpy_from_eeprom_with_checksum((char*)coord_data, addr, sizeof(float)*N_AXIS))) {
164 // Reset with default zero vector
165  clear_vector_float(coord_data);
166  settings_write_coord_data(coord_select,coord_data);
167  return(false);
168  }
169  return(true);
170 }
171 
174 // Check version-byte of eeprom
175  uint8_t version = eeprom_get_char(0);
176  if (version == SETTINGS_VERSION) {
177 // Read settings-record and check checksum
178  if (!(memcpy_from_eeprom_with_checksum((char*)&settings, EEPROM_ADDR_GLOBAL, sizeof(settings_t)))) {
179  return(false);
180  }
181  } else {
182  return(false);
183  }
184  return(true);
185 }
186 
188 uint8_t settings_store_global_setting(uint8_t parameter, float value) {
189  if (value < 0.0) { return(STATUS_NEGATIVE_VALUE); }
190  if (parameter >= AXIS_SETTINGS_START_VAL) {
191 // Store axis configuration. Axis numbering sequence set by AXIS_SETTING defines.
192 //
194  parameter -= AXIS_SETTINGS_START_VAL;
195  uint8_t set_idx = 0;
196  while (set_idx < AXIS_N_SETTINGS) {
197  if (parameter < N_AXIS) {
198 // Valid axis setting found.
199  switch (set_idx) {
200  case 0:
201  #ifdef MAX_STEP_RATE_HZ
202  if (value*settings.max_rate[parameter] > (MAX_STEP_RATE_HZ*60.0)) { return(STATUS_MAX_STEP_RATE_EXCEEDED); }
203  #endif
204  settings.steps_per_mm[parameter] = value;
205  break;
206  case 1:
207  #ifdef MAX_STEP_RATE_HZ
208  if (value*settings.steps_per_mm[parameter] > (MAX_STEP_RATE_HZ*60.0)) { return(STATUS_MAX_STEP_RATE_EXCEEDED); }
209  #endif
210  settings.max_rate[parameter] = value;
211  break;
212  case 2: settings.acceleration[parameter] = value*60*60; break;
213  case 3: settings.max_travel[parameter] = -value; break;
214  }
215  break;
216  } else {
217  set_idx++;
218 // If axis index greater than N_AXIS or setting index greater than number of axis settings, error out.
219  if ((parameter < AXIS_SETTINGS_INCREMENT) || (set_idx == AXIS_N_SETTINGS)) { return(STATUS_INVALID_STATEMENT); }
220  parameter -= AXIS_SETTINGS_INCREMENT;
221  }
222  }
223  } else {
224 // Store non-axis Grbl settings
225  uint8_t int_value = trunc(value);
226  switch(parameter) {
227  case 0:
228  if (int_value < 3) { return(STATUS_SETTING_STEP_PULSE_MIN); }
229  settings.pulse_microseconds = int_value; break;
230  case 1: settings.stepper_idle_lock_time = int_value; break;
231  case 2:
232  settings.step_invert_mask = int_value;
234  break;
235  case 3:
236  settings.dir_invert_mask = int_value;
238  break;
239  case 4:
240  if (int_value) { settings.flags |= BITFLAG_INVERT_ST_ENABLE; }
241  else { settings.flags &= ~BITFLAG_INVERT_ST_ENABLE; }
242  break;
243  case 5:
244  if (int_value) { settings.flags |= BITFLAG_INVERT_LIMIT_PINS; }
245  else { settings.flags &= ~BITFLAG_INVERT_LIMIT_PINS; }
246  break;
247  case 6:
248  if (int_value) { settings.flags |= BITFLAG_INVERT_PROBE_PIN; }
249  else { settings.flags &= ~BITFLAG_INVERT_PROBE_PIN; }
251  break;
252  case 10: settings.status_report_mask = int_value; break;
253  case 11: settings.junction_deviation = value; break;
254  case 12: settings.arc_tolerance = value; break;
255  case 13:
256  if (int_value) { settings.flags |= BITFLAG_REPORT_INCHES; }
257  else { settings.flags &= ~BITFLAG_REPORT_INCHES; }
259  break;
260  case 20:
261  if (int_value) {
263  settings.flags |= BITFLAG_SOFT_LIMIT_ENABLE;
264  } else { settings.flags &= ~BITFLAG_SOFT_LIMIT_ENABLE; }
265  break;
266  case 21:
267  if (int_value) { settings.flags |= BITFLAG_HARD_LIMIT_ENABLE; }
268  else { settings.flags &= ~BITFLAG_HARD_LIMIT_ENABLE; }
269  limits_init();
270  break;
272  case 22:
273  if (int_value) { settings.flags |= BITFLAG_HOMING_ENABLE; }
274  else {
275  settings.flags &= ~BITFLAG_HOMING_ENABLE;
276  settings.flags &= ~BITFLAG_SOFT_LIMIT_ENABLE;
277  }
278  break;
279  case 23: settings.homing_dir_mask = int_value; break;
280  case 24: settings.homing_feed_rate = value; break;
281  case 25: settings.homing_seek_rate = value; break;
282  case 26: settings.homing_debounce_delay = int_value; break;
283  case 27: settings.homing_pulloff = value; break;
284  case 30: settings.rpm_max = value; spindle_init(); break;
285  case 31: settings.rpm_min = value; spindle_init(); break;
286  case 32:
287  if (int_value) { settings.flags |= BITFLAG_LASER_MODE; }
288  else { settings.flags &= ~BITFLAG_LASER_MODE; }
289  break;
290  default:
291  return(STATUS_INVALID_STATEMENT);
292  }
293  }
295  return(STATUS_OK);
296 }
297 
300  if(!read_global_settings()) {
302  settings_restore(SETTINGS_RESTORE_ALL);
304  }
305 }
306 
308 uint8_t get_step_pin_mask(uint8_t axis_idx)
309 {
310  if ( axis_idx == X_AXIS ) { return((1<<X_STEP_BIT)); }
311  if ( axis_idx == Y_AXIS ) { return((1<<Y_STEP_BIT)); }
312  return((1<<Z_STEP_BIT));
313 }
314 
316 uint8_t get_direction_pin_mask(uint8_t axis_idx)
317 {
318  if ( axis_idx == X_AXIS ) { return((1<<X_DIRECTION_BIT)); }
319  if ( axis_idx == Y_AXIS ) { return((1<<Y_DIRECTION_BIT)); }
320  return((1<<Z_DIRECTION_BIT));
321 }
322 
324 uint8_t get_limit_pin_mask(uint8_t axis_idx)
325 {
326  if ( axis_idx == X_AXIS ) { return((1<<X_LIMIT_BIT)); }
327  if ( axis_idx == Y_AXIS ) { return((1<<Y_LIMIT_BIT)); }
328  return((1<<Z_LIMIT_BIT));
329 }
#define BITFLAG_INVERT_ST_ENABLE
Definition: settings.h:37
uint8_t homing_dir_mask
Definition: settings.h:94
void write_global_settings()
Method to store Grbl global settings struct and version number into EEPROM.
Definition: settings.c:58
#define N_AXIS
Axis array index values. Must start with 0 and be continuous.
Definition: nuts_bolts.h:30
void limits_init()
Initialize the limits module.
Definition: limits.c:32
void report_grbl_settings()
Grbl global settings print out.
Definition: report.c:178
#define Y_AXIS
Definition: nuts_bolts.h:32
void spindle_init()
Initializes spindle pins and hardware PWM, if enabled.
#define STATUS_SETTING_STEP_PULSE_MIN
Definition: report.h:29
float acceleration[N_AXIS]
Definition: settings.h:77
Global persistent settings (Stored from byte EEPROM_ADDR_GLOBAL onwards)
Definition: settings.h:73
void report_status_message(uint8_t status_code)
Handles the primary confirmation protocol response for streaming interfaces and human-feedback.
Definition: report.c:110
unsigned char eeprom_get_char(unsigned int addr)
Read byte from EEPROM.
Definition: eeprom.c:49
uint8_t settings_read_coord_data(uint8_t coord_select, float *coord_data)
Read selected coordinate data from EEPROM. Updates pointed coord_data value.
Definition: settings.c:160
void system_flag_wco_change()
Definition: system.c:265
float homing_feed_rate
Definition: settings.h:95
float rpm_max
Definition: settings.h:89
void protocol_buffer_synchronize()
Block until all buffered steps are executed or in a cycle state. Works with feed hold.
Definition: protocol.c:177
float homing_seek_rate
Definition: settings.h:96
void settings_store_startup_line(uint8_t n, char *line)
Method to store startup lines into EEPROM.
Definition: settings.c:27
#define SETTINGS_RESTORE_BUILD_INFO
Definition: settings.h:50
uint8_t status_report_mask
Mask to indicate desired report data.
Definition: settings.h:85
float arc_tolerance
Definition: settings.h:87
#define BITFLAG_SOFT_LIMIT_ENABLE
Definition: settings.h:40
int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size)
Definition: eeprom.c:139
void eeprom_put_char(unsigned int addr, unsigned char new_value)
Write byte to EEPROM.
Definition: eeprom.c:74
#define EEPROM_ADDR_GLOBAL
Define EEPROM memory address location values for Grbl settings and parameters.
Definition: settings.h:55
#define AXIS_SETTINGS_START_VAL
Definition: settings.h:69
#define clear_vector_float(a)
Definition: nuts_bolts.h:51
#define BITFLAG_LASER_MODE
Definition: settings.h:36
#define EEPROM_ADDR_PARAMETERS
Definition: settings.h:56
#define BITFLAG_HOMING_ENABLE
Definition: settings.h:39
void settings_store_build_info(char *line)
Method to store build info into EEPROM.
Definition: settings.c:39
#define SETTINGS_RESTORE_STARTUP_LINES
Definition: settings.h:49
uint8_t get_direction_pin_mask(uint8_t axis_idx)
Returns direction pin mask according to Grbl internal axis indexing.
Definition: settings.c:316
#define X_AXIS
Axis indexing value.
Definition: nuts_bolts.h:31
#define LINE_BUFFER_SIZE
Line buffer size from the serial input stream to be executed.
Definition: protocol.h:26
void probe_configure_invert_mask(uint8_t is_probe_away)
Called by probe_init() and the mc_probe() routines. Sets up the probe pin invert mask to...
Definition: probe.c:41
#define AXIS_N_SETTINGS
Define Grbl axis settings numbering scheme. Starts at START_VAL, every INCREMENT, over N_SETTINGS...
Definition: settings.h:68
float junction_deviation
Definition: settings.h:86
#define STATUS_INVALID_STATEMENT
Definition: report.h:26
#define STATUS_NEGATIVE_VALUE
Definition: report.h:27
uint8_t settings_read_startup_line(uint8_t n, char *line)
Reads startup line from EEPROM. Updated pointed line string data.
Definition: settings.c:135
#define Z_AXIS
Definition: nuts_bolts.h:33
uint8_t flags
Contains default boolean settings.
Definition: settings.h:92
#define STATUS_SOFT_LIMIT_ERROR
Definition: report.h:33
uint8_t step_invert_mask
Definition: settings.h:82
uint16_t homing_debounce_delay
Definition: settings.h:97
uint8_t dir_invert_mask
Definition: settings.h:83
#define SETTINGS_RESTORE_PARAMETERS
Definition: settings.h:48
void settings_write_coord_data(uint8_t coord_select, float *coord_data)
Method to store coord data parameters into EEPROM.
Definition: settings.c:46
float steps_per_mm[N_AXIS]
Definition: settings.h:75
#define bit_isfalse(x, mask)
Definition: nuts_bolts.h:61
float homing_pulloff
Definition: settings.h:98
float max_travel[N_AXIS]
Definition: settings.h:78
#define BITFLAG_REPORT_INCHES
NOTE: Check settings_reset() when moving to next version.
Definition: settings.h:35
uint8_t get_step_pin_mask(uint8_t axis_idx)
Returns step pin mask according to Grbl internal axis indexing.
Definition: settings.c:308
float rpm_min
Definition: settings.h:90
uint8_t get_limit_pin_mask(uint8_t axis_idx)
Returns limit pin mask according to Grbl internal axis indexing.
Definition: settings.c:324
#define BITFLAG_HARD_LIMIT_ENABLE
Definition: settings.h:38
float max_rate[N_AXIS]
Definition: settings.h:76
#define STATUS_MAX_STEP_RATE_EXCEEDED
Definition: report.h:35
memset(pl_data, 0, sizeof(plan_line_data_t))
Zero pl_data struct.
void settings_init()
Initialize the config subsystem.
Definition: settings.c:299
settings_t settings
Definition: settings.c:24
uint8_t pulse_microseconds
Definition: settings.h:81
#define EEPROM_ADDR_STARTUP_BLOCK
Definition: settings.h:57
#define EEPROM_ADDR_BUILD_INFO
Definition: settings.h:58
#define SETTINGS_RESTORE_DEFAULTS
Define settings restore bitflags.
Definition: settings.h:47
#define SETTINGS_VERSION
Version of the EEPROM data. Will be used to migrate existing data from older versions of Grbl...
Definition: settings.h:32
#define BITFLAG_INVERT_LIMIT_PINS
Definition: settings.h:41
#define AXIS_SETTINGS_INCREMENT
NOTE: Reserving settings values >= 100 for axis settings. Up to 255.
Definition: settings.h:71
uint8_t settings_read_build_info(char *line)
Reads startup line from EEPROM. Updated pointed line string data.
Definition: settings.c:148
uint8_t read_global_settings()
Reads Grbl global settings struct from EEPROM.
Definition: settings.c:173
#define STATUS_SETTING_READ_FAIL
Definition: report.h:30
uint8_t settings_store_global_setting(uint8_t parameter, float value)
A helper method to set settings from command line.
Definition: settings.c:188
void st_generate_step_dir_invert_masks()
Generates the step and direction port invert masks used in the Stepper Interrupt Driver.
Definition: stepper.c:464
#define STATUS_OK
Define Grbl status codes. Valid values (0-255)
Definition: report.h:23
#define SETTING_INDEX_NCOORD
Total number of system stored (from index 0)
Definition: settings.h:61
void settings_restore(uint8_t restore_flag)
Method to restore EEPROM-saved Grbl global settings back to defaults.
Definition: settings.c:65
uint8_t stepper_idle_lock_time
If max value 255, steppers do not disable.
Definition: settings.h:84
#define BITFLAG_INVERT_PROBE_PIN
Definition: settings.h:42
void memcpy_to_eeprom_with_checksum(unsigned int destination, char *source, unsigned int size)
Extensions added as part of Grbl.
Definition: eeprom.c:129