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 ); +} + /**@}*/ Index: NVDataMgmtDGRecords.h =================================================================== diff -u -r7e186bb97310fb59f525e5399ec7a74711bea571 -r839935998cfe2a1a7594e6b6810301ad3c2aa872 --- NVDataMgmtDGRecords.h (.../NVDataMgmtDGRecords.h) (revision 7e186bb97310fb59f525e5399ec7a74711bea571) +++ NVDataMgmtDGRecords.h (.../NVDataMgmtDGRecords.h) (revision 839935998cfe2a1a7594e6b6810301ad3c2aa872) @@ -35,7 +35,7 @@ #define MAX_TOP_LEVEL_SN_CHARS 15U ///< Max number of characters for top level serial number. #define PRES_SENSORS_RESERVED_SPACE_COUNT 5 ///< Pressure sensors reserved space count. #define FLOW_SENSROS_RESERVED_SPACE_COUNT 2 ///< Flow sensors reserved space count. -#define TEMP_SENSORS_RESERVED_SPACE_COUNT 5 ///< Temperature sensors reserved space count. +#define TEMP_SENSORS_RESERVED_SPACE_COUNT 2 ///< Temperature sensors reserved space count. #define COND_SENSORS_RESERVED_SPACE_COUNT 2 ///< Conductivity sensors reserved space count. #define GENERIC_VOL_RESERVED_SPACE_COUNT 4 ///< Generic volumes reserved space count. Index: RTC.c =================================================================== diff -u -r7e186bb97310fb59f525e5399ec7a74711bea571 -r839935998cfe2a1a7594e6b6810301ad3c2aa872 --- RTC.c (.../RTC.c) (revision 7e186bb97310fb59f525e5399ec7a74711bea571) +++ RTC.c (.../RTC.c) (revision 839935998cfe2a1a7594e6b6810301ad3c2aa872) @@ -1050,7 +1050,7 @@ * @details Outputs: none * @return next state *************************************************************************/ -static RTC_EXEC_STATE_T handleExecWaitForPostState( void ) +static RTC_EXEC_STATE_T handleExecWaitForPostState( void ) // TODO remove this function { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_WAIT_FOR_POST; @@ -1061,7 +1061,7 @@ result = RTC_EXEC_STATE_READ; } - return result; + return RTC_EXEC_STATE_IDLE; //result; } /*********************************************************************//** @@ -1090,7 +1090,7 @@ { result = RTC_EXEC_STATE_PREP_RAM; } - else if ( TIMER_COUNTER_TO_REQUEST_READ >= timeCounter ) + else if ( ( TIMER_COUNTER_TO_REQUEST_READ <= timeCounter ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) { if ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) { @@ -1134,17 +1134,21 @@ } RTC_EXEC_STATE_T result = RTC_EXEC_STATE_WRITE; - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { + releaseSemaphore( SEMAPHORE_RTC ); + // Reset the counter to start with the new read timeCounter = 1; hasWriteToRTCRequested = FALSE; result = RTC_EXEC_STATE_IDLE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result ); result = RTC_EXEC_STATE_IDLE; hasWriteToRTCRequested = FALSE; @@ -1164,7 +1168,7 @@ static RTC_EXEC_STATE_T handleExecPrepRAMState( void ) { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_PREP_RAM; - BOOL isStatusOk = serviceRTC( prepRAMBuffer, RAMBuffer, RTC_RAM_PREP_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( prepRAMBuffer, RAMBuffer, RTC_RAM_PREP_BUFFER_LENGTH ); if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { @@ -1179,6 +1183,8 @@ } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result ); result = RTC_EXEC_STATE_IDLE; } @@ -1202,12 +1208,16 @@ if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { + releaseSemaphore( SEMAPHORE_RTC ); + result = RTC_EXEC_STATE_IDLE; RTCRAMStatus = RTC_RAM_STATUS_COMPLETE; hasWriteToRAMRequested = FALSE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCRAMStatus = RTC_RAM_STATUS_FAILED; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result, RTCRAMStatus ); result = RTC_EXEC_STATE_IDLE; @@ -1229,16 +1239,20 @@ static RTC_EXEC_STATE_T handleExecReadFromRAMState( void ) { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_READ_FROM_RAM; - BOOL isStatusOk = serviceRTC( txBuffer, RAMBuffer, RAMBufferLength + 1 ); + BOOL isStatusOk = serviceRTC( txBuffer, RAMBuffer, RAMBufferLength + 1 ); if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { + releaseSemaphore( SEMAPHORE_RTC ); + result = RTC_EXEC_STATE_IDLE; RTCRAMStatus = RTC_RAM_STATUS_COMPLETE; hasReadFromRAMRequested = FALSE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCRAMStatus = RTC_RAM_STATUS_FAILED; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result, RTCRAMStatus ); result = RTC_EXEC_STATE_IDLE; @@ -1269,7 +1283,6 @@ { RTC_DATA_T data; - releaseSemaphore( SEMAPHORE_RTC ); updateReadTimestampStruct(); lastEpochTime = convertDateTime2Epoch( RTCTimestampStruct ); timeCounter = 1; @@ -1284,10 +1297,14 @@ #endif } + releaseSemaphore( SEMAPHORE_RTC ); + result = RTC_EXEC_STATE_IDLE; } else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) { + releaseSemaphore( SEMAPHORE_RTC ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_RTC_RAM_OPS_ERROR, result ); result = RTC_EXEC_STATE_IDLE; } @@ -1308,9 +1325,12 @@ RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_START; RTCSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; - prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); + if ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) + { + prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); - result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + } return result; } @@ -1329,7 +1349,7 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); if ( ( RTC_SERVICE_COMPLETE == RTCServiceState ) && ( TRUE == isStatusOk ) ) { @@ -1341,14 +1361,18 @@ } else { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - result = RTC_SELF_TEST_STATE_COMPLETE; + result = RTC_SELF_TEST_STATE_COMPLETE; } } - else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + else if ( RTC_SERVICE_COMPLETE == RTCServiceState ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; - result = RTC_SELF_TEST_STATE_COMPLETE; + result = RTC_SELF_TEST_STATE_COMPLETE; } return result; @@ -1385,12 +1409,16 @@ } else { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; result = RTC_SELF_TEST_STATE_COMPLETE; } } - else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + else if ( RTC_SERVICE_COMPLETE == RTCServiceState ) { + releaseSemaphore( SEMAPHORE_RTC ); + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; result = RTC_SELF_TEST_STATE_COMPLETE; } @@ -1443,6 +1471,8 @@ RTCSelfTestResult = SELF_TEST_STATUS_FAILED; SET_ALARM_WITH_2_U32_DATA( alarm, (U32)elapsedFPGATime, (U32)elapsedTime ); } + + releaseSemaphore( SEMAPHORE_RTC ); } #else result = RTC_SELF_TEST_STATE_COMPLETE; @@ -1459,7 +1489,7 @@ * @details Outputs : RTCSelfTestState * @return none *************************************************************************/ -void resetRTCPostState( void ) +void resetRTCPostState( void ) // TODO remove this function { RTCSelfTestState = RTC_SELF_TEST_STATE_START; } Index: Utilities.c =================================================================== diff -u -r7e186bb97310fb59f525e5399ec7a74711bea571 -r839935998cfe2a1a7594e6b6810301ad3c2aa872 --- Utilities.c (.../Utilities.c) (revision 7e186bb97310fb59f525e5399ec7a74711bea571) +++ Utilities.c (.../Utilities.c) (revision 839935998cfe2a1a7594e6b6810301ad3c2aa872) @@ -695,5 +695,10 @@ sempahoreStatus[ s ].isSemaphoreTaken = FALSE; } } + +BOOL isSemaphoreReleased( SEMAPHORE_T s ) +{ + return sempahoreStatus[ s ].isSemaphoreTaken; +} /**@}*/ Index: Utilities.h =================================================================== diff -u -r7e186bb97310fb59f525e5399ec7a74711bea571 -r839935998cfe2a1a7594e6b6810301ad3c2aa872 --- Utilities.h (.../Utilities.h) (revision 7e186bb97310fb59f525e5399ec7a74711bea571) +++ Utilities.h (.../Utilities.h) (revision 839935998cfe2a1a7594e6b6810301ad3c2aa872) @@ -110,7 +110,8 @@ void initSemaphores( void ); BOOL getSemaphore( SEMAPHORE_T s ); -void releaseSemaphore( SEMAPHORE_T s ); +void releaseSemaphore( SEMAPHORE_T s ); +BOOL isSemaphoreReleased( SEMAPHORE_T s ); /**@}*/