Index: NVDataMgmt.c =================================================================== diff -u -r1e1578eeb5f1c1dd837283aab216ec50108f0754 -r6a00bc5632cfdb84cf72e7dbbc55ff115e3481d5 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 1e1578eeb5f1c1dd837283aab216ec50108f0754) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 6a00bc5632cfdb84cf72e7dbbc55ff115e3481d5) @@ -71,7 +71,7 @@ #define LAST_DISINFECTION_DATE_ADDRESS 0x00000060 // 96 ///< Last disinfection date start address in RTC RAM (96) // Data addresses in EEPROM -#define CALIBRATION_RECORD_START_ADDRESS (BANK7_SECTOR0_START_ADDRESS + 0x100) ///< Calibration record start address in EEPROM +#define CALIBRATION_RECORD_START_ADDRESS ( BANK7_SECTOR0_START_ADDRESS + sizeof(MFG_RECORD_T) ) ///< Calibration record start address in EEPROM #define COMMAND_TIME_OUT 500U // time in ms ///< Timeout for an EEPROM or RTC command in ms @@ -171,6 +171,7 @@ { MFG_DATA_T mfgData; ///< Manufacturing data struct U16 crc; ///< Manufacturing data CRC + U08 Padding[ 0x400 - sizeof(MFG_DATA_T) - sizeof(U16) ]; ///< } MFG_RECORD_T; /// Service record struct @@ -185,6 +186,7 @@ { CALIBRATION_DATA_T calData; ///< Calibration data struct U16 crc; ///< Calibration data CRC + U08 Padding[ 0x400 - sizeof(CALIBRATION_DATA_T) - sizeof(U16) ]; ///< } CALIBRATION_RECORD_T; /// Last disinfection record struct @@ -215,6 +217,7 @@ static U32 bootloaderFlag = 0; ///< Bootloader flag static BOOL hasCommandTimedout = FALSE; ///< Boolean flag for timeout of the commands static U32 currentTime = 0; ///< Current time +static BOOL calRecordIsValid = FALSE; ///< Flag indicates whether stored calibration record was found to be valid // Private functions @@ -357,7 +360,7 @@ { BOOL status = FALSE; - if ( buffer != NULL ) + if ( ( buffer != NULL ) && ( TRUE == calRecordIsValid ) ) { memcpy ( buffer, (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_DATA_T) ); status = TRUE; @@ -1097,11 +1100,13 @@ #ifdef _HD_ calcCRC = crc16 ( (U08*)&treatmentTimeRecord.treatmentTime, sizeof(U32) ); recordCRC = treatmentTimeRecord.crc; +#ifndef LIMITED_NVDATA_CRC_CHECKS if ( calcCRC != recordCRC ) { hasCRCPassed = FALSE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR, recordCRC, calcCRC ); } +#endif #else calcCRC = crc16 ( (U08*)&waterConsumptionRecord.waterConsumption, sizeof(U32) ); recordCRC = waterConsumptionRecord.crc; @@ -1119,6 +1124,7 @@ SET_ALARM_WITH_2_U32_DATA( AlARM_ID_NVDATA_DISINFECTION_DATE_CRC_ERROR, recordCRC, calcCRC ); } #endif +#ifndef LIMITED_NVDATA_CRC_CHECKS // Check log header record calcCRC = crc16 ( (U08*)&logRecord.logHeader, sizeof(LOG_HEADER_T) ); recordCRC = logRecord.crc; @@ -1142,6 +1148,7 @@ hasCRCPassed = FALSE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR, recordCRC, calcCRC ); } +#endif // Check CRC for calibration record calcCRC = crc16 ( (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_DATA_T) ); recordCRC = calibrationRecord.crc; @@ -1150,6 +1157,11 @@ hasCRCPassed = FALSE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR, recordCRC, calcCRC ); } + else + { + calRecordIsValid = TRUE; + } +#ifndef LIMITED_NVDATA_CRC_CHECKS // Check CRC for service record calcCRC = crc16 ( (U08*)&serviceRecord.serviceData, sizeof(SERVICE_DATA_T) ); recordCRC = serviceRecord.crc; @@ -1158,8 +1170,8 @@ hasCRCPassed = FALSE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR, recordCRC, calcCRC ); } - // There should be no failed CRCs or no command should - // timeout for the self test to pass +#endif + // There should be no failed CRCs and no command should timeout for the self test to pass if ( hasCRCPassed && !hasCommandTimedout ) { NVDataMgmtSelfTestResult = SELF_TEST_STATUS_PASSED;