Move the calibration CRC value functions into storage.x

This commit is contained in:
Josh Stewart 2022-02-11 11:59:36 +11:00
parent 564a6b7ea3
commit ccfc344dc3
3 changed files with 64 additions and 39 deletions

View File

@ -20,7 +20,6 @@ A full copy of the license may be found in the projects root directory
#include "logger.h"
#include "comms.h"
#include "src/FastCRC/FastCRC.h"
#include <EEPROM.h>
#ifdef RTC_ENABLED
#include "rtc_common.h"
#endif
@ -368,33 +367,13 @@ void processSerialCommand()
case 'k': //Send CRC values for the calibration pages
{
uint32_t CRC32_val = 0;
switch(serialPayload[2]) //Get the page being requested
{
case O2_CALIBRATION_PAGE: //Calibration page for O2
serialPayload[1] = EEPROM.read(EEPROM_CALIBRATION_O2_CRC);
serialPayload[2] = EEPROM.read(EEPROM_CALIBRATION_O2_CRC + 1);
serialPayload[3] = EEPROM.read(EEPROM_CALIBRATION_O2_CRC + 2);
serialPayload[4] = EEPROM.read(EEPROM_CALIBRATION_O2_CRC + 3);
break;
case CLT_CALIBRATION_PAGE: //Calibration page 1
serialPayload[1] = EEPROM.read(EEPROM_CALIBRATION_CLT_CRC);
serialPayload[2] = EEPROM.read(EEPROM_CALIBRATION_CLT_CRC + 1);
serialPayload[3] = EEPROM.read(EEPROM_CALIBRATION_CLT_CRC + 2);
serialPayload[4] = EEPROM.read(EEPROM_CALIBRATION_CLT_CRC + 3);
break;
case IAT_CALIBRATION_PAGE: //Calibration page 2
serialPayload[1] = EEPROM.read(EEPROM_CALIBRATION_IAT_CRC);
serialPayload[2] = EEPROM.read(EEPROM_CALIBRATION_IAT_CRC + 1);
serialPayload[3] = EEPROM.read(EEPROM_CALIBRATION_IAT_CRC + 2);
serialPayload[4] = EEPROM.read(EEPROM_CALIBRATION_IAT_CRC + 3);
break;
default:
sendSerialReturnCode(SERIAL_RC_RANGE_ERR);
break;
}
uint32_t CRC32_val = readCalibrationCRC32(serialPayload[2]); //Get the CRC for the requested page
serialPayload[0] = SERIAL_RC_OK;
serialPayload[1] = ((CRC32_val >> 24) & 255);
serialPayload[2] = ((CRC32_val >> 16) & 255);
serialPayload[3] = ((CRC32_val >> 8) & 255);
serialPayload[4] = (CRC32_val & 255);
sendSerialPayload( &serialPayload, 5);
break;
@ -674,10 +653,7 @@ void processSerialCommand()
{
//apply CRC reflection
calibrationCRC = ~calibrationCRC;
EEPROM.update(EEPROM_CALIBRATION_O2_CRC, (calibrationCRC >> 24));
EEPROM.update(EEPROM_CALIBRATION_O2_CRC + 1, (calibrationCRC >> 16));
EEPROM.update(EEPROM_CALIBRATION_O2_CRC + 2, (calibrationCRC >> 8));
EEPROM.update(EEPROM_CALIBRATION_O2_CRC + 3, (calibrationCRC));
storeCalibrationCRC32(O2_CALIBRATION_PAGE, calibrationCRC);
}
}
sendSerialReturnCode(SERIAL_RC_OK);
@ -715,10 +691,7 @@ void processSerialCommand()
}
//Update the CRC
calibrationCRC = CRC32.crc32(&serialPayload[7], 64);
EEPROM.update(EEPROM_CALIBRATION_IAT_CRC, (calibrationCRC >> 24));
EEPROM.update(EEPROM_CALIBRATION_IAT_CRC + 1, (calibrationCRC >> 16));
EEPROM.update(EEPROM_CALIBRATION_IAT_CRC + 2, (calibrationCRC >> 8));
EEPROM.update(EEPROM_CALIBRATION_IAT_CRC + 3, (calibrationCRC));
storeCalibrationCRC32(IAT_CALIBRATION_PAGE, calibrationCRC);
writeCalibration();
sendSerialReturnCode(SERIAL_RC_OK);
@ -750,10 +723,7 @@ void processSerialCommand()
}
//Update the CRC
calibrationCRC = CRC32.crc32(&serialPayload[7], 64);
EEPROM.update(EEPROM_CALIBRATION_CLT_CRC, (calibrationCRC >> 24));
EEPROM.update(EEPROM_CALIBRATION_CLT_CRC + 1, (calibrationCRC >> 16));
EEPROM.update(EEPROM_CALIBRATION_CLT_CRC + 2, (calibrationCRC >> 8));
EEPROM.update(EEPROM_CALIBRATION_CLT_CRC + 3, (calibrationCRC));
storeCalibrationCRC32(CLT_CALIBRATION_PAGE, calibrationCRC);
writeCalibration();
sendSerialReturnCode(SERIAL_RC_OK);

View File

@ -507,6 +507,59 @@ uint32_t readPageCRC32(uint8_t pageNum)
return EEPROM.get(compute_crc_address(pageNum), crc32_val);
}
/** Same as above, but writes the CRC32 for the calibration page rather than tune data
@param pageNum - Calibration page number
@param crcValue - CRC32 checksum
*/
void storeCalibrationCRC32(uint8_t calibrationPageNum, uint32_t calibrationCRC)
{
uint16_t targetAddress;
switch(calibrationPageNum)
{
case O2_CALIBRATION_PAGE:
targetAddress = EEPROM_CALIBRATION_O2_CRC;
break;
case IAT_CALIBRATION_PAGE:
targetAddress = EEPROM_CALIBRATION_IAT_CRC;
break;
case CLT_CALIBRATION_PAGE:
targetAddress = EEPROM_CALIBRATION_CLT_CRC;
break;
default:
targetAddress = EEPROM_CALIBRATION_CLT_CRC; //Obviously should never happen
break;
}
EEPROM.put(targetAddress, calibrationCRC);
}
/** Retrieves and returns the 4 byte CRC32 checksum for a given calibration page from EEPROM.
@param pageNum - Config page number
*/
uint32_t readCalibrationCRC32(uint8_t calibrationPageNum)
{
uint32_t crc32_val;
uint16_t targetAddress;
switch(calibrationPageNum)
{
case O2_CALIBRATION_PAGE:
targetAddress = EEPROM_CALIBRATION_O2_CRC;
break;
case IAT_CALIBRATION_PAGE:
targetAddress = EEPROM_CALIBRATION_IAT_CRC;
break;
case CLT_CALIBRATION_PAGE:
targetAddress = EEPROM_CALIBRATION_CLT_CRC;
break;
default:
targetAddress = EEPROM_CALIBRATION_CLT_CRC; //Obviously should never happen
break;
}
EEPROM.get(targetAddress, crc32_val);
return crc32_val;
}
uint16_t getEEPROMSize()
{
return EEPROM.length();

View File

@ -130,6 +130,8 @@ uint8_t readEEPROMVersion();
void storeEEPROMVersion(uint8_t);
void storePageCRC32(uint8_t pageNum, uint32_t crcValue);
uint32_t readPageCRC32(uint8_t pageNum);
void storeCalibrationCRC32(uint8_t calibrationPageNum, uint32_t calibrationCRC);
uint32_t readCalibrationCRC32(uint8_t calibrationPageNum);
uint16_t getEEPROMSize();
bool isEepromWritePending();