renamed eeprom-files and added migrator
This commit is contained in:
parent
7f6c486eab
commit
f48b5a09ed
4
Software/data_src/static/tt_dtc/dtc_13.json
Normal file
4
Software/data_src/static/tt_dtc/dtc_13.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"title": "EEPROM-Migration failed",
|
||||||
|
"description": "Migration of EEPROM-Image from an other FW-Version failed - you need to reset everything manually!"
|
||||||
|
}
|
@ -19,6 +19,7 @@ typedef enum DTCNums_e
|
|||||||
DTC_NO_BATMNON_FOUND,
|
DTC_NO_BATMNON_FOUND,
|
||||||
DTC_BAT_LOW,
|
DTC_BAT_LOW,
|
||||||
DTC_BAT_CRITICAL,
|
DTC_BAT_CRITICAL,
|
||||||
|
DTC_EEPROM_MIGRATE_FAILED,
|
||||||
DTC_LAST_DTC
|
DTC_LAST_DTC
|
||||||
} DTCNums_t;
|
} DTCNums_t;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#ifndef _CONFIG_H_
|
#ifndef _EEPROM_H_
|
||||||
#define _CONFIG_H_
|
#define _EEPROM_H_
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
@ -8,6 +8,7 @@
|
|||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "dtc.h"
|
#include "dtc.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
|
||||||
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC64
|
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC64
|
||||||
#define EEPROM_ENDURANCE 1000000
|
#define EEPROM_ENDURANCE 1000000
|
||||||
@ -38,25 +39,36 @@ typedef enum
|
|||||||
} batteryType_t;
|
} batteryType_t;
|
||||||
|
|
||||||
const char BatteryString[][10]{
|
const char BatteryString[][10]{
|
||||||
"Undefined",
|
"Undefined",
|
||||||
"LiPo 2S",
|
"LiPo 2S",
|
||||||
"LiPo 3S"
|
"LiPo 3S"};
|
||||||
};
|
|
||||||
|
|
||||||
const size_t BatteryString_Elements = sizeof(BatteryString) / sizeof(BatteryString[0]);
|
const size_t BatteryString_Elements = sizeof(BatteryString) / sizeof(BatteryString[0]);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t EEPROM_Version = 1;
|
uint8_t EEPROM_Version;
|
||||||
batteryType_t batteryType = BATTERY_UNDEFINED;
|
batteryType_t batteryType;
|
||||||
bool active_faction_on_reboot = false;
|
bool active_faction_on_reboot;
|
||||||
uint32_t checksum = 0;
|
char Faction_1_Name[32];
|
||||||
|
char Faction_2_Name[32];
|
||||||
|
char Faction_3_Name[32];
|
||||||
|
uint32_t checksum;
|
||||||
} configData_t;
|
} configData_t;
|
||||||
|
|
||||||
const configData_t ConfigData_defaults = {
|
const configData_t ConfigData_defaults = {
|
||||||
0, BATTERY_LIPO_3S, 0
|
2, // EEPROM_Version (incerease this if anything on Layout changes!)
|
||||||
|
BATTERY_LIPO_3S, // batteryType
|
||||||
|
false, // active_faction_on_reboot
|
||||||
|
"FACTION 1", // Faction_1_Name
|
||||||
|
"FACTION 2", // Faction_2_Name
|
||||||
|
"FACTION 3", // Faction_3_Name
|
||||||
|
0 // checksum
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const uint16_t startofConfigData = 16;
|
||||||
|
const uint16_t startofPersistence = 16 + sizeof(ConfigData) + (sizeof(ConfigData) % 16);
|
||||||
|
|
||||||
void InitEEPROM();
|
void InitEEPROM();
|
||||||
void EEPROM_Process();
|
void EEPROM_Process();
|
||||||
void StoreConfig_EEPROM();
|
void StoreConfig_EEPROM();
|
||||||
@ -72,4 +84,5 @@ uint32_t ConfigSanityCheck(bool autocorrect = false);
|
|||||||
|
|
||||||
extern configData_t ConfigData;
|
extern configData_t ConfigData;
|
||||||
extern persistenceData_t PersistenceData;
|
extern persistenceData_t PersistenceData;
|
||||||
#endif // _CONFIG_H_
|
|
||||||
|
#endif // _EEPROM_H_
|
@ -6,7 +6,7 @@
|
|||||||
#include <Adafruit_GFX.h>
|
#include <Adafruit_GFX.h>
|
||||||
#include <Adafruit_SSD1306.h>
|
#include <Adafruit_SSD1306.h>
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "config.h"
|
#include "eeprom.h"
|
||||||
|
|
||||||
#define OLED_SDA 4
|
#define OLED_SDA 4
|
||||||
#define OLED_SCL 15
|
#define OLED_SCL 15
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <AsyncJson.h>
|
#include <AsyncJson.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "eeprom.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "dtc.h"
|
#include "dtc.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@ -1,25 +1,27 @@
|
|||||||
#include "config.h"
|
#include "eeprom.h"
|
||||||
|
|
||||||
I2C_eeprom ee(0x50, EEPROM_SIZE_BYTES);
|
I2C_eeprom ee(0x50, EEPROM_SIZE_BYTES);
|
||||||
|
|
||||||
configData_t ConfigData;
|
configData_t ConfigData;
|
||||||
persistenceData_t PersistenceData;
|
persistenceData_t PersistenceData;
|
||||||
const uint16_t eeVersion = 1; // inc
|
bool eeAvailable = false;
|
||||||
boolean eeAvailable = false;
|
|
||||||
|
|
||||||
const uint16_t startofConfigData = 16;
|
bool checkEEPROMavailable();
|
||||||
const uint16_t startofPersistence = 16 + sizeof(ConfigData) + (sizeof(ConfigData) % 16);
|
bool ValidateEEPROM_Version();
|
||||||
|
bool MigrateEEPROM(uint8_t fromVersion);
|
||||||
boolean checkEEPROMavailable();
|
|
||||||
|
|
||||||
void InitEEPROM()
|
void InitEEPROM()
|
||||||
{
|
{
|
||||||
ee.begin();
|
ee.begin();
|
||||||
checkEEPROMavailable();
|
eeAvailable = checkEEPROMavailable();
|
||||||
|
eeAvailable = ValidateEEPROM_Version();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EEPROM_Process()
|
void EEPROM_Process()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (globals.requestEEAction)
|
switch (globals.requestEEAction)
|
||||||
{
|
{
|
||||||
case EE_CFG_SAVE:
|
case EE_CFG_SAVE:
|
||||||
@ -75,7 +77,8 @@ void StoreConfig_EEPROM()
|
|||||||
{
|
{
|
||||||
ConfigData.checksum = 0;
|
ConfigData.checksum = 0;
|
||||||
ConfigData.checksum = Checksum_EEPROM((uint8_t *)&ConfigData, sizeof(ConfigData));
|
ConfigData.checksum = Checksum_EEPROM((uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||||
if (!checkEEPROMavailable())
|
|
||||||
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ee.updateBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
ee.updateBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||||
@ -83,7 +86,7 @@ void StoreConfig_EEPROM()
|
|||||||
|
|
||||||
void GetConfig_EEPROM()
|
void GetConfig_EEPROM()
|
||||||
{
|
{
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ee.readBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
ee.readBlock(startofConfigData, (uint8_t *)&ConfigData, sizeof(ConfigData));
|
||||||
@ -108,23 +111,23 @@ void GetConfig_EEPROM()
|
|||||||
|
|
||||||
void StorePersistence_EEPROM()
|
void StorePersistence_EEPROM()
|
||||||
{
|
{
|
||||||
|
PersistenceData.checksum = 0;
|
||||||
|
PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||||
|
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
if (PersistenceData.writeCycleCounter >= 0xFFF0)
|
if (PersistenceData.writeCycleCounter >= 0xFFF0)
|
||||||
MovePersistencePage_EEPROM(false);
|
MovePersistencePage_EEPROM(false);
|
||||||
else
|
else
|
||||||
PersistenceData.writeCycleCounter++;
|
PersistenceData.writeCycleCounter++;
|
||||||
|
|
||||||
PersistenceData.checksum = 0;
|
|
||||||
PersistenceData.checksum = Checksum_EEPROM((uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
|
||||||
|
|
||||||
if (!checkEEPROMavailable())
|
|
||||||
return;
|
|
||||||
|
|
||||||
ee.updateBlock(globals.eePersistanceAdress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
ee.updateBlock(globals.eePersistanceAdress, (uint8_t *)&PersistenceData, sizeof(PersistenceData));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetPersistence_EEPROM()
|
void GetPersistence_EEPROM()
|
||||||
{
|
{
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ee.readBlock(0, (uint8_t *)&globals.eePersistanceAdress, sizeof(globals.eePersistanceAdress));
|
ee.readBlock(0, (uint8_t *)&globals.eePersistanceAdress, sizeof(globals.eePersistanceAdress));
|
||||||
@ -153,14 +156,19 @@ void GetPersistence_EEPROM()
|
|||||||
|
|
||||||
void FormatConfig_EEPROM()
|
void FormatConfig_EEPROM()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
Serial.println("Formatting Config-Partition");
|
Serial.println("Formatting Config-Partition");
|
||||||
ConfigData = ConfigData_defaults;
|
ConfigData = ConfigData_defaults;
|
||||||
ConfigData.EEPROM_Version = eeVersion;
|
|
||||||
StoreConfig_EEPROM();
|
StoreConfig_EEPROM();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormatPersistence_EEPROM()
|
void FormatPersistence_EEPROM()
|
||||||
{
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return;
|
||||||
|
|
||||||
Serial.println("Formatting Persistance-Partition");
|
Serial.println("Formatting Persistance-Partition");
|
||||||
memset(&PersistenceData, 0, sizeof(PersistenceData));
|
memset(&PersistenceData, 0, sizeof(PersistenceData));
|
||||||
StorePersistence_EEPROM();
|
StorePersistence_EEPROM();
|
||||||
@ -168,7 +176,7 @@ void FormatPersistence_EEPROM()
|
|||||||
|
|
||||||
void MovePersistencePage_EEPROM(boolean reset)
|
void MovePersistencePage_EEPROM(boolean reset)
|
||||||
{
|
{
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
globals.eePersistanceAdress = +sizeof(PersistenceData);
|
globals.eePersistanceAdress = +sizeof(PersistenceData);
|
||||||
@ -206,7 +214,7 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
|
|||||||
{
|
{
|
||||||
#define BLOCK_TO_LENGTH 16
|
#define BLOCK_TO_LENGTH 16
|
||||||
|
|
||||||
if (!checkEEPROMavailable())
|
if (eeAvailable == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
char ascii_buf[BLOCK_TO_LENGTH + 1];
|
char ascii_buf[BLOCK_TO_LENGTH + 1];
|
||||||
@ -236,15 +244,13 @@ void dumpEEPROM(uint16_t memoryAddress, uint16_t length)
|
|||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean checkEEPROMavailable()
|
bool checkEEPROMavailable()
|
||||||
{
|
{
|
||||||
if (!ee.isConnected())
|
if (!ee.isConnected())
|
||||||
{
|
{
|
||||||
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, true);
|
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, true);
|
||||||
globals.systemStatus = sysStat_Error;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
MaintainDTC(DTC_NO_EEPROM_FOUND, DTC_CRITICAL, false);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,4 +266,88 @@ uint32_t ConfigSanityCheck(bool autocorrect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return setting_reset_bits;
|
return setting_reset_bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidateEEPROM_Version()
|
||||||
|
{
|
||||||
|
if (eeAvailable == false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint8_t EEPROMVersionOnChip = ee.readByte(startofConfigData);
|
||||||
|
|
||||||
|
if (EEPROMVersionOnChip < ConfigData_defaults.EEPROM_Version)
|
||||||
|
{
|
||||||
|
Serial.printf("EEPROM Image Version is %d, but %d expected - trying to migrate\n");
|
||||||
|
if (!MigrateEEPROM(EEPROMVersionOnChip))
|
||||||
|
{
|
||||||
|
Serial.print("Error\n");
|
||||||
|
MaintainDTC(DTC_EEPROM_MIGRATE_FAILED, DTC_CRITICAL, true, EEPROMVersionOnChip);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.print("Success\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MigrateEEPROM(uint8_t fromVersion)
|
||||||
|
{
|
||||||
|
uint16_t persistanceMarker_onChip;
|
||||||
|
|
||||||
|
switch (fromVersion)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Version 1 EEPROM Layout: startAdress size (byte)
|
||||||
|
// const uint16_t startofConfigData = 16 16
|
||||||
|
// const uint16_t startofPersistence = 32 24
|
||||||
|
//
|
||||||
|
// typedef struct
|
||||||
|
// {
|
||||||
|
// uint8_t EEPROM_Version = 1; 16 1
|
||||||
|
// batteryType_t batteryType = BATTERY_UNDEFINED; 17 4
|
||||||
|
// bool active_faction_on_reboot = false; 21 1
|
||||||
|
// uint32_t checksum = 0; 22 4
|
||||||
|
// } configData_t;
|
||||||
|
//
|
||||||
|
// typedef struct offset
|
||||||
|
// {
|
||||||
|
// uint32_t writeCycleCounter = 0; 0 4
|
||||||
|
// uint32_t faction_1_timer = 0; 4 4
|
||||||
|
// uint32_t faction_2_timer = 0; 8 4
|
||||||
|
// uint32_t faction_3_timer = 0; 12 4
|
||||||
|
// factions_t activeFaction = NONE; 16 4
|
||||||
|
// uint32_t checksum = 0; 20 4
|
||||||
|
// } persistenceData_t;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
// Migrate Config-Data and set defaults for Values which doesn't exists in this earlier Version
|
||||||
|
ConfigData.EEPROM_Version = ConfigData_defaults.EEPROM_Version;
|
||||||
|
strncpy(ConfigData.Faction_1_Name, ConfigData_defaults.Faction_1_Name, sizeof(ConfigData.Faction_1_Name));
|
||||||
|
strncpy(ConfigData.Faction_2_Name, ConfigData_defaults.Faction_2_Name, sizeof(ConfigData.Faction_2_Name));
|
||||||
|
strncpy(ConfigData.Faction_3_Name, ConfigData_defaults.Faction_3_Name, sizeof(ConfigData.Faction_3_Name));
|
||||||
|
ee.readBlock(17, (uint8_t *)&ConfigData.batteryType, 4);
|
||||||
|
ee.readBlock(21, (uint8_t *)ConfigData.active_faction_on_reboot, 1);
|
||||||
|
|
||||||
|
// Migrate Persistance-Data
|
||||||
|
ee.readBlock(0, (uint8_t *)&persistanceMarker_onChip, sizeof(uint16_t));
|
||||||
|
if (persistanceMarker_onChip < startofPersistence)
|
||||||
|
{
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 0, (uint8_t *)PersistenceData.writeCycleCounter, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 4, (uint8_t *)PersistenceData.faction_1_timer, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 8, (uint8_t *)PersistenceData.faction_2_timer, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 12, (uint8_t *)PersistenceData.faction_3_timer, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 16, (uint8_t *)PersistenceData.activeFaction, 4);
|
||||||
|
ee.readBlock(persistanceMarker_onChip + 20, (uint8_t *)PersistenceData.checksum, 4);
|
||||||
|
MovePersistencePage_EEPROM(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user