37 EepromBase::counter +=
size();
68 if (m_backend == EepromSecureBackend::Preferences) {
70 #if defined(ESP32) && __has_include(<Preferences.h>)
71 return saveToPreferences();
76 return saveToEeprom();
86 bool load (
const T &defaultData = T()) {
91 if (m_backend == EepromSecureBackend::Preferences) {
93 #if defined(ESP32) && __has_include(<Preferences.h>)
94 loaded = loadFromPreferences (crc);
99 loaded = loadFromEeprom (crc);
103 m_data = defaultData;
110 if (m_crcEnabled && (m_crc.value () != crc)) {
111 m_data = defaultData;
125 m_crcEnabled = enabled;
150 return sizeof (T) +
sizeof (m_crc);
181 operator const T &()
const {
224 return m_data == rhs.m_data;
231 return ! (*
this == rhs);
235 bool saveToEeprom () {
236 EEPROM.put (m_eem, m_data);
237 EEPROM.write (m_eem +
sizeof (T), storedCrcValue());
238 #if defined(ESP32) || defined(ESP8266)
239 return EEPROM.commit();
245 bool loadFromEeprom (uint8_t &crc) {
246 EEPROM.get (m_eem, m_data);
247 crc = EEPROM.read (m_eem +
sizeof (T));
251 #if defined(ESP32) && __has_include(<Preferences.h>)
252 bool saveToPreferences () {
254 if (!prefs.begin (kNamespace,
false)) {
260 makeKeys (dataKey, crcKey,
sizeof (dataKey),
sizeof (crcKey));
262 size_t bytes = prefs.putBytes (dataKey, &m_data,
sizeof (T));
263 size_t crcBytes = prefs.putUChar (crcKey, storedCrcValue());
265 return (bytes ==
sizeof (T)) && (crcBytes == 1);
268 bool loadFromPreferences (uint8_t &crc) {
270 if (!prefs.begin (kNamespace,
true)) {
276 makeKeys (dataKey, crcKey,
sizeof (dataKey),
sizeof (crcKey));
278 size_t expected =
sizeof (T);
279 size_t storedLen = prefs.getBytesLength (dataKey);
280 if (storedLen != expected) {
285 size_t bytes = prefs.getBytes (dataKey, &m_data,
sizeof (T));
286 crc = prefs.getUChar (crcKey, kMissingCrcValue);
288 if (bytes !=
sizeof (T)) {
294 return crc != kMissingCrcValue;
297 void makeKeys (
char *dataKey,
char *crcKey,
size_t dataKeySize,
size_t crcKeySize)
const {
298 snprintf (dataKey, dataKeySize,
"d%u",
static_cast<unsigned> (m_eem));
299 snprintf (crcKey, crcKeySize,
"c%u",
static_cast<unsigned> (m_eem));
303 static EepromSecureBackend resolveBackend (EepromSecureBackend
backend) {
304 if (
backend == EepromSecureBackend::Auto) {
305 #if defined(ESP32) && __has_include(<Preferences.h>)
306 return EepromSecureBackend::Preferences;
308 return EepromSecureBackend::EEPROM;
312 #if defined(ESP32) && __has_include(<Preferences.h>)
315 if (
backend == EepromSecureBackend::Preferences) {
316 return EepromSecureBackend::EEPROM;
322 uint8_t storedCrcValue ()
const {
324 return kCrcDisabledValue;
326 return m_crc.value();
332 m_crc.update (m_data);
336 static constexpr const char *kNamespace =
"EepSecData";
337 static constexpr uint8_t kMissingCrcValue = 0xFF;
338 static constexpr uint8_t kCrcDisabledValue = 0xA5;
339 EepromSecureBackend m_backend;
343 CrcIButton <T> m_crc;