#include "config.h" LubeConfig_t LubeConfig; persistenceData_t PersistenceData; uint16_t eePersistenceMarker = 0; uint16_t eeVersion = 0; // inc const uint16_t startofLubeConfig = sizeof(eePersistenceMarker); const uint16_t startofPersistence = sizeof(LubeConfig); void StoreConfig_EEPROM() { LubeConfig.checksum = 0; LubeConfig.checksum = Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)); EEPROM.begin(512); EEPROM.put(startofLubeConfig, LubeConfig); EEPROM.commit(); EEPROM.end(); } void GetConfig_EEPROM() { EEPROM.begin(512); EEPROM.get(startofLubeConfig, LubeConfig); EEPROM.end(); uint32_t checksum = LubeConfig.checksum; LubeConfig.checksum = 0; if (Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)) == checksum) Serial.printf("CFG EEPROM Checksum OK\n"); else Serial.printf("CFG EEPROM Checksum BAD\n"); LubeConfig.checksum = checksum; } void StorePersistence_EEPROM() { EEPROM.begin(512); if (PersistenceData.writeCycleCounter == 0xFFFF) { PersistenceData.writeCycleCounter = 0; eePersistenceMarker += sizeof(PersistenceData); EEPROM.put(0, eePersistenceMarker); } else { PersistenceData.writeCycleCounter++; } uint16_t PersistenceDataAddress = startofPersistence + eePersistenceMarker; PersistenceData.checksum = 0; PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)); EEPROM.put(PersistenceDataAddress, PersistenceData); EEPROM.commit(); EEPROM.end(); } void GetPersistence_EEPROM() { EEPROM.begin(512); EEPROM.get(0, eePersistenceMarker); uint16_t PersistenceDataAddress = startofPersistence + eePersistenceMarker; EEPROM.get(PersistenceDataAddress, PersistenceData); EEPROM.end(); uint32_t checksum = PersistenceData.checksum; PersistenceData.checksum = 0; if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) == checksum) { Serial.printf("Persistance EEPROM Checksum OK\n"); } else { Serial.printf("Persistance EEPROM Checksum BAD\n"); FormatPersistence_EEPROM(); } PersistenceData.checksum = checksum; } void FormatConfig_EEPROM() { LubeConfig_t defaults; LubeConfig = defaults; StoreConfig_EEPROM(); } void FormatPersistence_EEPROM() { persistenceData_t defaults; PersistenceData = defaults; eePersistenceMarker = 0; StorePersistence_EEPROM(); } uint32_t Checksum_EEPROM(uint8_t const *data, size_t len) { if (data == NULL) return 0; uint32_t crc = 0; while (len--) { crc ^= *data++; for (uint8_t k = 0; k < 8; k++) crc = crc & 1 ? (crc >> 1) ^ 0xb2 : crc >> 1; } return crc ^ 0xff; }