Exemplo n.º 1
0
// 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;
}
Exemplo n.º 2
0
// 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;
}