Index: NVDataMgmt.c =================================================================== diff -u -r087ae6de4dd6ffb50cf272e9d0aefaed062305ff -r40a953067e13f6479b0ea85dd760d903ea66612e --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 087ae6de4dd6ffb50cf272e9d0aefaed062305ff) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 40a953067e13f6479b0ea85dd760d903ea66612e) @@ -44,6 +44,7 @@ #define QUEUE_START_INDEX 0U ///< Queue start index. #define MIN_JOBS_NEEDED_FOR_DATA_LOG 3U ///< Min queue required for data log (3). #define MIN_JOBS_NEEDED_FOR_SECTOR_0 4U ///< Min queue count needed to write all (4) records back in sector 0. +#define MAX_NUM_OF_WRITE_TRIES 3U ///< Max number of write tries. // The clock frequency comes from HCLK_FREQ and it has to be rounded up to the nearest number #define ROUNDED_HCLK_FREQ FLOAT_TO_INT_WITH_ROUND(HCLK_FREQ) ///< Rounded HCLK for EERPOM clock. @@ -499,7 +500,8 @@ static volatile BOOL powerOffIsImminent; ///< Power off warning has been signaled. Non-volatile memory operations should be completed ASAP and then ceased. static BOOL isNewCalAvailable; ///< Signal to indicate whether a new calibration data is available. static U32 newCalStartTimer; ///< New calibration availability start timer. -static NVDATAMGMT_RECORDS_READ_STATUS recordsReadStatus; ///< NVDataMgmt records read status. +static NVDATAMGMT_RECORDS_READ_STATUS_T recordsReadStatus; ///< NVDataMgmt records read status. +static U32 usageWriteTries; ///< Usage write tries. // Self test functions static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadRecords( void ); @@ -594,7 +596,7 @@ * queueFrontIndex, queueCount, recordUpdateAddress, recordQueueRearIndex, * recordQueueFrontIndex, recordQueueCount, recordAddressOffset, * writtenRecordStatus, hasPublishRecordBeenRequested, isNewCalAvailable, - * newCalStartTimer, hasServiceRecordBeenUpdated + * newCalStartTimer, hasServiceRecordBeenUpdated, usageWriteTries * @return none *************************************************************************/ void initNVDataMgmt( void ) @@ -625,6 +627,7 @@ previousCalMessageNum = 0; recordReceiveStartTime = 0; recordsReadStatus = NVDATAMGMT_RECORDS_NOT_STARTED; + usageWriteTries = 0; enqueuePOSTReadRecords(); @@ -1420,11 +1423,16 @@ dgUsageInfoGroup.dgUsageInfo.roWaterGenTotalL += dgUsageInfoGroup.dgUsageInfo.roWaterGenSinceLastServiceL; 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, NVDATAMGMT_RTC, NVDATAMGMT_USAGE_INFO_RECORD ); SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].nvEvent, 0, 0 ) - status = TRUE; } + else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WRITE_GEN_RO_WATER_TO_NV_FAILURE, USAGE_INFO_RO_GEN_WATER ); + } return status; } @@ -1439,7 +1447,7 @@ * @param epochTime last disinfect time in epoch * @return TRUE if queue is not full *************************************************************************/ -BOOL setLastDisinfectDate( DG_DISINFECT_T disinfect, U32 epochTime ) +BOOL setLastDisinfectDate( DG_USAGE_INFO_ITEMS_T disinfect, U32 epochTime ) { BOOL status = FALSE; @@ -1458,11 +1466,16 @@ 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; enqueue( NVDATAMGMT_WRITE, NVDATAMGMT_RTC, DG_USAGE_INFO_START_ADDRESS, (U08*)&dgUsageInfoGroup, 0, sizeof( DG_USAGE_INFO_GROUP_T ) ); SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].nvEvent, 0, 0 ) - status = TRUE; } + else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WRITE_DISINFECT_DATE_TO_NV_FAILURE, disinfect ); + } return status; } @@ -1485,11 +1498,16 @@ 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; enqueue( NVDATAMGMT_WRITE, NVDATAMGMT_RTC, DG_USAGE_INFO_START_ADDRESS, (U08*)&dgUsageInfoGroup, 0, sizeof( DG_USAGE_INFO_GROUP_T ) ); SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].nvEvent, 0, 0 ) - status = TRUE; } + else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WRITE_DISINFECT_STATUS_TO_NV_FAILURE, USAGE_INFO_DISIFNECT_STATUS ); + } return status; } @@ -1536,7 +1554,7 @@ * @details Outputs: none * @return recordsReadStatus *************************************************************************/ -NVDATAMGMT_RECORDS_READ_STATUS getNVRecordsReadStatus( void ) +NVDATAMGMT_RECORDS_READ_STATUS_T getNVRecordsReadStatus( void ) { return recordsReadStatus; } @@ -2640,31 +2658,31 @@ BOOL status = TRUE; #ifdef _DG_ - U16 calcCRC = crc16( (U08*)&dgSWConfigGroup, sizeof( DG_SW_CONFIG_GROUP_T ) - sizeof(U16) ); + U16 calcCRC = crc16( (U08*)&dgSWConfigGroup, sizeof( DG_SW_CONFIG_GROUP_T ) - sizeof( U16 ) ); U16 recordCRC = dgSWConfigGroup.crc; if ( calcCRC != recordCRC ) { memset( (U08*)&dgSWConfigGroup, 0, sizeof( DG_SW_CONFIG_GROUP_T ) ); // Recalculate the CRC with the default values - dgSWConfigGroup.crc = crc16( (U08*)&dgSWConfigGroup, sizeof( DG_SW_CONFIG_GROUP_T ) - sizeof(U16) ); + dgSWConfigGroup.crc = crc16( (U08*)&dgSWConfigGroup, sizeof( DG_SW_CONFIG_GROUP_T ) - sizeof( U16 ) ); // Set the to FALSE since the record is not valid status = FALSE; } #endif #ifdef _HD_ - U16 calcCRC = crc16( (U08*)&hdSWConfigGroup, sizeof( HD_SW_CONFIG_GROUP_T ) - sizeof(U16) ); + U16 calcCRC = crc16( (U08*)&hdSWConfigGroup, sizeof( HD_SW_CONFIG_GROUP_T ) - sizeof( U16 ) ); U16 recordCRC = hdSWConfigGroup.crc; if ( calcCRC != recordCRC ) { memset( (U08*)&hdSWConfigGroup, SW_CONFIG_DISABLE_VALUE, sizeof( HD_SW_CONFIG_GROUP_T ) ); // Recalculate the CRC with the default values - hdSWConfigGroup.crc = crc16( (U08*)&hdSWConfigGroup, sizeof( HD_SW_CONFIG_GROUP_T ) - sizeof(U16) ); + hdSWConfigGroup.crc = crc16( (U08*)&hdSWConfigGroup, sizeof( HD_SW_CONFIG_GROUP_T ) - sizeof( U16 ) ); // Set the to FALSE since the record is not valid status = FALSE; @@ -2697,13 +2715,13 @@ dgSystemGroup.dgSystemRecord.mfgLocation = 0; memset( dgSystemGroup.dgSystemRecord.topLevelPN, RECORD_DEFAULT_CHARACTER, sizeof( dgSystemGroup.dgSystemRecord.topLevelPN ) ); memset( dgSystemGroup.dgSystemRecord.topLevelSN, RECORD_DEFAULT_CHARACTER, sizeof( dgSystemGroup.dgSystemRecord.topLevelSN ) ); + // Recalculate the CRC with the default values - dgSystemGroup.dgSystemRecord.crc = crc16 ( (U08*)&dgSystemGroup.dgSystemRecord, sizeof( DG_SYSTEM_RECORD_T ) - sizeof( U16 ) ); + dgSystemGroup.dgSystemRecord.crc = crc16 ( (U08*)&dgSystemGroup.dgSystemRecord, sizeof( DG_SYSTEM_RECORD_T ) - sizeof( U16 ) ); + dgSystemGroup.crc = crc16 ( (U08*)&dgSystemGroup, sizeof( DG_SYSTEM_GROUP_T ) - sizeof( U16 ) ); + status = FALSE; activateAlarmNoData( ALARM_ID_DG_INVALID_SYSTEM_RECORD_CRC ); - - // Set the to FALSE since the record is not valid - status = FALSE; } return status; @@ -2730,6 +2748,7 @@ dgServiceGroup.dgServiceRecord.serviceIntervalSeconds = RECORD_DEFAULT_SERVICE_INTERVAL_S; //dgServiceGroup.dgServiceRecord.lastResetTimeEpoch = getRTCTimestamp(); // TODO un-comment with the next calibration table roll out dgServiceGroup.dgServiceRecord.crc = crc16 ( (U08*)&dgServiceGroup.dgServiceRecord, sizeof( DG_SERVICE_RECORD_T ) - sizeof( U16 ) ); + dgServiceGroup.crc = crc16 ( (U08*)&dgServiceGroup, sizeof( DG_SERVICE_GROUP_T ) - sizeof( U16 ) ); status = FALSE; // Service record failure is also considered as RTC RAM failure @@ -2750,7 +2769,7 @@ static BOOL isDGUsageRecordValid( void ) { BOOL status = TRUE; - U16 calcCRC = crc16( (U08*)&dgUsageInfoGroup, sizeof( DG_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); + U16 calcCRC = crc16( (U08*)&dgUsageInfoGroup.dgUsageInfo, sizeof( DG_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); U16 recordCRC = dgUsageInfoGroup.dgUsageInfo.crc; if ( calcCRC != recordCRC ) @@ -2762,6 +2781,7 @@ dgUsageInfoGroup.dgUsageInfo.roWaterGenTotalL = 0.0; 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 );