Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -rfffbd99bcd6d15ce790e490e3b455fda43e34b8d -r0035249fd22540886ba093c4e7dc72f9ba8c8353 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision fffbd99bcd6d15ce790e490e3b455fda43e34b8d) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 0035249fd22540886ba093c4e7dc72f9ba8c8353) @@ -26,7 +26,7 @@ from .heaters import Heaters from .temperature_sensors import TemperatureSensors from .conductivity_sensors import ConductivitySensors -from .heat_disinfection import HeatDisinfection +from .heat_disinfection import HeatDisinfect from .thermistors import Thermistors from .fans import Fans from .uv_reactors import UVReactors @@ -144,7 +144,7 @@ self.conductivity_sensors = ConductivitySensors(self.can_interface, self.logger) self.concentrate_pumps = ConcentratePumps(self.can_interface, self.logger) self.alarms = DGAlarms(self.can_interface, self.logger) - self.heat_disinfect = HeatDisinfection(self.can_interface, self.logger) + self.heat_disinfect = HeatDisinfect(self.can_interface, self.logger) self.thermistors = Thermistors(self.can_interface, self.logger) self.fans = Fans(self.can_interface, self.logger) self.uv_reactors = UVReactors(self.can_interface, self.logger) Index: dialin/dg/heat_disinfection.py =================================================================== diff -u -re851e75aa1d8f801324442b0cb034ba3e82325c9 -r0035249fd22540886ba093c4e7dc72f9ba8c8353 --- dialin/dg/heat_disinfection.py (.../heat_disinfection.py) (revision e851e75aa1d8f801324442b0cb034ba3e82325c9) +++ dialin/dg/heat_disinfection.py (.../heat_disinfection.py) (revision 0035249fd22540886ba093c4e7dc72f9ba8c8353) @@ -2,86 +2,77 @@ import struct from ..utils.conversions import integer_to_bytearray from ..utils.conversions import float_to_bytearray #TODO remove -from .constants import NO_RESET from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from logging import Logger from enum import unique @unique -class HeatDisinfectionStates(DialinEnum): +class HeatDisinfectStates(DialinEnum): DG_HEAT_DISINFECT_STATE_START = 0 - DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER = 1 - DG_HEAT_DISINFECT_STATE_HEAT_WATER = 2 - DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH = 3 - DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2 = 4 - DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1 = 5 - DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH = 6 - DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIR = 7 - DG_HEAT_DISINFECT_STATE_COMPLETE = 8 + DG_HEAT_DISINFECT_STATE_DRAIN_R1 = 1 + DG_HEAT_DISINFECT_STATE_DRAIN_R2 = 2 + DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN = 3 + DG_HEAT_DISINFECT_STATE_FLUSH_CIRCULATION = 4 + DG_HEAT_DISINFECT_STATE_FLUSH_R1_AND_R2 = 5 + DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 = 6 + DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R2 = 7 + DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1 = 8 + DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER = 9 + DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2 = 10 + DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER = 11 + DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 12 + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1= 13 + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2 = 14 + DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2 = 15 + DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1 = 16 + DG_HEAT_DISINFECT_STATE_RINSE_CIRCULATION = 17 + DG_HEAT_DISINFECT_STATE_COMPLETE = 18 -@unique -class HeatDisinfectionInternalStates(DialinEnum): - - INTERNAL_HEAT_DISINFECT_STATE_OFF = 0 - INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER = 1 - INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH = 2 - INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1 = 3 - INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_2 =4 - INTERNAL_HEAT_DISINFECT_STATE_COMPLETE = 5 - - -class HeatDisinfection(_AbstractSubSystem): +class HeatDisinfect(_AbstractSubSystem): """ - \class HeatDisinfection + \class HeatDisinfect \brief Heat disinfection class with APIs to set the timing of each of the stages. """ - START_POS_INTERNAL_STATE = DenaliMessage.PAYLOAD_START_INDEX - END_POS_INTERNAL_STATE = START_POS_INTERNAL_STATE + 4 - START_POS_ELAPSED_TIME = END_POS_INTERNAL_STATE - END_POS_ELAPSED_TIME = START_POS_ELAPSED_TIME + 4 - START_POS_CURRENT_CYCLE = END_POS_ELAPSED_TIME - END_POS_CURRENT_CYCLE = START_POS_CURRENT_CYCLE + 4 - def __init__(self, can_interface, logger: Logger): super().__init__() self.can_interface = can_interface self.logger = logger - self.internal_state = 0 + self.current_state = 0 self.elapsed_time = 0 - self.current_cycle_count = 0 + self.current_cycle_count = 0 #TODO remove if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DG_HEAT_DISINFECT_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_heat_disinfect_sync) - @_publish(["internal_state", "elapsed_time", "current_cycle_count"]) + @_publish(["current_state", "elapsed_time", "current_cycle_count"]) def _handler_heat_disinfect_sync(self, message): """ Handles published heat disinfection message @param message: published heat disinfection data message @returns none """ - internal_state = struct.unpack('i', bytearray( - message['message'][self.START_POS_INTERNAL_STATE:self.END_POS_INTERNAL_STATE]))[0] + state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] elapsed_time = struct.unpack('f', bytearray( - message['message'][self.START_POS_ELAPSED_TIME:self.END_POS_ELAPSED_TIME]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] current_cycle = struct.unpack('i', bytearray( - message['message'][self.START_POS_CURRENT_CYCLE:self.END_POS_CURRENT_CYCLE]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.internal_state = internal_state - self.elapsed_time = elapsed_time + self.current_state = HeatDisinfectStates(state).name if HeatDisinfectStates.has_value(state) else 'Unknown' + self.elapsed_time = elapsed_time self.current_cycle_count = current_cycle def cmd_start_stop_heat_disinfection(self, start=True): Index: dialin/hd/valves.py =================================================================== diff -u -r287af45040e35882e001fb3ea835f304007870c4 -r0035249fd22540886ba093c4e7dc72f9ba8c8353 --- dialin/hd/valves.py (.../valves.py) (revision 287af45040e35882e001fb3ea835f304007870c4) +++ dialin/hd/valves.py (.../valves.py) (revision 0035249fd22540886ba093c4e7dc72f9ba8c8353) @@ -298,6 +298,8 @@ air_trap = struct.unpack('i', bytearray( message['message'][self.START_AIR_TRAP_VALVE_STATUS:self.END_AIR_TRAP_VALVE_STATUS]))[0] + print(vlv_ID) + # To make sure values of the enums are not out of range if ValvesEnum.has_value(vlv_ID) and ValvesPositions.has_value(pos_ID) and ValvesStates.has_value(pos_ID): vlv_name = ValvesEnum(vlv_ID).name Index: tests/dg_heat_disinfect_test.py =================================================================== diff -u -r94128c59d96218d3e1b3441f9e8cf9b6d77a4754 -r0035249fd22540886ba093c4e7dc72f9ba8c8353 --- tests/dg_heat_disinfect_test.py (.../dg_heat_disinfect_test.py) (revision 94128c59d96218d3e1b3441f9e8cf9b6d77a4754) +++ tests/dg_heat_disinfect_test.py (.../dg_heat_disinfect_test.py) (revision 0035249fd22540886ba093c4e7dc72f9ba8c8353) @@ -3,8 +3,8 @@ import sys sys.path.append("..") from dialin.dg.dialysate_generator import DG -from dialin.dg.heat_disinfection import HeatDisinfectionStates -from dialin.dg.heat_disinfection import HeatDisinfectionInternalStates +from dialin.dg.hd_proxy import DGHDProxy +from dialin.dg.heat_disinfection import HeatDisinfectStates from dialin.dg.drain_pump import DrainPumpStates from dialin.dg.thermistors import Thermistors from dialin.dg.uv_reactors import ReactorsStates @@ -21,7 +21,22 @@ #sleep(1) #dg.thermistors.cmd_thermistors_value_override(52.2, ThermistorsNames.THERMISTOR_ONBOARD_NTC.value, reset=1) #sleep(2) + try: + #dg.hd_proxy.cmd_start_stop_dg(start=False) + #sleep(4) + dg.hd_proxy.cmd_start_stop_dg() + while True: + sleep(0.5) + print("Duty, {}, Pressure, {}, Flow, {}, state, {}".format(dg.ro_pump.pwm_duty_cycle_pct, + dg.pressures.ro_pump_outlet_pressure, + dg.ro_pump.measured_flow_rate_lpm, + dg.ro_pump.ro_pump_state)) + except KeyboardInterrupt: + print('here') + dg.hd_proxy.cmd_start_stop_dg(start=False) + + """" while True: sleep(0.5) @@ -48,6 +63,7 @@ dg.temperature_sensors.temperature_sensors[TemperatureSensorsNames.INTERNAL_TDI_RTD.name], dg.temperature_sensors.temperature_sensors[TemperatureSensorsNames.INTERNAL_COND_TEMP_SENSOR.name], dg.fans.inlet_1_rpm, dg.fans.inlet_2_rpm)) + f = open("Heat_disinfection.txt", "w") @@ -57,20 +73,20 @@ #sleep(1) #dg.valves.cmd_valve_override(0, dg.valves.VALVE_RESERVOIR_OUTLET) #dg.valves.cmd_valve_override(1, dg.valves.VALVE_RESERVOIR_INLET) - dg.heat_disinfect.cmd_start_stop_heat_disinfection(start=False) - sleep(1) - time = 1 + #dg.heat_disinfect.cmd_start_stop_heat_disinfection(start=False) + #sleep(1) + #time = 1 dg.heat_disinfect.cmd_start_stop_heat_disinfection() try: while True: - """ + var = ('Mode, {}, State, {}, Sub, {}, RO, {}, Drain, {}, VPi, {}, VBf, {}, VSP, {}, VPd, {}, VPo, {}, VDr, {}, ' 'VRc, {}, VRo, {}, VRd, {}, VRi, {}, VRf, {}\r' .format(dg.dg_operation_mode, - HeatDisinfectionStates(dg.dg_operation_sub_mode).name, - HeatDisinfectionInternalStates(dg.heat_disinfect.internal_state).name, + HeatDisinfectStates(dg.dg_operation_sub_mode).name, + HeatDisinfectionInternalStates(dg.heat_disinfect.current_state).name, dg.ro_pump.ro_pump_state, DrainPumpStates(dg.drain_pump.drain_pump_state).name, dg.valves.valve_states_enum[dg.valves.VALVE_PRESSURE_INLET], @@ -84,13 +100,12 @@ dg.valves.valve_states_enum[dg.valves.VALVE_RESERVOIR_DRAIN], dg.valves.valve_states_enum[dg.valves.VALVE_RESERVOIR_INLET], dg.valves.valve_states_enum[dg.valves.VALVE_RESERVOIR_FILL])) - """ - var = ('Mode, {}, State, {}, Sub, {}, RO, {}, Flow, {:5.3f}, TgtPres, {:5.3f}, InletPres, {:5.3f}, ' + + var = ('Mode, {}, State, {}, RO, {}, Flow, {:5.3f}, TgtPres, {:5.3f}, InletPres, {:5.3f}, ' 'OutletPres, {:5.3f}, PWM, {:5.3f}, Drain, {}, DInletPres, {:5.3f}, DOutletPres, {:5.3f}, ' 'DrainDAC, {:5.3f}, R1, {:5.3f}, R2, {:5.3f}, TPi, {:5.3f}, TPo, {:5.3f}, TDi, {:5.3f} \r' .format(dg.dg_operation_mode, HeatDisinfectionStates(dg.dg_operation_sub_mode).name, - HeatDisinfectionInternalStates(dg.heat_disinfect.internal_state).name, dg.ro_pump.ro_pump_state, dg.ro_pump.measured_flow_rate_lpm, dg.ro_pump.target_pressure_psi, @@ -108,7 +123,10 @@ print(var) f.write(var) sleep(0.25) - + + except KeyboardInterrupt: + dg.hd_proxy.cmd_start_stop_dg(start=False) dg.heat_disinfect.cmd_start_stop_heat_disinfection(start=False) f.close() + """"" \ No newline at end of file Index: tests/test_hd_valves.py =================================================================== diff -u -r287af45040e35882e001fb3ea835f304007870c4 -r0035249fd22540886ba093c4e7dc72f9ba8c8353 --- tests/test_hd_valves.py (.../test_hd_valves.py) (revision 287af45040e35882e001fb3ea835f304007870c4) +++ tests/test_hd_valves.py (.../test_hd_valves.py) (revision 0035249fd22540886ba093c4e7dc72f9ba8c8353) @@ -24,8 +24,13 @@ # create an HD object called hd hd = HD() hd.cmd_log_in_to_hd() - hd.valves.cmd_hd_valves_broadcast_interval_override(50) + hd.valves.cmd_hd_valves_broadcast_interval_override(100) + sleep(1) + hd.valves.cmd_home_hd_valve(ValvesEnum.VBV.value) + print(hd.valves.valves_status[ValvesEnum.VDI.name]) + + """" # print params every second for a while while True: sleep(0.100) @@ -55,3 +60,4 @@ hd.valves.valves_status[ValvesEnum.VBV.name]['Current']) exit(1) + """ \ No newline at end of file