Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -43,9 +43,9 @@ #define HEAT_DISINFECT_TIME_INTERVAL_DAYS 2U ///< Heat disinfect time interval in days //TODO change the interval to actual value (was it every 21 days?) #define HEAT_DISINFECT_TIME_INTERVAL_SECONDS ( HEAT_DISINFECT_TIME_INTERVAL_DAYS * SECONDS_IN_A_DAY ) ///< Heat disinfect time interval in seconds -#define HEAT_DISINFECT_TARGET_TEMPERATURE 30U ///< Heat disinfection target temperature //TODO change the target temperature back to 85C +#define HEAT_DISINFECT_TARGET_TEMPERATURE 85 ///< Heat disinfection target temperature #define MAX_TPO_AND_TDI_SENSORS_DIFFERENCE 1U ///< Maximum allowed temperature difference in between TDi and TPo //TODO remove -#define MAX_TEMPERATURE_DEVIATION_FROM_TARGET 4U ///< Maximum allowed temperature deviation from target temperature +#define MAX_TEMPERATURE_DEVIATION_FROM_TARGET 1.5 ///< Maximum allowed temperature deviation from target temperature #define HEAT_DISINFECT_RECIRC_PATH_TIME_MINS 1U ///< Recirculation path heat disinfection duration in minutes #define HEAT_DISINFECT_R1_TO_R2_TIME_MINS 1U ///< Reservoir 1 to reservoir 2 heat disinfection duration in minutes @@ -61,13 +61,17 @@ #define HEAT_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / (2*TASK_GENERAL_INTERVAL) ) ///< Heat disinfection data publication time interval -#define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0U ///< Drain pump target delta pressure +#define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0.0 ///< Drain pump target delta pressure #define DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM 2800U ///< Drain pump target RPM during evacuating the fluid path #define DRAIN_PUMP_DISINFECT_DRAIN_PATH_TARGET_RPM 1500U ///< Drain pump target RPM during heat disinfection -#define RO_PUMP_TARGET_FLOW_RATE_LPM 0.9 ///< RO pump target flow rate +#define RO_PUMP_TARGET_FILL_FLOW_RATE_LPM 0.9 ///< RO pump target fill flow rate +#define RO_PUMP_TARGET_FILL_MAX_PRESSURE 140 ///< RO pump max allowed pressure during fillin the reservoirs +#define RO_PUMP_TARGET_HEAT_UP_FLOW_RATE_LPM 0.5 ///< RO pump target flow rate during heating up the fluid +#define RO_PUMP_TARGET_HEAT_UP_MAX_PRESSURE 30 ///< RO pump max allowed pressure during heating up water -#define FULL_RESERVOIRS_WEIGHT_GRAMS 2000U ///< The weight of a full reservoir //TODO Change this value to full value -#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 300U ///< The weight of an empty reservoir //TODO Change this value to full value +#define RESERVOIR1_TARGET_WEIGHT_GRAMS 2000U ///< Target weight of reservoir 1 +#define RESERVOIR2_TARGET_WEIGHT_GRAMS 500U ///< Target weight of reservoir 2 +#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 300U ///< The weight of an empty reservoir //TODO Change this value to full value // ********** private data ********** @@ -128,7 +132,7 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterDeprimeReservoirs( void ); -static void stopActuators( void ); +static void resetActuators( void ); static void setActuatorsToFillWater( void ); static BOOL isTemperatureInRange( void ); @@ -152,6 +156,12 @@ *************************************************************************/ void initHeatDisinfectMode( void ) { + // UV reactors will not be used in the heat disinfection since their operating temperature + // range is below 85C. They will be turned off once in the beginning to make sure they are + // not on. + turnOffUVReactor( INLET_UV_REACTOR ); + turnOffUVReactor( OUTLET_UV_REACTOR ); + heatDisinfectStartTime = 0; drainPumpTargetRPM = 0; heatDisinfectCurrentCycle = 1; @@ -170,7 +180,7 @@ void transitionToHeatDisinfectMode( void ) { initHeatDisinfectMode(); - stopActuators(); + resetActuators(); } /*********************************************************************//** @@ -260,7 +270,7 @@ *************************************************************************/ void stopDGHeatDisinfect( void ) { - stopActuators(); + resetActuators(); heatDisinfectState = DG_HEAT_DISINFECT_STATE_COMPLETE; heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; @@ -283,8 +293,8 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER; - stopActuators(); - drainPumpTargetRPM = DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM; + resetActuators(); + drainPumpTargetRPM = DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM; //TODO do we need this? heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; heatDisinfectStartTime = getMSTimerCount(); @@ -305,30 +315,30 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER; - execHeatDisinfectInternalStates(); //TODO test to see if it is needed to be in an if statement + execHeatDisinfectInternalStates(); + //heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; //TODO remove this for testing only if ( heatDisinfectInternalState == INTERNAL_HEAT_DISINFECT_STATE_COMPLETE ) { - // Done with evacuation and fill, set the states to heat up water - // Drain pump is stopped to exit the open loop mode - signalDrainPumpHardStop(); + // Stop the RO pump that was running during the fill process + signalROPumpHardStop(); - setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VPI, VALVE_STATE_CLOSED ); setValveState( VBF, VALVE_STATE_OPEN ); setValveState( VSP, VALVE_STATE_CLOSED ); - setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VDR, VALVE_STATE_RECIRC_C_TO_NC ); setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); - setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); - setValveState( VRD, VALVE_STATE_R2_C_TO_NC ); - setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); //DRAIN_PUMP_TARGET_DELTA_PRESSURE + setROPumpTargetFlowRate( RO_PUMP_TARGET_HEAT_UP_FLOW_RATE_LPM, RO_PUMP_TARGET_HEAT_UP_MAX_PRESSURE ); + setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); - setPrimaryHeaterTargetTemperature( HEAT_DISINFECT_TARGET_TEMPERATURE ); + setPrimaryHeaterTargetTemperature( 40.0 ); //HEAT_DISINFECT_TARGET_TEMPERATURE startPrimaryHeater(); state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; @@ -349,14 +359,13 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; - F32 TPi = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 test = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANCY ); //TODO remove later - if ( fabs(TPi - HEAT_DISINFECT_TARGET_TEMPERATURE) <= MAX_TEMPERATURE_DEVIATION_FROM_TARGET && - fabs(TDi - HEAT_DISINFECT_TARGET_TEMPERATURE) <= MAX_TEMPERATURE_DEVIATION_FROM_TARGET ) + if ( fabs( test - HEAT_DISINFECT_TARGET_TEMPERATURE ) <= MAX_TEMPERATURE_DEVIATION_FROM_TARGET ) { // Set the states to disinfect recirculation path - setValveState( VPI, VALVE_STATE_OPEN ); + /*setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VBF, VALVE_STATE_OPEN ); setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); @@ -366,7 +375,7 @@ setValveState( VRO, VALVE_STATE_R2_C_TO_NO ); setValveState( VRD, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO );*/ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; } @@ -490,7 +499,7 @@ setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_HEAT_UP_FLOW_RATE_LPM, RO_PUMP_TARGET_HEAT_UP_MAX_PRESSURE ); if ( ++heatDisinfectCurrentCycle > getNoOfCyclesToRun() ) { @@ -637,13 +646,14 @@ setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); // C to NC - setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); // C to NC + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setROPumpTargetFlowRate( 0.65 ); //RO_PUMP_TARGET_FLOW_RATE_LPM + //setROPumpTargetPWM( 0.85 ); //TODO remove this. It + setROPumpTargetFlowRate( RO_PUMP_TARGET_FILL_FLOW_RATE_LPM, RO_PUMP_TARGET_FILL_MAX_PRESSURE ); stateTimer = getMSTimerCount(); // For evac recirc path. TODO later, it should be controlled using // the composite pump @@ -652,10 +662,6 @@ else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) { setActuatorsToFillWater(); - // Start the UV reactors to disinfect the water that - // is being filled up - //startInletUVReactor(); - //startOutletUVReactor(); state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; } @@ -701,12 +707,11 @@ F32 reservoir1Weight = getLoadCellFilteredWeight( LOAD_CELL_A1 ); F32 reservoir2Weight = getLoadCellFilteredWeight( LOAD_CELL_B1 ); - if ( reservoir1Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS && - reservoir2Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS ) + if ( reservoir1Weight >= RESERVOIR1_TARGET_WEIGHT_GRAMS && reservoir2Weight >= RESERVOIR2_TARGET_WEIGHT_GRAMS ) { if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER ) { - stopActuators(); + resetActuators(); state = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; } else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) @@ -722,7 +727,7 @@ setValveState( VRD, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FILL_FLOW_RATE_LPM, RO_PUMP_TARGET_FILL_MAX_PRESSURE ); stateTimer = getMSTimerCount(); state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; @@ -746,7 +751,7 @@ INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; // TODO change this to composition pump mode - /*if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) + if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) { // Set the state to evacuate reservoir 1 signalROPumpHardStop(); @@ -764,7 +769,7 @@ setDrainPumpTargetSpeed( drainPumpTargetRPM ); //TODO commented for testing state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_R1; - }*/ + } return state; } @@ -798,7 +803,6 @@ setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setDrainPumpTargetSpeed( drainPumpTargetRPM ); //probably it is not needed TODO test this state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_R2; } @@ -847,11 +851,11 @@ * Outputs: none * @return none *************************************************************************/ -static void stopActuators( void ) +static void resetActuators( void ) { // De-energize all the valves setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VBF, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); @@ -865,8 +869,6 @@ //TODO composition pumps signalROPumpHardStop(); signalDrainPumpHardStop(); - //stopInletUVReactor(); - //stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater(); } @@ -906,8 +908,10 @@ *************************************************************************/ static void setActuatorsToFillWater( void ) { + signalDrainPumpHardStop(); + setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VBF, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); @@ -917,8 +921,7 @@ setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - signalDrainPumpHardStop(); //TODO is this needed here? + setROPumpTargetFlowRate( RO_PUMP_TARGET_FILL_FLOW_RATE_LPM, RO_PUMP_TARGET_FILL_MAX_PRESSURE ); } /*********************************************************************//**