2018-10-08 18:24:56 +00:00
//! @file
2016-07-22 13:28:01 +00:00
# include "Marlin.h"
# include "planner.h"
# include "temperature.h"
# include "ultralcd.h"
# include "ConfigurationStore.h"
# include "Configuration_prusa.h"
# ifdef MESH_BED_LEVELING
# include "mesh_bed_leveling.h"
# endif
2019-03-19 20:28:31 +00:00
# ifdef TMC2130
# include "tmc2130.h"
# endif
2018-09-24 12:54:41 +00:00
M500_conf cs ;
2018-09-24 12:34:43 +00:00
2018-10-08 18:24:56 +00:00
//! @brief Write data to EEPROM
//! @param pos destination in EEPROM, 0 is start
//! @param value value to be written
//! @param size size of type pointed by value
//! @param name name of variable written, used only for debug input if DEBUG_EEPROM_WRITE defined
//! @retval true success
//! @retval false failed
2018-07-26 17:43:33 +00:00
# ifdef DEBUG_EEPROM_WRITE
2018-10-08 18:24:56 +00:00
static bool EEPROM_writeData ( uint8_t * pos , uint8_t * value , uint8_t size , const char * name )
2018-07-26 17:43:33 +00:00
# else //DEBUG_EEPROM_WRITE
2018-10-08 18:24:56 +00:00
static bool EEPROM_writeData ( uint8_t * pos , uint8_t * value , uint8_t size , const char * )
2018-07-26 17:43:33 +00:00
# endif //DEBUG_EEPROM_WRITE
2016-07-22 13:28:01 +00:00
{
2018-07-26 17:43:33 +00:00
# ifdef DEBUG_EEPROM_WRITE
2022-02-02 19:58:21 +00:00
printf_P ( PSTR ( " EEPROM_WRITE_VAR addr=0x%04x size=0x%02x name=%s \n " ) , pos , size , name ) ;
2018-07-26 17:43:33 +00:00
# endif //DEBUG_EEPROM_WRITE
2021-01-12 21:44:39 +00:00
while ( size - - )
{
2018-10-08 18:24:56 +00:00
eeprom_update_byte ( pos , * value ) ;
if ( eeprom_read_byte ( pos ) ! = * value ) {
SERIAL_ECHOLNPGM ( " EEPROM Error " ) ;
return false ;
}
2021-01-12 21:44:39 +00:00
pos + + ;
value + + ;
}
2018-10-08 18:24:56 +00:00
return true ;
2016-07-22 13:28:01 +00:00
}
2018-07-26 17:43:33 +00:00
# ifdef DEBUG_EEPROM_READ
2018-10-08 18:24:56 +00:00
static void EEPROM_readData ( uint8_t * pos , uint8_t * value , uint8_t size , const char * name )
2018-07-26 17:43:33 +00:00
# else //DEBUG_EEPROM_READ
2018-10-08 18:24:56 +00:00
static void EEPROM_readData ( uint8_t * pos , uint8_t * value , uint8_t size , const char * )
2018-07-26 17:43:33 +00:00
# endif //DEBUG_EEPROM_READ
2016-07-22 13:28:01 +00:00
{
2018-07-26 17:43:33 +00:00
# ifdef DEBUG_EEPROM_READ
2022-02-02 19:58:21 +00:00
printf_P ( PSTR ( " EEPROM_READ_VAR addr=0x%04x size=0x%02x name=%s \n " ) , pos , size , name ) ;
2018-07-26 17:43:33 +00:00
# endif //DEBUG_EEPROM_READ
2018-10-08 18:24:56 +00:00
while ( size - - )
2016-07-22 13:28:01 +00:00
{
2018-10-08 18:24:56 +00:00
* value = eeprom_read_byte ( pos ) ;
2016-07-22 13:28:01 +00:00
pos + + ;
value + + ;
2018-10-08 18:24:56 +00:00
}
2016-07-22 13:28:01 +00:00
}
2018-07-26 17:43:33 +00:00
2018-01-30 10:31:44 +00:00
# define EEPROM_VERSION "V2"
2016-07-22 13:28:01 +00:00
# ifdef EEPROM_SETTINGS
2018-10-08 18:24:56 +00:00
void Config_StoreSettings ( )
2016-07-22 13:28:01 +00:00
{
2018-09-24 12:34:43 +00:00
strcpy ( cs . version , " 000 " ) ; //!< invalidate data first @TODO use erase to save one erase cycle
2016-07-22 13:28:01 +00:00
2018-10-08 18:24:56 +00:00
if ( EEPROM_writeData ( reinterpret_cast < uint8_t * > ( EEPROM_M500_base ) , reinterpret_cast < uint8_t * > ( & cs ) , sizeof ( cs ) , 0 ) , " cs, invalid version " )
{
2022-06-26 11:13:59 +00:00
# ifdef TEMP_MODEL
temp_model_save_settings ( ) ;
# endif
2018-10-08 18:24:56 +00:00
strcpy ( cs . version , EEPROM_VERSION ) ; //!< validate data if write succeed
EEPROM_writeData ( reinterpret_cast < uint8_t * > ( EEPROM_M500_base - > version ) , reinterpret_cast < uint8_t * > ( cs . version ) , sizeof ( cs . version ) , " cs.version valid " ) ;
}
2016-07-22 13:28:01 +00:00
SERIAL_ECHO_START ;
SERIAL_ECHOLNPGM ( " Settings Stored " ) ;
}
# endif //EEPROM_SETTINGS
# ifndef DISABLE_M503
2017-09-21 13:20:02 +00:00
void Config_PrintSettings ( uint8_t level )
2016-07-22 13:28:01 +00:00
{ // Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown
2018-07-19 16:56:01 +00:00
# ifdef TMC2130
2021-01-12 21:44:39 +00:00
printf_P ( PSTR (
" %SSteps per unit: \n %S M92 X%.2f Y%.2f Z%.2f E%.2f \n "
2019-03-19 20:28:31 +00:00
" %SUStep resolution: \n %S M350 X%d Y%d Z%d E%d \n "
2018-07-19 16:56:01 +00:00
" %SMaximum feedrates - normal (mm/s): \n %S M203 X%.2f Y%.2f Z%.2f E%.2f \n "
" %SMaximum feedrates - stealth (mm/s): \n %S M203 X%.2f Y%.2f Z%.2f E%.2f \n "
" %SMaximum acceleration - normal (mm/s2): \n %S M201 X%lu Y%lu Z%lu E%lu \n "
" %SMaximum acceleration - stealth (mm/s2): \n %S M201 X%lu Y%lu Z%lu E%lu \n "
2020-09-20 17:06:15 +00:00
" %SAcceleration: P=print, R=retract, T=travel \n %S M204 P%.2f R%.2f T%.2f \n "
2018-07-19 16:56:01 +00:00
" %SAdvanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s) \n %S M205 S%.2f T%.2f B%.2f X%.2f Y%.2f Z%.2f E%.2f \n "
" %SHome offset (mm): \n %S M206 X%.2f Y%.2f Z%.2f \n "
) ,
2018-09-24 12:54:41 +00:00
echomagic , echomagic , cs . axis_steps_per_unit [ X_AXIS ] , cs . axis_steps_per_unit [ Y_AXIS ] , cs . axis_steps_per_unit [ Z_AXIS ] , cs . axis_steps_per_unit [ E_AXIS ] ,
2019-03-19 20:28:31 +00:00
echomagic , echomagic , cs . axis_ustep_resolution [ X_AXIS ] , cs . axis_ustep_resolution [ Y_AXIS ] , cs . axis_ustep_resolution [ Z_AXIS ] , cs . axis_ustep_resolution [ E_AXIS ] ,
2018-09-24 13:09:19 +00:00
echomagic , echomagic , cs . max_feedrate_normal [ X_AXIS ] , cs . max_feedrate_normal [ Y_AXIS ] , cs . max_feedrate_normal [ Z_AXIS ] , cs . max_feedrate_normal [ E_AXIS ] ,
2018-09-24 15:33:58 +00:00
echomagic , echomagic , cs . max_feedrate_silent [ X_AXIS ] , cs . max_feedrate_silent [ Y_AXIS ] , cs . max_feedrate_silent [ Z_AXIS ] , cs . max_feedrate_silent [ E_AXIS ] ,
2018-09-24 13:40:35 +00:00
echomagic , echomagic , cs . max_acceleration_units_per_sq_second_normal [ X_AXIS ] , cs . max_acceleration_units_per_sq_second_normal [ Y_AXIS ] , cs . max_acceleration_units_per_sq_second_normal [ Z_AXIS ] , cs . max_acceleration_units_per_sq_second_normal [ E_AXIS ] ,
2018-09-24 15:33:58 +00:00
echomagic , echomagic , cs . max_acceleration_units_per_sq_second_silent [ X_AXIS ] , cs . max_acceleration_units_per_sq_second_silent [ Y_AXIS ] , cs . max_acceleration_units_per_sq_second_silent [ Z_AXIS ] , cs . max_acceleration_units_per_sq_second_silent [ E_AXIS ] ,
2020-09-20 17:06:15 +00:00
echomagic , echomagic , cs . acceleration , cs . retract_acceleration , cs . travel_acceleration ,
2018-09-24 14:35:33 +00:00
echomagic , echomagic , cs . minimumfeedrate , cs . mintravelfeedrate , cs . minsegmenttime , cs . max_jerk [ X_AXIS ] , cs . max_jerk [ Y_AXIS ] , cs . max_jerk [ Z_AXIS ] , cs . max_jerk [ E_AXIS ] ,
2018-09-24 14:42:28 +00:00
echomagic , echomagic , cs . add_homing [ X_AXIS ] , cs . add_homing [ Y_AXIS ] , cs . add_homing [ Z_AXIS ]
2018-07-19 16:56:01 +00:00
# else //TMC2130
2018-07-12 21:40:04 +00:00
printf_P ( PSTR (
" %SSteps per unit: \n %S M92 X%.2f Y%.2f Z%.2f E%.2f \n "
" %SMaximum feedrates (mm/s): \n %S M203 X%.2f Y%.2f Z%.2f E%.2f \n "
2018-07-19 16:56:01 +00:00
" %SMaximum acceleration (mm/s2): \n %S M201 X%lu Y%lu Z%lu E%lu \n "
2020-09-20 17:06:15 +00:00
" %SAcceleration: P=print, R=retract, T=travel \n %S M204 P%.2f R%.2f T%.2f \n "
2018-07-12 21:40:04 +00:00
" %SAdvanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s) \n %S M205 S%.2f T%.2f B%.2f X%.2f Y%.2f Z%.2f E%.2f \n "
" %SHome offset (mm): \n %S M206 X%.2f Y%.2f Z%.2f \n "
) ,
2018-09-24 12:54:41 +00:00
echomagic , echomagic , cs . axis_steps_per_unit [ X_AXIS ] , cs . axis_steps_per_unit [ Y_AXIS ] , cs . axis_steps_per_unit [ Z_AXIS ] , cs . axis_steps_per_unit [ E_AXIS ] ,
2018-07-12 21:40:04 +00:00
echomagic , echomagic , max_feedrate [ X_AXIS ] , max_feedrate [ Y_AXIS ] , max_feedrate [ Z_AXIS ] , max_feedrate [ E_AXIS ] ,
echomagic , echomagic , max_acceleration_units_per_sq_second [ X_AXIS ] , max_acceleration_units_per_sq_second [ Y_AXIS ] , max_acceleration_units_per_sq_second [ Z_AXIS ] , max_acceleration_units_per_sq_second [ E_AXIS ] ,
2020-09-20 17:06:15 +00:00
echomagic , echomagic , cs . acceleration , cs . retract_acceleration , cs . travel_acceleration ,
2018-09-24 14:35:33 +00:00
echomagic , echomagic , cs . minimumfeedrate , cs . mintravelfeedrate , cs . minsegmenttime , cs . max_jerk [ X_AXIS ] , cs . max_jerk [ Y_AXIS ] , cs . max_jerk [ Z_AXIS ] , cs . max_jerk [ E_AXIS ] ,
2018-09-24 14:42:28 +00:00
echomagic , echomagic , cs . add_homing [ X_AXIS ] , cs . add_homing [ Y_AXIS ] , cs . add_homing [ Z_AXIS ]
2018-07-19 16:56:01 +00:00
# endif //TMC2130
2021-01-12 21:44:39 +00:00
) ;
2016-07-22 13:28:01 +00:00
# ifdef PIDTEMP
2021-01-12 21:44:39 +00:00
printf_P ( PSTR ( " %SPID settings: \n %S M301 P%.2f I%.2f D%.2f \n " ) ,
echomagic , echomagic , cs . Kp , unscalePID_i ( cs . Ki ) , unscalePID_d ( cs . Kd ) ) ;
2016-07-22 13:28:01 +00:00
# endif
2017-03-24 18:47:50 +00:00
# ifdef PIDTEMPBED
2021-01-12 21:44:39 +00:00
printf_P ( PSTR ( " %SPID heatbed settings: \n %S M304 P%.2f I%.2f D%.2f \n " ) ,
echomagic , echomagic , cs . bedKp , unscalePID_i ( cs . bedKi ) , unscalePID_d ( cs . bedKd ) ) ;
2017-03-24 18:47:50 +00:00
# endif
2016-07-22 13:28:01 +00:00
# ifdef FWRETRACT
2021-01-12 21:44:39 +00:00
printf_P ( PSTR (
" %SRetract: S=Length (mm) F:Speed (mm/m) Z: ZLift (mm) \n %S M207 S%.2f F%.2f Z%.2f \n "
" %SRecover: S=Extra length (mm) F:Speed (mm/m) \n %S M208 S%.2f F%.2f \n "
" %SAuto-Retract: S=0 to disable, 1 to interpret extrude-only moves as retracts or recoveries \n %S M209 S%d \n "
) ,
echomagic , echomagic , cs . retract_length , cs . retract_feedrate * 60 , cs . retract_zlift ,
echomagic , echomagic , cs . retract_recover_length , cs . retract_recover_feedrate * 60 ,
echomagic , echomagic , ( cs . autoretract_enabled ? 1 : 0 )
) ;
2016-07-22 13:28:01 +00:00
# if EXTRUDERS > 1
2021-01-12 21:44:39 +00:00
printf_P ( PSTR ( " %SMulti-extruder settings: \n %S Swap retract length (mm): %.2f \n %S Swap rec. addl. length (mm): %.2f \n " ) ,
echomagic , echomagic , retract_length_swap , echomagic , retract_recover_length_swap ) ;
2016-07-22 13:28:01 +00:00
# endif
2021-01-12 21:44:39 +00:00
if ( cs . volumetric_enabled ) {
printf_P ( PSTR ( " %SFilament settings: \n %S M200 D%.2f \n " ) ,
echomagic , echomagic , cs . filament_size [ 0 ] ) ;
2016-07-22 13:28:01 +00:00
# if EXTRUDERS > 1
2021-01-12 21:44:39 +00:00
printf_P ( PSTR ( " %S M200 T1 D%.2f \n " ) ,
echomagic , echomagic , cs . filament_size [ 1 ] ) ;
2016-07-22 13:28:01 +00:00
# if EXTRUDERS > 2
2021-01-12 21:44:39 +00:00
printf_P ( PSTR ( " %S M200 T1 D%.2f \n " ) ,
echomagic , echomagic , cs . filament_size [ 2 ] ) ;
2016-07-22 13:28:01 +00:00
# endif
# endif
} else {
2018-07-12 21:50:41 +00:00
printf_P ( PSTR ( " %SFilament settings: Disabled \n " ) , echomagic ) ;
2016-07-22 13:28:01 +00:00
}
# endif
2021-01-12 21:44:39 +00:00
if ( level > = 10 ) {
2017-09-21 13:20:02 +00:00
# ifdef LIN_ADVANCE
2021-01-12 21:44:39 +00:00
printf_P ( PSTR ( " %SLinear advance settings:%S M900 K%.2f \n " ) ,
2019-05-18 14:41:25 +00:00
echomagic , echomagic , extruder_advance_K ) ;
2017-09-21 13:20:02 +00:00
# endif //LIN_ADVANCE
2021-01-12 21:44:39 +00:00
}
2020-05-07 16:03:08 +00:00
// Arc Interpolation Settings
printf_P ( PSTR (
2021-01-14 00:37:15 +00:00
" %SArc Settings: P:Max length(mm) S:Min length (mm) N:Corrections R:Min segments F:Segments/sec. \n %S M214 P%.2f S%.2f N%d R%d F%d \n " ) ,
2021-01-12 21:44:39 +00:00
echomagic , echomagic , cs . mm_per_arc_segment , cs . min_mm_per_arc_segment , cs . n_arc_correction , cs . min_arc_segments , cs . arc_segments_per_sec ) ;
2022-06-26 11:13:59 +00:00
# ifdef TEMP_MODEL
temp_model_report_settings ( ) ;
# endif
2016-07-22 13:28:01 +00:00
}
# endif
# ifdef EEPROM_SETTINGS
2018-09-21 18:52:44 +00:00
2018-09-24 15:29:02 +00:00
static_assert ( EXTRUDERS = = 1 , " ConfigurationStore M500_conf not implemented for more extruders, fix filament_size array size. " ) ;
static_assert ( NUM_AXIS = = 4 , " ConfigurationStore M500_conf not implemented for more axis. "
" Fix axis_steps_per_unit max_feedrate_normal max_acceleration_units_per_sq_second_normal max_jerk max_feedrate_silent "
" max_acceleration_units_per_sq_second_silent array size. " ) ;
2018-09-23 20:21:28 +00:00
# ifdef ENABLE_AUTO_BED_LEVELING
static_assert ( false , " zprobe_zoffset was not initialized in printers in field to -(Z_PROBE_OFFSET_FROM_EXTRUDER), so it contains "
" 0.0, if this is not acceptable, increment EEPROM_VERSION to force use default_conf " ) ;
# endif
2018-09-24 12:34:43 +00:00
2021-01-12 21:44:39 +00:00
static_assert ( sizeof ( M500_conf ) = = 209 , " sizeof(M500_conf) has changed, ensure that EEPROM_VERSION has been incremented, "
2018-09-25 14:27:20 +00:00
" or if you added members in the end of struct, ensure that historically uninitialized values will be initialized. "
" If this is caused by change to more then 8bit processor, decide whether make this struct packed to save EEPROM, "
" leave as it is to keep fast code, or reorder struct members to pack more tightly. " ) ;
2018-09-23 20:21:28 +00:00
static const M500_conf default_conf PROGMEM =
{
EEPROM_VERSION ,
DEFAULT_AXIS_STEPS_PER_UNIT ,
DEFAULT_MAX_FEEDRATE ,
DEFAULT_MAX_ACCELERATION ,
DEFAULT_ACCELERATION ,
DEFAULT_RETRACT_ACCELERATION ,
DEFAULT_MINIMUMFEEDRATE ,
DEFAULT_MINTRAVELFEEDRATE ,
2018-09-23 21:36:01 +00:00
DEFAULT_MINSEGMENTTIME ,
2018-09-23 20:21:28 +00:00
{ DEFAULT_XJERK , DEFAULT_YJERK , DEFAULT_ZJERK , DEFAULT_EJERK } ,
{ 0 , 0 , 0 } ,
- ( Z_PROBE_OFFSET_FROM_EXTRUDER ) ,
DEFAULT_Kp ,
DEFAULT_Ki * PID_dT ,
DEFAULT_Kd / PID_dT ,
DEFAULT_bedKp ,
DEFAULT_bedKi * PID_dT ,
DEFAULT_bedKd / PID_dT ,
0 ,
false ,
RETRACT_LENGTH ,
RETRACT_FEEDRATE ,
2018-09-23 21:36:01 +00:00
RETRACT_ZLIFT ,
RETRACT_RECOVER_LENGTH ,
RETRACT_RECOVER_FEEDRATE ,
false ,
2018-09-24 15:29:02 +00:00
{ DEFAULT_NOMINAL_FILAMENT_DIA ,
# if EXTRUDERS > 1
DEFAULT_NOMINAL_FILAMENT_DIA ,
# if EXTRUDERS > 2
DEFAULT_NOMINAL_FILAMENT_DIA ,
# endif
# endif
} ,
2018-09-23 21:36:01 +00:00
DEFAULT_MAX_FEEDRATE_SILENT ,
DEFAULT_MAX_ACCELERATION_SILENT ,
2019-03-19 20:28:31 +00:00
# ifdef TMC2130
{ TMC2130_USTEPS_XY , TMC2130_USTEPS_XY , TMC2130_USTEPS_Z , TMC2130_USTEPS_E } ,
# else // TMC2130
{ 16 , 16 , 16 , 16 } ,
# endif
2020-09-20 16:15:27 +00:00
DEFAULT_TRAVEL_ACCELERATION ,
2020-05-07 16:03:08 +00:00
DEFAULT_MM_PER_ARC_SEGMENT ,
DEFAULT_MIN_MM_PER_ARC_SEGMENT ,
2021-01-12 23:15:37 +00:00
DEFAULT_N_ARC_CORRECTION ,
2020-05-07 16:03:08 +00:00
DEFAULT_MIN_ARC_SEGMENTS ,
DEFAULT_ARC_SEGMENTS_PER_SEC
2018-09-23 20:21:28 +00:00
} ;
2020-09-20 17:04:08 +00:00
static bool is_uninitialized ( void * addr , uint8_t len )
{
while ( len - - )
{
if ( reinterpret_cast < uint8_t * > ( addr ) [ len ] ! = 0xff )
return false ;
}
return true ;
}
2018-10-08 18:24:56 +00:00
//! @brief Read M500 configuration
//! @retval true Succeeded. Stored settings retrieved or default settings retrieved in case EEPROM has been erased.
//! @retval false Failed. Default settings has been retrieved, because of older version or corrupted data.
bool Config_RetrieveSettings ( )
2016-07-22 13:28:01 +00:00
{
2021-01-12 21:44:39 +00:00
bool previous_settings_retrieved = true ;
2016-07-22 13:28:01 +00:00
char ver [ 4 ] = EEPROM_VERSION ;
2018-10-08 18:24:56 +00:00
EEPROM_readData ( reinterpret_cast < uint8_t * > ( EEPROM_M500_base - > version ) , reinterpret_cast < uint8_t * > ( cs . version ) , sizeof ( cs . version ) , " cs.version " ) ; //read stored version
2018-09-24 12:34:43 +00:00
// SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << cs.version << "]");
if ( strncmp ( ver , cs . version , 3 ) = = 0 ) // version number match
2016-07-22 13:28:01 +00:00
{
2018-09-24 12:34:43 +00:00
2018-10-08 18:24:56 +00:00
EEPROM_readData ( reinterpret_cast < uint8_t * > ( EEPROM_M500_base ) , reinterpret_cast < uint8_t * > ( & cs ) , sizeof ( cs ) , " cs " ) ;
2018-09-24 12:34:43 +00:00
calculate_extruder_multipliers ( ) ;
2016-07-22 13:28:01 +00:00
2021-01-12 21:44:39 +00:00
//if max_feedrate_silent and max_acceleration_units_per_sq_second_silent were never stored to eeprom, use default values:
2018-11-19 19:41:14 +00:00
for ( uint8_t i = 0 ; i < ( sizeof ( cs . max_feedrate_silent ) / sizeof ( cs . max_feedrate_silent [ 0 ] ) ) ; + + i )
2018-09-24 15:57:35 +00:00
{
const uint32_t erased = 0xffffffff ;
2020-09-20 17:05:19 +00:00
if ( is_uninitialized ( & ( cs . max_feedrate_silent [ i ] ) , sizeof ( float ) ) ) {
memcpy_P ( & cs . max_feedrate_silent [ i ] , & default_conf . max_feedrate_silent [ i ] , sizeof ( cs . max_feedrate_silent [ i ] ) ) ;
2018-11-19 19:41:14 +00:00
}
if ( erased = = cs . max_acceleration_units_per_sq_second_silent [ i ] ) {
memcpy_P ( & cs . max_acceleration_units_per_sq_second_silent [ i ] , & default_conf . max_acceleration_units_per_sq_second_silent [ i ] , sizeof ( cs . max_acceleration_units_per_sq_second_silent [ i ] ) ) ;
2018-11-19 19:09:03 +00:00
}
2018-09-24 15:57:35 +00:00
}
2022-05-02 08:02:00 +00:00
// Initialize arc interpolation settings if they are not already
2022-04-25 14:41:35 +00:00
if ( is_uninitialized ( & cs . mm_per_arc_segment , sizeof ( cs . mm_per_arc_segment ) ) ) cs . mm_per_arc_segment = default_conf . mm_per_arc_segment ;
if ( is_uninitialized ( & cs . min_mm_per_arc_segment , sizeof ( cs . min_mm_per_arc_segment ) ) ) cs . min_mm_per_arc_segment = default_conf . min_mm_per_arc_segment ;
if ( is_uninitialized ( & cs . n_arc_correction , sizeof ( cs . n_arc_correction ) ) ) cs . n_arc_correction = default_conf . n_arc_correction ;
if ( is_uninitialized ( & cs . min_arc_segments , sizeof ( cs . min_arc_segments ) ) ) cs . min_arc_segments = default_conf . min_arc_segments ;
if ( is_uninitialized ( & cs . arc_segments_per_sec , sizeof ( cs . arc_segments_per_sec ) ) ) cs . arc_segments_per_sec = default_conf . arc_segments_per_sec ;
2020-05-07 20:49:44 +00:00
2018-09-24 15:57:35 +00:00
2018-07-21 10:33:29 +00:00
# ifdef TMC2130
2021-01-12 21:44:39 +00:00
for ( uint8_t j = X_AXIS ; j < = Y_AXIS ; j + + )
{
if ( cs . max_feedrate_normal [ j ] > NORMAL_MAX_FEEDRATE_XY )
cs . max_feedrate_normal [ j ] = NORMAL_MAX_FEEDRATE_XY ;
if ( cs . max_feedrate_silent [ j ] > SILENT_MAX_FEEDRATE_XY )
cs . max_feedrate_silent [ j ] = SILENT_MAX_FEEDRATE_XY ;
if ( cs . max_acceleration_units_per_sq_second_normal [ j ] > NORMAL_MAX_ACCEL_XY )
cs . max_acceleration_units_per_sq_second_normal [ j ] = NORMAL_MAX_ACCEL_XY ;
if ( cs . max_acceleration_units_per_sq_second_silent [ j ] > SILENT_MAX_ACCEL_XY )
cs . max_acceleration_units_per_sq_second_silent [ j ] = SILENT_MAX_ACCEL_XY ;
}
2019-03-19 20:28:31 +00:00
2021-01-12 21:44:39 +00:00
if ( cs . axis_ustep_resolution [ X_AXIS ] = = 0xff ) { cs . axis_ustep_resolution [ X_AXIS ] = TMC2130_USTEPS_XY ; }
if ( cs . axis_ustep_resolution [ Y_AXIS ] = = 0xff ) { cs . axis_ustep_resolution [ Y_AXIS ] = TMC2130_USTEPS_XY ; }
if ( cs . axis_ustep_resolution [ Z_AXIS ] = = 0xff ) { cs . axis_ustep_resolution [ Z_AXIS ] = TMC2130_USTEPS_Z ; }
if ( cs . axis_ustep_resolution [ E_AXIS ] = = 0xff ) { cs . axis_ustep_resolution [ E_AXIS ] = TMC2130_USTEPS_E ; }
tmc2130_set_res ( X_AXIS , cs . axis_ustep_resolution [ X_AXIS ] ) ;
tmc2130_set_res ( Y_AXIS , cs . axis_ustep_resolution [ Y_AXIS ] ) ;
tmc2130_set_res ( Z_AXIS , cs . axis_ustep_resolution [ Z_AXIS ] ) ;
tmc2130_set_res ( E_AXIS , cs . axis_ustep_resolution [ E_AXIS ] ) ;
2018-07-21 10:33:29 +00:00
# endif //TMC2130
2020-09-20 17:04:08 +00:00
if ( is_uninitialized ( & cs . travel_acceleration , sizeof ( cs . travel_acceleration ) ) )
cs . travel_acceleration = cs . acceleration ;
2018-07-19 16:56:01 +00:00
reset_acceleration_rates ( ) ;
2021-01-12 21:44:39 +00:00
// Call updatePID (similar to when we have processed M301)
updatePID ( ) ;
2022-06-26 11:13:59 +00:00
# ifdef TEMP_MODEL
temp_model_load_settings ( ) ;
# endif
2016-07-22 13:28:01 +00:00
SERIAL_ECHO_START ;
SERIAL_ECHOLNPGM ( " Stored settings retrieved " ) ;
}
else
{
Config_ResetDefault ( ) ;
2021-01-12 21:44:39 +00:00
//Return false to inform user that eeprom version was changed and firmware is using default hardcoded settings now.
//In case that storing to eeprom was not used yet, do not inform user that hardcoded settings are used.
if ( eeprom_read_byte ( reinterpret_cast < uint8_t * > ( & ( EEPROM_M500_base - > version [ 0 ] ) ) ) ! = 0xFF | |
eeprom_read_byte ( reinterpret_cast < uint8_t * > ( & ( EEPROM_M500_base - > version [ 1 ] ) ) ) ! = 0xFF | |
eeprom_read_byte ( reinterpret_cast < uint8_t * > ( & ( EEPROM_M500_base - > version [ 2 ] ) ) ) ! = 0xFF )
{
previous_settings_retrieved = false ;
}
2016-07-22 13:28:01 +00:00
}
# ifdef EEPROM_CHITCHAT
Config_PrintSettings ( ) ;
# endif
2021-01-12 21:44:39 +00:00
return previous_settings_retrieved ;
2016-07-22 13:28:01 +00:00
}
# endif
void Config_ResetDefault ( )
{
2018-09-24 12:34:43 +00:00
memcpy_P ( & cs , & default_conf , sizeof ( cs ) ) ;
2018-07-19 16:56:01 +00:00
2021-01-12 21:44:39 +00:00
// steps per sq second need to be updated to agree with the units per sq second
2016-07-22 13:28:01 +00:00
reset_acceleration_rates ( ) ;
# ifdef PIDTEMP
updatePID ( ) ;
# endif //PIDTEMP
2022-06-26 11:13:59 +00:00
# ifdef TEMP_MODEL
temp_model_reset_settings ( ) ;
# endif
2016-07-22 13:28:01 +00:00
2021-01-12 21:44:39 +00:00
calculate_extruder_multipliers ( ) ;
2016-07-22 13:28:01 +00:00
SERIAL_ECHO_START ;
SERIAL_ECHOLNPGM ( " Hardcoded Default Settings Loaded " ) ;
}
2020-05-07 20:49:44 +00:00