6 #ifndef ACE_UTILS_CRC_EEPROM_H
7 #define ACE_UTILS_CRC_EEPROM_H
9 #if ! defined(UNIX_HOST_DUINO)
15 #if !defined(AVR) && !defined(ESP8266) && !defined(ESP32) && \
17 #error Unsupported architecture
23 namespace crc_eeprom {
48 #if defined(ESP8266) || defined(ESP32)
53 void begin(uint16_t ) {
61 const uint16_t dataSize)
const {
62 uint16_t byteCount = dataSize;
63 const uint8_t* d = (
const uint8_t*) data;
66 while (byteCount-- > 0) {
67 write(address++, *d++);
71 uint32_t crc = FastCRC32().crc32((
const uint8_t*) data, dataSize);
74 write(address++, buf[0]);
75 write(address++, buf[1]);
76 write(address++, buf[2]);
77 write(address++, buf[3]);
79 bool success = commit();
80 return (success) ? dataSize +
sizeof(crc) : 0;
88 const uint16_t dataSize)
const {
89 uint16_t byteCount = dataSize;
90 uint8_t* d = (uint8_t*) data;
93 while (byteCount-- > 0) {
94 *d++ = read(address++);
99 buf[0] = read(address++);
100 buf[1] = read(address++);
101 buf[2] = read(address++);
102 buf[3] = read(address++);
104 memcpy(&crc, buf, 4);
106 uint32_t dataCrc = FastCRC32().crc32((
const uint8_t*) data, dataSize);
107 return crc == dataCrc;
111 void write(
int address, uint8_t val)
const {
112 #if defined(ESP8266) || defined(ESP32)
113 EEPROM.write(address, val);
115 EEPROM.update(address, val);
119 uint8_t read(
int address)
const {
120 return EEPROM.read(address);
123 bool commit()
const {
124 #if defined(ESP8266) || defined(ESP32)
125 return EEPROM.commit();