Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u -r653a028c13aff34d2ad06cbfb0e7a34691767dd1 -r54abf84364e737dd350153d5fab7dd652f917ef4 --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 653a028c13aff34d2ad06cbfb0e7a34691767dd1) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 54abf84364e737dd350153d5fab7dd652f917ef4) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2022-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2022-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModeHeatDisinfectActiveCool.c * * @author (last) Dara Navaei -* @date (last) 31-May-2023 +* @date (last) 09-Sep-2024 * * @author (original) Dara Navaei * @date (original) 18-Dec-2022 @@ -44,9 +44,9 @@ // ********** private data ********** #define HEAT_DISINFECT_ACTIVE_COOL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode heat disinfect active cool data publish interval in counts. -#define ACID_PUMP_SPEED_ML_PER_MIN 30.6F ///< Acid concentrate pump speed in mL/min. +#define ACID_PUMP_SPEED_ML_PER_MIN -30.0F ///< Acid concentrate pump speed in mL/min. // The acid pump is 2% faster than the acid pump to create a flow from acid to bicarb line during heat disinfect -#define BICARB_PUMP_SPEED_ML_PER_MIN -30.0F ///< Bicarb concentrate pump speed in mL/min. +#define BICARB_PUMP_SPEED_ML_PER_MIN 30.6F ///< Bicarb concentrate pump speed in mL/min. #define RSRVR_FILL_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoir fill timeout in milliseconds. #define RSRVR_DRAIN_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoir drain timeout in milliseconds. #define RSRVR_DRAIN_STEADY_TIMEOUT_MS ( 6 * MS_PER_SECOND ) ///< Reservoir drain steady timeout in milliseconds. @@ -56,13 +56,12 @@ // RO filter cool down defines #define ROF_ACTIVE_COOL_TARGET_FLOW_LPM 0.3F ///< RO active cool down target flow in L/min. -#define ROF_ACTIVE_COOL_MAX_ALLOWED_PRESSURE_PSI 30 ///< RO active cool down maximum pressure in psi. #define ROF_ACTIVE_COOL_TARGET_RSRVR_FILL_ML 600.0F ///< RO active cool target reservoir fill in mL. #define ROF_ACTIVE_COOL_TARGET_TEMP_C 40.0F ///< RO active cool target temperature in C. #define ROF_ACTIVE_COOL_BELOW_TEMP_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< RO active cool temperature below target for cooling timeout in milliseconds. #define ROF_ACTIVE_COOL_INITIAL_TARGET_DRAIN_RPM 600 ///< RO active cool initial target drain RPM. #define ROF_ACTIVE_COOL_TARGET_DARIN_RPM 300 ///< RO active cool target drain RPM. -#define ROF_ACTIVE_COOL_MIX_DRAIN_VALVE_ON_TIMEOUT_MS ( 4 * MS_PER_SECOND ) ///< RO active cool mix drain VPd turn on timeout in milliseconds. +#define ROF_ACTIVE_COOL_MIX_DRAIN_VALVE_ON_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< RO active cool mix drain VPd turn on timeout in milliseconds. #define ROF_ACTIVE_COOL_RSRVR_MIX_DRAIN_TIMEOUT_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< RO active cool reservoir mix drain timeout in milliseconds. #define ROF_ACTIVE_COOL_MIX_DRAIN_STEADY_TIMEOUT_MS ( 15 * MS_PER_SECOND ) ///< RO active cool mix drain steady timeout in milliseconds. @@ -598,29 +597,28 @@ static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolCancelWaterPathState( void ) { DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T state = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE; - U32 drainSteadyTimeoutMS = RSRVR_DRAIN_STEADY_TIMEOUT_MS; - U32 drainTimeoutMS = RSRVR_DRAIN_TIMEOUT_MS; + F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); + BOOL isMixDrainNeeded = ( ( TDi >= RSRVR_MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) && ( TRo >= RSRVR_MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) ? TRUE : FALSE ); + U32 drainTimeoutMS = ( TRUE == isMixDrainNeeded ? RSRVR_MIX_DRAIN_TIMEOUT_MS : RSRVR_DRAIN_TIMEOUT_MS ); + U32 drainSteadyTimeoutMS = ( TRUE == isMixDrainNeeded ? ROF_ACTIVE_COOL_MIX_DRAIN_STEADY_TIMEOUT_MS : RSRVR_DRAIN_STEADY_TIMEOUT_MS ); if ( CANCELLATION_MODE_NONE == cancellationMode ) { U32 targetRPM = RSRVR_DRAIN_TARGET_RPM; - F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); - F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); cancellationMode = CANCELLATION_MODE_COLD; // The two sensors must be less than a threshold to decide if mix drain is needed to normal drain - if ( ( TDi >= RSRVR_MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) && ( TRo >= RSRVR_MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) ) + if ( TRUE == isMixDrainNeeded ) { // The fluid is hot so this is a mix drain. Set the VPd to direct the cold inlet fluid to drain setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NO ); turnOnUVReactor( INLET_UV_REACTOR ); - drainSteadyTimeoutMS = ROF_ACTIVE_COOL_MIX_DRAIN_STEADY_TIMEOUT_MS; - drainTimeoutMS = RSRVR_MIX_DRAIN_TIMEOUT_MS; - targetRPM = ROF_ACTIVE_COOL_INITIAL_TARGET_DRAIN_RPM; - cancellationMode = CANCELLATION_MODE_HOT; + targetRPM = ROF_ACTIVE_COOL_INITIAL_TARGET_DRAIN_RPM; + cancellationMode = CANCELLATION_MODE_HOT; } rsrvrsStatus.rsrvr[ DG_RESERVOIR_1 ].rStatus = DG_RESERVOIR_ABOVE_TARGET; @@ -629,6 +627,7 @@ // The drain is set to start from reservoir 2 since all the actuators have been de-energized // Set the drain valve to reservoir 2 setValveState( VRD2, VALVE_STATE_OPEN ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setDrainPumpTargetRPM( targetRPM ); // Start the timer for drain timeout @@ -717,13 +716,16 @@ *************************************************************************/ static void failHeatDisinfectActiveCool( void ) { + // If a fault alarm is active go to mode fault otherwise for cleaning mode alarms, transition to standby + DG_OP_MODE_T nextOpMode = ( FALSE == isDGFaultAlarmActive() ? DG_MODE_STAN : DG_MODE_FAUL ); + // In the cleaning modes the alarms are triggered but the mode is not transitioned to fault automatically // so transition to fault mode is done here if ( alarmDetectedPendingTrigger != ALARM_ID_NO_ALARM ) { SET_ALARM_WITH_1_U32_DATA( alarmDetectedPendingTrigger, heatDisinfectActiceCoolPrevState ) } - requestNewOperationMode( DG_MODE_STAN ); + requestNewOperationMode( nextOpMode ); } /*********************************************************************//** @@ -769,15 +771,19 @@ { if ( ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) || ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) ) { - // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path - // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function - heatDisinfectActiceCoolPrevState = heatDisinfectActiveCoolState; - heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_BASIC_PATH_STATE; - alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; - - if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + if ( ( heatDisinfectActiveCoolState != DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE ) && + ( heatDisinfectActiveCoolState != DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_BASIC_PATH_STATE ) ) { - alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path + // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function + heatDisinfectActiceCoolPrevState = heatDisinfectActiveCoolState; + heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE; + alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; + + if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + } } } } @@ -789,6 +795,7 @@ // If there is any fault alarm and we are not already in the cancel water path state, set it to cancel water path state heatDisinfectActiceCoolPrevState = heatDisinfectActiveCoolState; heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE; + setHeatDisinfectActiveCoolActuators( heatDisinfectActiveCoolState ); } } } @@ -887,7 +894,7 @@ requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); // RO pump - setROPumpTargetFlowRateLPM( ROF_ACTIVE_COOL_TARGET_FLOW_LPM, ROF_ACTIVE_COOL_MAX_ALLOWED_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( ROF_ACTIVE_COOL_TARGET_FLOW_LPM, CLEANING_MODE_HIGH_TEMP_MAX_RO_PRESSURE_PSI ); // Drain pump signalDrainPumpHardStop(); break; @@ -901,7 +908,7 @@ setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); - setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRD1, VALVE_STATE_CLOSED ); setValveState( VRD2, VALVE_STATE_CLOSED ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); @@ -915,7 +922,7 @@ requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); // RO pump - setROPumpTargetFlowRateLPM( ROF_ACTIVE_COOL_TARGET_FLOW_LPM, ROF_ACTIVE_COOL_MAX_ALLOWED_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( ROF_ACTIVE_COOL_TARGET_FLOW_LPM, CLEANING_MODE_HIGH_TEMP_MAX_RO_PRESSURE_PSI ); // Drain pump signalDrainPumpHardStop(); break; @@ -936,7 +943,7 @@ setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); // UV reactors turnOnUVReactor( INLET_UV_REACTOR ); - turnOnUVReactor( OUTLET_UV_REACTOR ); + turnOffUVReactor( OUTLET_UV_REACTOR ); // Concentrate pumps setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, ACID_PUMP_SPEED_ML_PER_MIN ); setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, BICARB_PUMP_SPEED_ML_PER_MIN ); @@ -964,7 +971,7 @@ setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); // UV reactors turnOnUVReactor( INLET_UV_REACTOR ); - turnOnUVReactor( OUTLET_UV_REACTOR ); + turnOffUVReactor( OUTLET_UV_REACTOR ); // Concentrate pumps setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, ACID_PUMP_SPEED_ML_PER_MIN ); setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, BICARB_PUMP_SPEED_ML_PER_MIN ); @@ -1032,8 +1039,13 @@ case DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE: case DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_BASIC_PATH_STATE: case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE: - // Do nothing the actuators in the above states are handled in a different part of code + // De-energize the actuators in the state upon transitioning to these states + deenergizeActuators( NO_PARK_CONC_PUMPS ); break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEAT_DISINFECT_ACTIVE_COOL_INVALID_EXEC_STATE, state ) + break; } } @@ -1092,6 +1104,7 @@ heatDisinfectActiceCoolPrevState = state; state = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE; + setHeatDisinfectActiveCoolActuators( state ); } return state;