Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
2.5 KiB

/*
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);
}