Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -31,7 +31,7 @@ // ********** private definitions ********** -#define CONCENTRATE_PUMP_ON_CONTROL 0x1A ///< Configuration to turn on concentrate pump with 8 microsteps. +#define CONCENTRATE_PUMP_ON_CONTROL 0x1A ///< Configuration to turn on concentrate pump with 16 microsteps. #define CONCENTRATE_PUMP_OFF_CONTROL 0x3A ///< Configuration to turn off concentrate pump. #define CONCENTRATE_PUMP_FORWARD_DIR 0x1 ///< Concentrate pump forward direction configuration. @@ -102,13 +102,16 @@ U32 controlTimerCounter; ///< Timer counter to perform control on concentrate pump. CONCENTRATE_PUMP_STATE_T execState; ///< Concentrate pump execute current state. BOOL hasTurnOnPumpsBeenRequested; ///< Flag indicates a request to turn concentrate pumps on. + BOOL hasParkBeenRequested; ///< Flag indicates a request to park the pump. F32 pumpTargetSpeed; ///< Target concentrate pumps' speed (mL/min). F32 currentPumpSpeed; ///< Current controlled concentrate pumps' speed (mL/min). OVERRIDE_F32_T measuredPumpSpeed; ///< Measured concentrate pump speed (mL/min). U16 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). U08 direction; ///< Concentrate pump motor direction. U08 controlSet; ///< Concentrate pump control set. (Used in DVT) F32 pulseWidthUS; ///< Concentrate pump pulse width in microseconds. + OVERRIDE_U32_T parked; ///< Concentrate pump is currently parked (T/F). + OVERRIDE_U32_T parkFaulted; ///< Concentrate pump park command has faulted (T/F). } CONCENTRATE_PUMP_T; // ********** private data ********** @@ -150,7 +153,11 @@ { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; + concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; + concentratePumps[ pumpId ].hasParkBeenRequested = FALSE; + concentratePumps[ pumpId ].parked.data = FALSE; + concentratePumps[ pumpId ].parkFaulted.data = FALSE; concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT @@ -185,6 +192,11 @@ calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpIsParked(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpIsParked(); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpParkFault(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpParkFault(); + #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONC_PUMPS_SPEED_ALARM ) != SW_CONFIG_ENABLE_VALUE ) #endif @@ -197,21 +209,22 @@ { CONCENTRATE_PUMP_DATA_T data; U08 fpgaConcentratePumpsFault = getFPGAConcentratePumpsFault(); - - if ( 0 != fpgaConcentratePumpsFault ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); - } - U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); F32 cp1TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; + BOOL cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); + BOOL cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); F32 cp2TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; + if ( 0 != fpgaConcentratePumpsFault ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); + } + // Use the above values to prepare the broadcast data data.cp1CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1SetSpeed * -1.0 : cp1SetSpeed ); data.cp1MeasuredSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1Speed * -1.0 : cp1Speed ); @@ -223,6 +236,10 @@ data.cp2State = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState; data.cp1PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pulseWidthUS; data.cp2PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pulseWidthUS; + data.cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); + data.cp2Parked = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); + data.cp1ParkFault = getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ); + data.cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ); concentratePumpMonitorTimerCounter = 0; broadcastData( MSG_ID_DG_CONCENTRATE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( CONCENTRATE_PUMP_DATA_T ) ); @@ -327,13 +344,15 @@ * @details Inputs: none * @details Outputs: set flag isPumpOffRequested to TRUE * @param pumpId concentrate pump id + * @param park TRUE if pump should be parked, FALSE if not * @return none *************************************************************************/ -void requestConcentratePumpOff( CONCENTRATE_PUMPS_T pumpId ) +void requestConcentratePumpOff( CONCENTRATE_PUMPS_T pumpId, BOOL park ) { if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; + concentratePumps[ pumpId ].hasParkBeenRequested = park; concentratePumps[ pumpId ].pumpTargetSpeed = 0.0F; } else @@ -438,8 +457,58 @@ /*********************************************************************//** * @brief + * The getConcPumpIsParked function gets the current parked state for a + * given pump. + * @details Inputs: parked + * @details Outputs: none + * @param pumpId concentrate pump id to get parked state for + * @return the current concentrate pump parked state. + *************************************************************************/ +BOOL getConcPumpIsParked( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].parked ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getConcPumpParkIsFaulted function gets the current park command + * fault state for a given pump. + * @details Inputs: parkFaulted + * @details Outputs: none + * @param pumpId concentrate pump id to get park faulted state for + * @return the current concentrate pump park faulted state. + *************************************************************************/ +BOOL getConcPumpParkIsFaulted( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].parkFaulted ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The stopConcentratePump function sets the concentrate pump step speed - * to zero and turns off concentrate pumps. + * to zero and turns off concentrate pump. Also parks the pump if requested. * @details Inputs: none * @details Outputs: targetPumpSpeed[], currentPumpSpeed[], turn * concentrate pumps off @@ -448,10 +517,13 @@ *************************************************************************/ static void stopConcentratePump( CONCENTRATE_PUMPS_T pumpId ) { - concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; - concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0F; + BOOL parkPump = concentratePumps[ pumpId ].hasParkBeenRequested; + concentratePumps[ pumpId ].hasParkBeenRequested = FALSE; // reset park request for next time + concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; // set target rate to zero + #ifndef _RELEASE_ + // Beta units require a stop command in addition to the zero rate if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) { if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) @@ -465,6 +537,7 @@ } #endif + // Send zero rate command to stop the pump if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) { setFPGAAcidPumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); @@ -473,6 +546,43 @@ { setFPGABicarbSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } + + // Park concentrate pump too if requested +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONCENTRATE_PUMPS_PARK ) != SW_CONFIG_ENABLE_VALUE ) + { + if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) + { + if ( TRUE == parkPump ) + { + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + { + setFPGAV3AcidPumpParkCmd(); + } + else + { + setFPGAV3BicarbPumpParkCmd(); + } + } + } + else + { +#endif + if ( TRUE == parkPump ) + { + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + { + setFPGAAcidPumpParkCmd(); + } + else + { + setFPGABicarbPumpParkCmd(); + } + } +#ifndef _RELEASE_ + } + } +#endif } /*********************************************************************//** @@ -753,7 +863,7 @@ { BOOL result = FALSE; - if ( pumpId < NUM_OF_CONCENTRATE_PUMPS && isTestingActivated() ) + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS && ( TRUE == isTestingActivated() ) ) { F32 const absSpeed = fabs( value ); @@ -781,7 +891,7 @@ { BOOL result = FALSE; - if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && isTestingActivated() ) + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) { result = TRUE; concentratePumps[ pumpId ].measuredPumpSpeed.ovData = value; @@ -804,7 +914,7 @@ { BOOL result = FALSE; - if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && isTestingActivated() ) + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) { result = TRUE; concentratePumps[ pumpId ].measuredPumpSpeed.ovData = 0.0; @@ -814,4 +924,132 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetConcentratePumpParkedOverride function overrides the parked + * status of given concentrate pump id. + * @details Inputs: none + * @details Outputs: parked[] + * @param pumpId concentrate pump id + * @param value override concentrate pump parked status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpParkedOverride( U32 pumpId, U32 value ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parked.ovData = value; + concentratePumps[ pumpId ].parked.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetConcentratePumpParkedOverride function resets the parked + * status of given concentrate pump id. + * @details Inputs: none + * @details Outputs: parked[] + * @param pumpId concentrate pump id + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetConcentratePumpParkedOverride( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parked.ovData = 0.0; + concentratePumps[ pumpId ].parked.override = OVERRIDE_RESET; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetConcentratePumpParkCmdFaultedOverride function overrides the + * park command fault status of given concentrate pump id. + * @details Inputs: none + * @details Outputs: parkFaulted[] + * @param pumpId concentrate pump id + * @param value override concentrate pump park command faulted status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpParkCmdFaultedOverride( U32 pumpId, U32 value ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parkFaulted.ovData = value; + concentratePumps[ pumpId ].parkFaulted.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetConcentratePumpParkCmdFaultedOverride function resets the + * park command fault status given concentrate pump id. + * @details Inputs: none + * @details Outputs: parkFaulted[] + * @param pumpId concentrate pump id + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetConcentratePumpParkCmdFaultedOverride( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parkFaulted.ovData = 0.0; + concentratePumps[ pumpId ].parkFaulted.override = OVERRIDE_RESET; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetConcentratePumpParkCommand function commands the given pump + * to park. + * @details Inputs: none + * @details Outputs: measuredPumpSpeed[] + * @param pumpId concentrate pump id + * @param value override concentrate pump measured speed + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpParkCommand( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + + // If pump is running, stop it w/ park option + if ( TRUE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) + { + requestConcentratePumpOff( pumpId, TRUE ); + } + // If pump is already stopped, just send park command + else + { + concentratePumps[ pumpId ].hasParkBeenRequested = TRUE; + stopConcentratePump( pumpId ); + } + } + + return result; +} + /**@}*/