Reworked EEPROM-Handling by Flag

This commit is contained in:
Marcel Peterkau 2022-02-04 21:24:15 +01:00
parent 9571f5bbcc
commit 39fc8af955
6 changed files with 123 additions and 55 deletions

View File

@ -11,34 +11,48 @@ uint16_t eeVersion = 0; // inc
boolean eeAvailable = false; boolean eeAvailable = false;
const uint16_t startofLubeConfig = sizeof(eePersistenceMarker); const uint16_t startofLubeConfig = sizeof(eePersistenceMarker);
const uint16_t startofPersistence = sizeof(LubeConfig); const uint16_t startofPersistence = sizeof(LubeConfig) + sizeof(eePersistenceMarker);
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
void InitEEPROM() void InitEEPROM()
{ {
ee.begin(); ee.begin();
if (ee.isConnected()) if (!ee.isConnected())
{
eeAvailable = true;
Serial.println("EEPROM Initialized...");
}
else
{
Serial.println("ERROR: Can't find eeprom..."); Serial.println("ERROR: Can't find eeprom...");
}
} }
#endif #endif
void EEPROM_Process()
{
switch (globals.requestEEAction)
{
case EE_CFG_SAVE:
StoreConfig_EEPROM();
break;
case EE_CFG_LOAD:
GetConfig_EEPROM();
break;
case EE_PDS_SAVE:
StorePersistence_EEPROM();
break;
case EE_PDS_LOAD:
GetPersistence_EEPROM();
break;
case EE_IDLE:
default:
globals.requestEEAction = EE_IDLE;
}
}
void StoreConfig_EEPROM() void StoreConfig_EEPROM()
{ {
LubeConfig.checksum = 0; LubeConfig.checksum = 0;
LubeConfig.checksum = Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)); LubeConfig.checksum = Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig));
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
if (eeAvailable) if (!ee.isConnected())
{ return;
ee.updateBlock(startofLubeConfig, (uint8_t *)&LubeConfig, sizeof(LubeConfig)); ee.writeBlock(startofLubeConfig, (uint8_t *)&LubeConfig, sizeof(LubeConfig));
}
#else #else
EEPROM.begin(512); EEPROM.begin(512);
EEPROM.put(startofLubeConfig, LubeConfig); EEPROM.put(startofLubeConfig, LubeConfig);
@ -50,10 +64,9 @@ void StoreConfig_EEPROM()
void GetConfig_EEPROM() void GetConfig_EEPROM()
{ {
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
if (eeAvailable) if (!ee.isConnected())
{ return;
ee.readBlock(startofLubeConfig, (uint8_t *)&LubeConfig, sizeof(LubeConfig)); ee.readBlock(startofLubeConfig, (uint8_t *)&LubeConfig, sizeof(LubeConfig));
}
#else #else
EEPROM.begin(512); EEPROM.begin(512);
EEPROM.get(startofLubeConfig, LubeConfig); EEPROM.get(startofLubeConfig, LubeConfig);
@ -63,10 +76,11 @@ void GetConfig_EEPROM()
uint32_t checksum = LubeConfig.checksum; uint32_t checksum = LubeConfig.checksum;
LubeConfig.checksum = 0; LubeConfig.checksum = 0;
if (Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)) == checksum) if (Checksum_EEPROM((uint8_t *)&LubeConfig, sizeof(LubeConfig)) != checksum)
Serial.printf("CFG EEPROM Checksum OK\n"); {
else
Serial.printf("CFG EEPROM Checksum BAD\n"); Serial.printf("CFG EEPROM Checksum BAD\n");
FormatConfig_EEPROM();
}
LubeConfig.checksum = checksum; LubeConfig.checksum = checksum;
} }
@ -82,10 +96,9 @@ void StorePersistence_EEPROM()
PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)); PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData));
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
if (eeAvailable) if (!ee.isConnected())
{ return;
ee.updateBlock(PersistenceDataAddress, (uint8_t *)&PersistenceData, sizeof(PersistenceData)); ee.updateBlock(PersistenceDataAddress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
}
#else #else
EEPROM.put(PersistenceDataAddress, PersistenceData); EEPROM.put(PersistenceDataAddress, PersistenceData);
EEPROM.commit(); EEPROM.commit();
@ -96,24 +109,18 @@ void StorePersistence_EEPROM()
void GetPersistence_EEPROM() void GetPersistence_EEPROM()
{ {
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
if (eeAvailable) if (!ee.isConnected())
{ return;
eePersistenceMarker = (ee.readByte(0) << 8) | ee.readByte(1); eePersistenceMarker = (ee.readByte(0) << 8) | ee.readByte(1);
Serial.printf("get EE eePersistenceMarker: 0x%04X\n", eePersistenceMarker);
}
#else #else
EEPROM.begin(512); EEPROM.begin(512);
EEPROM.get(0, eePersistenceMarker); EEPROM.get(0, eePersistenceMarker);
#endif #endif
uint16_t PersistenceDataAddress = startofPersistence + eePersistenceMarker; uint16_t PersistenceDataAddress = startofPersistence + eePersistenceMarker;
Serial.printf("get EE PersistenceDataAddress: 0x%04X\n", PersistenceDataAddress);
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
if (eeAvailable) ee.readBlock(PersistenceDataAddress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
{
ee.readBlock(PersistenceDataAddress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
}
#else #else
EEPROM.get(PersistenceDataAddress, PersistenceData); EEPROM.get(PersistenceDataAddress, PersistenceData);
EEPROM.end(); EEPROM.end();
@ -122,11 +129,7 @@ void GetPersistence_EEPROM()
uint32_t checksum = PersistenceData.checksum; uint32_t checksum = PersistenceData.checksum;
PersistenceData.checksum = 0; PersistenceData.checksum = 0;
if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) == checksum) if (Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData)) != checksum)
{
Serial.printf("Persistance EEPROM Checksum OK\n");
}
else
{ {
Serial.printf("Persistance EEPROM Checksum BAD\n"); Serial.printf("Persistance EEPROM Checksum BAD\n");
FormatPersistence_EEPROM(); FormatPersistence_EEPROM();
@ -155,16 +158,14 @@ void MovePersistencePage_EEPROM(boolean reset)
PersistenceData.writeCycleCounter = 0; PersistenceData.writeCycleCounter = 0;
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
if (!ee.isConnected())
return;
ee.updateByte(0, (uint8_t)(eePersistenceMarker >> 8)); ee.updateByte(0, (uint8_t)(eePersistenceMarker >> 8));
ee.updateByte(1, (uint8_t)(eePersistenceMarker & 0xFF)); ee.updateByte(1, (uint8_t)(eePersistenceMarker & 0xFF));
#else #else
EEPROM.begin(512); EEPROM.begin(512);
EEPROM.put(0, eePersistenceMarker); EEPROM.put(0, eePersistenceMarker);
#endif #endif
Serial.printf("Moving PDS-Page\n");
Serial.printf("PersistenceData.writeCycleCounter: 0x%04X\n", PersistenceData.writeCycleCounter);
Serial.printf("eePersistenceMarker: 0x%04X\n", eePersistenceMarker);
Serial.printf("sizeof(PersistenceData): 0x%04X\n", sizeof(PersistenceData));
} }
uint32_t Checksum_EEPROM(uint8_t const *data, size_t len) uint32_t Checksum_EEPROM(uint8_t const *data, size_t len)
@ -183,8 +184,14 @@ uint32_t Checksum_EEPROM(uint8_t const *data, size_t len)
void dumpEEPROM(uint16_t memoryAddress, uint16_t length) void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
{ {
const int BLOCK_TO_LENGTH = 16; #define BLOCK_TO_LENGTH 16
Serial.print("\nAddr. ");
if (!ee.isConnected())
return;
char ascii_buf[BLOCK_TO_LENGTH + 1];
sprintf(ascii_buf, "%*s", BLOCK_TO_LENGTH, "ASCII");
Serial.print("\nAddress ");
for (int x = 0; x < BLOCK_TO_LENGTH; x++) for (int x = 0; x < BLOCK_TO_LENGTH; x++)
Serial.printf("%3d", x); Serial.printf("%3d", x);
@ -193,9 +200,17 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
for (unsigned int i = 0; i < length; i++) for (unsigned int i = 0; i < length; i++)
{ {
if (memoryAddress % BLOCK_TO_LENGTH == 0) int blockpoint = memoryAddress % BLOCK_TO_LENGTH;
if (blockpoint == 0)
{
ascii_buf[BLOCK_TO_LENGTH] = 0;
Serial.printf(" %s", ascii_buf);
Serial.printf("\n0x%05X:", memoryAddress); Serial.printf("\n0x%05X:", memoryAddress);
Serial.printf(" %02X", ee.readByte(memoryAddress)); }
ascii_buf[blockpoint] = ee.readByte(memoryAddress);
Serial.printf(" %02X", ascii_buf[blockpoint]);
if (ascii_buf[blockpoint] < 0x20 || ascii_buf[blockpoint] > 0x7E)
ascii_buf[blockpoint] = '.';
memoryAddress++; memoryAddress++;
} }
Serial.println(); Serial.println();

View File

@ -8,6 +8,7 @@
#else #else
#include <EEPROM.h> #include <EEPROM.h>
#endif #endif
#include "globals.h"
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC256 #define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC256
@ -89,6 +90,7 @@ typedef struct
#if PCB_REVISION >= 12 #if PCB_REVISION >= 12
void InitEEPROM(); void InitEEPROM();
#endif #endif
void EEPROM_Process();
void StoreConfig_EEPROM(); void StoreConfig_EEPROM();
void GetConfig_EEPROM(); void GetConfig_EEPROM();
void StorePersistence_EEPROM(); void StorePersistence_EEPROM();

View File

@ -13,13 +13,23 @@ typedef enum eSystem_Status
sysStat_Shutdown sysStat_Shutdown
} tSystem_Status; } tSystem_Status;
typedef enum eEERequest
{
EE_IDLE,
EE_CFG_SAVE,
EE_CFG_LOAD,
EE_PDS_SAVE,
EE_PDS_LOAD
} tEERequest;
typedef struct Globals_s { typedef struct Globals_s
{
tSystem_Status systemStatus = sysStat_Startup; tSystem_Status systemStatus = sysStat_Startup;
uint8_t purgePulses= 0; uint8_t purgePulses= 0;
tSystem_Status resumeStatus = sysStat_Startup; tSystem_Status resumeStatus = sysStat_Startup;
char systemStatustxt[16] = ""; char systemStatustxt[16] = "";
}Globals_t; eEERequest requestEEAction = EE_IDLE;
} Globals_t;
extern Globals_t globals; extern Globals_t globals;
extern uint32_t TravelDistance_highRes; extern uint32_t TravelDistance_highRes;

View File

@ -58,6 +58,8 @@ void RemoteDebug_formatPersistence();
void RemotDebug_printSystemInfo(); void RemotDebug_printSystemInfo();
void RemoteDebug_printWifiInfo(); void RemoteDebug_printWifiInfo();
void RemoteDebug_CheckEEPOM(); void RemoteDebug_CheckEEPOM();
void RemoteDebug_dumpConfig();
void RemoteDebug_dumpPersistance();
void updateWebUITicker_callback(); void updateWebUITicker_callback();
void IRAM_ATTR trigger_ISR(); void IRAM_ATTR trigger_ISR();
void LED_Process(uint8_t override = false, CRGB setColor = CRGB::White); void LED_Process(uint8_t override = false, CRGB setColor = CRGB::White);
@ -183,6 +185,7 @@ void loop()
Display_Process(); Display_Process();
Button_Process(); Button_Process();
LED_Process(); LED_Process();
EEPROM_Process();
ArduinoOTA.handle(); ArduinoOTA.handle();
Debug.handle(); Debug.handle();
@ -222,6 +225,12 @@ void processCmdRemoteDebug()
dumpEEPROM(0, EEPROM_SIZE_BYTES); dumpEEPROM(0, EEPROM_SIZE_BYTES);
else if (lastCmd == "resetPageEE") else if (lastCmd == "resetPageEE")
MovePersistencePage_EEPROM(true); MovePersistencePage_EEPROM(true);
else if (lastCmd == "dumpCFG")
RemoteDebug_dumpConfig();
else if (lastCmd == "dumpPDS")
RemoteDebug_dumpPersistance();
else if (lastCmd == "saveEE")
StoreConfig_EEPROM();
} }
void RemoteDebug_formatCFG() void RemoteDebug_formatCFG()
@ -258,6 +267,35 @@ void RemotDebug_printSystemInfo()
debugA("Git-Revison: %s", GIT_REV); debugA("Git-Revison: %s", GIT_REV);
} }
void RemoteDebug_dumpConfig()
{
debugA("DistancePerLube_Default: %d", LubeConfig.DistancePerLube_Default);
debugA("DistancePerLube_Rain: %d", LubeConfig.DistancePerLube_Rain);
debugA("tankCapacity_ml: %d", LubeConfig.tankCapacity_ml);
debugA("amountPerDose_µl: %d", LubeConfig.amountPerDose_µl);
debugA("TankRemindAtPercentage: %d", LubeConfig.TankRemindAtPercentage);
debugA("PulsePerRevolution: %d", LubeConfig.PulsePerRevolution);
debugA("TireWidth_mm: %d", LubeConfig.TireWidth_mm);
debugA("TireWidthHeight_Ratio: %d", LubeConfig.TireWidth_mm);
debugA("RimDiameter_Inch: %d", LubeConfig.RimDiameter_Inch);
debugA("DistancePerRevolution_mm: %d", LubeConfig.DistancePerRevolution_mm);
debugA("BleedingPulses: %d", LubeConfig.BleedingPulses);
debugA("SpeedSource: %d", LubeConfig.SpeedSource);
debugA("GPSBaudRate: %d", LubeConfig.GPSBaudRate);
#if PCB_REVISION == 13
debugA("CANSource: %d", LubeConfig.CANSource);
#endif
debugA("checksum: 0x%08X", LubeConfig.checksum);
}
void RemoteDebug_dumpPersistance()
{
debugA("writeCycleCounter: %d", PersistenceData.writeCycleCounter);
debugA("tankRemain_µl: %d", PersistenceData.tankRemain_µl);
debugA("distanceTraveled_m: %d", PersistenceData.distanceTraveled_m);
debugA("checksum: %d", PersistenceData.checksum);
}
void RemoteDebug_printWifiInfo() void RemoteDebug_printWifiInfo()
{ {
} }

View File

@ -3,6 +3,9 @@ const char helpCmd[] = "sysinfo - System Info\r\n"
"formatPDS - Format Persistence EEPROM Data\r\n" "formatPDS - Format Persistence EEPROM Data\r\n"
"formatCFG - Format Configuration EEPROM Data\r\n" "formatCFG - Format Configuration EEPROM Data\r\n"
"checkEE - Check EEPROM with checksum\r\n" "checkEE - Check EEPROM with checksum\r\n"
"dumpEE1k - This will dump the first 1kb of EEPROM to Serial\r\n" "dumpEE1k - dump the first 1kb of EEPROM to Serial\r\n"
"dumpEE - This will dump the whole EPPROM to Serial\r\n" "dumpEE - dump the whole EPPROM to Serial\r\n"
"resetPageEE - This will Reset the PersistenceData Page\r\n"; "resetPageEE - Reset the PersistenceData Page\r\n"
"dumpCFG - print Config struct\r\n"
"dumpPDS - print PersistanceStruct\r\n"
"saveEE - save EE-Data\r\n";

View File

@ -95,13 +95,13 @@ void buttons_Callback(Control *sender, int type)
if (sender->id == button_store) if (sender->id == button_store)
{ {
StoreConfig_EEPROM(); globals.requestEEAction = EE_CFG_SAVE;
ESPUI.print(label_storeStatus, "Successfully Stored Settings"); ESPUI.print(label_storeStatus, "Successfully Stored Settings");
} }
if (sender->id == button_reload) if (sender->id == button_reload)
{ {
GetConfig_EEPROM(); globals.requestEEAction = EE_CFG_LOAD;
ESPUI.print(label_storeStatus, "Successfully Reloaded Settings"); ESPUI.print(label_storeStatus, "Successfully Reloaded Settings");
} }
} }