Index: firmware/App/Services/NVMgmtDD.c =================================================================== diff -u -r1e809a81cb8831f5aa5938bd333cc374920d5b87 -r45b03b9f23005c05fc75f69416595a155e250cbe --- firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision 1e809a81cb8831f5aa5938bd333cc374920d5b87) +++ firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision 45b03b9f23005c05fc75f69416595a155e250cbe) @@ -12,10 +12,12 @@ * ***************************************************************************/ #include // For memcpy +#include "Common.h" #include "NVDriver.h" #include "NVMgmtDD.h" #include "NVMsgQ.h" #include "NVRecordsDD.h" +#include "Timers.h" /// NVDataMgmt Exec states enumeration. typedef enum NVDataMgmt_Exec_State @@ -38,13 +40,15 @@ } RECORD_VALIDITY_CHECK_T; #define COMMAND_TIME_OUT (1 * MS_PER_SECOND) ///< Timeout for an EEPROM or RTC command in ms. +/// EEPROM functions use the buffer length as the size of U32. So before send the length to any of FAPI functions, it should be divided by 4. +#define EEPROM_OPS_SIZE_OF_CONVERTER 4 - static NVDATAMGMT_EXEC_STATE_T nvDataMgmtExecState; ///< NVDataMgmt exec state variable. static volatile BOOL powerOffIsImminent; ///< Power off warning has been signaled. Non-volatile memory operations should be completed ASAP and then ceased. static RECORD_VALIDITY_CHECK_T writtenRecordStatus; ///< Record data write validity check. static U08 writtenRecordCheckBuffer[ MAX_EEPROM_WRITE_BUFFER_BYTES ]; ///< Written record validity check buffer. static U32 currentTime; ///< Current time. +static U32 recordAddressOffset; ///< Record address offset. // Exec functions static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ); @@ -63,6 +67,7 @@ currentTime = 0; writtenRecordStatus = NVDATAMGMT_RECORD_NOT_CHECKED; + recordAddressOffset = 0; initNVDriver(); initNVMsgQ(); @@ -136,17 +141,20 @@ NVDATAMGMT_OPERATION_STATE_T ops; U32 startAddress; U08* bufferAddress; + PROCESS_RECORD_JOB_T recordCurrentJob; + RECORD_JOBS_STATE_T job; + PROCESS_RECORD_SPECS_T jobSpecs; // If power off command has been issued, do not process any new jobs if ( powerOffIsImminent != TRUE ) { // If the record processing queue is not empty, process the queues - if ( ( FALSE == isRecordQueueEmpty() ) && ( TRUE == areResourcesAvailableForNextJob() ) ) + if ( ( FALSE == isRecordQueueEmpty() ) && ( TRUE == isFlashReady() ) ) { dequeueRecordJob(); - - RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; - PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS[ job ]; + recordCurrentJob = getCurrentProcessRecordJob(); + job = recordCurrentJob.recordJob; + jobSpecs = getProcessRecord( job ); // Set the record address offset to 0 since a job will just be started recordAddressOffset = 0; areQueuesNotEmpty = TRUE; @@ -223,8 +231,9 @@ { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; BOOL timeoutStatus = didCommandTimeout( state ); + PROCESS_RECORD_JOB_T recordCurrentJob = getCurrentProcessRecordJob(); RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; - PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + PROCESS_RECORD_SPECS_T jobSpecs = getProcessRecord ( job ); // Check if the fapi has finished if ( TRUE == isFlashReady() ) @@ -311,8 +320,9 @@ { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE; BOOL timeoutStatus = didCommandTimeout( state ); + PROCESS_RECORD_JOB_T recordCurrentJob = getCurrentProcessRecordJob(); RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; - PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + PROCESS_RECORD_SPECS_T jobSpecs = getProcessRecord ( job ); // Check if the write job is EEPROM or RTC RAM if ( TRUE == isFlashReady() ) @@ -361,253 +371,17 @@ *************************************************************************/ void resetNVDataMgmtPOSTState( void ) { - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; - nvDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS; + updateNVSelfTestResult( SELF_TEST_STATUS_IN_PROGRESS ); + updateNVSelfTestState( NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS ); } -/*********************************************************************//** - * @brief - * The getNVRecord2Driver function copies the requested non-volatile - * data into the provided buffer by the caller. The function then checks if - * the non-volatile data is valid. If the data is not valid, it raises the - * provided alarm by the caller. - * @details Inputs: ddCalibrationRecord - * @details Outputs: ddCalibrationRecord - * @param nvData the non-volatile data to be copied - * @param bufferAddress the address of the provided buffer by the caller - * @param bufferLength the length of the provided buffer by the caller - * @param numOfSnsrs2Check the number of sensors to check in a array of sensors called - * @param nvAlarm the corresponding alarm of the non-volatile data to be raised - * if the data is not valid - * @return TRUE if the non-volatile data is valid otherwise, FALSE - *************************************************************************/ -BOOL getNVRecord2Driver( NV_DATA_T nvData, U08* bufferAddress, U32 bufferLength, U08 numOfSnsrs2Check, ALARM_ID_T nvAlarm ) +BOOL isNVExecStateIdle ( void ) { - U08 i; - U08* nvDataStartPtr = 0; - BOOL isNVDataInvalid = FALSE; - U32 nvDataLength = 0; - - switch ( nvData ) - { - - case GET_CAL_PRESSURE_SENOSRS: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.presSensorsCalRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.presSensorsCalRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.presSensorsCalRecord.pressureSensors[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_LOAD_CELL_SENSORS: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.loadCellsCalRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.loadCellsCalRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.loadCellsCalRecord.loadCells[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_FLOW_SENSORS: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.flowSensorsCalRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.flowSensorsCalRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.flowSensorsCalRecord.flowSensors[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_ACID_CONCENTREATES: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.acidConcentratesRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.acidConcentratesRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.acidConcentratesRecord.acidConcentrate[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_BICARB_CONCENTRATES: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.bicarbConcentratesRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.bicarbConcentratesRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.bicarbConcentratesRecord.bicarbConcentrate[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_ACCEL_SENSORS: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.accelerometerSensorCalRecord; - isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.accelerometerSensorCalRecord.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_TEMP_SENSORS: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.tempSensorsCalRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.tempSensorsCalRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.tempSensorsCalRecord.tempSensors[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_RSRVRS_VOL_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.reservoirVolumesRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.reservoirVolumesRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.reservoirVolumesRecord.reservoir[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_HEATING_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.heatingCalRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.heatingCalRecord ); - isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.heatingCalRecord.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_DRAIN_LINE_VOLUME_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.drainLineVolumeRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.drainLineVolumeRecord ); - isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.drainLineVolumeRecord.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_RO_PUMP_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.roPumpRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.roPumpRecord ); - isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.roPumpRecord.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_CONCENTRATE_PUMPS_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.concentratePumpsRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.concentratePumpsRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.concentratePumpsRecord.concentratePumps[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_DRAIN_PUMP_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.drainPumpRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.drainPumpRecord ); - isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.drainPumpRecord.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_FANS_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.fansRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.fansRecord ); - for ( i = 0; i < numOfSnsrs2Check; i++ ) - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.fansRecord.fans[ i ].calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_PRE_RO_PURGE_VOLUME_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.preROPurgeVolumeRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.preROPurgeVolumeRecord ); - isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.preROPurgeVolumeRecord.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_FILTERS_RECORD: - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.filtersRecord; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.filtersRecord ); - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.filtersRecord.carbonFilter.calibrationTime ? TRUE : FALSE ); - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.filtersRecord.carbonPolishFilter.calibrationTime ? TRUE : FALSE ); - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.filtersRecord.roFilter.calibrationTime ? TRUE : FALSE ); - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.filtersRecord.sedimentFilter.calibrationTime ? TRUE : FALSE ); - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.filtersRecord.ultraFilter.calibrationTime ? TRUE : FALSE ); - break; - - case GET_CAL_FILL_CONDUCTIVITIES_RECORD: - { - DG_FILL_COND_OPS_T fillOps; - - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.fillCondCalRecord.fillCondValues; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.fillCondCalRecord.fillCondValues ); - - for ( i = 0; i < numOfSnsrs2Check; i++ ) - { - for ( fillOps = FILL_COND_NORMAL_OP; fillOps < NUM_OF_FILL_COND_TEST; fillOps++ ) - { - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.fillCondCalRecord.fillCondValues[ i ][ fillOps ].calibrationTime ? TRUE : FALSE ); - } - } - } - break; - - case GET_INF_HEATERS_RECORD: - nvDataStartPtr = (U08*)&ddHeatersInfoGroup.ddHeatersInfo; - nvDataLength = sizeof( ddHeatersInfoGroup.ddHeatersInfo ); - break; - - case GET_SYS_RECORD: - nvDataStartPtr = (U08*)&ddSystemGroup.ddSystemRecord; - nvDataLength = sizeof( ddSystemGroup.ddSystemRecord ); - break; - - case GET_SRV_RECORD: - nvDataStartPtr = (U08*)&ddServiceGroup.ddServiceRecord; - nvDataLength = sizeof( ddServiceGroup.ddServiceRecord ); - break; - - case GET_SRR_RECORD: - nvDataStartPtr = (U08*)&ddScheduledRunsGroup.ddScheduledRun; - nvDataLength = sizeof( ddScheduledRunsGroup.ddScheduledRun ); - break; - - case GET_USAGE_RECORD: - nvDataStartPtr = (U08*)&ddUsageInfoGroup.ddUsageInfo; - nvDataLength = sizeof( ddUsageInfoGroup.ddUsageInfo ); - break; - - default: -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_NV_RECORD_SELECTED, nvData ); - break; - } - - // Make sure the provided buffer length is >= NV Data Length in the NV data management so the memory of the other variables is not - // overridden. - if ( ( bufferLength >= nvDataLength ) && ( nvDataStartPtr != 0 ) ) - { - // Copy the data into the provided buffer - memcpy( bufferAddress, nvDataStartPtr, bufferLength ); - } - - // Check if the non-volatile data is valid and if not raise the alarm - if ( TRUE == isNVDataInvalid ) - { - // If no alarm has been provided to raise, just set the variable as TRUE - if ( ALARM_ID_NO_ALARM == nvAlarm ) - { - isNVDataInvalid = FALSE; - } - else - { -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CAL_CHECK ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - activateAlarmNoData( nvAlarm ); - } -#ifndef _RELEASE_ - else - { - isNVDataInvalid = FALSE; - } -#endif - } - } - - // Reverse the polarity to signal the outside users that the calibration has passed. - return ( FALSE == isNVDataInvalid ? TRUE : FALSE ); + return ( NVDATAMGMT_EXEC_STATE_IDLE == nvDataMgmtExecState ); } -#ifndef _RELEASE_ /*********************************************************************//** * @brief - * The getSoftwareConfigStatus function returns the status of a software - * configuration. - * @details Inputs: swConfigsList - * @details Outputs: none - * @param config which is the configuration of the that its status is requested - * @return status of the software configuration (0 or 1) - *************************************************************************/ -U08 getSoftwareConfigStatus( SOFTWARE_CONFIG_T config ) -{ - U08 value = 0; - - // If the build is not a release, get the value from the software configurations list - // If the build is a release, the configuration not matter what its value is kept in - // the NV RAM, it returns a 0 which is the configuration is disabled - value = ddSWConfigGroup.ddSWConfigsRecord.swConfigs[ config ]; - - return value; -} -#endif - -/*********************************************************************//** - * @brief * The didCommandTimedout checks whether the a command whether RTC RAM or * EEPROM has timedout. If it has timedout, it sets the alarm and turns * flag to TRUE. @@ -630,48 +404,5 @@ } -/*********************************************************************//** - * @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: - ddCalibrationRecord.crc = crc; - status = enqueueSector0Records(); - break; - case NVDATAMGMT_SYSTEM_RECORD: - ddSystemGroup.ddSystemRecord.crc = crc; - status = enqueueSector0Records(); - break; - - case NVDATAMGMT_SERVICE_RECORD: - ddServiceGroup.ddServiceRecord.crc = crc; - status = enqueueSector0Records(); - break; - - case NVDATAMGMT_USAGE_INFO_RECORD: - ddUsageInfoGroup.ddUsageInfo.crc = crc; - if ( getAvailableRecordQueueCount() > 0 ) - { - enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_USAGE_INFO_RECORD ); - status = TRUE; - } - break; - - } - - return status; -} -