Index: RTC.c =================================================================== diff -u -rb6711400cf9f7239d7f9041da7c87d89d901b02a -rd6b9e2bb9886a4bf7954204710ddb571314b3b06 --- RTC.c (.../RTC.c) (revision b6711400cf9f7239d7f9041da7c87d89d901b02a) +++ RTC.c (.../RTC.c) (revision d6b9e2bb9886a4bf7954204710ddb571314b3b06) @@ -7,8 +7,8 @@ * * @file RTC.c * -* @author (last) Dara Navaei -* @date (last) 13-Jul-2022 +* @author (last) Sean Nash +* @date (last) 18-Aug-2022 * * @author (original) Dara Navaei * @date (original) 11-Jan-2020 @@ -118,6 +118,7 @@ #define TEN 10U ///< Ten #define YEAR_2000 2000U ///< Year 2000 #define EPOCH_BASE_YEAR 1970U ///< Reference year to calculate epoch (1970) +#define YEAR_2021 2021U ///< Year 2021 #define SECS_IN_HOUR 3600 ///< Number of seconds in an hour. #define MONTHS_IN_YEAR 12 ///< Number of months in a year. @@ -136,6 +137,7 @@ RTC_SELF_TEST_STATE_CHECK_CTRL_REGS, ///< Self test check control registers RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND, ///< Self test wait for first second RTC_SELF_TEST_STATE_CHECK_ACCURACY, ///< Self test check time accuracy (compare 1st to 2nd second vs. timer counter) + RTC_SELF_TEST_STATE_CHECK_RTC_YEAR, ///< Self test check RTC year RTC_SELF_TEST_STATE_COMPLETE, ///< Self test complete NUM_OF_RTC_SELF_TEST_STATES ///< Total number of self-test states } RTC_SELF_TEST_STATE_T; @@ -204,7 +206,7 @@ static U16 RAMBuffer[ MIBSPI_MAX_BUFFER_LENGTH ]; ///< Buffer to read RTC RAM data. static U16 previousFPGATimerCount; ///< Previous FPGA timer count; #ifdef _DG_ -static BOOL syncDG2HDDateTimeFlag = FALSE; ///< Flag indicating whether DG RTC should be sync'd to HD RTC. +static BOOL syncDG2HDDateTimeFlag; ///< Flag indicating whether DG RTC should be sync'd to HD RTC. #endif /// Array of days in each month. Assumes non-leap year. Must adjust days in February if leap year. @@ -226,6 +228,7 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs( void ); static RTC_SELF_TEST_STATE_T handleSelfTestWaitForFirstSecond( void ); static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy( void ); +static RTC_SELF_TEST_STATE_T handleSelfTestCheckRTCYear( void ); static RTC_EXEC_STATE_T handleExecIdleState( void ); static RTC_EXEC_STATE_T handleExecReadState( void ); @@ -262,6 +265,9 @@ isRTCServiceOnEntry = FALSE; isTimestampBufferReady = FALSE; previousFPGATimerCount = 0; +#ifdef _DG_ + syncDG2HDDateTimeFlag = FALSE; +#endif } /*********************************************************************//** @@ -372,6 +378,10 @@ RTCSelfTestState = handleSelfTestCheckAccuracy(); break; + case RTC_SELF_TEST_STATE_CHECK_RTC_YEAR: + RTCSelfTestState = handleSelfTestCheckRTCYear(); + break; + case RTC_SELF_TEST_STATE_COMPLETE: // Done with POST regardless of the results break; @@ -671,7 +681,7 @@ *************************************************************************/ static BOOL serviceRTC( U16* bufferTransmit, U16* bufferReceive, U16 bufferLength ) { - BOOL result = FALSE; + BOOL result = FALSE; BOOL isBufferOk = FALSE; if ( isRTCServiceOnEntry ) @@ -682,7 +692,6 @@ switch ( RTCServiceState ) { case RTC_SEND_COMMAND: - if ( previousTransferLength == bufferLength ) { isBufferOk = TRUE; @@ -708,7 +717,6 @@ break; case RTC_WAIT_FOR_TRANSFER_AND_READ: - if ( mibspiIsTransferComplete( mibspiREG3, MIBSPI_GROUP_ZERO ) ) { mibspiGetData( mibspiREG3, MIBSPI_GROUP_ZERO, bufferReceive ); @@ -834,7 +842,7 @@ bcdHigh = ( bcd & MASK_OFF_NIBBLE_LSB ) >> SHIFT_BITS_BY_4; bcdLow = ( bcd & MASK_OFF_NIBBLE_MSB ); - if ( bcdHigh > MAX_SINGLE_DIGIT_DECIMAL || bcdLow > MAX_SINGLE_DIGIT_DECIMAL ) + if ( ( bcdHigh > MAX_SINGLE_DIGIT_DECIMAL ) || ( bcdLow > MAX_SINGLE_DIGIT_DECIMAL ) ) { decimal = 0; } @@ -1099,7 +1107,7 @@ { result = RTC_EXEC_STATE_PREP_RAM; } - else if ( ( TIMER_COUNTER_TO_REQUEST_READ <= timeCounter ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) + else if ( TIMER_COUNTER_TO_REQUEST_READ <= timeCounter ) { if ( TRUE == getSemaphore( SEMAPHORE_RTC ) ) { @@ -1284,21 +1292,21 @@ static RTC_EXEC_STATE_T handleExecReadState( void ) { RTC_EXEC_STATE_T result = RTC_EXEC_STATE_READ; - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); - if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) + if ( ( RTC_SERVICE_COMPLETE == RTCServiceState ) && ( TRUE == isStatusOk ) ) { if ( TRUE == isRTCFunctional() ) { - RTC_DATA_T data; + RTC_DATA_T data; updateReadTimestampStruct(); lastEpochTime = convertDateTime2Epoch( RTCTimestampStruct ); timeCounter = 1; data.epochTime = lastEpochTime; #ifdef _DG_ - broadcastData( MSG_ID_RTC_EPOCH, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( RTC_DATA_T ) ); + broadcastData( MSG_ID_DG_RTC_EPOCH, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( RTC_DATA_T ) ); #endif #ifdef _HD_ @@ -1310,7 +1318,7 @@ result = RTC_EXEC_STATE_IDLE; } - else if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + else if ( RTC_SERVICE_COMPLETE == RTCServiceState ) { releaseSemaphore( SEMAPHORE_RTC ); @@ -1449,18 +1457,17 @@ static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy( void ) { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; + BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); -#ifndef BOARD_WITH_NO_HARDWARE - BOOL isStatusOk = serviceRTC( txBuffer, rxBuffer, RTC_GENERAL_BUFFER_LENGTH ); - if ( ( TRUE == isStatusOk ) && ( rxBuffer[ RTC_SECONDS_INDEX ] != RTCPreviousSecond ) ) { + updateReadTimestampStruct(); + ALARM_ID_T alarm; S32 elapsedTime = (S32)calcTimeSince( RTCSelfTestTimer ); S32 deltaTime = elapsedTime - (S32)MS_PER_SECOND; S32 elapsedFPGATime = (S32)u16DiffWithWrap( previousFPGATimerCount, getFPGATimerCount() ); - result = RTC_SELF_TEST_STATE_COMPLETE; - RTCSelfTestResult = SELF_TEST_STATUS_PASSED; + result = RTC_SELF_TEST_STATE_CHECK_RTC_YEAR; #ifdef _DG_ alarm = ALARM_ID_DG_RTC_OR_TIMER_ACCURACY_FAILURE; @@ -1472,26 +1479,59 @@ if ( abs( deltaTime ) > RTC_ACCURACY_TOLERANCE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; SET_ALARM_WITH_2_U32_DATA( alarm, (U32)deltaTime, RTC_ACCURACY_TOLERANCE ); } if ( abs( elapsedFPGATime - elapsedTime ) > FPGA_ACCURACY_TOLERANCE ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; SET_ALARM_WITH_2_U32_DATA( alarm, (U32)elapsedFPGATime, (U32)elapsedTime ); } releaseSemaphore( SEMAPHORE_RTC ); } -#else - result = RTC_SELF_TEST_STATE_COMPLETE; - RTCSelfTestResult = SELF_TEST_STATUS_PASSED; -#endif return result; } +/*********************************************************************//** + * @brief + * The handleSelfTestCheckRTCYear checks whether the year that has been set + * in RTC is greater than 2021 or not. + * @details Inputs: RTCSelfTestTimer + * Outputs : RTCSelfTestResult + * @return next state + *************************************************************************/ +static RTC_SELF_TEST_STATE_T handleSelfTestCheckRTCYear( void ) +{ + RTC_SELF_TEST_STATE_T state = RTC_SELF_TEST_STATE_COMPLETE; + ALARM_ID_T alarm; +#ifdef _DG_ + alarm = ALARM_ID_DG_SET_RTC_YEAR_INVALID; +#endif +#ifdef _HD_ + alarm = ALARM_ID_HD_SET_RTC_YEAR_INVALID; +#endif + + // Check if the year is not 0, meaning that the year has been read + // If the year is greater than 2021, set as pass, otherwise fail POST + if ( RTCTimestampStruct.years > ( YEAR_2021 - YEAR_2000 ) ) + { + RTCSelfTestResult = SELF_TEST_STATUS_PASSED; + } + else + { + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_1_U32_DATA( alarm, (U16)RTCTimestampStruct.years ); + } + + return state; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/