Index: firmware/App/Controllers/RTC.c =================================================================== diff -u -r23ebecb91f2a05526f691b611d6c1862426f171d -rdc96b82b3e7b8acde804180b1c5da37bbdafd96d --- firmware/App/Controllers/RTC.c (.../RTC.c) (revision 23ebecb91f2a05526f691b611d6c1862426f171d) +++ firmware/App/Controllers/RTC.c (.../RTC.c) (revision dc96b82b3e7b8acde804180b1c5da37bbdafd96d) @@ -64,7 +64,7 @@ #define MIBSPI_NO_WDELAY 0U #define MIBSPI_LOCK_TG 0U #define MIBSPI_DATA_FORMAT_ZERO 0U -#define MIBSPI_GROUP_ZEREO 0U +#define MIBSPI_GROUP_ZERO 0U #define MIBSPI_BUFFER_MODE_BIT_SHIFT 13U #define MIBSPI_CHIP_SELECT_BIT_SHIFT 12U @@ -96,6 +96,8 @@ { RTC_SELF_TEST_STATE_START = 0, RTC_SELF_TEST_STATE_CHECK_CTRL_REGS, + RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND, + RTC_SELF_TEST_STATE_WAIT_FOR_SECOND_SECOND, RTC_SELF_TEST_STATE_COMPARE_SECONDS, RTC_SELF_TEST_STATE_CHECK_ACCURACY, RTC_SELF_TEST_STATE_COMPLETE @@ -146,6 +148,7 @@ static U32 RTCPreviousSecond = 0; static U32 RAMBufferLength = 0; static U32 lastEpochTime = 0; +static U32 previousTransferLength = 0; static U32 timeCounter = 1; static U32 numberOfFailedRTCTransfers = 1; @@ -173,7 +176,8 @@ static RTC_SELF_TEST_STATE_T handleSelfTestStart(); static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs(); -static RTC_SELF_TEST_STATE_T handleSelfTestCompareSeconds(); +static RTC_SELF_TEST_STATE_T handleSelfTestWaitForFirstSecond(); +static RTC_SELF_TEST_STATE_T handleSelfTestWaitForSecondSecond(); static RTC_SELF_TEST_STATE_T handleSelfTestCheckAccuracy(); static RTC_EXEC_STATE_T handleExecWaitForPostState(); @@ -227,20 +231,28 @@ RTCSelfTestState = handleSelfTestCheckCtrlRegs(); break; - case RTC_SELF_TEST_STATE_COMPARE_SECONDS: + case RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND: - RTCSelfTestState = handleSelfTestCompareSeconds(); + RTCSelfTestState = handleSelfTestWaitForFirstSecond(); break; + case RTC_SELF_TEST_STATE_WAIT_FOR_SECOND_SECOND: + + RTCSelfTestState = handleSelfTestWaitForSecondSecond(); + break; + case RTC_SELF_TEST_STATE_CHECK_ACCURACY: RTCSelfTestState = handleSelfTestCheckAccuracy(); break; case RTC_SELF_TEST_STATE_COMPLETE: + + // Done with the state break; default: + // TODO: Add the alarms RTCSelfTestResult = SELF_TEST_STATUS_FAILED; break; @@ -332,6 +344,7 @@ txBuffer[ BUFFER_INDEX_3 ] = RTC_WRITE_TO_RAM; U08 i; + for ( i = 0; i < RAMBufferLength; i++ ) { // The first 3 elements in txBuffer are filled @@ -343,7 +356,7 @@ { U16 currentAddress = 0; currentAddress = ( ~currentAddress & txBuffer[ BUFFER_INDEX_1 ] ) << 8; - currentAddress = ~currentAddress & txBuffer[ BUFFER_INDEX_2 ]; + currentAddress = ~currentAddress & txBuffer[ BUFFER_INDEX_2 ]; if ( currentAddress == address ) { @@ -386,6 +399,7 @@ txBuffer[ BUFFER_INDEX_3 ] = RTC_READ_FROM_RAM; U08 i; + for ( i = 0; i < length; i++ ) { txBuffer[ i + BUFFER_INDEX_4 ] = 0x0000; @@ -426,6 +440,8 @@ { BOOL result = FALSE; + BOOL bufferStatus = FALSE; + if ( !hasServiceRTCRequested ) { RTCServiceState = RTC_SEND_COMMAND; @@ -436,14 +452,25 @@ { case RTC_SEND_COMMAND: - if ( setMibSPIBufferLength( bufferLength ) ) + if ( previousTransferLength == bufferLength ) { - mibspiSetData( mibspiREG3, MIBSPI_GROUP_ZEREO, bufferTransmit ); + bufferStatus = TRUE; + } + else if ( setMibSPIBufferLength( bufferLength ) ) + { + bufferStatus = TRUE; + } - mibspiTransfer( mibspiREG3, MIBSPI_GROUP_ZEREO ); + if ( bufferStatus ) + { + mibspiSetData( mibspiREG3, MIBSPI_GROUP_ZERO, bufferTransmit ); + mibspiTransfer( mibspiREG3, MIBSPI_GROUP_ZERO ); + numberOfFailedRTCTransfers = 1; + previousTransferLength = bufferLength; + RTCServiceState = RTC_WAIT_FOR_TRANSFER_AND_READ; } else @@ -454,9 +481,9 @@ case RTC_WAIT_FOR_TRANSFER_AND_READ: - if ( mibspiIsTransferComplete( mibspiREG3, MIBSPI_GROUP_ZEREO ) ) + if ( mibspiIsTransferComplete( mibspiREG3, MIBSPI_GROUP_ZERO ) ) { - mibspiGetData( mibspiREG3, MIBSPI_GROUP_ZEREO, bufferReceive ); + mibspiGetData( mibspiREG3, MIBSPI_GROUP_ZERO, bufferReceive ); RTCServiceState = RTC_SERVICE_COMPLETE; @@ -854,6 +881,10 @@ result = RTC_EXEC_STATE_IDLE; } + else + { + result = RTC_EXEC_STATE_FAULT; + } } else if ( RTCServiceState == RTC_SERVICE_COMPLETE && !isStatusOk ) { @@ -868,16 +899,35 @@ { RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_START; - if ( setMibSPIBufferLength( RTC_GENERAL_BUFFER_LENGTH ) ) - { - // Reset the states - //RTCServiceState = RTC_SEND_COMMAND; + prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); - prepBufferForReadCommand( RTC_GENERAL_BUFFER_LENGTH ); + result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; - result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + return result; +} + +static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs() +{ + RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + + BOOL isStatusOk = serviceRTC( &txBuffer[ BUFFER_INDEX_0 ], &rxBuffer[ BUFFER_INDEX_0 ], RTC_GENERAL_BUFFER_LENGTH ); + + if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) + { + if ( isRTCFunctional() ) + { + U32 RTCCurrentSecond = rxBuffer[ RTC_SECONDS_INDEX ]; + RTCPreviousSecond = RTCCurrentSecond; + + result = RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND; + } + else + { + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; + } } - else + else if ( RTCServiceState == RTC_SERVICE_COMPLETE && !isStatusOk ) { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; result = RTC_SELF_TEST_STATE_COMPLETE; @@ -886,55 +936,69 @@ return result; } -static RTC_SELF_TEST_STATE_T handleSelfTestCheckCtrlRegs() +static RTC_SELF_TEST_STATE_T handleSelfTestWaitForFirstSecond() { - RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_CHECK_CTRL_REGS; + RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_WAIT_FOR_FIRST_SECOND; - serviceRTC( &txBuffer[ BUFFER_INDEX_0 ], &rxBuffer[ BUFFER_INDEX_0 ], RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( &txBuffer[ BUFFER_INDEX_0 ], &rxBuffer[ BUFFER_INDEX_0 ], RTC_GENERAL_BUFFER_LENGTH ); - if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { - // Reset the states - RTCServiceState = RTC_SEND_COMMAND; - if ( isRTCFunctional() ) { - result = RTC_SELF_TEST_STATE_COMPARE_SECONDS; + U32 RTCCurrentSecond = rxBuffer[ RTC_SECONDS_INDEX ]; + + if ( RTCCurrentSecond != RTCPreviousSecond ) + { + RTCPreviousSecond = RTCCurrentSecond; + RTCSelfTestTimer = getMSTimerCount(); + + result = RTC_SELF_TEST_STATE_WAIT_FOR_SECOND_SECOND; + } } else { RTCSelfTestResult = SELF_TEST_STATUS_FAILED; result = RTC_SELF_TEST_STATE_COMPLETE; } } + else if ( RTCServiceState == RTC_SERVICE_COMPLETE && !isStatusOk ) + { + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; + } return result; } -static RTC_SELF_TEST_STATE_T handleSelfTestCompareSeconds() +static RTC_SELF_TEST_STATE_T handleSelfTestWaitForSecondSecond() { - RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_COMPARE_SECONDS; + RTC_SELF_TEST_STATE_T result = RTC_SELF_TEST_STATE_WAIT_FOR_SECOND_SECOND; - serviceRTC( &txBuffer[ BUFFER_INDEX_0 ], &rxBuffer[ BUFFER_INDEX_0 ], RTC_GENERAL_BUFFER_LENGTH ); + BOOL isStatusOk = serviceRTC( &txBuffer[ BUFFER_INDEX_0 ], &rxBuffer[ BUFFER_INDEX_0 ], RTC_GENERAL_BUFFER_LENGTH ); - if ( RTCServiceState == RTC_SERVICE_COMPLETE ) + if ( RTCServiceState == RTC_SERVICE_COMPLETE && isStatusOk ) { - // Reset the states - RTCServiceState = RTC_SEND_COMMAND; - - U32 RTCCurrentSecond = rxBuffer[RTC_SECONDS_INDEX]; - - if ( RTCPreviousSecond == 0 ) + if ( isRTCFunctional() ) { - RTCPreviousSecond = RTCCurrentSecond; + U32 RTCCurrentSecond = rxBuffer[ RTC_SECONDS_INDEX ]; + + if ( RTCCurrentSecond != RTCPreviousSecond ) + { + result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; + } } - else if ( RTCCurrentSecond > RTCPreviousSecond ) + else { - RTCSelfTestTimer = getMSTimerCount(); - - result = RTC_SELF_TEST_STATE_CHECK_ACCURACY; + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; } } + else if ( RTCServiceState == RTC_SERVICE_COMPLETE && !isStatusOk ) + { + RTCSelfTestResult = SELF_TEST_STATUS_FAILED; + result = RTC_SELF_TEST_STATE_COMPLETE; + } return result; } @@ -945,7 +1009,7 @@ if ( didTimeout( RTCSelfTestTimer, RTC_ACCURACY_TIMEOUT ) ) { - U32 elapsedTime = calcTimeSince(RTCSelfTestTimer); + U32 elapsedTime = calcTimeSince( RTCSelfTestTimer ); if ( elapsedTime > RTC_ACCURACY_TIMEOUT_TOLERANCE ) { Index: firmware/App/Controllers/RTC.h =================================================================== diff -u -r23ebecb91f2a05526f691b611d6c1862426f171d -rdc96b82b3e7b8acde804180b1c5da37bbdafd96d --- firmware/App/Controllers/RTC.h (.../RTC.h) (revision 23ebecb91f2a05526f691b611d6c1862426f171d) +++ firmware/App/Controllers/RTC.h (.../RTC.h) (revision dc96b82b3e7b8acde804180b1c5da37bbdafd96d) @@ -50,3 +50,10 @@ void getDataFromRAM( U16* externalBuffer, U32 length ); #endif + + + + + + +