Index: NVDataMgmt.c =================================================================== diff -u -ra6005795af5d50ce9248d2801673e16a2fad0001 -r363cb32e448a75b1c62e5344ee246f5a32fd2466 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision a6005795af5d50ce9248d2801673e16a2fad0001) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 363cb32e448a75b1c62e5344ee246f5a32fd2466) @@ -106,6 +106,10 @@ #define RECORD_DEFAULT_CONST 0.0 ///< Record default constant. #define RECORD_DEFAULT_RATIO 1.0 ///< Record default ratio. +/// Once a new calibration data is available the driver, sets a signal for the defined time. Once the time +/// is out, it turns the signal off. +#define NEW_CAL_AVAILABLE_SIGNAL_TIMEOUT_MS (1 * MS_PER_SECOND) + /// NVDataMgmt self-test states enumeration. typedef enum NVDataMgmt_Self_Test_States { @@ -427,50 +431,53 @@ static SELF_TEST_STATUS_T nvDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< NVDataMgmt self-test result. static U32 currentTime = 0; ///< Current time. static volatile BOOL powerOffIsImminent = FALSE; ///< Power off warning has been signaled. Non-volatile memory operations should be completed ASAP and then ceased. +static BOOL isNewCalAvailable = FALSE; ///< Signal to indicate whether a new calibration data is available. +static U32 newCalStartTimer = 0; ///< New calibration availability start timer. // Private functions -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadSystemRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadSystemRecord( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadScheduledRunsRecord( void ); #ifdef _HD_ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadHDTreatmentTime ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadHDTreatmentTime( void ); #endif #ifdef _DG_ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadDGWaterConsumption ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadDGWaterConsumption( void ); #endif -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState ( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecIdleState ( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecEraseState ( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecWriteToEEPROMState ( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecVerifyEEPROMWriteState ( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecReadFromEEPROMState ( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecWriteToRAMState ( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecEraseState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecWriteToEEPROMState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecVerifyEEPROMWriteState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecReadFromEEPROMState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecWriteToRAMState( void ); static NVDATAMGMT_EXEC_STATE_T handleExecVerifyRTCWriteState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecReadFromRAMState ( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecReadFromRAMState( void ); static PROCESS_RECORD_STATE_T handleExecProcessRecordIdleState( void ); static PROCESS_RECORD_STATE_T handleExecProcessRecordSendRecordState( void ); // Log queue functions -static void setMemoryOpsStruct ( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, +static void setMemoryOpsStruct( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, U32 startAddress, U08* data, READ_DATA_T* extAddress, U32 length ); -static void enqueue ( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, +static void enqueue( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, U32 startAddress, U08* data, READ_DATA_T* extAddress, U32 length ); -static void dequeue ( void ); -static U32 prepareWriteLogJobAndGetStartAddress ( U08* data ); -static U32 prepareReadLogJobAndGetStartAddress ( void ); -static BOOL isQueueEmpty ( void ); -static BOOL isQueueFull ( void ); -static U32 getAvailableQueueCount ( void ); +static void dequeue( void ); +static U32 prepareWriteLogJobAndGetStartAddress( U08* data ); +static U32 prepareReadLogJobAndGetStartAddress( void ); +static BOOL isQueueEmpty( void ); +static BOOL isQueueFull( void ); +static U32 getAvailableQueueCount( void ); // Helper functions -static BOOL didCommandTimeout ( ALARM_ID_T alarm, U08* state ); -static BOOL eraseDataLogSectors ( void ); +static BOOL didCommandTimeout( ALARM_ID_T alarm, U08* state ); +static BOOL eraseDataLogSectors( void ); +static void monitorNewCalSignal( void ); // Record operations queue functions static void enqueueRecordJob( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, RECORD_JOBS_STATE_T job ); @@ -512,13 +519,15 @@ * nvDataMgmtExecReceiveRecordState, queueRearIndex, queueFrontIndex, * queueFrontIndex, queueCount, recordUpdateAddress, recordQueueRearIndex, * recordQueueFrontIndex, recordQueueCount, recordAddressOffset, - * writtenRecordStatus, hasPublishRecordBeenRequested + * writtenRecordStatus, hasPublishRecordBeenRequested, isNewCalAvailable, + * newCalStartTimer * @details Outputs: nvDataMgmtSelfTestState, nvDataMgmtExecState, * nvDataMgmtSelfTestResult, nvDataMgmtExecProcessRecordState, * nvDataMgmtExecReceiveRecordState, queueRearIndex, queueFrontIndex, * queueFrontIndex, queueCount, recordUpdateAddress, recordQueueRearIndex, * recordQueueFrontIndex, recordQueueCount, recordAddressOffset, - * writtenRecordStatus, hasPublishRecordBeenRequested + * writtenRecordStatus, hasPublishRecordBeenRequested, isNewCalAvailable, + * newCalStartTimer * @return none *************************************************************************/ void initNVDataMgmt( void ) @@ -539,6 +548,8 @@ recordAddressOffset = 0; writtenRecordStatus = NVDATAMGMT_RECORD_NOT_CHECKED; hasPublishRecordBeenRequested = FALSE; + isNewCalAvailable = FALSE; + newCalStartTimer = 0; // Initialize and activate flash bank 7 Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); @@ -616,6 +627,9 @@ nvDataMgmtExecState = NVDATAMGMT_EXEC_STATE_IDLE; break; } + + // Check the calibration signal + monitorNewCalSignal(); } /*********************************************************************//** @@ -820,6 +834,10 @@ // CRC passed, enqueue an erase, a write of calibration data and a write of service record BOOL scheduleStatus = enqueueSector0Records(); + // Signal that there is a new calibration record available. + isNewCalAvailable = TRUE; + newCalStartTimer = getMSTimerCount(); + // Done with receiving data, go back to idle nvDataMgmtExecReceiveRecordState = NVDATAMGMT_RECEIVE_RECORD_IDLE; } @@ -1156,6 +1174,20 @@ return status; } +/*********************************************************************//** + * @brief + * The isNewCalibrationRecordAvailable function returns the status of a + * new calibration availability. + * @details Inputs: none + * @details Outputs: none + * @return isNewCalAvailable which is TRUE is cal is available, otherwise + * FALSE + *************************************************************************/ +BOOL isNewCalibrationRecordAvailable( void ) +{ + return isNewCalAvailable; +} + #ifdef _DG_ /*********************************************************************//** * @brief @@ -1758,7 +1790,6 @@ getDataFromRAM( bufferAddress, maxBufferLength ); #ifdef _DG_ - if ( getRTCRAMState() == RTC_RAM_STATE_READY ) { PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_SCHEDULED_RUNS_RECORD ]; @@ -1879,7 +1910,7 @@ // If the RAM is in Idle, read the log records if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) { - // TODO enable the logs once we get back to logging + // TODO enable the logs once we get back to logging the data in the future phases //U32 len = sizeof(MFG_RECORD_T) / sizeof(U32); //U32 *addr = (U32*)&mfgRecord; @@ -2010,7 +2041,7 @@ maxBufferLength = jobSpecs.maxReadBufferSize; } } - // TODO add the log queue later. + // TODO add the log queue later in the future phases. } // Check if a queue job is available @@ -2866,6 +2897,22 @@ /*********************************************************************//** * @brief + * The monitorNewCalSignal function monitors the new calibration signal + * and if it on and time to on has elapsed, it turns it off. + * @details Inputs: isNewCalAvailable + * @details Outputs: isNewCalAvailable + * @return none + *************************************************************************/ +static void monitorNewCalSignal( void ) +{ + if ( didTimeout( newCalStartTimer, NEW_CAL_AVAILABLE_SIGNAL_TIMEOUT_MS ) && isNewCalAvailable == TRUE ) + { + isNewCalAvailable = FALSE; + } +} + +/*********************************************************************//** + * @brief * The areRecordsValid function checks whether the records are still valid * by calculating the CRCs and comparing it to the strucutre's CRC. * @details Inputs: none Index: NVDataMgmt.h =================================================================== diff -u -r63224e051e2c46221bd5fa8505da344d4294b307 -r363cb32e448a75b1c62e5344ee246f5a32fd2466 --- NVDataMgmt.h (.../NVDataMgmt.h) (revision 63224e051e2c46221bd5fa8505da344d4294b307) +++ NVDataMgmt.h (.../NVDataMgmt.h) (revision 363cb32e448a75b1c62e5344ee246f5a32fd2466) @@ -102,6 +102,8 @@ BOOL getScheduledRunsRecord( void ); BOOL setScheduledRunsRecord( U32 currentMessage, U32 totalMessages, U32 length, U08 *addressPtr ); +BOOL isNewCalibrationRecordAvailable( void ); + #ifdef _DG_ DG_PRES_SENSORS_CAL_RECORD_T getDGPressureSensorsCalibrationRecord( void ); DG_FLOW_SENSORS_CAL_RECORD_T getDGFlowSensorsCalibrationRecord( void ); Index: NVDataMgmtHDRecords.h =================================================================== diff -u -r5010eb0fe6fb79f67dfa73ae40331d61cd80f17b -r363cb32e448a75b1c62e5344ee246f5a32fd2466 --- NVDataMgmtHDRecords.h (.../NVDataMgmtHDRecords.h) (revision 5010eb0fe6fb79f67dfa73ae40331d61cd80f17b) +++ NVDataMgmtHDRecords.h (.../NVDataMgmtHDRecords.h) (revision 363cb32e448a75b1c62e5344ee246f5a32fd2466) @@ -135,13 +135,13 @@ /// HD occlusion sensors calibration record typedef struct { - POLYNOMIAL_CAL_PAYLOAD_T hdOcclusionSensors[ NUM_OF_CAL_DATA_OCCLUSION_SENSORS ]; ///< HD occlusion sensors calibration data. + POLYNOMIAL_CAL_PAYLOAD_T hdOcclusionSensors[ NUM_OF_CAL_DATA_OCCLUSION_SENSORS ]; ///< HD occlusion sensors calibration data. } HD_OCCLUSION_SENSORS_CAL_RECORD_T; /// HD flow sensors calibration record typedef struct { - POLYNOMIAL_CAL_PAYLOAD_T hdFlowSensors[ NUM_OF_CAL_DATA_HD_FLOW_SENSORS ]; ///< HD flow sensors calibration data. + POLYNOMIAL_CAL_PAYLOAD_T hdFlowSensors[ NUM_OF_CAL_DATA_HD_FLOW_SENSORS ]; ///< HD flow sensors calibration data. } HD_FLOW_SENSORS_CAL_RECORD_T; /// HD pressure sensors calibration record