Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r03e051ef654a1bff100da02483645c4e9d0b7a30 -r26f63d0260a3c35277e3e6dbca3573c253775318 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 03e051ef654a1bff100da02483645c4e9d0b7a30) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 26f63d0260a3c35277e3e6dbca3573c253775318) @@ -111,7 +111,7 @@ static U32 drainControlTimerCounter = 0; ///< Determines when to perform control on drain pump. static BOOL hasClosedLoopBeenRequested = FALSE; ///< Closed loop pump control flag. -static U32 currentDrainPumpRPM = 0; ///< Current drain pump RPM from feedback. +static OVERRIDE_U32_T drainPumpMeasuredRPM = { 0, 0, 0, 0 }; ///< Measured drain pump RPM from feedback. static BOOL signalNewRPMRequest = FALSE; ///< Signal flag the indicates there is a new RPM request. static DRAIN_PUMP_STATE_T pendingDrainPumpCmd = DRAIN_PUMP_OFF_STATE; ///< Delayed (pending) drain pump command. @@ -148,8 +148,7 @@ signalNewRPMRequest = FALSE; // Initialize the drain pump PI controller - initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_MIN_DAC, - DRAIN_PUMP_P_COEFFICIENT, DRAIN_PUMP_I_COEFFICIENT, + initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_MIN_DAC, DRAIN_PUMP_P_COEFFICIENT, DRAIN_PUMP_I_COEFFICIENT, DRAIN_PUMP_MIN_DAC, DRAIN_PUMP_MAX_DAC ); // Initialize the persistent alarm for open loop RPM out of range @@ -290,10 +289,9 @@ /*********************************************************************//** * @brief * The signalDrainPumpHardStop function stops the Drain pump immediately. - * @details Inputs: targetDrainPumpSpeed, drainPumpState, drainPumpControlMode, - * hasClosedLoopBeenRequested, drainControlTimerCounter + * @details Inputs: none * @details Outputs: targetDrainPumpSpeed, drainPumpState, drainPumpControlMode, - * hasClosedLoopBeenRequested, drainControlTimerCounter + * hasClosedLoopBeenRequested, drainControlTimerCounter, isRMPNonZeroInClosedLoop * @return none *************************************************************************/ void signalDrainPumpHardStop( void ) @@ -324,12 +322,12 @@ if ( DRAIN_PUMP_OFF_RPM_ADC_COUNT == fpgaADCSpeedCount ) { - currentDrainPumpRPM = 0; + drainPumpMeasuredRPM.data = 0; } else { // Convert speed ADC to RPM - currentDrainPumpRPM = CONVERSION_COEFF / getFPGADrainPumpSpeed(); + drainPumpMeasuredRPM.data = CONVERSION_COEFF / getFPGADrainPumpSpeed(); } #ifndef IGNORE_DRAIN_PUMP_MONITOR @@ -339,20 +337,20 @@ if ( PUMP_CONTROL_MODE_OPEN_LOOP == drainPumpControlModeSet ) { // Using abs since the read RPM can be above or below the target - U32 rpmDiff = abs( getTargetDrainPumpRPM() - currentDrainPumpRPM ); + U32 rpmDiff = abs( getDrainPumpTargetRPM() - getDrainPumpMeasuredRPM() ); // Check if RPM is out of range BOOL isRPMOutOfRange = ( rpmDiff > MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, currentDrainPumpRPM, MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, getDrainPumpMeasuredRPM(), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); } // Check if the pump is in off state and the RPM is greater than the minimum RPM if ( DRAIN_PUMP_OFF_STATE == drainPumpState ) { - BOOL isRPMTooHigh = currentDrainPumpRPM > MIN_DRAIN_PUMP_RPM; + BOOL isRPMTooHigh = ( getDrainPumpMeasuredRPM() > MIN_DRAIN_PUMP_RPM ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, currentDrainPumpRPM, MIN_DRAIN_PUMP_RPM ); + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); // If the off fault alarm has become active, trigger the safety shutdown if ( isAlarmActive( ALARM_ID_DRAIN_PUMP_OFF_FAULT ) ) @@ -391,7 +389,7 @@ } else if ( DRAIN_PUMP_OPEN_LOOP_STATE == pendingDrainPumpCmd ) { - drainPumpDAC = (U32)( pendingDrainPumpCmdTarget * RPM_2_DAC_SLOPE - RPM_2_DAC_INTERCEPT + FLOAT_TO_INT_ROUNDUP_OFFSET ); + drainPumpDAC = (U32)( pendingDrainPumpCmdTarget * RPM_2_DAC_SLOPE - RPM_2_DAC_INTERCEPT + FLOAT_TO_INT_ROUNDUP_OFFSET ); targetDrainPumpRPM = (U32)pendingDrainPumpCmdTarget; drainPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; drainPumpControlModeSet = drainPumpControlMode; @@ -451,26 +449,46 @@ /*********************************************************************//** * @brief - * The getTargetDrainPumpRPM function gets the current target drain pump + * The getDrainPumpTargetRPM function gets the current target drain pump * RPM. * @details Inputs: targetDrainPumpRPM * @details Outputs: none * @return the current target drain pump RPM. *************************************************************************/ -U32 getTargetDrainPumpRPM( void ) +U32 getDrainPumpTargetRPM( void ) { return targetDrainPumpRPM; } /*********************************************************************//** * @brief + * The getDrainPumpMeasuredRPM function returns the RPM read from the drain + * pump RPM sensor. + * @details Inputs: drainPumpMeasuredRPM + * @details Outputs: none + * @return drain pump RPM + *************************************************************************/ +U32 getDrainPumpMeasuredRPM( void ) +{ + U32 rpm = drainPumpMeasuredRPM.data; + + if ( OVERRIDE_KEY == drainPumpMeasuredRPM.override ) + { + rpm = drainPumpMeasuredRPM.ovData; + } + + return rpm; +} + +/*********************************************************************//** + * @brief * The getTargetDrainPumpOutletPressure function gets the current target * drain pump delta pressure. * @details Inputs: targetDrainPumpOutletPressure * @details Outputs: none * @return the current target drain pump outlet pressure. *************************************************************************/ -F32 getTargetDrainPumpOutletPressure( void ) +F32 getDrainPumpTargetOutletPressure( void ) { return targetDrainPumpOutletPressure; } @@ -514,7 +532,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 ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == drainPumpControlModeSet ) ) + if ( ( getDrainPumpTargetRPM() > 0 ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == drainPumpControlModeSet ) ) { // Set drain pump enable pin SET_DRAIN_PUMP_ENABLE(); @@ -562,7 +580,7 @@ if ( ++drainControlTimerCounter >= DRP_CONTROL_INTERVAL ) { F32 outletDrainPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); - F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, getTargetDrainPumpOutletPressure(), outletDrainPressure ); + F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, getDrainPumpTargetOutletPressure(), outletDrainPressure ); // The PI controller sends the DAC out and it is rounded to the nearest offset and is fed to the FPGA drainPumpDACSet = (U32)( dac + FLOAT_TO_INT_ROUNDUP_OFFSET ); @@ -571,13 +589,6 @@ drainControlTimerCounter = 0; } - // Check if the RPM is 0, and if it is turn off the pump - if ( 0 == getTargetDrainPumpRPM() ) - { - state = DRAIN_PUMP_OFF_STATE; - signalDrainPumpHardStop(); - } - return state; } @@ -592,14 +603,8 @@ { DRAIN_PUMP_STATE_T state = DRAIN_PUMP_OPEN_LOOP_STATE; - // Check if the RPM is 0, then turn off the pump - if ( 0 == getTargetDrainPumpRPM() ) - { - state = DRAIN_PUMP_OFF_STATE; - signalDrainPumpHardStop(); - } // If there is a signal for a new RPM, change to the new RPM - else if ( TRUE == signalNewRPMRequest ) + if ( TRUE == signalNewRPMRequest ) { // Set drain pump DAC drainPumpDACSet = drainPumpDAC; @@ -642,10 +647,11 @@ DRAIN_PUMP_DATA_T drainPumpData; // Populate the data structure for publication - drainPumpData.rpmSetPoint = getTargetDrainPumpRPM(); + drainPumpData.rpmSetPoint = getDrainPumpTargetRPM(); drainPumpData.pumpDACSet = drainPumpDACSet; drainPumpData.drainPumpState = (U32)drainPumpState; - drainPumpData.drainPumpRPM = currentDrainPumpRPM; + drainPumpData.drainPumpRPM = getDrainPumpMeasuredRPM(); + drainPumpData.trgtOutletPrsr = targetDrainPumpOutletPressure; broadcastDrainPumpData( &drainPumpData ); @@ -753,10 +759,15 @@ if ( TRUE == isTestingActivated() ) { - if ( ( 0 == value ) || ( value >= MIN_DRAIN_PUMP_RPM ) && ( value <= MAX_DRAIN_PUMP_RPM ) ) + if ( ( value >= MIN_DRAIN_PUMP_RPM ) && ( value <= MAX_DRAIN_PUMP_RPM ) ) { result = setDrainPumpTargetRPM( value ); } + + if ( 0 == value ) + { + signalDrainPumpHardStop(); + } } return result; @@ -778,7 +789,7 @@ if ( TRUE == isTestingActivated() ) { // Check if delta pressure is in range - if ( value >= MIN_ALLOWED_TARGET_OUTLET_PRESSURE && value <= MAX_ALLOWED_TARGET_OUTLET_PRESSURE ) + if ( ( value >= MIN_ALLOWED_TARGET_OUTLET_PRESSURE ) && ( value <= MAX_ALLOWED_TARGET_OUTLET_PRESSURE ) ) { result = setDrainPumpTargetOutletPressure( value ); } @@ -787,4 +798,56 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetDrainPumpMeasuredRPMOverride function overrides the drain pump + * measured RPM data. + * @details Inputs: none + * @details Outputs: drainPumpMeasuredRPM + * @param value override drain pump measured data + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetDrainPumpMeasuredRPMOverride( U32 value ) +{ + BOOL status = FALSE; + + // Check if the requested drain pump RPM is within range + if ( ( value >= MIN_DRAIN_PUMP_RPM ) && ( value <= MAX_DRAIN_PUMP_RPM ) ) + { + // Check if the user is logged in + if ( TRUE == isTestingActivated() ) + { + drainPumpMeasuredRPM.ovData = value; + drainPumpMeasuredRPM.override = OVERRIDE_KEY; + drainPumpMeasuredRPM.ovInitData = drainPumpMeasuredRPM.data; + status = TRUE; + } + } + + return status; +} + +/*********************************************************************//** + * @brief + * The testResetDrainPumpMeasuredRPMOverride function resets the drain pump + * measured RPM data. + * @details Inputs: none + * @details Outputs: drainPumpMeasuredRPM + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetDrainPumpMeasuredRPMOverride( void ) +{ + BOOL status = FALSE; + + // Check if the user is logged in + if ( TRUE == isTestingActivated() ) + { + drainPumpMeasuredRPM.ovData = drainPumpMeasuredRPM.ovInitData; + drainPumpMeasuredRPM.override = OVERRIDE_RESET; + status = TRUE; + } + + return status; +} + /**@}*/