Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r4fb1e15d35f6b968bab5620909c30baec98bfd4e -r200dfbd12ee14a4dbe5ee1daaece7bfce9e8a104 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 4fb1e15d35f6b968bab5620909c30baec98bfd4e) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 200dfbd12ee14a4dbe5ee1daaece7bfce9e8a104) @@ -15,13 +15,16 @@ * ***************************************************************************/ - -#include "OperationModes.h" +#include "ConcentratePumps.h" +#include "DialysatePumps.h" +#include "Heaters.h" #include "ModeFault.h" #include "Messaging.h" +#include "OperationModes.h" +#include "SafetyShutdown.h" #include "Utilities.h" +#include "Valves.h" - /** * @addtogroup DDFaultMode * @{ @@ -34,23 +37,29 @@ // ********** private data ********** static DD_FAULT_STATE_T faultState; ///< Currently active fault state. +static DD_FAULT_NVDATA_STATE_T faultNVDataState; ///< Currently active NVdata fault state static SELF_TEST_STATUS_T faultPOSTSelfTestResult; ///< Fault POST self test result. // ********** private function prototypes ********** static DD_FAULT_STATE_T handleFaultStartState( void ); -static DD_FAULT_STATE_T handleFaultRunNVPOSTsState( void ); +static DD_FAULT_STATE_T handleFaultDeenergizedState( void ); +static DD_FAULT_STATE_T handleFaultEnergizedState( void ); +static DD_FAULT_NVDATA_STATE_T handleFaultNVDataMgmtStartState( void ); +static DD_FAULT_NVDATA_STATE_T handleFaultRunNVPOSTsState( void ); + /*********************************************************************//** * @brief - * The initFaultMode function initializes the Fault Mode module. + * The initFaultMode function initializes the Fault Mode unit. * @details \b Inputs : none - * @details \b Outputs: Fault mode module initialized + * @details \b Outputs: Fault mode unit initialized * @return none *************************************************************************/ void initFaultMode( void ) { faultState = DD_FAULT_STATE_START; + faultNVDataState = DD_FAULT_NVDATA_STATE_START; faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; } @@ -63,8 +72,6 @@ *************************************************************************/ U32 transitionToFaultMode( void ) { -// deenergizeActuators( PARK_CONC_PUMPS ); - initFaultMode(); setCurrentSubState( NO_SUB_STATE ); // Publish POST failure status to UI if fault triggered in Init/POST mode @@ -74,55 +81,35 @@ //sendPOSTFinalResult( FALSE ); } - //setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); - - // Release RTC in case the RTC semaphore was not released prior to transitioning to fault mode. - // In fault mode, the non-volatile data mgmt POST might be run again so the RTC has to be available. Also, - // the RTC time is read every second which requires the semaphore. - releaseSemaphore( SEMAPHORE_RTC ); - -//#ifndef _RELEASE_ -// setHeatNelsonSupportMode( NELSON_NONE ); -// setChemNelsonSupportMode( NELSON_NONE ); -//#endif - return faultState; } /*********************************************************************//** * @brief * The execFaultMode function executes the fault mode state machine. - * @details \b Inputs: none + * @details \b Inputs: faultState * @details \b Outputs: Fault mode state machine executed * @return current state of fault mode *************************************************************************/ U32 execFaultMode( void ) { -// deenergizeActuators( NO_PARK_CONC_PUMPS ); - // execute current fault state switch ( faultState ) { case DD_FAULT_STATE_START: faultState = handleFaultStartState(); break; - case DD_FAULT_STATE_RUN_NV_POSTS: - faultState = handleFaultRunNVPOSTsState(); + case DD_FAULT_DEENERGIZED_STATE: + faultState = handleFaultDeenergizedState(); break; - case DD_FAULT_STATE_COMPLETE: - // Do nothing unless the test configuration to recover treatment is enabled - if ( ( TRUE == getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) ) && ( TRUE == hasRecoverFromFaultModeBeenSet() ) ) - { - DD_OP_MODE_T prevMode = getPreviousOperationMode(); - - requestNewOperationMode( prevMode ); - } + case DD_FAULT_ENERGIZED_STATE: + faultState = handleFaultEnergizedState(); break; default: - faultState = DD_FAULT_STATE_COMPLETE; + faultState = DD_FAULT_STATE_START; break; } @@ -131,6 +118,39 @@ /*********************************************************************//** * @brief + * The execFaultNVdataMgmt function executes the fault mode NVData + * management state machine. + * @details \b Inputs: faultNVDataState + * @details \b Outputs: Fault mode NVdata state machine executed + * @return current state of fault NVDATA management mode + *************************************************************************/ +U32 execFaultNVdataMgmt( void ) +{ + // execute current fault NVData state manangement state + switch ( faultNVDataState ) + { + case DD_FAULT_NVDATA_STATE_START: + faultNVDataState = handleFaultNVDataMgmtStartState(); + break; + + case DD_FAULT_NVDATA_STATE_RUN_NV_POSTS: + faultNVDataState = handleFaultRunNVPOSTsState(); + break; + + case DD_FAULT_NVDATA_STATE_COMPLETE: + //Do Nothing + break; + + default: + faultNVDataState = DD_FAULT_NVDATA_STATE_COMPLETE; + break; + } + + return faultNVDataState; +} + +/*********************************************************************//** + * @brief * The getCurrentFaultState function returns the current state of the fault mode. * @details \b Inputs: faultState * @details \b Outputs: none @@ -152,42 +172,186 @@ *************************************************************************/ void deenergizeActuators( BOOL parkPumps ) { -// // Turn off the UV reactors -// turnOffUVReactor( INLET_UV_REACTOR ); -// turnOffUVReactor( OUTLET_UV_REACTOR ); -// -// // De-energize all the valves -// setValveStateDelayed( VPI, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); -// setValveStateDelayed( VBF, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); -// setValveStateDelayed( VSP, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); -// setValveStateDelayed( VPD, VALVE_STATE_DRAIN_C_TO_NO, DELAY_VALVE_MS ); -// setValveStateDelayed( VPO, VALVE_STATE_NOFILL_C_TO_NO, DELAY_VALVE_MS ); -// setValveStateDelayed( VDR, VALVE_STATE_DRAIN_C_TO_NO, DELAY_VALVE_MS ); -// setValveStateDelayed( VRC, VALVE_STATE_DRAIN_C_TO_NO, DELAY_VALVE_MS ); -// setValveStateDelayed( VRO, VALVE_STATE_R1_C_TO_NO, DELAY_VALVE_MS ); -// setValveStateDelayed( VRD1, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); -// setValveStateDelayed( VRD2, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); -// setValveStateDelayed( VRI, VALVE_STATE_R1_C_TO_NO, DELAY_VALVE_MS ); -// setValveStateDelayed( VRF, VALVE_STATE_R2_C_TO_NO, DELAY_VALVE_MS ); -// -// requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, parkPumps ); -// requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, parkPumps ); -// signalROPumpHardStop(); -// signalDrainPumpHardStop(); -// stopHeater( DD_PRIMARY_HEATER ); -// stopHeater( DD_TRIMMER_HEATER ); + U32 i; + + // De-energize all the hydraulics valves + setValveStateDelayed( D53_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D52_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D8_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D54_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D14_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D65_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D64_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D31_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D34_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D35_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D40_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D47_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D3_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( DD_M4_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + + // De-energize Balancing chamber and Ultrafiltration valves + for ( i = FIRST_BC_VALVE; i <= LAST_BC_VALVE; i++ ) + { + setValveStateDelayed( (DD_VALVES_T)i, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + } + + // TODO: To be removed once HDD clean up is done + for ( i = FIRST_UF_VALVE; i <= FIRST_UF_VALVE; i++ ) + { + setValveStateDelayed( (DD_VALVES_T)i, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + } + + requestConcentratePumpOff( D11_PUMP, parkPumps ); + requestConcentratePumpOff( D10_PUMP, parkPumps ); + requestConcentratePumpOff( D76_PUMP, parkPumps ); + signalDialysatePumpHardStop( D12_PUMP ); + signalDialysatePumpHardStop( D48_PUMP ); + stopHeater( D5_HEAT ); + stopHeater( D45_HEAT ); } /*********************************************************************//** * @brief - * The handleFaultStartState function handles the start state of the fault mode. + * The deenergizeActuatorsWithDrainEnabled function sets most of the actuators + * to reset and de-energized state, except drain and spent balancing chamber + * valves enabled. * @details \b Inputs: none * @details \b Outputs: none - * @return next state + * @param parkPumps TRUE if concentrate pumps should be parked, FALSE if not + * @return none *************************************************************************/ +void deenergizeActuatorsWithDrainEnabled( BOOL parkPumps ) +{ + U32 i; + + // Energize drain and spent balancing chamber valves to relieve the pressure. + setValveState( D53_VALV, VALVE_STATE_OPEN ); + setValveState( D23_VALV, VALVE_STATE_OPEN ); + setValveState( D24_VALV, VALVE_STATE_OPEN ); + setValveState( D25_VALV, VALVE_STATE_OPEN ); + setValveState( D26_VALV, VALVE_STATE_OPEN ); + + // De-energize hydraulics valves + setValveStateDelayed( D52_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D8_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D54_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D14_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D65_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D64_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D31_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D34_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D35_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D40_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D47_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D3_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( DD_M4_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + + // De-energize portion of balancing chamber valves. + setValveStateDelayed( D19_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D20_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D21_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + setValveStateDelayed( D22_VALV, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + + // TODO: To be removed once HDD clean up is done + // De-energize Ultrafiltration valves + for ( i = FIRST_UF_VALVE; i <= FIRST_UF_VALVE; i++ ) + { + setValveStateDelayed( (DD_VALVES_T)i, VALVE_STATE_CLOSED, DELAY_VALVE_MS ); + } + + requestConcentratePumpOff( D11_PUMP, parkPumps ); + requestConcentratePumpOff( D10_PUMP, parkPumps ); + requestConcentratePumpOff( D76_PUMP, parkPumps ); + signalDialysatePumpHardStop( D12_PUMP ); + signalDialysatePumpHardStop( D48_PUMP ); + stopHeater( D5_HEAT ); + stopHeater( D45_HEAT ); +} + +/*********************************************************************//** + * @brief + * The handleFaultStartState function handles the start state of + * the fault mode. + * @details \b Inputs: safetyShutdownActivated + * @details \b Outputs: none + * @return next fault state + *************************************************************************/ static DD_FAULT_STATE_T handleFaultStartState( void ) { - DD_FAULT_STATE_T state = DD_FAULT_STATE_START; + DD_FAULT_STATE_T state = DD_FAULT_STATE_START; + + // Check saftey shutdown line already pulled + if ( TRUE == isSafetyShutdownActivated() ) + { + state = DD_FAULT_DEENERGIZED_STATE; + } + else + { + state = DD_FAULT_ENERGIZED_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleFaultDeenergizedState function handles the deenergized + * state of the fault mode. + * @details \b Inputs: faultNVDataState + * @details \b Outputs: none + * @return fault state + *************************************************************************/ +static DD_FAULT_STATE_T handleFaultDeenergizedState( void ) +{ + DD_FAULT_STATE_T state = DD_FAULT_DEENERGIZED_STATE; + + deenergizeActuators( NO_PARK_CONC_PUMPS ); + + //Make sure the stored config datas read completely. + execFaultNVdataMgmt(); + + return state; +} + +/*********************************************************************//** + * @brief + * The handleFaultEnergizedState function handles the energized + * state of the fault mode (by enabling few valves). + * @details \b Inputs: none + * @details \b Outputs: none + * @return fault state + *************************************************************************/ +static DD_FAULT_STATE_T handleFaultEnergizedState( void ) +{ + DD_FAULT_STATE_T state = DD_FAULT_ENERGIZED_STATE; + + deenergizeActuatorsWithDrainEnabled( NO_PARK_CONC_PUMPS ); + + //Make sure the stored config datas read completely. + execFaultNVdataMgmt(); + + //if saftey shutdown line pulled meanwhile, trainsition to deenergized state + if ( TRUE == isSafetyShutdownActivated() ) + { + state = DD_FAULT_DEENERGIZED_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleFaultNVDataMgmtStartState function handles the start state of + * the fault NVdata management. + * @details \b Inputs: none + * @details \b Outputs: none + * @return next fault NVdata management state + *************************************************************************/ +static DD_FAULT_NVDATA_STATE_T handleFaultNVDataMgmtStartState( void ) +{ + //TODO : Revisit once NV data management been implemented + DD_FAULT_NVDATA_STATE_T state = DD_FAULT_NVDATA_STATE_START; //NVDATAMGMT_RECORDS_READ_STATUS_T status = getNVRecordsReadStatus(); // switch ( status ) @@ -196,12 +360,12 @@ // // their CRCs. // case NVDATAMGMT_RECORDS_QUEUED: // case NVDATAMGMT_RECORDS_READ: -// state = DD_FAULT_STATE_RUN_NV_POSTS; +// state = DD_FAULT_NVDATA_STATE_RUN_NV_POSTS; // break; // // // If the NV post was completed prior to transitioning to fault mode, do nothing // case NVDATAMGMT_RECORDS_CRC_CHECKED: -// state = DD_FAULT_STATE_COMPLETE; +// state = DD_FAULT_NVDATA_STATE_COMPLETE; // break; // } @@ -213,18 +377,19 @@ * The handleFaultRunNVPOSTsState function handles running non-volatile POSTs. * @details \b Inputs: faultPOSTSelfTestResult * @details \b Outputs: faultPOSTSelfTestResult - * @return next state + * @return next fault NVdata management state *************************************************************************/ -static DD_FAULT_STATE_T handleFaultRunNVPOSTsState( void ) +static DD_FAULT_NVDATA_STATE_T handleFaultRunNVPOSTsState( void ) { - DD_FAULT_STATE_T state = DD_FAULT_STATE_RUN_NV_POSTS; + //TODO : Revisit once NV data management been implemented + DD_FAULT_NVDATA_STATE_T state = DD_FAULT_NVDATA_STATE_RUN_NV_POSTS; // faultPOSTSelfTestResult = execNVDataMgmtSelfTest(); // // // Regardless of the status of the NV POST transition to the complete state. // if ( ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) || ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) ) // { -// state = DD_FAULT_STATE_COMPLETE; +// state = DD_FAULT_NVDATA_STATE_COMPLETE; // } return state;