/** * @brief Loads all user defined settings from external EEPROM chip. * @return 1 - if write operation is successful; * 0 - if write operation fails. */ uint8_t eepromLoadSettings(void) { msg_t status = RDY_OK; uint8_t addr = EEPROM_START_ADDR; i2cAcquireBus(&I2CD2); status = i2cMasterTransmitTimeout(&I2CD2, EEPROM_24C02_ADDR, &addr, 1, (uint8_t *)&eepromData, sizeof(eepromData), MS2ST(EEPROM_READ_TIMEOUT_MS)); i2cReleaseBus(&I2CD2); if (status != RDY_OK) { g_i2cErrorInfo.last_i2c_error = i2cGetErrors(&I2CD2); if (g_i2cErrorInfo.last_i2c_error) { debugLog("E:eeprom-load"); g_i2cErrorInfo.i2c_error_counter++; } return 0; } if (eepromData.crc32 != crcCRC32((uint32_t *)&eepromData, sizeof(eepromData) / sizeof(uint32_t) - 1)) { /* Fill with default settings. */ return eepromSaveSettings(); } else { pidSettingsUpdate(eepromData.pidSettings); pwmOutputSettingsUpdate(eepromData.pwmOutput); mixedInputSettingsUpdate(eepromData.mixedInput); inputModeSettingsUpdate(eepromData.modeSettings); sensorSettingsUpdate(eepromData.sensorSettings); accelBiasUpdate(&g_IMU1, eepromData.accelBias); gyroBiasUpdate(&g_IMU1, eepromData.gyroBias); } return 1; }
/** * @brief Calculates CRC32 checksum of received data buffer. * @param pMsg - pointer to COMM message structure. * @return CRC32 checksum of received zero-padded data buffer. */ static uint32_t CommGetCRC32Checksum(const PMessage pMsg) { uint32_t crc_length = (pMsg->size - COMM_MSG_CRC_SIZE) / sizeof(uint32_t); if ((pMsg->size - COMM_MSG_CRC_SIZE) % sizeof(uint32_t)) { crc_length++; } return crcCRC32((uint32_t *)pMsg, crc_length); }
/** * @brief Starts saving all user defined settings to external EEPROM chip. * @return 1 - if write operation is successful; * 0 - if write operation fails. */ uint8_t eepromSaveSettings(void) { memcpy((void *)eepromData.pidSettings, (void *)g_pidSettings, sizeof(g_pidSettings)); memcpy((void *)eepromData.pwmOutput, (void *)g_pwmOutput, sizeof(g_pwmOutput)); memcpy((void *)eepromData.mixedInput, (void *)g_mixedInput, sizeof(g_mixedInput)); memcpy((void *)eepromData.modeSettings, (void *)g_modeSettings, sizeof(g_modeSettings)); memcpy((void *)eepromData.sensorSettings, (void *)g_sensorSettings, sizeof(g_sensorSettings)); memcpy((void *)eepromData.accelBias, (void *)g_IMU1.accelBias, sizeof(g_IMU1.accelBias)); memcpy((void *)eepromData.gyroBias, (void *)g_IMU1.gyroBias, sizeof(g_IMU1.gyroBias)); eepromData.crc32 = crcCRC32((uint32_t *)&eepromData, sizeof(eepromData) / sizeof(uint32_t) - 1); fSkipContinue = 1; return eepromWriteData(EEPROM_START_ADDR, (uint8_t *)&eepromData, sizeof(eepromData)); }