6 #ifndef ACE_UTILS_CRC_EEPROM_CRC_EEPROM_H
7 #define ACE_UTILS_CRC_EEPROM_CRC_EEPROM_H
10 #include "EepromInterface.h"
13 namespace crc_eeprom {
27 constexpr uint32_t toContextId(
char a,
char b,
char c,
char d) {
28 return ((uint32_t) d << 24)
29 | ((uint32_t) c << 16)
41 constexpr
size_t toSavedSize(
size_t dataSize) {
54 typedef uint32_t (*Crc32Calculator)(
const void* data,
size_t dataSize);
86 template <
typename>
class T_EI,
118 uint32_t contextId = 0,
120 Crc32Calculator crcCalc = ace_crc::crc32_nibblem::crc_calculate
122 Crc32Calculator crcCalc = ace_crc::crc32_nibble::crc_calculate
126 mContextId(contextId),
127 mCrc32Calculator(crcCalc)
137 template <
typename T>
149 template <
typename T>
159 const size_t address0 = address;
162 writeData(address, (
const uint8_t*) &mContextId,
sizeof(mContextId));
163 address +=
sizeof(mContextId);
166 writeData(address, (
const uint8_t*) data, dataSize);
170 uint32_t crc = (*mCrc32Calculator)(data, dataSize);
171 writeData(address, (
const uint8_t*) &crc,
sizeof(crc));
172 address +=
sizeof(crc);
174 bool success = commit();
175 return (success) ? address - address0: 0;
185 uint32_t retrievedContextId;
186 readData(address, (uint8_t*) &retrievedContextId,
187 sizeof(retrievedContextId));
188 if (retrievedContextId != mContextId)
return false;
189 address +=
sizeof(retrievedContextId);
192 readData(address, (uint8_t*) data, dataSize);
196 uint32_t retrievedCrc;
197 readData(address, (uint8_t*) &retrievedCrc,
sizeof(retrievedCrc));
198 address +=
sizeof(retrievedCrc);
201 uint32_t expectedCrc = (*mCrc32Calculator)(data, dataSize);
202 return expectedCrc == retrievedCrc;
206 void write(
size_t address, uint8_t val) {
207 mEeprom.write(address, val);
210 uint8_t read(
size_t address)
const {
return mEeprom.read(address); }
212 bool commit() {
return mEeprom.commit(); }
214 void writeData(
size_t address,
const uint8_t* data,
size_t size) {
216 write(address++, *data++);
220 void readData(
size_t address, uint8_t* data,
size_t size)
const {
222 *data++ = read(address++);
228 uint32_t
const mContextId;
229 Crc32Calculator
const mCrc32Calculator;
233 template <
typename T_E>
238 uint32_t contextId = 0,
240 Crc32Calculator crcCalc = ace_crc::crc32_nibblem::crc_calculate
242 Crc32Calculator crcCalc = ace_crc::crc32_nibble::crc_calculate
251 template <
typename T_E>
256 uint32_t contextId = 0,
258 Crc32Calculator crcCalc = ace_crc::crc32_nibblem::crc_calculate
260 Crc32Calculator crcCalc = ace_crc::crc32_nibble::crc_calculate
Version of CrcEeprom specialized for an AvrStyleEeprom.
Version of CrcEeprom specialized for an EspStyleEeprom.
Thin wrapper around the EEPROM object (from the the built-in EEPROM library) to read and write a give...
size_t writeWithCrc(size_t address, const T &data)
Convenience method that writes the given data of type T at given address.
bool readDataWithCrc(size_t address, void *data, size_t dataSize) const
Read the data from EEPROM along with its CRC and contextId.
size_t writeDataWithCrc(size_t address, const void *data, size_t dataSize)
Write the data with its CRC and its contextId.
CrcEeprom(T_E &eeprom, uint32_t contextId=0, Crc32Calculator crcCalc=ace_crc::crc32_nibblem::crc_calculate)
Constructor with an optional contextId identifier and an optional Crc32Calculator crcCalc function po...
bool readWithCrc(size_t address, T &data) const
Convenience function that reads the given data of type T at given address.