114 lines
2.6 KiB
C++
Raw Normal View History

2022-01-09 20:51:16 +01:00
#include "config.h"
LubeConfig_t LubeConfig;
persistenceData_t PersistenceData;
uint16_t eePersistenceMarker = 0;
uint16_t eeVersion = 0; // inc
const uint16_t startofLubeConfig = sizeof(eePersistenceMarker);
const uint16_t startofPersistence = sizeof(LubeConfig);
2022-01-09 20:51:16 +01:00
void StoreConfig_EEPROM()
{
LubeConfig.checksum = 0;
LubeConfig.checksum = Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig));
EEPROM.begin(512);
EEPROM.put(startofLubeConfig, LubeConfig);
2022-01-09 20:51:16 +01:00
EEPROM.commit();
EEPROM.end();
}
void GetConfig_EEPROM()
{
EEPROM.begin(512);
EEPROM.get(startofLubeConfig, LubeConfig);
2022-01-09 20:51:16 +01:00
EEPROM.end();
uint32_t checksum = LubeConfig.checksum;
LubeConfig.checksum = 0;
if (Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)) == checksum)
Serial.printf("CFG EEPROM Checksum OK\n");
else
Serial.printf("CFG EEPROM Checksum BAD\n");
LubeConfig.checksum = checksum;
}
void StorePersistence_EEPROM()
{
EEPROM.begin(512);
if (PersistenceData.writeCycleCounter == 0xFFFF)
{
PersistenceData.writeCycleCounter = 0;
eePersistenceMarker += sizeof(PersistenceData);
EEPROM.put(0, eePersistenceMarker);
}
2022-01-09 20:51:16 +01:00
else
{
PersistenceData.writeCycleCounter++;
}
uint16_t PersistenceDataAddress = startofPersistence + eePersistenceMarker;
PersistenceData.checksum = 0;
PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData));
EEPROM.put(PersistenceDataAddress, PersistenceData);
EEPROM.commit();
EEPROM.end();
}
void GetPersistence_EEPROM()
{
EEPROM.begin(512);
EEPROM.get(0, eePersistenceMarker);
uint16_t PersistenceDataAddress = startofPersistence + eePersistenceMarker;
EEPROM.get(PersistenceDataAddress, PersistenceData);
EEPROM.end();
uint32_t checksum = PersistenceData.checksum;
PersistenceData.checksum = 0;
if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) == checksum)
{
Serial.printf("Persistance EEPROM Checksum OK\n");
}
else
{
Serial.printf("Persistance EEPROM Checksum BAD\n");
FormatPersistence_EEPROM();
}
PersistenceData.checksum = checksum;
}
void FormatConfig_EEPROM()
{
LubeConfig_t defaults;
LubeConfig = defaults;
StoreConfig_EEPROM();
}
void FormatPersistence_EEPROM()
{
persistenceData_t defaults;
PersistenceData = defaults;
eePersistenceMarker = 0;
StorePersistence_EEPROM();
2022-01-09 20:51:16 +01:00
}
uint32_t Checksum_EEPROM(uint8_t const *data, size_t len)
{
if (data == NULL)
return 0;
uint32_t crc = 0;
while (len--)
{
crc ^= *data++;
for (uint8_t k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ 0xb2 : crc >> 1;
}
return crc ^ 0xff;
}