Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -ra303cd4258157a8fbcbd8af4dd2bbaadec1a736c -rb64c49fdcf2b6d95e61e63f8e258c4e600935bbd --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision a303cd4258157a8fbcbd8af4dd2bbaadec1a736c) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision b64c49fdcf2b6d95e61e63f8e258c4e600935bbd) @@ -14,33 +14,35 @@ * **************************************************************************/ -#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,14 +67,15 @@ 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++ ) { - watchdogTaskCheckedIn[i].data = FALSE; - watchdogTaskCheckedIn[i].ovData = FALSE; - watchdogTaskCheckedIn[i].ovInitData = FALSE; - watchdogTaskCheckedIn[i].override = OVERRIDE_RESET; + watchdogTaskCheckedIn[ i ].data = FALSE; + watchdogTaskCheckedIn[ i ].ovData = FALSE; + watchdogTaskCheckedIn[ i ].ovInitData = FALSE; + watchdogTaskCheckedIn[ i ].override = OVERRIDE_RESET; } } @@ -105,7 +108,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 + } } } @@ -123,7 +133,7 @@ { if ( task < NUM_OF_TASKS ) { - watchdogTaskCheckedIn[task].data = TRUE; + watchdogTaskCheckedIn[ task ].data = TRUE; } } @@ -156,24 +166,34 @@ } if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) { - result = SELF_TEST_STATUS_PASSED; + watchdogSelfTestStatus = SELF_TEST_STATUS_PASSED; } else { - result = SELF_TEST_STATUS_FAILED; - // TODO - trigger watchdog POST failure + activateAlarmNoData( ALARM_ID_WATCHDOG_POST_TEST_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; default: result = SELF_TEST_STATUS_FAILED; - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, watchdogSelfTestState ) break; } @@ -196,7 +216,7 @@ // initialize task check-ins to false for ( i = 0; i < NUM_OF_TASKS; i++ ) { - watchdogTaskCheckedIn[i].data = FALSE; + watchdogTaskCheckedIn[ i ].data = FALSE; } } @@ -281,25 +301,3 @@ * @return TRUE if override successful, FALSE if not *************************************************************************/ DATA_ARRAY_OVERRIDE_FUNC( BOOL, testSetWatchdogTaskCheckInOverride, testResetWatchdogTaskCheckInOverride, watchdogTaskCheckedIn, task, NUM_OF_TASKS-1 ) - - - - - - - - - - - - - - - - - - - - - -