Index: RTC.c =================================================================== diff -u -r7574a250df6c0a773344ccafb62431c22930f6a3 -r3f0de5d7cc215f17a32a950da26043f812ecd07e --- RTC.c (.../RTC.c) (revision 7574a250df6c0a773344ccafb62431c22930f6a3) +++ RTC.c (.../RTC.c) (revision 3f0de5d7cc215f17a32a950da26043f812ecd07e) @@ -19,6 +19,7 @@ #include "FPGA.h" #include "MessageSupport.h" #include "OperationModes.h" +#include "PersistentAlarm.h" #include "RTC.h" #include "SystemCommMessages.h" #include "Timers.h" @@ -110,6 +111,7 @@ #define RTC_ACCURACY_TOLERANCE 75U ///< RTC accuracy tolerance in ms #define FPGA_ACCURACY_TOLERANCE 12U ///< FPGA accuracy tolerance in ms #define RTC_PUBLISH_INTERVAL 18U ///< RTC publish interval in counts (18) +#define RTC_REG_ERROR_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< RTC register error timeout in milliseconds. #define TIMER_COUNTER_TO_REQUEST_READ 18U ///< Timer counter for reading time from RTC (18) #define MAX_ALLOWED_FAILED_RTC_TRANSFERS 3U ///< Max allowed failed RTC transfers (3) @@ -268,6 +270,13 @@ #ifdef _DG_ syncDG2HDDateTimeFlag = FALSE; #endif + +#ifdef _DG_ + initPersistentAlarm( ALARM_ID_DG_RTC_CONFIG_ERROR, RTC_REG_ERROR_TIMEOUT_MS, RTC_REG_ERROR_TIMEOUT_MS ); +#endif +#ifdef _HD_ + initPersistentAlarm( ALARM_ID_HD_RTC_CONFIG_ERROR, RTC_REG_ERROR_TIMEOUT_MS, RTC_REG_ERROR_TIMEOUT_MS ); +#endif } /*********************************************************************//** @@ -761,20 +770,24 @@ *************************************************************************/ static BOOL isRTCFunctional( void ) { - ALARM_ID_T alarm; - BOOL hasTestPassed = TRUE; + ALARM_ID_T reg1Alarm; + ALARM_ID_T batteryAlarm; + BOOL hasReg1Failed = FALSE; + BOOL isBatteryLow = FALSE; + BOOL status = TRUE; + U16 controlReg1 = rxBuffer[ RTC_REG_1_INDEX ]; + U16 controlReg2 = rxBuffer[ RTC_REG_2_INDEX ]; + U16 controlReg3 = rxBuffer[ RTC_REG_3_INDEX ]; #ifdef _DG_ - alarm = ALARM_ID_DG_RTC_CONFIG_ERROR; + reg1Alarm = ALARM_ID_DG_RTC_CONFIG_ERROR; + batteryAlarm = ALARM_ID_DG_RTC_BATTERY_LOW; #endif #ifdef _HD_ - alarm = ALARM_ID_HD_RTC_CONFIG_ERROR; + reg1Alarm = ALARM_ID_HD_RTC_CONFIG_ERROR; + batteryAlarm = ALARM_ID_HD_RTC_BATTERY_LOW; #endif - U16 controlReg1 = rxBuffer[ RTC_REG_1_INDEX ]; - U16 controlReg2 = rxBuffer[ RTC_REG_2_INDEX ]; - U16 controlReg3 = rxBuffer[ RTC_REG_3_INDEX ]; - controlReg1 = controlReg1 & MASK_OFF_MSB; controlReg2 = controlReg2 & MASK_OFF_MSB; controlReg3 = controlReg3 & MASK_OFF_MSB; @@ -788,41 +801,35 @@ if ( controlReg1 & RTC_REG_1_12_HOUR_MODE_MASK ) { - SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_12_HOUR_MODE_MASK ); - hasTestPassed = FALSE; + hasReg1Failed = FALSE; } if ( controlReg1 & RTC_REG_1_PORO ) { - SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_PORO ); - hasTestPassed = FALSE; + hasReg1Failed = FALSE; } if ( controlReg1 & RTC_REG_1_CLK_STOPPED_MASK ) { - SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_CLK_STOPPED_MASK ); - hasTestPassed = FALSE; + hasReg1Failed = FALSE; } if ( controlReg1 & RTC_REG_1_UNUSED_MASK ) { - SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_UNUSED_MASK ); - hasTestPassed = FALSE; + hasReg1Failed = FALSE; } if ( controlReg1 & RTC_REG_1_EXT_CLK_MODE_MASK ) { - SET_ALARM_WITH_2_U32_DATA( alarm, controlReg1, RTC_REG_1_EXT_CLK_MODE_MASK ); - hasTestPassed = FALSE; + hasReg1Failed = FALSE; } if ( controlReg3 & RTC_REG_3_BLF_MASK ) { -#ifdef _DG_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_RTC_BATTERY_LOW, controlReg3, RTC_REG_3_BLF_MASK ); -#endif -#ifdef _HD_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_RTC_BATTERY_LOW, controlReg3, RTC_REG_3_BLF_MASK ); -#endif - hasTestPassed = FALSE; + isBatteryLow = TRUE; } - return hasTestPassed; + status = ( hasReg1Failed | isBatteryLow ? TRUE : FALSE ); + + checkPersistentAlarm( reg1Alarm, hasReg1Failed, controlReg1, 0 ); + checkPersistentAlarm( batteryAlarm, isBatteryLow, controlReg3, 0 ); + + return status; } /*********************************************************************//**