AceUtils  0.5.0
Useful Arduino utilties which are too small as separate libraries, but complex enough to be shared among multiple projects, and often have external dependencies to other libraries.
CrcEeprom.h
1 /*
2  * MIT License
3  * Copyright (c) 2018 Brian T. Park
4  */
5 
6 #ifndef ACE_UTILS_CRC_EEPROM_H
7 #define ACE_UTILS_CRC_EEPROM_H
8 
9 #include <AceCRC.h> // crc32_nibble
10 
11 namespace ace_utils {
12 namespace crc_eeprom {
13 
25  public:
30  virtual void begin(size_t size) = 0;
31 
33  virtual void write(size_t address, uint8_t val) = 0;
34 
36  virtual uint8_t read(size_t address) const = 0;
37 
39  virtual bool commit() = 0;
40 };
41 
46 template <typename E>
48  public:
50  AvrEepromAdapter(E &eeprom)
51  : mEeprom(eeprom)
52  {}
53 
54  virtual void begin(size_t size) {
55  (void) size; // disable compiler warning
56  }
57 
58  virtual void write(size_t address, uint8_t val) {
59  mEeprom.update(address, val);
60  }
61 
62  virtual uint8_t read(size_t address) const {
63  return mEeprom.read(address);
64  }
65 
66  virtual bool commit() {
67  return true;
68  }
69 
70  private:
71  E& mEeprom;
72 };
73 
78 template <typename E>
80  public:
82  EspEepromAdapter(E &eeprom)
83  : mEeprom(eeprom)
84  {}
85 
86  virtual void begin(size_t size) {
87  mEeprom.begin(size);
88  }
89 
90  virtual uint8_t read(size_t address) const {
91  return mEeprom.read(address);
92  }
93 
94  virtual void write(size_t address, uint8_t val) {
95  mEeprom.write(address, val);
96  }
97 
98  virtual bool commit() {
99  return mEeprom.commit();
100  }
101 
102  private:
103  E& mEeprom;
104 };
105 
130 class CrcEeprom {
131  public:
137  typedef uint32_t (*Crc32Calculator)(const void* data, size_t dataSize);
138 
145  static constexpr uint32_t toContextId(char a, char b, char c, char d) {
146  return ((uint32_t) d << 24)
147  | ((uint32_t) c << 16)
148  | ((uint32_t) b << 8)
149  | a;
150  }
151 
157  static constexpr size_t toSavedSize(size_t dataSize) {
158  return dataSize + 8;
159  }
160 
184  explicit CrcEeprom(
185  IEepromAdapter& eepromAdapter,
186  uint32_t contextId = 0,
187  #if defined(ESP8266)
188  Crc32Calculator crcCalc = ace_crc::crc32_nibblem::crc_calculate
189  #else
190  Crc32Calculator crcCalc = ace_crc::crc32_nibble::crc_calculate
191  #endif
192  ) :
193  mEepromAdapter(eepromAdapter),
194  mContextId(contextId),
195  mCrc32Calculator(crcCalc)
196  {}
197 
203  void begin(size_t size) {
204  mEepromAdapter.begin(size);
205  }
206 
214  template<typename T>
215  size_t writeWithCrc(size_t address, const T& data) {
216  return writeDataWithCrc(address, &data, sizeof(T));
217  }
218 
226  template<typename T>
227  bool readWithCrc(size_t address, T& data) const {
228  return readDataWithCrc(address, &data, sizeof(T));
229  }
230 
235  size_t writeDataWithCrc(size_t address, const void* data, size_t dataSize);
236 
242  bool readDataWithCrc(size_t address, void* data, size_t dataSize) const;
243 
244  private:
245  void write(size_t address, uint8_t val) {
246  mEepromAdapter.write(address, val);
247  }
248 
249  uint8_t read(size_t address) const { return mEepromAdapter.read(address); }
250 
251  bool commit() { return mEepromAdapter.commit(); }
252 
253  void writeData(size_t address, const uint8_t* data, size_t size) {
254  while (size--) {
255  write(address++, *data++);
256  }
257  }
258 
259  void readData(size_t address, uint8_t* data, size_t size) const {
260  while (size--) {
261  *data++ = read(address++);
262  }
263  }
264 
265  private:
266  IEepromAdapter& mEepromAdapter;
267  uint32_t const mContextId;
268  Crc32Calculator const mCrc32Calculator;
269 };
270 
271 } // crc_eeprom
272 } // ace_utils
273 
274 #endif // defined(ACE_UTILS_CRC_EEPROM_H)
ace_utils::crc_eeprom::CrcEeprom::writeWithCrc
size_t writeWithCrc(size_t address, const T &data)
Convenience method that writes the given data of type T at given address.
Definition: CrcEeprom.h:215
ace_utils::crc_eeprom::CrcEeprom::begin
void begin(size_t size)
Initialize the underlying eepromAdapter with the given size.
Definition: CrcEeprom.h:203
ace_utils::crc_eeprom::AvrEepromAdapter::AvrEepromAdapter
AvrEepromAdapter(E &eeprom)
Wrap around an AVR-flavored EEPROM object.
Definition: CrcEeprom.h:50
ace_utils::crc_eeprom::EspEepromAdapter::write
virtual void write(size_t address, uint8_t val)
Write thte byte at address, potentially buffered.
Definition: CrcEeprom.h:94
ace_utils::crc_eeprom::IEepromAdapter::begin
virtual void begin(size_t size)=0
Initialize the size of the EEPROM space.
ace_utils::crc_eeprom::CrcEeprom::writeDataWithCrc
size_t writeDataWithCrc(size_t address, const void *data, size_t dataSize)
Write the data with its CRC and its contextId.
Definition: CrcEeprom.cpp:11
ace_utils::crc_eeprom::CrcEeprom::toSavedSize
static constexpr size_t toSavedSize(size_t dataSize)
Return the actual number of bytes saved to EEPROM for the given dataSize.
Definition: CrcEeprom.h:157
ace_utils::crc_eeprom::CrcEeprom::toContextId
static constexpr uint32_t toContextId(char a, char b, char c, char d)
Convert 4 characters into a uint32_t contextId Example ‘toContextId('d’, 'e', 'm',...
Definition: CrcEeprom.h:145
ace_utils::crc_eeprom::CrcEeprom::CrcEeprom
CrcEeprom(IEepromAdapter &eepromAdapter, 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...
Definition: CrcEeprom.h:184
ace_utils::crc_eeprom::CrcEeprom::Crc32Calculator
uint32_t(* Crc32Calculator)(const void *data, size_t dataSize)
Function pointer to the CRC32 calculator.
Definition: CrcEeprom.h:137
ace_utils::crc_eeprom::AvrEepromAdapter
A wrapper class around an EEPROM class that follows the AVR-style API.
Definition: CrcEeprom.h:47
ace_utils::crc_eeprom::EspEepromAdapter::EspEepromAdapter
EspEepromAdapter(E &eeprom)
Wrap around an ESP-flavored EEPROM object.
Definition: CrcEeprom.h:82
ace_utils::crc_eeprom::EspEepromAdapter::commit
virtual bool commit()
Flush the buffer if it is used.
Definition: CrcEeprom.h:98
ace_utils::crc_eeprom::EspEepromAdapter
A wrapper class around an EEPROM class that follows the ESP-style API.
Definition: CrcEeprom.h:79
ace_utils::crc_eeprom::AvrEepromAdapter::write
virtual void write(size_t address, uint8_t val)
Write thte byte at address, potentially buffered.
Definition: CrcEeprom.h:58
ace_utils::crc_eeprom::IEepromAdapter::read
virtual uint8_t read(size_t address) const =0
Return the byte at address.
ace_utils::crc_eeprom::EspEepromAdapter::read
virtual uint8_t read(size_t address) const
Return the byte at address.
Definition: CrcEeprom.h:90
ace_utils::crc_eeprom::IEepromAdapter::write
virtual void write(size_t address, uint8_t val)=0
Write thte byte at address, potentially buffered.
ace_utils::crc_eeprom::CrcEeprom::readDataWithCrc
bool readDataWithCrc(size_t address, void *data, size_t dataSize) const
Read the data from EEPROM along with its CRC and contextId.
Definition: CrcEeprom.cpp:35
ace_utils::crc_eeprom::IEepromAdapter
The base EEPROM API used by CrcEeprom class.
Definition: CrcEeprom.h:24
ace_utils::crc_eeprom::CrcEeprom
Thin wrapper around the EEPROM object (from the the built-in EEPROM library) to read and write a give...
Definition: CrcEeprom.h:130
ace_utils::crc_eeprom::CrcEeprom::readWithCrc
bool readWithCrc(size_t address, T &data) const
Convenience function that reads the given data of type T at given address.
Definition: CrcEeprom.h:227
ace_utils::crc_eeprom::IEepromAdapter::commit
virtual bool commit()=0
Flush the buffer if it is used.
ace_utils::crc_eeprom::AvrEepromAdapter::read
virtual uint8_t read(size_t address) const
Return the byte at address.
Definition: CrcEeprom.h:62
ace_utils::crc_eeprom::AvrEepromAdapter::begin
virtual void begin(size_t size)
Initialize the size of the EEPROM space.
Definition: CrcEeprom.h:54
ace_utils::crc_eeprom::AvrEepromAdapter::commit
virtual bool commit()
Flush the buffer if it is used.
Definition: CrcEeprom.h:66
ace_utils::crc_eeprom::EspEepromAdapter::begin
virtual void begin(size_t size)
Initialize the size of the EEPROM space.
Definition: CrcEeprom.h:86