// Initialize all PG records from EEPROM. // This functions processes all PGs sequentially, scanning EEPROM for each one. This is suboptimal, // but each PG is loaded/initialized exactly once and in defined order. bool loadEEPROM(void) { // read in the transitional masterConfig record const uint8_t *p = &__config_start; p += sizeof(configHeader_t); // skip header masterConfig = *(master_t*)p; PG_FOREACH(reg) { configRecordFlags_e cls_start, cls_end; if (pgIsSystem(reg)) { cls_start = CR_CLASSICATION_SYSTEM; cls_end = CR_CLASSICATION_SYSTEM; } else { cls_start = CR_CLASSICATION_PROFILE1; cls_end = CR_CLASSICATION_PROFILE_LAST; } for (configRecordFlags_e cls = cls_start; cls <= cls_end; cls++) { int profileIndex = cls - cls_start; const configRecord_t *rec = findEEPROM(reg, cls); if (rec) { // config from EEPROM is available, use it to initialize PG. pgLoad will handle version mismatch pgLoad(reg, profileIndex, rec->pg, rec->size - offsetof(configRecord_t, pg), rec->version); } else { pgReset(reg, profileIndex); } } } return true; }
// Load a PG into RAM, upgrading and downgrading as needed. static bool loadPG(const configRecord_t *record) { const pgRegistry_t *reg = pgMatcher(pgMatcherForConfigRecord, record); if (reg == NULL) { return false; } uint8_t profileIndex = 0; if (!pgIsSystem(reg)) { profileIndex = (record->flags & CR_CLASSIFICATION_MASK) - 1; } pgLoad(reg, record->pg, record->size, profileIndex); return true; }