Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -rf639bbc47806ddcefdbdce78a377cd87050872e5 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision f639bbc47806ddcefdbdce78a377cd87050872e5) @@ -19,8 +19,10 @@ #include "DrainPump.h" #include "Heaters.h" #include "ModeFault.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "ROPump.h" +#include "RTC.h" #include "SystemCommMessages.h" #include "UVReactors.h" #include "Valves.h" @@ -36,10 +38,14 @@ // ********** private data ********** -static DG_FAULT_STATE_T faultState = DG_FAULT_STATE_START; ///< Currently active fault state. +static DG_FAULT_STATE_T faultState; ///< Currently active fault state. +static DG_POST_STATE_T faultPOSTState; ///< Fault POST state. +static SELF_TEST_STATUS_T faultPOSTSelfTestResult; ///< Fault POST self test result. // ********** private function prototypes ********** +static DG_FAULT_STATE_T handleRunNVPOSTsState( void ); + /*********************************************************************//** * @brief * The initFaultMode function initializes the Fault Mode module. @@ -49,7 +55,9 @@ *************************************************************************/ void initFaultMode( void ) { - faultState = DG_FAULT_STATE_START; + faultState = DG_FAULT_STATE_START; + faultPOSTState = DG_POST_STATE_RTC; + faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; } /*********************************************************************//** @@ -72,6 +80,11 @@ sendPOSTFinalResult( FALSE ); } + // Reset the RTC and NV data management POST states so + // the POSTs can be redone again + resetNVDataMgmtPostState(); + resetRTCPostState(); + return faultState; } @@ -90,11 +103,19 @@ switch ( faultState ) { case DG_FAULT_STATE_START: + faultState = DG_FAULT_STATE_RUN_NV_POSTS; break; + case DG_FAULT_STATE_RUN_NV_POSTS: + faultState = handleRunNVPOSTsState(); + break; + + case DG_FAULT_STATE_COMPLETE: + // Do nothing + break; + default: - // TODO - s/w fault - faultState = DG_FAULT_STATE_START; + faultState = DG_FAULT_STATE_COMPLETE; break; } @@ -149,4 +170,42 @@ stopHeater( DG_TRIMMER_HEATER ); } +/*********************************************************************//** + * @brief + * The handleRunNVPOSTsState function handles running the RTC and non-volatile + * data management POSTs. + * @details Inputs: faultPOSTState, faultPOSTSelfTestResult + * @details Outputs: faultPOSTState, faultPOSTSelfTestResult + * @return next state + *************************************************************************/ +static DG_FAULT_STATE_T handleRunNVPOSTsState( void ) +{ + DG_FAULT_STATE_T state = DG_FAULT_STATE_RUN_NV_POSTS; + + switch ( faultPOSTState ) + { + case DG_POST_STATE_RTC: + faultPOSTSelfTestResult = execRTCSelfTest(); + if ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) + { + faultPOSTState = DG_POST_STATE_NVDATAMGMT; + } + else if ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) + { + state = DG_FAULT_STATE_COMPLETE; + } + break; + + case DG_POST_STATE_NVDATAMGMT: + faultPOSTSelfTestResult = execNVDataMgmtSelfTest(); + if ( ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) || ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) ) + { + state = DG_FAULT_STATE_COMPLETE; + } + break; + } + + return state; +} + /**@}*/