Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -r52863cba9685f31136ab3f4b4764a17ccf34fc05 -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) @@ -16,31 +16,34 @@ #include "Common.h" #include "CPLD.h" +#include "SafetyShutdown.h" #include "SystemCommMessages.h" #include "Timers.h" #include "WatchdogMgmt.h" // ********** private definitions ********** #define MIN_WATCHDOG_PET_INTERVAL_MS 45 +#define WATCHDOG_POST_TIMEOUT_MS 100 +#define WATCHDOG_RECOVERY_TIME_MS 250 typedef enum Button_Self_Test_States { WATCHDOG_SELF_TEST_STATE_START = 0, WATCHDOG_SELF_TEST_STATE_IN_PROGRESS, + WATCHDOG_SELF_TEST_STATE_RECOVER, WATCHDOG_SELF_TEST_STATE_COMPLETE, NUM_OF_WATCHDOG_SELF_TEST_STATES } WATCHDOG_SELF_TEST_STATE_T; -#define WATCHDOG_POST_TIMEOUT_MS 100 // ms - // ********** private data ********** static U32 lastWatchdogPetTime = 0; DATA_ARRAY_DECL( BOOL, TaskCheckIns, NUM_OF_TASKS, watchdogTaskCheckedIn ); static WATCHDOG_SELF_TEST_STATE_T watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_START; +static SELF_TEST_STATUS_T watchdogSelfTestStatus; static U32 watchdogSelfTestTimerCount = 0; // ********** private function prototypes ********** @@ -65,6 +68,7 @@ lastWatchdogPetTime = 0; watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_START; + watchdogSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; watchdogSelfTestTimerCount = 0; // initialize task check-ins to false for ( i = 0; i < NUM_OF_TASKS; i++ ) @@ -105,7 +109,14 @@ // check to see if watchdog has expired if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) { - // TODO - watchdog expired fault + // ignore expired watchdog until after watchdog POST + if ( WATCHDOG_SELF_TEST_STATE_COMPLETE == watchdogSelfTestState ) + { +#ifndef DEBUG_ENABLED + activateSafetyShutdown(); // TODO - restore these - commented out now so that we don't get WD error with breakpoints while debugging + activateAlarmNoData( ALARM_ID_WATCHDOG_EXPIRED ); +#endif + } } } @@ -156,18 +167,28 @@ } if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) { - result = SELF_TEST_STATUS_PASSED; + watchdogSelfTestStatus = SELF_TEST_STATUS_PASSED; } else { activateAlarmNoData( ALARM_ID_WATCHDOG_POST_TEST_FAILED ); - result = SELF_TEST_STATUS_FAILED; + watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; } - watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; + watchdogSelfTestTimerCount = getMSTimerCount(); + watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_RECOVER; break; + case WATCHDOG_SELF_TEST_STATE_RECOVER: + if ( TRUE == didTimeout( watchdogSelfTestTimerCount, WATCHDOG_RECOVERY_TIME_MS ) ) + { + result = watchdogSelfTestStatus; + watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_COMPLETE; + } + break; + case WATCHDOG_SELF_TEST_STATE_COMPLETE: // if we get called in this state, assume we're doing self test again + watchdogSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; watchdogSelfTestState = WATCHDOG_SELF_TEST_STATE_START; break;