void readEEPROM(void) { uint8_t i; // Sanity check if (!validEEPROM()) failureMode(10); // Read flash memcpy(&mcfg, (char *)FLASH_WRITE_ADDR, sizeof(master_t)); // Copy current profile if (mcfg.current_profile > 2) // sanity check mcfg.current_profile = 0; memcpy(&cfg, &mcfg.profile[mcfg.current_profile], sizeof(config_t)); for (i = 0; i < 6; i++) lookupPitchRollRC[i] = (2500 + cfg.rcExpo8 * (i * i - 25)) * i * (int32_t) cfg.rcRate8 / 2500; for (i = 0; i < 11; i++) { int16_t tmp = 10 * i - cfg.thrMid8; uint8_t y = 1; if (tmp > 0) y = 100 - cfg.thrMid8; if (tmp < 0) y = cfg.thrMid8; lookupThrottleRC[i] = 10 * cfg.thrMid8 + tmp * (100 - cfg.thrExpo8 + (int32_t) cfg.thrExpo8 * (tmp * tmp) / (y * y)) / 10; // [0;1000] lookupThrottleRC[i] = mcfg.minthrottle + (int32_t) (mcfg.maxthrottle - mcfg.minthrottle) * lookupThrottleRC[i] / 1000; // [0;1000] -> [MINTHROTTLE;MAXTHROTTLE] } cfg.tri_yaw_middle = constrain(cfg.tri_yaw_middle, cfg.tri_yaw_min, cfg.tri_yaw_max); //REAR setPIDController(cfg.pidController); }
void writeEEPROM(uint8_t b, uint8_t updateProfile) { FLASH_Status status; uint32_t i; uint8_t chk = 0; const uint8_t *p; int tries = 0; // prepare checksum/version constants mcfg.version = EEPROM_CONF_VERSION; mcfg.size = sizeof(master_t); mcfg.magic_be = 0xBE; mcfg.magic_ef = 0xEF; mcfg.chk = 0; // when updateProfile = true, we copy contents of cfg to global configuration. when false, only profile number is updated, and then that profile is loaded on readEEPROM() if (updateProfile) { // copy current in-memory profile to stored configuration memcpy(&mcfg.profile[mcfg.current_profile], &cfg, sizeof(config_t)); } // recalculate checksum before writing for (p = (const uint8_t *)&mcfg; p < ((const uint8_t *)&mcfg + sizeof(master_t)); p++) chk ^= *p; mcfg.chk = chk; //taskENTER_CRITICAL(); // write it retry: FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); if (FLASH_ErasePage(FLASH_WRITE_ADDR) == FLASH_COMPLETE) { for (i = 0; i < sizeof(master_t); i += 4) { status = FLASH_ProgramWord(FLASH_WRITE_ADDR + i, *(uint32_t *) ((char *)&mcfg + i)); if (status != FLASH_COMPLETE) { FLASH_Lock(); tries++; if (tries < 3) goto retry; else break; } } } FLASH_Lock(); //taskEXIT_CRITICAL(); // Flash write failed - just die now if (tries == 3 || !validEEPROM()) { failureMode(10); } // re-read written data readEEPROM(); if (b) blinkLED(15, 20, 1); }
void checkFirstTime(bool reset) { // check the EEPROM integrity before resetting values if (!validEEPROM() || reset) { resetConf(); // no need to memcpy profile again, we just did it in resetConf() above writeEEPROM(0, false); } }
bool readEEPROM(void) { // Sanity check if (!validEEPROM()) { return false; } // Read flash memcpy(&_params, (char *)FLASH_WRITE_ADDR, sizeof(params_t)); return true; }
bool writeEEPROM(bool blink) { FLASH_Status status; uint8_t chk = 0; const uint8_t *p; // prepare checksum/version constants _params.version = EEPROM_CONF_VERSION; _params.size = sizeof(params_t); _params.magic_be = 0xBE; _params.magic_ef = 0xEF; _params.chk = 0; // recalculate checksum before writing for (p = (const uint8_t *)&_params; p < ((const uint8_t *)&_params + sizeof(params_t)); p++) chk ^= *p; _params.chk = chk; // write it FLASH_Unlock(); for (unsigned int tries = 3; tries; tries--) { FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ErasePage(FLASH_WRITE_ADDR); status = FLASH_ErasePage(FLASH_WRITE_ADDR + FLASH_PAGE_SIZE); for (unsigned int i = 0; i < sizeof(params_t) && status == FLASH_COMPLETE; i += 4) status = FLASH_ProgramWord(FLASH_WRITE_ADDR + i, *(uint32_t *)((char *)&_params + i)); if (status == FLASH_COMPLETE) break; } FLASH_Lock(); // Flash write failed - just die now if (status != FLASH_COMPLETE || !validEEPROM()) { return false; } if (blink) { for (uint8_t i=0; i < 3; i++) { LED0_TOGGLE; delay(100); LED0_TOGGLE; delay(50); } } return true; }
void readEEPROM(void) { // Sanity check if (!validEEPROM()) failureMode(10); // Read flash memcpy(&mcfg, (char *)FLASH_WRITE_ADDR, sizeof(master_t)); // Copy current profile if (mcfg.current_profile > 2) // sanity check mcfg.current_profile = 0; memcpy(&cfg, &mcfg.profile[mcfg.current_profile], sizeof(config_t)); }
void checkFirstTime(bool reset) { if (!validEEPROM() || reset) resetConf(); // check the EEPROM integrity }
void checkFirstTime(bool reset) { // check the EEPROM integrity before resetting values if (!validEEPROM() || reset) resetConf(); }