/* settings.c - eeprom configuration handling Part of Grbl Copyright (c) 2009-2011 Simen Svale Skogsrud Copyright (c) 2011-2012 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 . */ #include #include #include "nuts_bolts.h" #include "settings.h" #include "eeprom.h" #include "print.h" #include #include "protocol.h" #include "config.h" settings_t settings; // Version 1 outdated settings record typedef struct { float steps_per_mm[3]; uint8_t microsteps; uint8_t pulse_microseconds; float default_feed_rate; float default_seek_rate; uint8_t invert_mask; float mm_per_arc_segment; } settings_v1_t; // Version 2,3,4 outdated settings record typedef struct { float steps_per_mm[3]; uint8_t microsteps; uint8_t pulse_microseconds; float default_feed_rate; float default_seek_rate; uint8_t invert_mask; float mm_per_arc_segment; float acceleration; float junction_deviation; } settings_v2_v4_t; // Default settings (used when resetting eeprom-settings) #define MICROSTEPS 8 #define DEFAULT_X_STEPS_PER_MM (94.488188976378*MICROSTEPS) #define DEFAULT_Y_STEPS_PER_MM (94.488188976378*MICROSTEPS) #define DEFAULT_Z_STEPS_PER_MM (94.488188976378*MICROSTEPS) #define DEFAULT_STEP_PULSE_MICROSECONDS 30 #define DEFAULT_MM_PER_ARC_SEGMENT 0.1 #define DEFAULT_RAPID_FEEDRATE 500.0 // mm/min #define DEFAULT_FEEDRATE 500.0 #define DEFAULT_ACCELERATION (DEFAULT_FEEDRATE*60*60/10.0) // mm/min^2 #define DEFAULT_JUNCTION_DEVIATION 0.05 // mm #define DEFAULT_STEPPING_INVERT_MASK ((1<= 50) { // Developmental settings. Version numbers greater than or equal to 50 are temporary. // Currently, this will update the user settings to v4 and the remainder of the settings // should be re-written to the default value, if the developmental version number changed. // Grab settings regardless of error. memcpy_from_eeprom_with_checksum((char*)&settings, 1, sizeof(settings_t)); settings_reset(false); write_settings(); } else { return(false); } } return(true); } // A helper method to set settings from command line void settings_store_setting(int parameter, float value) { switch(parameter) { case 0: case 1: case 2: if (value <= 0.0) { printPgmString(PSTR("Steps/mm must be > 0.0\r\n")); return; } settings.steps_per_mm[parameter] = value; break; case 3: if (value < 3) { printPgmString(PSTR("Step pulse must be >= 3 microseconds\r\n")); return; } settings.pulse_microseconds = round(value); break; case 4: settings.default_feed_rate = value; break; case 5: settings.default_seek_rate = value; break; case 6: settings.mm_per_arc_segment = value; break; case 7: settings.invert_mask = trunc(value); break; case 8: settings.acceleration = value*60*60; break; // Convert to mm/min^2 for grbl internal use. case 9: settings.junction_deviation = fabs(value); break; case 10: if (value) { settings.flags |= FLAG_BIT_HOMING_ENABLE; printPgmString(PSTR("Install all axes limit switches before use\r\n")); } else { settings.flags &= ~FLAG_BIT_HOMING_ENABLE; } break; case 11: settings.homing_feed_rate = value; break; case 12: settings.homing_seek_rate = value; break; case 13: settings.homing_debounce_delay = round(value); break; case 14: settings.stepper_idle_lock_time = round(value); break; default: printPgmString(PSTR("Unknown parameter\r\n")); return; } write_settings(); printPgmString(PSTR("Stored new setting\r\n")); } // Initialize the config subsystem void settings_init() { if(!read_settings()) { printPgmString(PSTR("Warning: Failed to read EEPROM settings. Using defaults.\r\n")); settings_reset(true); write_settings(); settings_dump(); } }