Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -rb63e03ba8b2568afbbd314e9ba6c59c16db29f42 -r1a5efe97f5f39594b45797fded52cafce92afe80 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision b63e03ba8b2568afbbd314e9ba6c59c16db29f42) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 1a5efe97f5f39594b45797fded52cafce92afe80) @@ -116,6 +116,10 @@ static BOOL hasClosedLoopBeenRequested = FALSE; ///< Closed loop pump control flag. static U32 currentDrainPumpRPM = 0; ///< Current drain pump RPM from feedback. +static DRAIN_PUMP_STATE_T pendingDrainPumpCmd = DRAIN_PUMP_OFF_STATE; ///< Delayed (pending) drain pump command. +static F32 pendingDrainPumpCmdTarget = 0.0; ///< Delayed (pending) drain pump command target (rpm or PSI depending on command). +static U32 pendingDrainPumpCmdCountDown = 0; ///< Delayed (pending) drain pump command count down timer (in task intervals). + /* TODO These variables are used for POST. POST will be implemented later static DRAIN_PUMP_SELF_TEST_STATE_T drainPumpSelfTestState = DRAIN_PUMP_SELF_TEST_STATE_START; ///< Current drain pump self test state. static U32 drainPumpSelfTestTimerCount = 0; ///< Timer counter for drain pump self test. @@ -194,8 +198,38 @@ /*********************************************************************//** * @brief - * The setDrainPumpTargetOutletPressure function sets the target drain pump - * outlet pressure. + * The setDrainPumpTargetRPMDelayed function sets a new target RPM for the + * drain pump with delayed start. + * @details Inputs: drainPumpDAC, targetDrainPumpSpeed, drainPumpControlMode, + * drainPumpControlModeSet + * @details Outputs: pendingDrainPumpCmd, pendingDrainPumpCmdTarget, pendingDrainPumpCmdCountDown + * @param rpm new drain pump target RPM + * @param delayMs delay duration (in ms) before drain pump started + * @return TRUE if new target RPM is set, FALSE if not + *************************************************************************/ +BOOL setDrainPumpTargetRPMDelayed( U32 rpm, U32 delayMs ) +{ + BOOL result = FALSE; + + if ( ( 0 == rpm ) || ( ( rpm >= MIN_DRAIN_PUMP_RPM ) && ( rpm <= MAX_DRAIN_PUMP_RPM ) ) ) + { + pendingDrainPumpCmd = DRAIN_PUMP_OPEN_LOOP_STATE; + pendingDrainPumpCmdTarget = (F32)rpm; + pendingDrainPumpCmdCountDown = delayMs / TASK_GENERAL_INTERVAL; + result = TRUE; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DRAIN_PUMP_INVALID_RPM_SELECTED, rpm ) + } + + return result; +} + +/*********************************************************************//** + * @brief + * The setDrainPumpTargetOutletPressure function sets the drain pump to start + * with given target PDr pressure. * @details Inputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet * @details Outputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, @@ -228,6 +262,38 @@ /*********************************************************************//** * @brief + * The setDrainPumpTargetOutletPressureDelayed function sets the drain pump + * to start with given target PDr pressure after given delay. + * @details Inputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, + * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet + * @details Outputs: targetDrainPumpDeltaPressure, hasClosedLoopBeenRequested, + * drainPumpDAC, drainPumpControlMode, drainPumpControlModeSet + * @param pressure new target drain pump outlet pressure + * @param delayMS delay duration (in ms) before drain pump started + * @return TRUE if new target speed is set, FALSE if not + *************************************************************************/ +BOOL setDrainPumpTargetOutletPressureDelayed( F32 pressure, U32 delayMs ) +{ + BOOL result = FALSE; + + // Check the delta pressure is in range + if ( ( pressure >= MIN_ALLOWED_TARGET_OUTLET_PRESSURE ) && ( pressure <= MAX_ALLOWED_TARGET_OUTLET_PRESSURE ) ) + { + pendingDrainPumpCmd = DRAIN_PUMP_CONTROL_TO_TARGET_STATE; + pendingDrainPumpCmdTarget = pressure; + pendingDrainPumpCmdCountDown = delayMs / TASK_GENERAL_INTERVAL; + result = TRUE; + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DRAIN_PUMP_INVALID_DELTA_PRESSURE_SELECTED, pressure ) + } + + return result; +} + +/*********************************************************************//** + * @brief * The signalDrainPumpHardStop function stops the Drain pump immediately. * @details Inputs: targetDrainPumpSpeed, drainPumpState, drainPumpControlMode, * hasClosedLoopBeenRequested, drainControlTimerCounter @@ -318,6 +384,33 @@ *************************************************************************/ void execDrainPumpController( void ) { + // Handle pending drain pump command + if ( pendingDrainPumpCmdCountDown > 0 ) + { + pendingDrainPumpCmdCountDown--; + if ( 0 == pendingDrainPumpCmdCountDown ) + { + if ( DRAIN_PUMP_CONTROL_TO_TARGET_STATE == pendingDrainPumpCmd ) + { + targetDrainPumpOutletPressure = pendingDrainPumpCmdTarget; + hasClosedLoopBeenRequested = TRUE; + drainPumpDAC = DRAIN_PUMP_MIN_DAC; + drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; + drainPumpControlModeSet = drainPumpControlMode; + } + else if ( DRAIN_PUMP_OPEN_LOOP_STATE == pendingDrainPumpCmd ) + { + drainPumpDAC = (U32)(pendingDrainPumpCmdTarget * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); + targetDrainPumpRPM = (U32)pendingDrainPumpCmdTarget; + drainPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + drainPumpControlModeSet = drainPumpControlMode; + } + pendingDrainPumpCmdTarget = 0.0; + pendingDrainPumpCmd = DRAIN_PUMP_OFF_STATE; + } + } + + // Execute drain pump state machine switch ( drainPumpState ) { case DRAIN_PUMP_OFF_STATE: @@ -385,6 +478,18 @@ /*********************************************************************//** * @brief + * The isDrainPumpOn function determines whether the drain pump is on. + * @details Inputs: drainPumpDACSet + * @details Outputs: none + * @return TRUE if drain pump is on, FALSE if not. + *************************************************************************/ +BOOL isDrainPumpOn( void ) +{ + return ( drainPumpDACSet > 0 ? TRUE : FALSE ); +} + +/*********************************************************************//** + * @brief * The handleDrainPumpOffState function handles the drain pump off state of * the drain pump controller state machine. * @details Inputs: drainPumpControlModeSet, drainPumpDACSet, drainPumpDAC @@ -398,7 +503,7 @@ // If the target drain pump speed was not 0 and the control mode // is open loop, set the drain pump to open loop - if ( getTargetDrainPumpRPM() > 0 && drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + if ( ( getTargetDrainPumpRPM() > 0 ) && ( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) ) { // Set drain pump enable pin SET_DRAIN_PUMP_ENABLE(); @@ -411,7 +516,7 @@ } // If the drain pump is set to closed loop, call the proper state // It is checked for the value of delta pressure because it can be anything including 0 - else if ( drainPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP && hasClosedLoopBeenRequested ) + else if ( ( drainPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) && ( hasClosedLoopBeenRequested ) ) { // set drain pump enable pin SET_DRAIN_PUMP_ENABLE();