Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r837e86dd59014bd075bc39839c8b4b6324288880 -r9861a0e5ab609dfd56e6c612e41a91edbfda24af --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 837e86dd59014bd075bc39839c8b4b6324288880) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 9861a0e5ab609dfd56e6c612e41a91edbfda24af) @@ -76,7 +76,9 @@ #define CONCENTRATE_PUMP_CONTROL_DISABLE 0x01 ///< Concentrate pump control disable pump. #define CONCENTRATE_PUMP_CONTROL_NOT_RESET 0x20 ///< Concentrate pump control not reset. #define CONCENTRATE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Concentrate pump control sleep off. +#define CONCENTRATE_PUMP_CONTROL_ENABLE_MASK 0x10 ///< Concentrate pump control enable bit mask. + static const U32 CONCENTRATE_PUMP_CONTROL_FORWARD = CONCENTRATE_PUMP_CONTROL_SLEEP_OFF | CONCENTRATE_PUMP_CONTROL_NOT_RESET | CONCENTRATE_PUMP_CONTROL_ENABLE | @@ -108,6 +110,7 @@ OVERRIDE_U32_T hasParkBeenRequested; ///< Flag indicates a request to park the pump. OVERRIDE_F32_T pumpTargetSpeed; ///< Target concentrate pumps' speed (mL/min). OVERRIDE_U32_T pumpTargetRevCnt; ///< Target concentrate pump revolution count + OVERRIDE_U32_T pumpMesauredRevCnt; ///< Current measured concentrate pump revolution count 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). @@ -198,6 +201,10 @@ concentratePumps[ pumpId ].pumpTargetRevCnt.ovInitData = 0; concentratePumps[ pumpId ].pumpTargetRevCnt.ovData = 0; concentratePumps[ pumpId ].pumpTargetRevCnt.override = OVERRIDE_RESET; + concentratePumps[ pumpId ].pumpMesauredRevCnt.data = 0; + concentratePumps[ pumpId ].pumpMesauredRevCnt.ovInitData = 0; + concentratePumps[ pumpId ].pumpMesauredRevCnt.ovData = 0; + concentratePumps[ pumpId ].pumpMesauredRevCnt.override = OVERRIDE_RESET; concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; concentratePumps[ pumpId ].isConcPumpParkInProgress = FALSE; @@ -242,6 +249,9 @@ concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parkFaulted.data = (U32)getFPGAAcidPumpParkFault(); concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parkFaulted.data = (U32)getFPGABicarbPumpParkFault(); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpMesauredRevCnt.data = (U32)getFPGACPARevolutionCountStatus(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpMesauredRevCnt.data = (U32)getFPGACPBRevolutionCountStatus(); + if ( ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ) ) || ( TRUE == getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ) ) ) { // If the pump has parked or faulted during the park, then it is not in progress @@ -450,7 +460,6 @@ { concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; concentratePumps[ pumpId ].hasParkBeenRequested.data = park; - concentratePumps[ pumpId ].pumpTargetSpeed.data = 0.0F; } else { @@ -660,6 +669,32 @@ /*********************************************************************//** * @brief + * The getConcPumpCurrentMeasuredRevolutionCount function gets the concentrate pump + * current measured revolution count. + * @details \b Inputs: pumpMesauredRevCnt + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. + * @param pumpId concentrate pump id to get current measured revolution count + * @return the current revolution count for the given concentrate pump + *************************************************************************/ +U16 getConcPumpCurrentMeasuredRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (U16)getU32OverrideValue( &concentratePumps[ pumpId ].pumpMesauredRevCnt ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The getConcPumpIsParked function gets the current parked state for a * given pump. * @details \b Inputs: parked @@ -724,16 +759,24 @@ BOOL parkPump = getConcPumpParkRequest( pumpId ); concentratePumps[ pumpId ].hasParkBeenRequested.data = FALSE; // reset park request for next time + concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; // Just to make sure pump is in Off state. concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; // set target rate to zero + concentratePumps[ pumpId ].pumpTargetSpeed.data = 0.0F; + concentratePumps[ pumpId ].pumpTargetRevCnt.data = 0; + // Disable the motor when stopping, to take next revolution count // Send zero rate command to stop the pump if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) { setFPGAAcidPumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].controlSet &= ~CONCENTRATE_PUMP_CONTROL_ENABLE_MASK; + setFPGAAcidPumpControl( concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].controlSet ); } else { setFPGABicarbSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].controlSet &= ~CONCENTRATE_PUMP_CONTROL_ENABLE_MASK; + setFPGABicarbPumpControl( concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].controlSet ); } // Park concentrate pump too if requested @@ -805,12 +848,14 @@ static CONCENTRATE_PUMP_STATE_T handleConcentratePumpRampToTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ) { CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; + //U16 currentMeasuredRev = getConcPumpCurrentMeasuredRevolutionCount( pumpId ); if ( TRUE == stepConcentratePumpToTargetSpeed( pumpId ) ) { state = CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE; } + //Stop the pump if measured rev count reaches zero if ( FALSE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) { state = CONCENTRATE_PUMP_OFF_STATE; @@ -833,6 +878,7 @@ static CONCENTRATE_PUMP_STATE_T handleConcentratePumpControlTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ) { CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE; + //U16 currentMeasuredRev = getConcPumpCurrentMeasuredRevolutionCount( pumpId ); F32 targetToCurreSpeedDiffMLPM = fabs( getPumpTargetSpeed( pumpId ) - concentratePumps[ pumpId ].currentPumpSpeed ); if ( ++concentratePumps[ pumpId ].controlTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) @@ -849,6 +895,7 @@ state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } + //Stop the pump if measured rev count reaches zero if ( FALSE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) { state = CONCENTRATE_PUMP_OFF_STATE; @@ -1265,7 +1312,7 @@ //Handle stop command if ( FALSE == payload.startStop ) { - stopConcentratePump( (CONCENTRATE_PUMPS_T)payload.pumpID ); + requestConcentratePumpOff( (CONCENTRATE_PUMPS_T)payload.pumpID, TRUE ); result = TRUE; } }