52constexpr uint32_t
magic(
const char (&s)[5]) {
53 return (uint32_t)(uint8_t)s[0] | (uint32_t)(uint8_t)s[1] << 8 |
54 (uint32_t)(uint8_t)s[2] << 16 | (uint32_t)(uint8_t)s[3] << 24;
69const void *
read(uint32_t
magic, uint8_t version, uint16_t size, uint8_t *flag =
nullptr);
81bool write(uint32_t
magic, uint8_t version, uint16_t size, uint8_t flag = 0);
89template <
class T>
bool load(uint32_t
magic, uint8_t version, T &data, uint8_t *flag =
nullptr) {
90 static_assert(
sizeof(T) <=
MAX_DATA,
"save data must fit one flash page");
91 const T *p = (
const T *)
read(
magic, version,
sizeof(T), flag);
102template <
class T>
bool store(uint32_t
magic, uint8_t version,
const T &data, uint8_t flag = 0) {
103 static_assert(
sizeof(T) <=
MAX_DATA,
"save data must fit one flash page");
106 return write(
magic, version,
sizeof(T), flag);
Saved records: load, store, and the raw read/write underneath.
Definition Save.h:43
bool store(uint32_t magic, uint8_t version, const T &data, uint8_t flag=0)
Save a struct as a new record.
Definition Save.h:102
constexpr uint32_t magic(const char(&s)[5])
Four characters as a magic number ("CHCR" -> 0x52434843).
Definition Save.h:52
bool load(uint32_t magic, uint8_t version, T &data, uint8_t *flag=nullptr)
Load a struct from the newest valid record.
Definition Save.h:89
static const uint16_t MAX_DATA
The most data a record holds: a 256-byte page less the header and CRC.
Definition Save.h:46
void * buffer()
The page buffer to fill before write(): writing in place.
bool available()
Whether saving works in this image.
const void * read(uint32_t magic, uint8_t version, uint16_t size, uint8_t *flag=nullptr)
Find the newest valid record.
bool write(uint32_t magic, uint8_t version, uint16_t size, uint8_t flag=0)
Write what is in buffer() as a new record, to the older page.