Reset the entire config when parameter groups have changed.

This commit is contained in:
mikeller 2018-05-27 19:51:26 +12:00
parent 1ab7b7816b
commit 464da66ee1
7 changed files with 35 additions and 19 deletions

View File

@ -95,7 +95,7 @@ void initEEPROM(void)
}
// Scan the EEPROM config. Returns true if the config is valid.
bool isEEPROMContentValid(void)
bool isEEPROMStructureValid(void)
{
const uint8_t *p = &__config_start;
const configHeader_t *header = (const configHeader_t *)p;
@ -176,16 +176,23 @@ static const configRecord_t *findEEPROM(const pgRegistry_t *reg, configRecordFla
// but each PG is loaded/initialized exactly once and in defined order.
bool loadEEPROM(void)
{
bool success = true;
PG_FOREACH(reg) {
const configRecord_t *rec = findEEPROM(reg, CR_CLASSICATION_SYSTEM);
if (rec) {
// config from EEPROM is available, use it to initialize PG. pgLoad will handle version mismatch
pgLoad(reg, rec->pg, rec->size - offsetof(configRecord_t, pg), rec->version);
if (!pgLoad(reg, rec->pg, rec->size - offsetof(configRecord_t, pg), rec->version)) {
success = false;
}
} else {
pgReset(reg);
success = false;
}
}
return true;
return success;
}
static bool writeSettingsToEEPROM(void)
@ -247,7 +254,7 @@ void writeConfigToEEPROM(void)
}
}
if (success && isEEPROMContentValid()) {
if (success && isEEPROMStructureValid()) {
return;
}

View File

@ -25,7 +25,7 @@
#define EEPROM_CONF_VERSION 169
bool isEEPROMContentValid(void);
bool isEEPROMStructureValid(void);
bool loadEEPROM(void);
void writeConfigToEEPROM(void);
uint16_t getEEPROMConfigSize(void);

View File

@ -454,16 +454,14 @@ void validateAndFixGyroConfig(void)
}
#endif // USE_OSD_SLAVE
void readEEPROM(void)
bool readEEPROM(void)
{
#ifndef USE_OSD_SLAVE
suspendRxSignal();
#endif
// Sanity check, read flash
if (!loadEEPROM()) {
failureMode(FAILURE_INVALID_EEPROM_CONTENTS);
}
bool success = loadEEPROM();
validateAndFixConfig();
activateConfig();
@ -471,6 +469,8 @@ void readEEPROM(void)
#ifndef USE_OSD_SLAVE
resumeRxSignal();
#endif
return success;
}
void writeEEPROM(void)
@ -489,12 +489,16 @@ void writeEEPROM(void)
void resetEEPROM(void)
{
resetConfigs();
validateAndFixConfig();
activateConfig();
writeEEPROM();
}
void ensureEEPROMContainsValidData(void)
void ensureEEPROMStructureIsValid(void)
{
if (isEEPROMContentValid()) {
if (isEEPROMStructureValid()) {
return;
}
resetEEPROM();

View File

@ -60,9 +60,9 @@ void setPreferredBeeperOffMask(uint32_t mask);
void initEEPROM(void);
void resetEEPROM(void);
void readEEPROM(void);
bool readEEPROM(void);
void writeEEPROM(void);
void ensureEEPROMContainsValidData(void);
void ensureEEPROMStructureIsValid(void);
void saveConfigAndNotify(void);
void validateAndFixGyroConfig(void);

View File

@ -237,12 +237,13 @@ void init(void)
initEEPROM();
ensureEEPROMContainsValidData();
readEEPROM();
ensureEEPROMStructureIsValid();
bool readSuccess = readEEPROM();
// !!TODO: Check to be removed when moving to generic targets
if (strncasecmp(systemConfig()->boardIdentifier, TARGET_BOARD_IDENTIFIER, sizeof(TARGET_BOARD_IDENTIFIER))) {
if (!readSuccess || strncasecmp(systemConfig()->boardIdentifier, TARGET_BOARD_IDENTIFIER, sizeof(TARGET_BOARD_IDENTIFIER))) {
resetEEPROM();
activateConfig();
}
systemState |= SYSTEM_STATE_CONFIG_LOADED;

View File

@ -72,14 +72,18 @@ bool pgResetCopy(void *copy, pgn_t pgn)
return false;
}
void pgLoad(const pgRegistry_t* reg, const void *from, int size, int version)
bool pgLoad(const pgRegistry_t* reg, const void *from, int size, int version)
{
pgResetInstance(reg, pgOffset(reg));
// restore only matching version, keep defaults otherwise
if (version == pgVersion(reg)) {
const int take = MIN(size, pgSize(reg));
memcpy(pgOffset(reg), from, take);
return true;
}
return false;
}
int pgStore(const pgRegistry_t* reg, void *to, int size)

View File

@ -187,7 +187,7 @@ extern const uint8_t __pg_resetdata_end[];
const pgRegistry_t* pgFind(pgn_t pgn);
void pgLoad(const pgRegistry_t* reg, const void *from, int size, int version);
bool pgLoad(const pgRegistry_t* reg, const void *from, int size, int version);
int pgStore(const pgRegistry_t* reg, void *to, int size);
void pgResetAll(void);
void pgResetInstance(const pgRegistry_t *reg, uint8_t *base);