Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f -r1644c24b0b51661ceaba579e5ebee0d1d5bad85f --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 1644c24b0b51661ceaba579e5ebee0d1d5bad85f) @@ -41,12 +41,16 @@ #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. #define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 10.0F ///< Concentrate pump low speed threshold in mL/min. #define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFF ///< Pulse width value when zero flow rate or pump is off. -#ifndef __PUMPTEST__ -#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). -#else + +#ifdef __DIENER_CONC_PUMP__ +#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.4F ///< Volume output every revolution (mL). +#elif __PUMPTEST__ #define PISTON_PUMP_STEPS_PER_ML 342.0F ///< Revolution count for 1ml volume delivery. #define CONCENTRATE_PUMP_VOLUME_PER_REV ( CONCENTRATE_PUMP_STEP_PER_REV / PISTON_PUMP_STEPS_PER_ML ) ///< Volume output every revolution (mL). +#else +#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). #endif + #define CONCENTRATE_PUMP_PULSE_PER_REV 2.0F ///< Number of pulses generate for every revolution. #define CONCENTRATE_PUMP_STEP_PER_REV 200.0F ///< Number of steps for every revolution. #define CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION 100.0F ///< Hall sense period resolution in microseconds. @@ -66,7 +70,7 @@ #define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. -#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. +#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 100 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. #define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. #define NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. @@ -125,17 +129,17 @@ /// Payload record structure for concentrate pump start/stop request typedef struct { - U32 pumpID; ///< Concentrate pump ID (0:Acid ,1:Bicarb) + U32 pumpID; ///< Concentrate pump ID (0:Acid ,1:Bicarb, 2:UF) U32 startStop; ///< Concentrate pump start:1,stop :0. - F32 speed; ///< Speed range from 0.1 ml/min to 48.0 ml/min. + F32 speed; ///< Speed in ml/min F32 volume; ///< Target volume in ml } CONC_PUMP_START_STOP_CMD_PAYLOAD_T; // ********** private data ********** static U32 concentratePumpMonitorTimerCounter; ///< Timer counter to perform monitor on concentrate pump. static BOOL acidConcentratePumpParkPersistenceClear; ///< Boolean acid park persistence clearing. -static BOOL bicarbConcentratePumpParkPersistenceClear; ///< Boolean for bicard park persistence clearing. +static BOOL bicarbConcentratePumpParkPersistenceClear; ///< Boolean for bicarb park persistence clearing. /// Concentrate pump data publish interval. static OVERRIDE_U32_T concentratePumpDataPublishInterval = { CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, 0, 0 }; @@ -151,6 +155,7 @@ //static DD_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. //static DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. +//static DD_UF_PUMP_RECORD_T ultrafilterationPumpCalRecord; ///< Ultrafilteration pump calibration record. //static DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. // ********** private function prototypes ********** @@ -222,6 +227,7 @@ initPersistentAlarm( ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + //TODO: UF pump park bits to be defined in HDD and then will handle UF pump alarm later initPersistentAlarm( ALARM_ID_DD_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ); initPersistentAlarm( ALARM_ID_DD_CONCENTRATE_PUMP_FAULT, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); } @@ -256,6 +262,7 @@ // Update rev count status pumpMesauredRevCnt[ D11_PUMP ].data = (U32)getFPGAD11PumpRevolutionCountStatus(); pumpMesauredRevCnt[ D10_PUMP ].data = (U32)getFPGAD10PumpRevolutionCountStatus(); + pumpMesauredRevCnt[ D76_PUMP ].data = (U32)getFPGAD76PumpRevolutionCountStatus(); //Monitor Pump Park status monitorPumpParkStatus(); @@ -285,6 +292,7 @@ parked[ D10_PUMP ].data = (U32)getFPGAD10PumpIsParked(); parkFaulted[ D11_PUMP ].data = (U32)getFPGAD11PumpParkFault(); parkFaulted[ D10_PUMP ].data = (U32)getFPGAD10PumpParkFault(); + // TODO : Handle UF Pump Park alarms once HDD updated with the details. if ( ( TRUE == getConcPumpIsParked( D11_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D11_PUMP ) ) ) { @@ -429,12 +437,14 @@ // pumps should be not ON and DD operation mode is not in fault mode if ( ( concentratePumps[D11_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && ( concentratePumps[D10_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && + ( concentratePumps[D76_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && //( DD_MODE_FILL != opMode ) && ( DD_MODE_FAUL != opMode ) ) { // Park concentrate pump requestConcentratePumpOff( D11_PUMP, PARK_CONC_PUMPS ); requestConcentratePumpOff( D10_PUMP, PARK_CONC_PUMPS ); + requestConcentratePumpOff( D76_PUMP, PARK_CONC_PUMPS ); result = TRUE; } @@ -531,10 +541,14 @@ { setFPGAD11PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } + else + { + setFPGAD76PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); + } } /* @@ -821,10 +835,14 @@ { setFPGAD11PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } + else + { + setFPGAD76PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + } #ifndef __PUMPTEST__ // Park concentrate pump too if requested if ( TRUE == parkPump ) @@ -834,11 +852,16 @@ setFPGAD11PumpParkCmd(); acidConcentratePumpParkPersistenceClear = TRUE; } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpParkCmd(); bicarbConcentratePumpParkPersistenceClear = TRUE; } + else + { + //TODO: Need to evaluate park support in the new pump. + setFPGAD76PumpParkCmd(); + } concentratePumps[ pumpId ].isConcPumpParkInProgress = TRUE; } #endif @@ -865,10 +888,14 @@ { setFPGAD11PumpControl( controlSet ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpControl( controlSet ); } + else + { + setFPGAD76PumpControl( controlSet ); + } state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } @@ -1016,10 +1043,14 @@ { setFPGAD11PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } + else + { + setFPGAD76PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + } return hasTgtBeenReached; } @@ -1051,10 +1082,14 @@ { pulseWidthCount = getFPGAD11PumpHallSensePulseWidth(); } - else + else if ( D10_PUMP == pumpId ) { pulseWidthCount = getFPGAD10PumpHallSensePulseWidth(); } + else + { + pulseWidthCount = getFPGAD76PumpHallSensePulseWidth(); + } pulseWidthInMicroSeconds = pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; @@ -1140,7 +1175,7 @@ setFPGAD11PumpControl( concentratePumps[ pumpId ].controlSet ); } } - else + else if ( D10_PUMP == pumpId ) { controlSetBits = getFPGAD10PumpControlStatus(); @@ -1149,6 +1184,15 @@ setFPGAD10PumpControl( concentratePumps[ pumpId ].controlSet ); } } + else + { + controlSetBits = getFPGAD76PumpControlStatus(); + + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGAD76PumpControl( concentratePumps[ pumpId ].controlSet ); + } + } } /*********************************************************************//** @@ -1172,6 +1216,9 @@ U08 d10_PumpDirection = concentratePumps[ D10_PUMP ].direction; F32 d10_PumpSetSpeed = concentratePumps[ D10_PUMP ].currentPumpSpeed; F32 d10_PumpTgtSpeed = getPumpTargetSpeed( D10_PUMP ); + U08 d76_PumpDirection = concentratePumps[ D76_PUMP ].direction; + F32 d76_PumpSetSpeed = concentratePumps[ D76_PUMP ].currentPumpSpeed; + F32 d76_PumpTgtSpeed = getPumpTargetSpeed( D76_PUMP ); // Use the above values to prepare the broadcast data data.d11_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d11_PumpDirection ? d11_PumpSetSpeed * -1.0F : d11_PumpSetSpeed ); @@ -1192,6 +1239,13 @@ data.d10_PumpParked = getConcPumpIsParked( D10_PUMP ); data.d11_PumpParkFault = getConcPumpParkIsFaulted( D11_PUMP ); data.d10_PumpParkFault = getConcPumpParkIsFaulted( D10_PUMP ); + data.d76_PumpTargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d76_PumpDirection ? d76_PumpTgtSpeed * -1.0F : d76_PumpTgtSpeed ); + data.d76_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d76_PumpDirection ? d76_PumpSetSpeed * -1.0F : d76_PumpSetSpeed ); + data.d76_PumpMeasuredSpeed = getMeasuredPumpSpeedMLPM( D76_PUMP ); + data.d76_PumpTargetRevCount = (U32)getConcPumpTargetRevolutionCount( D76_PUMP ); + data.d76_PumpMeasuredRevCount= (U32)getConcPumpCurrentMeasuredRevolutionCount( D76_PUMP ); + data.d76_PumpState = concentratePumps[ D76_PUMP ].execState; + data.d76_PumpPulseUS = concentratePumps[ D76_PUMP ].pulseWidthUS; concentratePumpMonitorTimerCounter = 0; broadcastData( MSG_ID_DD_CONCENTRATE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( CONCENTRATE_PUMP_DATA_T ) );