Index: NVDataMgmt.c =================================================================== diff -u -re8828d66e4a76e0590c3f06b7f6235f33df64e80 -raa1221efc98233c54a97a2cbbf7fb1a5a35d385d --- NVDataMgmt.c (.../NVDataMgmt.c) (revision e8828d66e4a76e0590c3f06b7f6235f33df64e80) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision aa1221efc98233c54a97a2cbbf7fb1a5a35d385d) @@ -8,7 +8,7 @@ * @file NVDataMgmt.c * * @author (last) Sean Nash -* @date (last) 21-Jul-2020 +* @date (last) 12-Aug-2020 * * @author (original) Dara Navaei * @date (original) 12-Feb-2020 @@ -72,7 +72,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 @@ -172,6 +172,7 @@ { MFG_DATA_T mfgData; ///< Manufacturing data struct U16 crc; ///< Manufacturing data CRC + U08 Padding[ 0x30 - sizeof(MFG_DATA_T) - sizeof(U16) ]; ///< Padding for reserved mfg data space } MFG_RECORD_T; /// Service record struct @@ -186,6 +187,7 @@ { CALIBRATION_DATA_T calData; ///< Calibration data struct U16 crc; ///< Calibration data CRC + U08 Padding[ 0x50 - sizeof(CALIBRATION_DATA_T) - sizeof(U16) ]; ///< Padding for reserved cal data space } CALIBRATION_RECORD_T; /// Last disinfection record struct @@ -216,6 +218,8 @@ 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 +static volatile BOOL powerOffIsImminent = FALSE; ///< Power off warning has been signaled. Non-volatile memory operations should be completed ASAP and then ceased. // Private functions @@ -264,7 +268,6 @@ * @details * Inputs : none * Outputs : none - * @param none * @return none *************************************************************************/ void initNVDataMgmt ( void ) @@ -280,6 +283,21 @@ } /************************************************************************* + * @brief + * The signalPowerOffWarning signals this module that system power off is \n + * imminent and any non-volatile data writes in progress should be wrapped up \n + * quickly and any pending non-volatile data writes should not be started. + * @details + * Inputs : none + * Outputs : powerOffIsImminent + * @return none + *************************************************************************/ +void signalPowerOffWarning( void ) +{ + powerOffIsImminent = TRUE; +} + +/************************************************************************* * @brief setMfgData * The setMfgData updates the struct that holds the manufacturing data, * calls another function to calculate the CRC for the provided data and @@ -288,7 +306,6 @@ * @details * Inputs : MFG_DATA_T (data) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL setMfgData ( MFG_DATA_T data ) @@ -306,7 +323,6 @@ * @details * Inputs : MFG_DATA_T* (buffer) * Outputs : BOOL (status) - * @param none * @return BOOL (status) *************************************************************************/ BOOL getMfgData ( MFG_DATA_T* buffer ) @@ -331,16 +347,17 @@ * @details * Inputs : MFG_DATA_T (data) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL setCalibrationData ( CALIBRATION_DATA_T data ) { + BOOL status; + calibrationRecord.calData = data; - calibrationRecord.crc = crc16 ( (U08*)&calibrationRecord.calData, - sizeof(CALIBRATION_DATA_T) ); + calibrationRecord.crc = crc16( (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_DATA_T) ); // The entire sector 0 must be erased and re-written again - BOOL status = enqueueBank7Sector0Records(); + status = enqueueBank7Sector0Records(); + return status; } @@ -351,7 +368,6 @@ * @details * Inputs : CALIBRATION_DATA_T* (buffer) * Outputs : BOOL (status) - * @param none * @return BOOL (status) *************************************************************************/ BOOL getCalibrationData ( CALIBRATION_DATA_T* buffer ) @@ -361,11 +377,12 @@ if ( buffer != NULL ) { memcpy ( buffer, (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_DATA_T) ); - status = TRUE; + status = calRecordIsValid; } return status; - } +} + /************************************************************************* * @brief setServiceDate * The setServiceDate updates the struct that holds the calibration data, @@ -374,7 +391,6 @@ * @details * Inputs : SERVICE_DATA_T (data) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL setServiceDate ( SERVICE_DATA_T data ) @@ -400,7 +416,6 @@ * @details * Inputs : SERVICE_DATA_T* (buffer) * Outputs : BOOL (status) - * @param none * @return BOOL (status) *************************************************************************/ BOOL getServiceDate ( SERVICE_DATA_T* buffer ) @@ -423,7 +438,6 @@ * @details * Inputs : LOG_DATA_T* (data) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL writeLogData ( LOG_DATA_T* data ) @@ -447,7 +461,6 @@ * @details * Inputs : READ_DATA_T* (buffer), U32 (length) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL readLogData ( READ_DATA_T* buffer, U32 length ) @@ -471,7 +484,6 @@ * @details * Inputs : U32 (mins) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL setTreatmentTime ( U32 hours ) @@ -497,7 +509,6 @@ * @details * Inputs : none * Outputs : U32 - * @param none * @return U32 *************************************************************************/ U32 getTreatmentTime ( void ) @@ -512,7 +523,6 @@ * @details * Inputs : U32 (liters) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL setWaterConsumption ( U32 liters ) @@ -537,7 +547,6 @@ * @details * Inputs : none * Outputs : U32 - * @param none * @return U32 *************************************************************************/ U32 getWaterConsumption ( void ) @@ -553,7 +562,6 @@ * @details * Inputs : DISINFECTION_DATE_T (date) * Outputs : BOOL (status) - * @param none * @return BOOL (status) *************************************************************************/ BOOL setDisinfectionDate ( DISINFECTION_DATE_T date ) @@ -579,7 +587,6 @@ * @details * Inputs : DISINFECTION_DATE_T* (buffer) * Outputs : BOOL (status) - * @param none * @return BOOL (status) *************************************************************************/ BOOL getDisinfectionDate ( DISINFECTION_DATE_T* buffer ) @@ -601,7 +608,6 @@ * @details * Inputs : none * Outputs : SELF_TEST_STATUS_T - * @param none * @return SELF_TEST_STATUS_T *************************************************************************/ SELF_TEST_STATUS_T execNVDataMgmtSelfTest ( void ) @@ -690,7 +696,6 @@ * @details * Inputs : U32 (flag) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ BOOL setBootloaderFlag ( U32 flag ) @@ -713,7 +718,6 @@ * @details * Inputs : none * Outputs : U32 (flag value) - * @param none * @return U32 (flag value) *************************************************************************/ U32 getBootloaderFlag( void ) @@ -727,11 +731,10 @@ * @details * Inputs : none * Outputs : none - * @param none * @return none *************************************************************************/ -void execNVDataMgmt ( void ) -{ +void execNVDataMgmt( void ) +{ // TODO - not sure where it should go Dara, but need to look at powerOffIsImminent flag and block queuing of any new jobs, maybe even block starting of any new jobs if flag is set switch ( NVDataMgmtExecState ) { case NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST: @@ -791,7 +794,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart ( void ) @@ -813,7 +815,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestEnableEEPROM ( void ) @@ -843,7 +844,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag ( void ) @@ -884,7 +884,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadHDTreatmentTime ( void ) @@ -915,7 +914,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadDGWaterConsumption ( void ) @@ -944,7 +942,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord ( void ) @@ -955,12 +952,14 @@ // If the RAM is in Idle, read the log records if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) { + U32 len = sizeof(MFG_RECORD_T) / sizeof(U32); + U32 *addr = (U32*)&mfgRecord; + getDataFromRAM ( (U08*)&logRecord, sizeof(LOG_RECORD_T) ); currentTime = getMSTimerCount(); // Get ready for reading the manufacturing record - Fapi_doMarginRead ( (U32*)BANK7_SECTOR0_START_ADDRESS, (U32*)&mfgRecord, - sizeof(MFG_RECORD_T), Fapi_NormalRead ); + Fapi_doMarginRead( (U32*)BANK7_SECTOR0_START_ADDRESS, addr, len, Fapi_NormalRead ); state = NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD; } @@ -974,7 +973,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord ( void ) @@ -988,7 +986,7 @@ currentTime = getMSTimerCount(); // Send the read command for calibration record Fapi_doMarginRead ( (U32*)CALIBRATION_RECORD_START_ADDRESS, (U32*)&calibrationRecord, - sizeof(CALIBRATION_RECORD_T), Fapi_NormalRead ); + sizeof(CALIBRATION_RECORD_T) / sizeof(U32), Fapi_NormalRead ); state = NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD; } @@ -1002,7 +1000,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ) @@ -1032,7 +1029,6 @@ * @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 ) @@ -1061,7 +1057,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLastDisinfectionDate ( void ) @@ -1086,7 +1081,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T - * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ) @@ -1098,11 +1092,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; @@ -1120,6 +1116,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; @@ -1143,14 +1140,20 @@ 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) ); + 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 ); } + 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; @@ -1159,8 +1162,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; @@ -1179,7 +1182,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState ( void ) @@ -1201,7 +1203,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecIdleState ( void ) @@ -1270,7 +1271,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecWriteToEEPROMState ( void ) @@ -1293,7 +1293,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecReadFromEEPROMState ( void ) @@ -1317,7 +1316,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecEraseState ( void ) @@ -1341,7 +1339,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecWriteToRAMState ( void ) @@ -1366,7 +1363,6 @@ * @details * Inputs : none * Outputs : NVDATAMGMT_EXEC_STATE_T - * @param none * @return NVDATAMGMT_EXEC_STATE_T *************************************************************************/ static NVDATAMGMT_EXEC_STATE_T handleExecReadFromRAMState ( void ) @@ -1392,7 +1388,6 @@ * (location), U32 (startAddress), U08* (data), READ_DATA_T* (extAddress) * U32 (length) * Outputs : none - * @param none * @return none *************************************************************************/ static void setMemoryOpsStruct ( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, @@ -1430,7 +1425,6 @@ * @details * Inputs : U08* (data) * Outputs : U32 (opsStartAddress) - * @param none * @return U32 (opsStartAddress) *************************************************************************/ static U32 prepareWriteLogJobAndGetStartAddress ( U08* data ) @@ -1483,7 +1477,6 @@ * @details * Inputs : none * Outputs : U32 (opsStartAddress) - * @param none * @return U32 (opsStartAddress) *************************************************************************/ static U32 prepareReadLogJobAndGetStartAddress ( void ) @@ -1530,7 +1523,6 @@ * (location), U32 (startAddress), U08* (data), READ_DATA_T* (extAddress) * U32 (length) * Outputs : none - * @param none * @return none *************************************************************************/ static void enqueue ( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, @@ -1592,7 +1584,6 @@ * @details * Inputs : none * Outputs : none - * @param none * @return none *************************************************************************/ static void dequeue ( void ) @@ -1620,7 +1611,6 @@ * @details * Inputs : none * Outputs : isEmpty (BOOL) - * @param none * @return isEmpty (BOOL) *************************************************************************/ static BOOL isQueueEmpty ( void ) @@ -1642,7 +1632,6 @@ * @details * Inputs : none * Outputs : isFull (BOOL) - * @param none * @return isFull (BOOL) *************************************************************************/ static BOOL isQueueFull ( void ) @@ -1663,7 +1652,6 @@ * @details * Inputs : none * Outputs : U32 - * @param none * @return U32 *************************************************************************/ static U32 getAvailableQueueCount ( void ) @@ -1680,7 +1668,6 @@ * @details * Inputs : none * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ static BOOL enqueueBank7Sector0Records( void ) @@ -1692,10 +1679,8 @@ { // Sector 0 must be erased first enqueue ( NVDATAMGMT_ERASE_SECTOR, NVDATAMGMT_EEPROM, BANK7_SECTOR0_START_ADDRESS, 0, 0, 0 ); - enqueue ( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, BANK7_SECTOR0_START_ADDRESS, - (U08*)&mfgRecord, 0, sizeof(MFG_RECORD_T) ); - enqueue ( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, CALIBRATION_RECORD_START_ADDRESS, - (U08*)&calibrationRecord, 0, sizeof(CALIBRATION_RECORD_T) ); + enqueue ( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, BANK7_SECTOR0_START_ADDRESS, (U08*)&mfgRecord, 0, sizeof(MFG_RECORD_T) ); + enqueue ( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, CALIBRATION_RECORD_START_ADDRESS, (U08*)&calibrationRecord, 0, sizeof(CALIBRATION_RECORD_T) ); status = TRUE; } @@ -1710,7 +1695,6 @@ * @details * Inputs : ALARM_ID_T (alarm), U08* state (pointer to the state) * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ static BOOL didCommandTimeout ( ALARM_ID_T alarm, U08* state ) @@ -1738,7 +1722,6 @@ * @details * Inputs : none * Outputs : BOOL - * @param none * @return BOOL *************************************************************************/ static BOOL eraseDataLogSectors ( void )