Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r499e5de29e706d09f79ba22511068990c4044e84 -r4c20f6a3d8c8ff33d2dff4ba27e0732c7614378b --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 499e5de29e706d09f79ba22511068990c4044e84) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 4c20f6a3d8c8ff33d2dff4ba27e0732c7614378b) @@ -14,51 +14,138 @@ * **************************************************************************/ +#include "DrainPump.h" +#include "LoadCell.h" #include "ModeDrain.h" #include "OperationModes.h" +#include "Reservoirs.h" +#include "Valves.h" +/** + * @addtogroup DGDrainMode + * @{ + */ + +// ********** private definitions ********** + +#define TARGET_DRAIN_PUMP_RPM 2800 ///< Target drain pump speed (in RPM). + // ********** private data ********** +static DG_DRAIN_STATE_T drainState = DG_DRAIN_STATE_START; ///< Currently active drain state. + // ********** private function prototypes ********** -/************************************************************************* - * @brief initDrainMode +static DG_DRAIN_STATE_T handleDrainState( void ); + +/*********************************************************************//** + * @brief * The initOpParamsMode function initializes the Drain Mode module. * @details * Inputs : none * Outputs : Operating Parameters Mode module initialized. - * @param none * @return none *************************************************************************/ void initDrainMode( void ) { + drainState = DG_DRAIN_STATE_START; } -/************************************************************************* - * @brief transitionToDrainMode +/*********************************************************************//** + * @brief * The transitionToDrainMode function prepares for transition to drain \n * mode. * @details * Inputs : none * Outputs : - * @param none * @return none *************************************************************************/ void transitionToDrainMode( void ) { + // re-initialize each time we transition to drain mode + initDrainMode(); + + // set initial actuator states + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setDrainPumpTargetSpeed( TARGET_DRAIN_PUMP_RPM ); } -/************************************************************************* - * @brief execDrainMode +/*********************************************************************//** + * @brief * The execDrainMode function executes the Drain Mode state machine. * @details * Inputs : none * Outputs : - * @param none - * @return none + * @return current state. *************************************************************************/ -void execDrainMode( void ) +U32 execDrainMode( void ) { + // execute current drain state + switch ( drainState ) + { + case DG_DRAIN_STATE_START: + drainState = DG_DRAIN_STATE_DRAIN; + break; + case DG_DRAIN_STATE_DRAIN: + drainState = handleDrainState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, drainState ) // TODO - add s/w fault enum to 1st data param + drainState = DG_DRAIN_STATE_START; + break; + } + + return drainState; } +/*********************************************************************//** + * @brief + * The handleDrainState function handles the drain state of the Drain Mode \n + * state machine. + * @details + * Inputs : none + * Outputs : + * @return the next state + *************************************************************************/ +static DG_DRAIN_STATE_T handleDrainState( void ) +{ + DG_DRAIN_STATE_T result = DG_DRAIN_STATE_DRAIN; + LOAD_CELL_ID_T drainWeightLoadCell = LOAD_CELL_A1; + + // determine which load cell to use for drain volume - we want weight of inactive reservoir +#ifndef BETA_V1_BUILD + if ( RESERVOIR_1 == getActiveReservoir() ) +#else + if ( RESERVOIR_2 == getActiveReservoir() ) +#endif + { + drainWeightLoadCell = LOAD_CELL_B1; + } + + // if we've reached our target drain to volume (by weight), we're done draining - go back to re-circ mode + if ( getReservoirDrainVolumeTargetMl() >= getLoadCellFilteredWeight( drainWeightLoadCell ) ) + { + setDrainPumpTargetSpeed( 0 ); + requestNewOperationMode( DG_MODE_CIRC ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getCurrentDrainState function returns the current state of the \n + * drain mode. + * @details + * Inputs : drainState + * Outputs : none + * @return the current state of drain mode. + *************************************************************************/ +DG_DRAIN_STATE_T getCurrentDrainState( void ) +{ + return drainState; +} + +/**@}*/