Index: NVDataMgmt.c =================================================================== diff -u -r8f8569c7cbc55dceebb2f5654e3ae162691d5991 -ra5ba573ba517926bb1dc49f42b0284cef69d613d --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 8f8569c7cbc55dceebb2f5654e3ae162691d5991) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision a5ba573ba517926bb1dc49f42b0284cef69d613d) @@ -534,7 +534,7 @@ static U32 getAvailableQueueCount( void ); // Helper functions -static BOOL didCommandTimeout( ALARM_ID_T alarm, U08* state ); +static BOOL didCommandTimeout( NVDATAMGMT_EXEC_STATE_T state ); static BOOL eraseDataLogSectors( void ); static void monitorNewCalSignal( void ); @@ -1039,6 +1039,11 @@ nvDataLength = sizeof( hdServiceGroup.hdServiceRecord ); break; + case GET_USAGE_RECORD: + nvDataStartPtr = (U08*)&hdUsageInfoGroup.hdUsageInfo; + nvDataLength = sizeof( hdUsageInfoGroup.hdUsageInfo ); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_NV_RECORD_SELECTED, nvData ) break; @@ -1466,13 +1471,33 @@ { switch ( disinfect ) { - case USAGE_INFO_HEAT_DISINFECT: - dgUsageInfoGroup.dgUsageInfo.lastHeatDisDateEpoch = epochTime; + case USAGE_INFO_BASIC_FLUSH: + dgUsageInfoGroup.dgUsageInfo.lastBasicFlushCompleteDateEpoch = epochTime; break; - case USAGE_INFO_CHEMICAL_DISINFECT: - dgUsageInfoGroup.dgUsageInfo.lastChemicalDisDateEpoch = epochTime; + case USAGE_INFO_CHEM_DIS_START: + dgUsageInfoGroup.dgUsageInfo.lastChemDisStartDateEpoch = epochTime; break; + + case USAGE_INFO_CHEM_DIS: + dgUsageInfoGroup.dgUsageInfo.lastChemDisCompleteDateEpoch = epochTime; + break; + + case USAGE_INFO_CHEM_FLUSH: + dgUsageInfoGroup.dgUsageInfo.lastChemDisFlushCompleteDateEpoch = epochTime; + break; + + case USAGE_INFO_HEAT_DIS: + dgUsageInfoGroup.dgUsageInfo.lastHeatDisCompleteDateEpoch = epochTime; + break; + + case USAGE_INFO_FILTER_FLUSH: + dgUsageInfoGroup.dgUsageInfo.lastFilterFlushCompleteDateEpoch = epochTime; + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_USAGE_INFO_SELECTED, disinfect ); + break; } dgUsageInfoGroup.dgUsageInfo.crc = crc16( (U08*)&dgUsageInfoGroup.dgUsageInfo, sizeof( DG_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); @@ -1493,38 +1518,6 @@ /*********************************************************************//** * @brief - * The setDisinfectStatus sets a queue job to write whether the device is already - * disinfected or not. - * @details Inputs: dgUsageInfoGroup - * @details Outputs: dgUsageInfoGroup - * @param disinfectStatus disinfect status - * @return TRUE if queue is not full - *************************************************************************/ -BOOL setDisinfectStatus( BOOL disinfectStatus ) -{ - BOOL status = FALSE; - - if ( FALSE == isQueueFull() ) - { - dgUsageInfoGroup.dgUsageInfo.isDisinfected = disinfectStatus; - dgUsageInfoGroup.dgUsageInfo.crc = crc16( (U08*)&dgUsageInfoGroup.dgUsageInfo, sizeof( DG_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); - dgUsageInfoGroup.crc = crc16( (U08*)&dgUsageInfoGroup, sizeof( DG_USAGE_INFO_GROUP_T ) - sizeof( U16 ) ); - usageWriteTries = 0; - status = TRUE; - - enqueueRecordJob( NVDATAMGMT_WRITE, RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].dataLoc, NVDATAMGMT_USAGE_INFO_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].nvEvent, 0, 0 ) - } - else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WRITE_USAGE_INFO_TO_NV_FAILURE, USAGE_INFO_DISIFNECT_STATUS ); - } - - return status; -} - -/*********************************************************************//** - * @brief * The setHeatersInfoRecord sets a queue job to write the DG heaters info * back to the RTC RAM. * @details Inputs: none @@ -1598,6 +1591,70 @@ /*********************************************************************//** * @brief + * The testSetNVRecordCRCOverride overrides the non-volatile record CRC override. + * @details Inputs: none + * @details Outputs: none + * @param job the job to override its CRC (i.e. calibration record) + * @param crc the value its CRC to be overridden + * @return TRUE if the job was scheduled successfully otherwise, FALSE + *************************************************************************/ +BOOL testSetNVRecordCRCOverride( U32 job, U16 crc ) +{ + BOOL status = FALSE; + RECORD_JOBS_STATE_T nvJob = (RECORD_JOBS_STATE_T)job; + + switch( nvJob ) + { + case NVDATAMGMT_CALIBRATION_RECORD: +#ifdef _DG_ + dgCalibrationRecord.crc = crc; +#endif +#ifdef _HD_ + hdCalibrationRecord.crc = crc; +#endif + status = enqueueSector0Records(); + break; + + case NVDATAMGMT_SYSTEM_RECORD: +#ifdef _DG_ + dgSystemGroup.crc = crc; +#endif +#ifdef _HD_ + hdSystemGroup.crc = crc; +#endif + status = enqueueSector0Records(); + break; + + case NVDATAMGMT_SERVICE_RECORD: +#ifdef _DG_ + dgServiceGroup.crc = crc; +#endif +#ifdef _HD_ + hdServiceGroup.crc = crc; +#endif + status = enqueueSector0Records(); + break; + + case NVDATAMGMT_USAGE_INFO_RECORD: +#ifdef _DG_ + dgUsageInfoGroup.crc = crc; +#endif +#ifdef _HD_ + hdUsageInfoGroup.crc = crc; +#endif + if ( getAvailableRecordQueueCount() > 0 ) + { + enqueueRecordJob( NVDATAMGMT_WRITE, RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].dataLoc, NVDATAMGMT_USAGE_INFO_RECORD ); + status = TRUE; + } + break; + } + + return status; +} + +/*********************************************************************//** + * @brief * The handleSelfTestReadRecords waits for the records to be read * @details Inputs: none * @details Outputs: none @@ -1807,7 +1864,7 @@ static NVDATAMGMT_EXEC_STATE_T handleExecWriteToEEPROMState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + BOOL timeoutStatus = didCommandTimeout( state ); RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; @@ -1874,7 +1931,7 @@ static NVDATAMGMT_EXEC_STATE_T handleExecVerifyEEPROMWriteState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + BOOL timeoutStatus = didCommandTimeout( state ); RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; @@ -1926,7 +1983,7 @@ static NVDATAMGMT_EXEC_STATE_T handleExecReadFromEEPROMState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + BOOL timeoutStatus = didCommandTimeout( state ); if ( ( Fapi_Status_FsmReady == FAPI_CHECK_FSM_READY_BUSY ) || ( TRUE == timeoutStatus ) ) { @@ -1955,7 +2012,7 @@ static NVDATAMGMT_EXEC_STATE_T handleExecEraseState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + BOOL timeoutStatus = didCommandTimeout( state ); if ( Fapi_Status_FsmReady == FAPI_CHECK_FSM_READY_BUSY || timeoutStatus == TRUE ) { @@ -1977,8 +2034,8 @@ static NVDATAMGMT_EXEC_STATE_T handleExecWriteToRAMState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WRITE_TO_RTC; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); - RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + BOOL timeoutStatus = didCommandTimeout( state ); + RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; // Check if the RTC RAM has finished @@ -2050,8 +2107,8 @@ static NVDATAMGMT_EXEC_STATE_T handleExecVerifyRTCWriteState( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_VERIFY_RTC_WRITE; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); - RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + BOOL timeoutStatus = didCommandTimeout( state ); + RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; // Check if the write job is EEPROM or RTC RAM @@ -2104,7 +2161,7 @@ static NVDATAMGMT_EXEC_STATE_T handleExecReadFromRAMState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_READ_FROM_RTC; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); + BOOL timeoutStatus = didCommandTimeout( state ); if ( ( ( TRUE == isSemaphoreReleased( SEMAPHORE_RTC ) ) && ( RTC_RAM_STATUS_IDLE == getRTCRAMStatus() ) ) || ( TRUE == timeoutStatus ) ) { @@ -2239,6 +2296,7 @@ sendDGUsageInfoRecord( calPublishMessageCount + 1, calPublishTotalMessages, length, startPtr ); #endif #ifdef _HD_ + sendHDUsageRecord( calPublishMessageCount + 1, calPublishTotalMessages, length, startPtr ); #endif break; @@ -2558,21 +2616,21 @@ * flag to TRUE. * @details Inputs: none * @details Outputs: alarm if command timed out - * @param alarm alarm ID * @param state the state that the command timed out * @return TRUE if a command timed out *************************************************************************/ -static BOOL didCommandTimeout ( ALARM_ID_T alarm, U08* state ) +static BOOL didCommandTimeout ( NVDATAMGMT_EXEC_STATE_T state ) { - /* - * NOTE: The state is a pointer so it can cover both the self-test - * states and exec states - */ BOOL status = FALSE; - if ( didTimeout( currentTime, COMMAND_TIME_OUT ) ) + if ( TRUE == didTimeout( currentTime, COMMAND_TIME_OUT ) ) { - SET_ALARM_WITH_1_U32_DATA( alarm, *state ); +#ifdef _DG_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_MANAGEMENT_OPS_TIMEOUT, state ) +#endif +#ifdef _HD_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_MANAGEMENT_OPS_TIMEOUT, state ) +#endif status = TRUE; } @@ -2786,15 +2844,14 @@ if ( calcCRC != recordCRC ) { - dgUsageInfoGroup.dgUsageInfo.isDisinfected = FALSE; - dgUsageInfoGroup.dgUsageInfo.lastChemicalDisDateEpoch = 0; - dgUsageInfoGroup.dgUsageInfo.lastHeatDisDateEpoch = 0; - dgUsageInfoGroup.dgUsageInfo.roWaterGenSinceLastServiceL = 0.0F; - dgUsageInfoGroup.dgUsageInfo.roWaterGenTotalL = 0.0F; - dgUsageInfoGroup.dgUsageInfo.lastResetTimeEpoch = getRTCTimestamp(); - dgUsageInfoGroup.dgUsageInfo.crc = crc16( (U08*)&dgUsageInfoGroup.dgUsageInfo, sizeof( DG_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); - dgUsageInfoGroup.crc = crc16( (U08*)&dgUsageInfoGroup, sizeof( DG_USAGE_INFO_GROUP_T ) - sizeof( U16 ) ); - status = FALSE; + dgUsageInfoGroup.dgUsageInfo.lastChemDisCompleteDateEpoch = 0; + dgUsageInfoGroup.dgUsageInfo.lastHeatDisCompleteDateEpoch = 0; + dgUsageInfoGroup.dgUsageInfo.roWaterGenSinceLastServiceL = 0.0F; + dgUsageInfoGroup.dgUsageInfo.roWaterGenTotalL = 0.0F; + dgUsageInfoGroup.dgUsageInfo.lastResetTimeEpoch = getRTCTimestamp(); + dgUsageInfoGroup.dgUsageInfo.crc = crc16( (U08*)&dgUsageInfoGroup.dgUsageInfo, sizeof( DG_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); + dgUsageInfoGroup.crc = crc16( (U08*)&dgUsageInfoGroup, sizeof( DG_USAGE_INFO_GROUP_T ) - sizeof( U16 ) ); + status = FALSE; activateAlarmNoData( ALARM_ID_DG_INVALID_USAGE_RECORD_CRC ); }