Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -r39dd0b7734331c784b8410f2bbd481e0f792892e -rfc12876da6930c955864352182aee2076513a1cc --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 39dd0b7734331c784b8410f2bbd481e0f792892e) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision fc12876da6930c955864352182aee2076513a1cc) @@ -35,7 +35,9 @@ #define WATCHDOG_RECOVERY_TIME_MS 250 ///< After watchdog POST test, wait this long (in ms) before moving on. #define MAX_24V_LEVEL_ON_WATCHDOG_EXPIRED 5.0 ///< Maximum voltage on 24V line when watchdog is expired. // TODO - check w/ Systems. Takes time for V to bleed off. Had to raise to 5V. +#define MIN_24V_LEVEL_ON_WATCHDOG_RECOVER 22.6 ///< Minimum voltage on 24V line when watchdog is recovered. #define MIN_BACKUP_ALARM_CURRENT_MA 200.0 ///< Minimum backup alarm audio current (in mA) detected when watchdog is expired. +#define MAX_BACKUP_ALARM_CURRENT_MA 10.0 ///< Maximum backup alarm audio current (in mA) detected when watchdog is recovered. /// Enumeration of watchdog self-test states. typedef enum Watchdog_Self_Test_States @@ -167,7 +169,7 @@ { // Waiting here for w.d. test period to prevent this task from checking in - watchdog should expire } - if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) + if ( getCPLDWatchdogExpired() == PIN_SIGNAL_LOW ) { F32 v24 = getIntADCVoltageConverted( INT_ADC_24V_ACTUATORS ); F32 audioCurrent = getFPGABackupAlarmAudioCurrent(); @@ -184,23 +186,41 @@ SET_ALARM_WITH_2_F32_DATA( ALARM_ID_WATCHDOG_POST_TEST_FAILED, 3.0, audioCurrent ); watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; } - else - { - watchdogSelfTestStatus = SELF_TEST_STATUS_PASSED; - } + watchdogSelfTestTimerCount = getMSTimerCount(); + watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_RECOVER; } else { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_WATCHDOG_POST_TEST_FAILED, 1 ); watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; } - watchdogSelfTestTimerCount = getMSTimerCount(); - watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_RECOVER; break; case WATCHDOG_SELF_TEST_STATE_RECOVER: if ( TRUE == didTimeout( watchdogSelfTestTimerCount, WATCHDOG_RECOVERY_TIME_MS ) ) - { + { // Verify watchdog expired signal no longer active + if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) + { + F32 v24 = getIntADCVoltageConverted( INT_ADC_24V_ACTUATORS ); + F32 audioCurrent = getFPGABackupAlarmAudioCurrent(); + + // Verify 24V is down when w.d. recovered + if ( v24 < MIN_24V_LEVEL_ON_WATCHDOG_RECOVER ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_WATCHDOG_POST_TEST_FAILED, 4.0, v24 ); + watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; + } + // Verify backup alarm audio is on when w.d. recovered + else if ( audioCurrent > MAX_BACKUP_ALARM_CURRENT_MA ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_WATCHDOG_POST_TEST_FAILED, 5.0, audioCurrent ); + watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; + } + else + { + watchdogSelfTestStatus = SELF_TEST_STATUS_PASSED; + } + } result = watchdogSelfTestStatus; watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; }