- /*
-
- EEPROM MODULE
-
- */
-
- #pragma once
-
- #include <Arduino.h>
- #include <EEPROM_Rotate.h>
-
- // "The library uses 3 bytes to track last valid sector, so there must be at least 3"
- // Reserve addresses 11, 12 and 13 for EEPROM_Rotate
- constexpr int EepromRotateOffset = 11;
- constexpr size_t EepromRotateReservedSize = 3;
-
- // Backwards compatibility requires us to reserve up to the offset + it's size
- // *The* main reason right now is EEPROM_Rotate crc bytes, the rest is not used
- // (but, might be in the future?)
- constexpr size_t EepromReservedSize = 14;
-
- constexpr size_t EepromSize = SPI_FLASH_SEC_SIZE;
-
- bool eepromReady();
-
- void eepromSectorsDebug();
- void eepromRotate(bool value);
-
- uint32_t eepromCurrent();
- String eepromSectors();
-
- unsigned long eepromSpace();
-
- void eepromClear();
- void eepromBackup(uint32_t index);
-
- void eepromForceCommit();
- void eepromCommit();
-
- void eepromSetup();
-
- // Implementation is inline right here, since we want to avoid chaining too much functions to simply access the EEPROM object
- // (which is already hidden via the subclassing...)
-
- // TODO: note that EEPROM is a `char` storage, but we have some helper methods to write up to 4 bytes at once
- // TODO: note that SPI flash is an `int32_t` storage, might want to optimize for that? write will happen in bulk anyway, perhaps does not matter much
-
- extern EEPROM_Rotate EEPROMr;
-
- inline unsigned long eepromSpace() {
- return EEPROMr.reserved() * SPI_FLASH_SEC_SIZE;
- }
-
- inline void eepromClear() {
- auto* ptr = EEPROMr.getDataPtr();
- std::fill(ptr + EepromReservedSize, ptr + EepromSize, 0xFF);
- EEPROMr.commit();
- }
-
- inline uint8_t eepromRead(int address) {
- return EEPROMr.read(address);
- }
-
- inline void eepromWrite(int address, unsigned char value) {
- EEPROMr.write(address, value);
- }
-
- inline void eepromGet(int address, unsigned char& value) {
- EEPROMr.get(address, value);
- }
-
- inline void eepromGet(int address, unsigned short& value) {
- EEPROMr.get(address, value);
- }
-
- inline void eepromGet(int address, unsigned int& value) {
- EEPROMr.get(address, value);
- }
-
- inline void eepromGet(int address, unsigned long& value) {
- EEPROMr.get(address, value);
- }
-
- inline void eepromPut(int address, unsigned char value) {
- EEPROMr.put(address, value);
- }
-
- inline void eepromPut(int address, unsigned short value) {
- EEPROMr.put(address, value);
- }
-
- inline void eepromPut(int address, unsigned int value) {
- EEPROMr.put(address, value);
- }
-
- inline void eepromPut(int address, unsigned long value) {
- EEPROMr.put(address, value);
- }
|