Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -rdedf0cbae7f010d314c430f06834114213e18f2c -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision dedf0cbae7f010d314c430f06834114213e18f2c) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) @@ -35,7 +35,7 @@ #define CONCENTRATE_PUMP_FORWARD_DIR 0x1 ///< Concentrate pump forward direction configuration. #define CONCENTRATE_PUMP_REVERSE_DIR 0x0 ///< Concentrate pump reverse direction configuration. -#define CONCENTRATE_PUMP_SPEED_INCREMENT 10.0F ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. +#define CONCENTRATE_PUMP_RAMP_SPEED_INCREMENT 10.0F ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. #define CONCENTRATE_PUMP_MIN_SPEED 3.0F ///< Minimum speed for concentrate pump in mL per min. #define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT 0.02F ///< Concentrate pump speed out of range tolerance when on in percentage. #define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM 1.0F ///< Concentrate pump speed out of range tolerance when slow in mL/min. @@ -54,7 +54,7 @@ #define CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ( 5 * MS_PER_SECOND ) ///< Hall sensors out of range time in milliseconds. #define CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP 8.0F ///< Number of micro-steps ( fractions of step) per step. -#define CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ( ( 1 / CONCENTRATE_PUMP_VOLUME_PER_REV ) * \ +#define CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ( ( 1.0F / CONCENTRATE_PUMP_VOLUME_PER_REV ) * \ ( CONCENTRATE_PUMP_STEP_PER_REV * \ CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ) ) ///< Convert volume in to number of revolutions needed. #ifdef __PUMPTEST__ @@ -87,7 +87,6 @@ #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 | @@ -165,6 +164,7 @@ static void monitorPumpSpeed( CONCENTRATE_PUMPS_T pumpId, ALARM_ID_T alarm ); static void checkConcentratePumpControlSet( CONCENTRATE_PUMPS_T pumpId ); static void publishConcentratePumpData( void ); +static void monitorPumpParkStatus( void ); /*********************************************************************//** * @brief @@ -253,14 +253,39 @@ // Calculate pump speed for each defined pump calcMeasuredPumpsSpeed(); + // Update rev count status + pumpMesauredRevCnt[ D11_PUMP ].data = (U32)getFPGAD11PumpRevolutionCountStatus(); + pumpMesauredRevCnt[ D10_PUMP ].data = (U32)getFPGAD10PumpRevolutionCountStatus(); + + //Monitor Pump Park status + monitorPumpParkStatus(); + + //Monitor Pump Speed + monitorPumpSpeed( D11_PUMP, ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR ); + monitorPumpSpeed( D10_PUMP, ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); + + checkPersistentAlarm( ALARM_ID_DD_CONCENTRATE_PUMP_FAULT, isConcPumpFault, fpgaConcPumpsFault, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); + + //Publish concentrate pump data + publishConcentratePumpData(); +} + +/*********************************************************************//** + * @brief + * The monitorPumpParkStatus function monitors the concentrate pump park status + * and associated fault handling. + * @details \b Inputs: Park status + * @details \b Outputs: isConcPumpParkInProgress,acidConcentratePumpParkPersistenceClear + * bicarbConcentratePumpParkPersistenceClear + * @return none + *************************************************************************/ +static void monitorPumpParkStatus( void ) +{ parked[ D11_PUMP ].data = (U32)getFPGAD11PumpIsParked(); - parked[ D10_PUMP ].data = (U32)getFPGAD10PumpIsParked(); + parked[ D10_PUMP ].data = (U32)getFPGAD10PumpIsParked(); parkFaulted[ D11_PUMP ].data = (U32)getFPGAD11PumpParkFault(); - parkFaulted[ D10_PUMP ].data = (U32)getFPGAD10PumpParkFault(); + parkFaulted[ D10_PUMP ].data = (U32)getFPGAD10PumpParkFault(); - pumpMesauredRevCnt[ D11_PUMP ].data = (U32)getFPGAD11PumpRevolutionCountStatus(); - pumpMesauredRevCnt[ D10_PUMP ].data = (U32)getFPGAD10PumpRevolutionCountStatus(); - if ( ( TRUE == getConcPumpIsParked( D11_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D11_PUMP ) ) ) { // If the pump has parked or faulted during the park, then it is not in progress @@ -297,14 +322,6 @@ resetPersistentAlarmTimer( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); } } - - monitorPumpSpeed( D11_PUMP, ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR ); - monitorPumpSpeed( D10_PUMP, ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); - - checkPersistentAlarm( ALARM_ID_DD_CONCENTRATE_PUMP_FAULT, isConcPumpFault, fpgaConcPumpsFault, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); - - //Publish concentrate pump data - publishConcentratePumpData(); } /*********************************************************************//** @@ -335,13 +352,11 @@ concentratePumps[ pumpId ].execState = handleConcentratePumpControlTargetSpeedState( pumpId ); break; -#ifndef _VECTORCAST_ // The switch case is in a for loop so the default case cannot be covered in VectorCAST default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, pumpId ) concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; break; -#endif } } } @@ -485,6 +500,7 @@ * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. * @param pumpId pump id to set step speed * @param targetSpeed_ml_min target speed in mL/min + * @param targetVolume_ml dosing volume to be delivered in ml. * @return none *************************************************************************/ void setConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId, F32 targetSpeed_ml_min, F32 targetVolume_ml ) @@ -573,6 +589,28 @@ /*********************************************************************//** * @brief + * The isConcentratePumpDosingCompleted function returns the dosing status + * for a given concentrate pump. + * @details \b Inputs: concentratePumps + * @details \b Outputs: none + * @param pumpId concentrate pump id to get current dosing status + * @return TRUE if dosing completed otherwise,FALSE. + *************************************************************************/ +BOOL isConcentratePumpDosingCompleted( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL state = FALSE; + + //On dosing completion,state transition to off state + if ( CONCENTRATE_PUMP_OFF_STATE == concentratePumps[ pumpId ].execState ) + { + state = TRUE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The getPumpTargetSpeed function gets the current target spped for the given * concentrate pump. * @details \b Inputs: pumpTargetSpeed @@ -682,28 +720,6 @@ /*********************************************************************//** * @brief - * The IsConcentratePumpDosingCompleted function gets the concentrate pump - * dosing completion status. - * @details \b Inputs: execState - * @details \b Outputs: none - * @return true when dosing completed,otherwise false. - *************************************************************************/ -BOOL IsConcentratePumpDosingCompleted( void ) -{ - BOOL result = FALSE; - - // Check doisng completed status - if ( ( concentratePumps[D11_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && - ( concentratePumps[D10_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) ) - { - result = TRUE; - } - - return result; -} - -/*********************************************************************//** - * @brief * The getConcPumpCurrentMeasuredRevolutionCount function gets the concentrate pump * current measured revolution count. * @details \b Inputs: pumpMesauredRevCnt @@ -804,14 +820,10 @@ if ( D11_PUMP == pumpId ) { setFPGAD11PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); - //concentratePumps[ D11_PUMP ].controlSet |= CONCENTRATE_PUMP_CONTROL_ENABLE_MASK; - //setFPGAD11PumpControl( concentratePumps[ D11_PUMP ].controlSet ); } else { setFPGAD10PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); - //concentratePumps[ D10_PUMP ].controlSet |= CONCENTRATE_PUMP_CONTROL_ENABLE_MASK; - //setFPGAD10PumpControl( concentratePumps[ D10_PUMP ].controlSet ); } #ifndef __PUMPTEST__ // Park concentrate pump too if requested @@ -960,9 +972,9 @@ if ( currentToTargetDiff > NEARLY_ZERO ) { - if ( currentToTargetDiff > CONCENTRATE_PUMP_SPEED_INCREMENT ) + if ( currentToTargetDiff > CONCENTRATE_PUMP_RAMP_SPEED_INCREMENT ) { - speedIncrease = CONCENTRATE_PUMP_SPEED_INCREMENT; + speedIncrease = CONCENTRATE_PUMP_RAMP_SPEED_INCREMENT; } else { @@ -1035,24 +1047,15 @@ for ( pumpId = CONCENTRATEPUMPS_FIRST; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) { - switch ( pumpId ) + if ( D11_PUMP == pumpId ) { - case D11_PUMP: - pulseWidthCount = getFPGAD11PumpHallSensePulseWidth(); - break; + pulseWidthCount = getFPGAD11PumpHallSensePulseWidth(); + } + else + { + pulseWidthCount = getFPGAD10PumpHallSensePulseWidth(); + } - case D10_PUMP: - pulseWidthCount = getFPGAD10PumpHallSensePulseWidth(); - break; - -#ifndef _VECTORCAST_ - // Disabled in VectorCAST since it cannot be reached in VectorCAST because the switch case is in a for loop - default: - // Loop only allows for valid concentrate pump Ids. - break; -#endif - } - pulseWidthInMicroSeconds = pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; isPumpPulseWidthOut = ( pulseWidthInMicroSeconds <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); @@ -1121,37 +1124,30 @@ * required set bit, they are set again. * @details \b Inputs: concentratePumps * @details \b Outputs: none - * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. * @param pumpId pump id to check its control set bit * @return none *************************************************************************/ static void checkConcentratePumpControlSet( CONCENTRATE_PUMPS_T pumpId ) { U08 controlSetBits; - switch ( pumpId ) + if ( D11_PUMP == pumpId ) { - case D11_PUMP: - controlSetBits = getFPGAD11PumpControlStatus(); + controlSetBits = getFPGAD11PumpControlStatus(); - if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) - { - setFPGAD11PumpControl( concentratePumps[ pumpId ].controlSet ); - } - break; + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGAD11PumpControl( concentratePumps[ pumpId ].controlSet ); + } + } + else + { + controlSetBits = getFPGAD10PumpControlStatus(); - case D10_PUMP: - controlSetBits = getFPGAD10PumpControlStatus(); - - if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) - { - setFPGAD10PumpControl( concentratePumps[ pumpId ].controlSet ); - } - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); - break; + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGAD10PumpControl( concentratePumps[ pumpId ].controlSet ); + } } } @@ -1325,7 +1321,7 @@ { BOOL result = FALSE; - // Verify tester has logged in with TD + // Verify tester has logged in with DD if ( TRUE == isTestingActivated() ) { // Verify payload length is valid