Index: NVDataMgmt.c =================================================================== diff -u -r7e186bb97310fb59f525e5399ec7a74711bea571 -r839935998cfe2a1a7594e6b6810301ad3c2aa872 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 7e186bb97310fb59f525e5399ec7a74711bea571) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 839935998cfe2a1a7594e6b6810301ad3c2aa872) @@ -25,6 +25,7 @@ #include "MsgQueues.h" #include "NVDataMgmt.h" +#include "OperationModes.h" #include "RTC.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -155,6 +156,7 @@ NVDATAMGMT_SELF_TEST_STATE_READ_WATER_CONSUMPTION, ///< Self test read water consumption. TODO combine with tx time NVDATAMGMT_SELF_TEST_STATE_READ_DG_HEATERS_INFO, ///< Self test read DG heaters information. NVDATAMGMT_SELF_TEST_STATE_READ_SW_CONFIG_RECORD, ///< Self test read software configuration record. + NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS, // TODO new POST State ///< Self test read records. NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC, ///< Self test check CRC. NVDATAMGMT_SELF_TEST_STATE_COMPLETE, ///< Self test complete. NUM_OF_NVDATAMGMT_SELF_TEST_STATES ///< Total number of self-test states. @@ -436,6 +438,7 @@ // Process records specifications const PROCESS_RECORD_SPECS_T RECORDS_SPECS[ NUM_OF_NVDATMGMT_RECORDS_JOBS ] = { + // Start address Size of the job Max write bytes per job Max read bytes per job Record structure pointer Record CRC pointer Memory location {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(DG_CALIBRATION_RECORD_T), (U08*)&dgCalibrationRecord, (U08*)&dgCalibrationRecord.crc, NVDATAMGMT_EEPROM}, // NVDATAMGMT_CALIBRATION_RECORD {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(DG_SYSTEM_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(DG_SYSTEM_GROUP_T), (U08*)&dgSystemGroup, (U08*)&dgSystemGroup.crc, NVDATAMGMT_EEPROM}, // NVDATAMGMT_SYSTEM_RECORD {SERVICE_RECORD_START_ADDRESS, sizeof(DG_SERVICE_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&dgServiceGroup, (U08*)&dgServiceGroup.crc, NVDATAMGMT_RTC}, // NVDATAMGMT_SERVICE_RECORD @@ -521,6 +524,9 @@ #endif static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadSWConfigRecord( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord( void ); + +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadRecords( void ); // TODO new function + static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ); @@ -560,6 +566,7 @@ static BOOL isRecordQueueEmpty( void ); static U32 getAvailableRecordQueueCount( void ); static BOOL enqueueSector0Records( void ); +static void enqueuePOSTReadRecords( void ); // Record check helper functions static BOOL areRecordsValid( void ); @@ -634,6 +641,8 @@ newCalStartTimer = 0; hasServiceRecordBeenUpdated = FALSE; + enqueuePOSTReadRecords(); + // Initialize and activate flash bank 7 Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); Fapi_setActiveFlashBank( Fapi_FlashBank7 ); @@ -767,6 +776,10 @@ nvDataMgmtSelfTestState = handleSelfTestReadSWConfigRecord(); break; + case NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS: + nvDataMgmtSelfTestState = handleSelfTestReadRecords(); + break; + case NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC: nvDataMgmtSelfTestState = handleSelfTestCheckCRC(); break; @@ -1563,7 +1576,7 @@ { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_START; - if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady ) + /*if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady ) { PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_CALIBRATION_RECORD ]; U32 startAddress = specs.startAddress; @@ -1575,7 +1588,8 @@ state = NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD; } - return state; + return state;*/ + return NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS; } /*********************************************************************//** @@ -1921,6 +1935,18 @@ return state; } +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadRecords( void ) +{ + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS; + + if ( TRUE == isRecordQueueEmpty() ) + { + state = NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC; + } + + return state; +} + /*********************************************************************//** * @brief * The handleSelfTestCheckCRC calculates the CRC of the records and compares @@ -2002,7 +2028,7 @@ * @details Outputs: none * @return next state *************************************************************************/ -static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState ( void ) +static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState ( void ) // TODO remove this function { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; @@ -2011,7 +2037,8 @@ state = NVDATAMGMT_EXEC_STATE_IDLE; } - return state; + //return state; + return NVDATAMGMT_EXEC_STATE_IDLE; } /*********************************************************************//** @@ -2025,28 +2052,28 @@ static NVDATAMGMT_EXEC_STATE_T handleExecIdleState ( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_IDLE; - + BOOL areQueuesNotEmpty = FALSE; NVDATAMGMT_OPERATION_STATE_T ops; NVDATAMGMT_LOCATION_STATE_T location; U32 startAddress; U08* bufferAddress; U32 maxBufferLength; - BOOL areQueuesNotEmpty = FALSE; + // TODO queue peek // If power off command has been issued, do not process any new jobs if ( powerOffIsImminent != TRUE ) { // Check if the service record has to be updated - updateServiceRecord(); + //updateServiceRecord(); // TODO what is this doing here? // If the record processing queue is not empty, process the queues if ( FALSE == isRecordQueueEmpty() ) { dequeueRecordJob(); RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; - PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS[ job ]; // Set the record address offset to 0 since a job will just be started recordAddressOffset = 0; areQueuesNotEmpty = TRUE; @@ -2058,13 +2085,18 @@ activeQueue = NVDATAMGMT_PROCESS_RECORDS; // Choose the right buffer size - if ( ops == NVDATAMGMT_WRITE ) + if ( ( NVDATAMGMT_WRITE == ops ) ) { maxBufferLength = jobSpecs.maxWriteBufferSize; } else if ( ops == NVDATAMGMT_READ ) { - maxBufferLength = jobSpecs.maxReadBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER; + maxBufferLength = jobSpecs.maxReadBufferSize; + + if ( NVDATAMGMT_EEPROM == location ) + { + maxBufferLength = jobSpecs.maxReadBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER; + } } } // TODO add the log queue later in Phase 1B. @@ -2073,24 +2105,30 @@ // Check if a queue job is available if ( TRUE == areQueuesNotEmpty ) { - if ( ops == NVDATAMGMT_ERASE_SECTOR ) + if ( NVDATAMGMT_ERASE_SECTOR == ops ) { Fapi_issueAsyncCommandWithAddress( Fapi_EraseSector, (U32*)startAddress ); state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; } - else if ( ops == NVDATAMGMT_WRITE && location == NVDATAMGMT_EEPROM ) + else if ( ( NVDATAMGMT_WRITE == ops ) && ( NVDATAMGMT_EEPROM == location ) ) { Fapi_issueProgrammingCommand( (U32*)startAddress, (U08*)bufferAddress, maxBufferLength, 0x00, 0, Fapi_DataOnly ); + currentTime = getMSTimerCount(); state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; } else if ( ops == NVDATAMGMT_READ && location == NVDATAMGMT_EEPROM ) { - Fapi_doMarginRead( (U32*)startAddress, (U32*)bufferAddress, maxBufferLength / EEPROM_OPS_SIZE_OF_CONVERTER, Fapi_NormalRead ); - state = NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM; + if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady ) + { + Fapi_doMarginRead( (U32*)startAddress, (U32*)bufferAddress, maxBufferLength, Fapi_NormalRead ); + + currentTime = getMSTimerCount(); + state = NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM; + } } else if ( ops == NVDATAMGMT_WRITE && location == NVDATAMGMT_RTC ) { - if ( getRTCRAMState() == RTC_RAM_STATE_READY ) + if ( ( RTC_RAM_STATE_READY == getRTCRAMState() ) && ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) ) { currentTime = getMSTimerCount(); writeToRAM( startAddress, bufferAddress, maxBufferLength ); @@ -2099,11 +2137,11 @@ } else if ( ops == NVDATAMGMT_READ && location == NVDATAMGMT_RTC ) { - if ( getRTCRAMState() == RTC_RAM_STATE_READY ) + if ( ( RTC_RAM_STATE_READY == getRTCRAMState() ) && ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) ) { currentTime = getMSTimerCount(); readFromRAM( startAddress, maxBufferLength ); - currentJob.externalAddress->status = NVDATAMGMT_READ_IN_PROGRESS; + //currentJob.externalAddress->status = NVDATAMGMT_READ_IN_PROGRESS; // TODO Phase 1B for logging state = NVDATAMGMT_EXEC_STATE_READ_FROM_RTC; } } @@ -2245,13 +2283,13 @@ 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 ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); - if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + if ( ( Fapi_Status_FsmReady == FAPI_CHECK_FSM_READY_BUSY ) || ( TRUE == timeoutStatus ) ) { // Signal the external client that the read is complete. - // This is only needed for reading the data logs and not the records - if ( activeQueue == NVDATAMGMT_PROCESS_LOGS ) + // NOTE: This is only needed for reading the data logs and not the records + if ( NVDATAMGMT_PROCESS_LOGS == activeQueue ) { currentJob.externalAddress->status = NVDATAMGMT_READ_COMPLETE; activeQueue = NVDATAMGMT_QUEUE_NONE; @@ -2295,10 +2333,10 @@ *************************************************************************/ 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; - PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + 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; + PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; // Check if the RTC RAM has finished if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE ) @@ -2329,6 +2367,8 @@ // max write buffer, go to idle if ( jobSpecs.sizeofJob == recordAddressOffset || jobSpecs.sizeofJob == jobSpecs.maxWriteBufferSize ) { + releaseSemaphore( SEMAPHORE_RTC ); + writtenRecordStatus = NVDATAMGMT_RECORD_NOT_CHECKED; state = NVDATAMGMT_EXEC_STATE_IDLE; } @@ -2422,25 +2462,32 @@ 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 ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); - if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) + if ( ( ( FALSE == isSemaphoreReleased( SEMAPHORE_RTC ) ) && ( RTC_RAM_STATUS_IDLE == getRTCRAMStatus() ) ) || ( TRUE == timeoutStatus ) ) { U08* bufferPtr = 0; - U32 length = 0; + U32 length = 0; - if ( activeQueue == NVDATAMGMT_PROCESS_RECORDS ) + RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + + bufferPtr = jobSpecs.structAddressPtr; + length = jobSpecs.sizeofJob; + + /*if ( NVDATAMGMT_PROCESS_RECORDS == activeQueue ) { RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + bufferPtr = jobSpecs.structAddressPtr; length = jobSpecs.sizeofJob; } else { // TODO add the rest of the items for for logging currentJob.externalAddress->status = NVDATAMGMT_READ_COMPLETE; - } + }*/ getDataFromRAM( bufferPtr, length ); @@ -3563,17 +3610,16 @@ static BOOL isDGGenericVolRecordValid( DG_GENERIC_VOLUME_DATA_T* record ) { BOOL status = TRUE; - U16 calcCRC = crc16 ( (U08*)record, sizeof(DG_GENERIC_VOLUME_DATA_T) - sizeof(U16) ); + U16 calcCRC = crc16 ( (U08*)record, sizeof( DG_GENERIC_VOLUME_DATA_T ) - sizeof( U16 ) ); U16 recordCRC = record->crc; if ( calcCRC != recordCRC ) { // CRC did not pass so set all values to default record->volume = RECORD_DEFAULT_CONST; record->calibrationTime = RECORD_DEFAULT_TIME; - - // Set the to FALSE since the record is not valid - status = FALSE; + record->crc = crc16 ( (U08*)record, sizeof( DG_GENERIC_VOLUME_DATA_T ) - sizeof( U16 ) ); + status = FALSE; } return status; @@ -4159,4 +4205,13 @@ return status; } +static void enqueuePOSTReadRecords( void ) +{ + enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_EEPROM, NVDATAMGMT_CALIBRATION_RECORD ); + enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_EEPROM, NVDATAMGMT_SYSTEM_RECORD ); + enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_RTC, NVDATAMGMT_SERVICE_RECORD ); + enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_RTC, NVDATAMGMT_SW_CONFIG_RECORD ); + //enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_RTC, NVDATAMGMT_USAGE_INFO_RECORD ); +} + /**@}*/