Add FIELD_TEST to validate storage
This commit is contained in:
		| @@ -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]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user