#include <EEPROM.h>
#define PRESET_VERSION 3
#define PRESET_VERSION_ADDR 0
#define PRESET_DATA_ADDR 4
static uint8_t preset_data[104];
static uint8_t preset_data_copy[104];
void PresetInit(void)
{
memset((void *)preset_data, 1, sizeof(preset_data));
}
//================================================================================
void setup(void)
{
Serial.begin(9600);
delay(500);
for (int i = 0; i < 20; i++)
{
Serial.println();
}
Serial.println("Serial Initialized");
// Only read preset from EEPROM if we know what version it is
uint8_t byte = EEPROM.read(PRESET_VERSION_ADDR);
Serial.println("preset version");
Serial.println(byte);
Serial.print("preset data size: ");
Serial.println(sizeof(preset_data));
// Compare stored preset version without currently expected version.
// If they are the same, read the data into memory.
// If they are not the same, re-write EEPROM with current version and data format
if (byte == PRESET_VERSION)
{
EEPROM.get(PRESET_DATA_ADDR, preset_data);
}
else
{
Serial.println("EEPROM DATA CORRUPTION DETECTED at power on, reformatting.");
EEPROM.get(PRESET_DATA_ADDR, preset_data);
uint8_t *data_ptr = (uint8_t *)preset_data;
for (uint8_t i = 0; i < sizeof(preset_data); i++)
{
Serial.print(*data_ptr); Serial.print(" ");
data_ptr++;
}
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
Serial.println("Reformatting preset in EEPROM...");
PresetInit();
EEPROM.write(PRESET_VERSION_ADDR, PRESET_VERSION);
EEPROM.put(PRESET_DATA_ADDR, preset_data);
delay(5000);
}
}
void loop()
{
static bool data_was_saved = false;
// Write data to EEPROM and do read-back/compare peridically to test.
if (!data_was_saved)
{
Serial.println("Data to write:");
uint8_t *data_ptr = (uint8_t *)preset_data;
for (uint8_t i = 0; i < sizeof(preset_data); i++)
{
Serial.print(*data_ptr); Serial.print(" ");
data_ptr++;
}
Serial.println(" ");
EEPROM.put(PRESET_DATA_ADDR, preset_data);
Serial.println("saved preset");
EEPROM.get(PRESET_DATA_ADDR, preset_data_copy);
Serial.println("Data read back:");
data_ptr = (uint8_t *)&preset_data_copy;
for (uint8_t i = 0; i < sizeof(preset_data_copy); i++)
{
Serial.print(*data_ptr); Serial.print(" ");
data_ptr++;
}
Serial.println(" ");
Serial.println(" ");
uint8_t byte = EEPROM.read(PRESET_VERSION_ADDR);
Serial.print("read back preset version: ");
Serial.println(byte);
if (byte != PRESET_VERSION)
{
Serial.println("EEPROM DATA CORRUPTION DETECTED after write.");
}
data_was_saved = true;
Serial.println("Halting test");
}
}