diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 4067a6629a..914cb25d25 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -40,6 +40,10 @@ #define EEPROM_VERSION "V48" #define EEPROM_OFFSET 100 +// Check the integrity of data offsets. +// Can be disabled for production build. +//#define DEBUG_EEPROM_READWRITE + #include "configuration_store.h" #include "endstops.h" #include "planner.h" @@ -323,7 +327,17 @@ void MarlinSettings::postprocess() { #define EEPROM_WRITE(VAR) HAL::PersistentStore::write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) #define EEPROM_READ(VAR) HAL::PersistentStore::read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating) #define EEPROM_READ_ALWAYS(VAR) HAL::PersistentStore::read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) - #define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START(); SERIAL_ERRORLNPGM(ERR); eeprom_read_error = true; }while(0) + #define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START(); SERIAL_ERRORLNPGM(ERR); eeprom_error = true; }while(0) + + #if ENABLED(DEBUG_EEPROM_READWRITE) + #define _FIELD_TEST(FIELD) \ + EEPROM_ASSERT( \ + eeprom_error || eeprom_index == offsetof(SettingsData, FIELD), \ + "Field " STRINGIFY(FIELD) " mismatch." \ + ) + #else + #define _FIELD_TEST(FIELD) NOOP + #endif const char version[4] = EEPROM_VERSION; @@ -363,6 +377,8 @@ void MarlinSettings::postprocess() { working_crc = 0; // clear before first "real data" + _FIELD_TEST(esteppers); + const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ; EEPROM_WRITE(esteppers); @@ -377,6 +393,9 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(planner.min_travel_feedrate_mm_s); EEPROM_WRITE(planner.min_segment_time_us); EEPROM_WRITE(planner.max_jerk); + + _FIELD_TEST(home_offset); + #if !HAS_HOME_OFFSET const float home_offset[XYZ] = { 0 }; #endif @@ -426,6 +445,8 @@ void MarlinSettings::postprocess() { for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummy); #endif // MESH_BED_LEVELING + _FIELD_TEST(zprobe_zoffset); + #if !HAS_BED_PROBE const float zprobe_zoffset = 0; #endif @@ -470,6 +491,8 @@ void MarlinSettings::postprocess() { for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_WRITE(dummy); #endif // AUTO_BED_LEVELING_BILINEAR + _FIELD_TEST(planner_leveling_active); + #if ENABLED(AUTO_BED_LEVELING_UBL) EEPROM_WRITE(planner.leveling_active); EEPROM_WRITE(ubl.storage_slot); @@ -482,6 +505,7 @@ void MarlinSettings::postprocess() { // 11 floats for DELTA / [XYZ]_DUAL_ENDSTOPS #if ENABLED(DELTA) + _FIELD_TEST(delta_height); EEPROM_WRITE(delta_height); // 1 float EEPROM_WRITE(delta_endstop_adj); // 3 floats EEPROM_WRITE(delta_radius); // 1 float @@ -491,6 +515,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(delta_tower_angle_trim); // 3 floats #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + _FIELD_TEST(x_endstop_adj); // Write dual endstops in X, Y, Z order. Unused = 0.0 dummy = 0.0f; #if ENABLED(X_DUAL_ENDSTOPS) @@ -518,6 +543,8 @@ void MarlinSettings::postprocess() { for (uint8_t q = 11; q--;) EEPROM_WRITE(dummy); #endif + _FIELD_TEST(lcd_preheat_hotend_temp); + #if DISABLED(ULTIPANEL) constexpr int lcd_preheat_hotend_temp[2] = { PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND }, lcd_preheat_bed_temp[2] = { PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED }, @@ -567,6 +594,8 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(thermalManager.bedKd); #endif + _FIELD_TEST(lcd_contrast); + #if !HAS_LCD_CONTRAST const uint16_t lcd_contrast = 32; #endif @@ -592,6 +621,7 @@ void MarlinSettings::postprocess() { // // Volumetric & Filament Size // + _FIELD_TEST(parser_volumetric_enabled); #if DISABLED(NO_VOLUMETRICS) EEPROM_WRITE(parser.volumetric_enabled); @@ -614,6 +644,7 @@ void MarlinSettings::postprocess() { // // Save TMC2130 or TMC2208 Configuration, and placeholder values // + _FIELD_TEST(tmc_stepper_current); uint16_t currents[11] = { #if HAS_TRINAMIC #if X_IS_TRINAMIC @@ -702,7 +733,7 @@ void MarlinSettings::postprocess() { // // Linear Advance // - + _FIELD_TEST(planner_extruder_advance_k); #if ENABLED(LIN_ADVANCE) EEPROM_WRITE(planner.extruder_advance_k); EEPROM_WRITE(planner.advance_ed_ratio); @@ -722,7 +753,7 @@ void MarlinSettings::postprocess() { // // CNC Coordinate Systems // - + _FIELD_TEST(coordinate_system); #if ENABLED(CNC_COORDINATE_SYSTEMS) EEPROM_WRITE(coordinate_system); // 27 floats #else @@ -733,7 +764,7 @@ void MarlinSettings::postprocess() { // // Skew correction factors // - + _FIELD_TEST(planner_xy_skew_factor); #if ENABLED(SKEW_CORRECTION) EEPROM_WRITE(planner.xy_skew_factor); EEPROM_WRITE(planner.xz_skew_factor); @@ -746,6 +777,7 @@ void MarlinSettings::postprocess() { // // Advanced Pause filament load & unload lengths // + _FIELD_TEST(filament_change_unload_length); #if ENABLED(ADVANCED_PAUSE_FEATURE) for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q];