Index: NVDataMgmt.c =================================================================== diff -u -r2ef5e5a21d6f81900fed686b68d07da8d31f1d6d -r299edeca9155ebc1c7ceeeee8cfc01ee22915557 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 2ef5e5a21d6f81900fed686b68d07da8d31f1d6d) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 299edeca9155ebc1c7ceeeee8cfc01ee22915557) @@ -81,6 +81,7 @@ NVDATAMGMT_SELF_TEST_STATE_READ_WATER_CONSUMPTION, NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD, NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD, + NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD, NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC, NVDATAMGMT_SELF_TEST_STATE_COMPLETE, NUM_OF_NVDATAMGMT_SELF_TEST_STATES @@ -159,6 +160,13 @@ typedef struct { + SERVICE_DATA_T serviceData; + U16 crc; + +} SERVICE_RECORD_T; + +typedef struct +{ CALIBRATION_DATA_T calData; U16 crc; } CALIBRATION_RECORD_T; @@ -186,6 +194,7 @@ static LOG_DATA_T logData; static MFG_RECORD_T mfgRecord; static CALIBRATION_RECORD_T calibrationRecord; +static SERVICE_RECORD_T serviceRecord; static U08 queueRearIndex = QUEUE_START_INDEX; static U08 queueFrontIndex = QUEUE_START_INDEX; static U08 queueCount = 0; @@ -194,16 +203,18 @@ static SELF_TEST_STATUS_T NVDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; static BOOL isServiceOnEntry = TRUE; static U32 bootloaderFlag = 0; +static BOOL hasLogRecordCRCFailed = FALSE; // Private functions static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadHDTreatmentTime ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadDGWaterConsumption ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadHDTreatmentTime ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadDGWaterConsumption ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ); static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState ( void ); @@ -226,10 +237,8 @@ static BOOL isQueueEmpty ( void ); static BOOL isQueueFull ( void ); static U32 getAvailableQueueCount ( void ); -static BOOL enqueueBank7Sector0Records( void ); +static BOOL enqueueBank7Sector0Records ( void ); - - // REMOVE THIS CODE //static U08 tempBufferForTest[5] = {'5', 'Y', 'I', 'D', 'P'}; static U08 readBufferForTest [ 36 ]; @@ -253,6 +262,7 @@ NVDataMgmtExecState = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; NVDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; isServiceOnEntry = TRUE; + hasLogRecordCRCFailed = FALSE; queueRearIndex = QUEUE_START_INDEX; queueFrontIndex = QUEUE_START_INDEX; Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); @@ -310,7 +320,7 @@ { calibrationRecord.calData = data; calibrationRecord.crc = crc16 ( (U08*)&calibrationRecord.calData, - sizeof(CALIBRATION_RECORD_T) ); + sizeof(CALIBRATION_DATA_T) ); BOOL status = enqueueBank7Sector0Records(); return status; } @@ -476,6 +486,11 @@ NVDataMgmtSelfTestState = handleSelfTestReadCalibrationRecord(); break; + case NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD: + + NVDataMgmtSelfTestState = handleSelfTestReadServiceRecord(); + break; + case NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC: NVDataMgmtSelfTestState = handleSelfTestCheckCRC(); @@ -736,20 +751,12 @@ NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_LOG_RECORD; if ( isServiceOnEntry && getRTCRAMState() == RTC_RAM_STATE_READY ) { - readFromRAM ( LOG_RECORD_START_ADDRESS, sizeof(LOG_HEADER_T) ); + readFromRAM ( LOG_RECORD_START_ADDRESS, sizeof(LOG_RECORD_T) ); isServiceOnEntry= FALSE; } if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE ) { getDataFromRAM ( (U08*)&logRecord, sizeof(LOG_RECORD_T) ); - /*U08 i; - U08* logPtr = (U08*)&logRecord; - getDataFromRAM ( readBuffer, sizeof(LOG_HEADER_T) ); - for ( i = 0; i < sizeof(LOG_HEADER_T); i++ ) - { - *logPtr = ( readBuffer[ i ] & MASK_OFF_MSB ); - logPtr++; - }*/ state = NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD; isServiceOnEntry = TRUE; } @@ -786,6 +793,35 @@ } /************************************************************************* + * @brief handleSelfTestReadServiceRecord + * The handleSelfTestReadServiceRecord reads the service dates from RTC + * RAM + * @details + * Inputs : none + * Outputs : NVDATAMGMT_SELF_TEST_STATE_T + * @param none + * @return NVDATAMGMT_SELF_TEST_STATE_T + *************************************************************************/ +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ) +{ + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD; + + if ( isServiceOnEntry && getRTCRAMState() == RTC_RAM_STATE_READY ) + { + readFromRAM( SERVICE_DATE_START_ADDRESS, sizeof(SERVICE_RECORD_T) ); + isServiceOnEntry= FALSE; + } + if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE ) + { + getDataFromRAM ( (U08*)&serviceRecord, sizeof(SERVICE_RECORD_T) ); + state = NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC; + isServiceOnEntry = TRUE; + } + + return state; +} + +/************************************************************************* * @brief handleSelfTestReadCalibrationRecord * The handleSelfTestReadCalibrationRecord reads the calibration record * from EEPROM @@ -830,21 +866,55 @@ BOOL hasCRCPassed = TRUE; U16 calcCRC; U16 recordCRC; - +#ifdef _HD_ + calcCRC = crc16 ( (U08*)&treatmentTimeRecord.treatmentTime, sizeof(U32) ); + recordCRC = treatmentTimeRecord.crc; + if ( calcCRC != recordCRC ) + { + hasCRCPassed = FALSE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR, recordCRC, calcCRC ); + } +#else + calcCRC = crc16 ( (U08*)&waterConsumptionRecord.waterConsumption, sizeof(U32) ); + recordCRC = waterConsumptionRecord.crc; + if ( calcCRC != recordCRC ) + { + hasCRCPassed = FALSE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR, recordCRC, calcCRC ); + } +#endif + // Check log header record + calcCRC = crc16 ( (U08*)&logRecord.logHeader, sizeof(LOG_HEADER_T) ); + recordCRC = logRecord.crc; + if ( calcCRC != recordCRC ) + { + hasCRCPassed = FALSE; + // Warning alarm + } + // Check CRC for manufacturing record calcCRC = crc16 ( (U08*)&mfgRecord.mfgData, sizeof(MFG_DATA_T) ); recordCRC = mfgRecord.crc; if ( calcCRC != recordCRC ) { hasCRCPassed = FALSE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR, recordCRC, calcCRC ); } - calcCRC = crc16 ( (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_RECORD_T) ); + // Check CRC for calibration record + calcCRC = crc16 ( (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_DATA_T) ); recordCRC = calibrationRecord.crc; if ( calcCRC != recordCRC ) { hasCRCPassed = FALSE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR, recordCRC, calcCRC ); } - + // Check CRC for service record + calcCRC = crc16 ( (U08*)&serviceRecord.serviceData, sizeof(SERVICE_DATA_T) ); + recordCRC = serviceRecord.crc; + if ( calcCRC != recordCRC ) + { + hasCRCPassed = FALSE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR, recordCRC, calcCRC ); + } if ( hasCRCPassed ) { NVDataMgmtSelfTestResult = SELF_TEST_STATUS_PASSED;