Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r2332d35e7db7dd3b4b58e79433ebcf9fd28a1544 -r3cc784af591b14e5d292f92c796db70bcbd5a40b --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 2332d35e7db7dd3b4b58e79433ebcf9fd28a1544) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 3cc784af591b14e5d292f92c796db70bcbd5a40b) @@ -44,7 +44,6 @@ #ifdef __DIENER_CONC_PUMP__ #define CONCENTRATE_PUMP_VOLUME_PER_REV 0.4F ///< Volume output every revolution (mL). -#define CONCENTRATR_PUMP_SPEED_RATIO_FACTOR 4.0F ///< Diener pump Speed multiply factor. #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). @@ -130,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 }; @@ -156,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 ********** @@ -227,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 ); } @@ -261,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(); @@ -290,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 ) ) ) { @@ -434,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; } @@ -536,10 +541,14 @@ { setFPGAD11PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } + else + { + setFPGAD76PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); + } } /* @@ -826,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 ) @@ -839,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 @@ -870,10 +888,14 @@ { setFPGAD11PumpControl( controlSet ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpControl( controlSet ); } + else + { + setFPGAD76PumpControl( controlSet ); + } state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } @@ -1002,11 +1024,7 @@ if ( concentratePumps[ pumpId ].currentPumpSpeed > NEARLY_ZERO ) { -#ifdef __DIENER_CONC_PUMP__ - F32 timePerStep = CONCENTRATE_PUMP_VOLUME_PER_REV / ( concentratePumps[ pumpId ].currentPumpSpeed * CONCENTRATR_PUMP_SPEED_RATIO_FACTOR * CONCENTRATE_PUMP_STEP_PER_REV ); -#else F32 timePerStep = CONCENTRATE_PUMP_VOLUME_PER_REV / ( concentratePumps[ pumpId ].currentPumpSpeed * CONCENTRATE_PUMP_STEP_PER_REV ); -#endif F32 stepPeriodCounts = timePerStep / ( CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION * CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ); concentratePumps[ pumpId ].togglePeriodCount = (U16)( stepPeriodCounts + FLOAT_TO_INT_ROUNDUP_OFFSET ); @@ -1023,10 +1041,14 @@ { setFPGAD11PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } + else + { + setFPGAD76PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + } return hasTgtBeenReached; } @@ -1058,10 +1080,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; @@ -1074,11 +1100,7 @@ } else if ( FALSE == isPumpPulseWidthOut ) { -#ifdef __DIENER_CONC_PUMP__ - measuredPumpSpeed[ pumpId ].data = ( ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN ) / CONCENTRATR_PUMP_SPEED_RATIO_FACTOR; -#else measuredPumpSpeed[ pumpId ].data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; -#endif } // If pulse width is out of range capture pump out of range, pumpId and pulse width @@ -1151,7 +1173,7 @@ setFPGAD11PumpControl( concentratePumps[ pumpId ].controlSet ); } } - else + else if ( D10_PUMP == pumpId ) { controlSetBits = getFPGAD10PumpControlStatus(); @@ -1160,6 +1182,15 @@ setFPGAD10PumpControl( concentratePumps[ pumpId ].controlSet ); } } + else + { + controlSetBits = getFPGAD76PumpControlStatus(); + + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGAD76PumpControl( concentratePumps[ pumpId ].controlSet ); + } + } } /*********************************************************************//** @@ -1183,6 +1214,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 ); @@ -1203,6 +1237,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 ) );