Browse Source

Better EEPROM read/write error handling

Scott Lahteine 7 years ago
parent
commit
492b68f8e3
1 changed files with 26 additions and 15 deletions
  1. 26
    15
      Marlin/configuration_store.cpp

+ 26
- 15
Marlin/configuration_store.cpp View File

188
       value++;
188
       value++;
189
     };
189
     };
190
   }
190
   }
191
+  bool eeprom_read_error;
191
   void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) {
192
   void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) {
192
     do {
193
     do {
193
       uint8_t c = eeprom_read_byte((unsigned char*)pos);
194
       uint8_t c = eeprom_read_byte((unsigned char*)pos);
194
-      *value = c;
195
+      if (!eeprom_read_error) *value = c;
195
       eeprom_checksum += c;
196
       eeprom_checksum += c;
196
       pos++;
197
       pos++;
197
       value++;
198
       value++;
203
   #define EEPROM_SKIP(VAR) eeprom_index += sizeof(VAR)
204
   #define EEPROM_SKIP(VAR) eeprom_index += sizeof(VAR)
204
   #define EEPROM_WRITE(VAR) _EEPROM_writeData(eeprom_index, (uint8_t*)&VAR, sizeof(VAR))
205
   #define EEPROM_WRITE(VAR) _EEPROM_writeData(eeprom_index, (uint8_t*)&VAR, sizeof(VAR))
205
   #define EEPROM_READ(VAR) _EEPROM_readData(eeprom_index, (uint8_t*)&VAR, sizeof(VAR))
206
   #define EEPROM_READ(VAR) _EEPROM_readData(eeprom_index, (uint8_t*)&VAR, sizeof(VAR))
207
+  #define EEPROM_ASSERT(TST,ERR) if () do{ SERIAL_ERROR_START; SERIAL_ERRORLNPGM(ERR); eeprom_read_error |= true; }while(0)
206
 
208
 
207
   /**
209
   /**
208
    * M500 - Store Configuration
210
    * M500 - Store Configuration
371
       EEPROM_WRITE(dummy);
373
       EEPROM_WRITE(dummy);
372
     }
374
     }
373
 
375
 
374
-    uint16_t final_checksum = eeprom_checksum,
375
-             eeprom_size = eeprom_index;
376
+    if (!eeprom_write_error) {
376
 
377
 
377
-    eeprom_index = EEPROM_OFFSET;
378
-    EEPROM_WRITE(version);
379
-    EEPROM_WRITE(final_checksum);
378
+      uint16_t final_checksum = eeprom_checksum,
379
+               eeprom_size = eeprom_index;
380
 
380
 
381
-    // Report storage size
382
-    SERIAL_ECHO_START;
383
-    SERIAL_ECHOPAIR("Settings Stored (", eeprom_size);
384
-    SERIAL_ECHOLNPGM(" bytes)");
381
+      // Write the EEPROM header
382
+      eeprom_index = EEPROM_OFFSET;
383
+      EEPROM_WRITE(version);
384
+      EEPROM_WRITE(final_checksum);
385
+
386
+      // Report storage size
387
+      SERIAL_ECHO_START;
388
+      SERIAL_ECHOPAIR("Settings Stored (", eeprom_size);
389
+      SERIAL_ECHOLNPGM(" bytes)");
390
+    }
385
   }
391
   }
386
 
392
 
387
   /**
393
   /**
390
   void Config_RetrieveSettings() {
396
   void Config_RetrieveSettings() {
391
 
397
 
392
     EEPROM_START();
398
     EEPROM_START();
399
+    eeprom_read_error = false; // If set EEPROM_READ won't write into RAM
393
 
400
 
394
     char stored_ver[4];
401
     char stored_ver[4];
395
     EEPROM_READ(stored_ver);
402
     EEPROM_READ(stored_ver);
568
       }
575
       }
569
 
576
 
570
       if (eeprom_checksum == stored_checksum) {
577
       if (eeprom_checksum == stored_checksum) {
571
-        Config_Postprocess();
572
-        SERIAL_ECHO_START;
573
-        SERIAL_ECHO(version);
574
-        SERIAL_ECHOPAIR(" stored settings retrieved (", eeprom_index);
575
-        SERIAL_ECHOLNPGM(" bytes)");
578
+        if (eeprom_read_error)
579
+          Config_ResetDefault();
580
+        else {
581
+          Config_Postprocess();
582
+          SERIAL_ECHO_START;
583
+          SERIAL_ECHO(version);
584
+          SERIAL_ECHOPAIR(" stored settings retrieved (", eeprom_index);
585
+          SERIAL_ECHOLNPGM(" bytes)");
586
+        }
576
       }
587
       }
577
       else {
588
       else {
578
         SERIAL_ERROR_START;
589
         SERIAL_ERROR_START;

Loading…
Cancel
Save