Index: dialin/common/msg_ids.py =================================================================== diff -u -r9f132769f48a414c43bc9862a00fce24e3f8cfa5 -r8ded14e44a1f69305149bfb2cd638252eaae8d1a --- dialin/common/msg_ids.py (.../msg_ids.py) (revision 9f132769f48a414c43bc9862a00fce24e3f8cfa5) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 8ded14e44a1f69305149bfb2cd638252eaae8d1a) @@ -140,6 +140,26 @@ MSG_ID_HD_ALARM_INFORMATION = 0X7D MSG_ID_DG_VOLTAGES_DATA = 0X86 MSG_ID_DG_CHEM_DISINFECT_DATA = 0X87 + MSG_ID_DG_SERIAL_NUMBER = 0x88 + MSG_ID_UI_REQUEST_SYSTEM_USAGE_INFO = 0x89 + MSG_ID_HD_SERVICE_SCHEDULE_DATA = 0x8A + MSG_ID_HD_USAGE_DATA = 0x8B + MSG_ID_DG_SERVICE_SCHEDULE_DATA = 0x8C + MSG_ID_DG_USAGE_DATA = 0x8D + MSG_ID_HD_POST_SINGLE_TEST_RESULT = 0x8E + MSG_ID_HD_POST_FINAL_TEST_RESULT = 0x8F + MSG_ID_DG_POST_SINGLE_TEST_RESULT = 0x90 + MSG_ID_DG_POST_FINAL_TEST_RESULT = 0x91 + MSG_ID_UI_POST_FINAL_TEST_RESULT = 0x92 + MSG_ID_HD_BUBBLES_DATA = 0x93 + MSG_ID_HD_TREATMENT_LOG_PERIODIC_DATA = 0x94 + MSG_ID_HD_TREATMENT_LOG_ALARM_EVENT = 0x95 + MSG_ID_HD_TREATMENT_LOG_EVENT = 0x96 + MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST = 0x97 + MSG_ID_HD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE = 0x98 + MSG_ID_HD_SERIAL_NUMBER = 0x99, + MSG_ID_DG_CHEM_DISINFECT_TO_UI_DATA_PUBLISH = 0x9A + MSG_ID_DG_HEAT_DISINFECT_TO_UI_DATA_PUBLISH = 0x9B MSG_ID_DIALYSATE_FLOW_DATA = 0X8 MSG_ID_TESTER_LOGIN_REQUEST = 0X8000 MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0X8001 Index: dialin/dg/chemical_disinfect.py =================================================================== diff -u -rcea384a65cd9f07a347924eb760c012f3520d874 -r8ded14e44a1f69305149bfb2cd638252eaae8d1a --- dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision cea384a65cd9f07a347924eb760c012f3520d874) +++ dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision 8ded14e44a1f69305149bfb2cd638252eaae8d1a) @@ -19,21 +19,22 @@ DG_CHEM_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 = 6 DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN_R2 = 7 DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN_R1 = 8 - DG_CHEM_DISINFECT_STATE_FILL_WITH_WATER_AND_DISINFECTANT = 9 - DG_CHEM_DISINFECT_STATE_REMOVE_ACID_BOTTLE_FROM_UI = 10 - DG_CHEM_DISINFECT_STATE_DISINFECT_R1_TO_R2 = 11 - DG_CHEM_DISINFECT_STATE_FILL_R2_WITH_DISINFECTANT = 12 - DG_CHEM_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 13 - DG_CHEM_DISINFECT_STATE_COOL_DOWN_HEATERS = 14 - DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R1 = 15 - DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R2 = 16 - DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2 = 17 - DG_CHEM_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1 = 18 - DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2_AND_DRAIN_R2 = 19 - DG_CHEM_DISINFECT_STATE_RINSE_CIRCULATION = 20 - DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH = 21 - DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH = 22 - DG_CHEM_DISINFECT_STATE_COMPLETE = 23 + DG_CHEM_DISINFECT_STATE_PRIME_ACID_LINE = 9 + DG_CHEM_DISINFECT_STATE_FILL_WITH_WATER_AND_DISINFECTANT = 10 + DG_CHEM_DISINFECT_STATE_REMOVE_ACID_BOTTLE_FROM_UI = 11 + DG_CHEM_DISINFECT_STATE_DISINFECT_R1_TO_R2 = 12 + DG_CHEM_DISINFECT_STATE_FILL_R2_WITH_DISINFECTANT = 13 + DG_CHEM_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 14 + DG_CHEM_DISINFECT_STATE_COOL_DOWN_HEATERS = 15 + DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R1 = 16 + DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R2 = 17 + DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2 = 18 + DG_CHEM_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1 = 19 + DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2_AND_DRAIN_R2 = 20 + DG_CHEM_DISINFECT_STATE_RINSE_CIRCULATION = 21 + DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH = 22 + DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH = 23 + DG_CHEM_DISINFECT_STATE_COMPLETE = 24 @unique @@ -68,13 +69,32 @@ self.r2_level = 0 self.target_post_rinse_count = 0 self.current_post_rinse_count = 0 + self.chemical_disinfect_ui_state = 0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DG_CHEM_DISINFECT_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_chemical_disinfect_sync) + channel_id = DenaliChannels.dg_to_ui_ch_id + msg_id = MsgIds.MSG_ID_DG_CHEM_DISINFECT_TO_UI_DATA_PUBLISH.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, + self._handler_chemical_disinfect_to_ui_sync) + + @_publish(["disinfect_elapsed_time"]) + def _handler_chemical_disinfect_to_ui_sync(self, message ): + """ + Handles published chemical disinfect message + + @param message: published chemical disinfect to UI data message + @returns none + """ + disinfect_elapsed_time = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + + self.disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) + @_publish(["chemical_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", "r1_level", "r2_level", "target_post_rinse_count", "current_post_rinse_count"]) def _handler_chemical_disinfect_sync(self, message): @@ -90,25 +110,25 @@ message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] state_elapsed_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - disinfect_elapsed_time = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] cancellation_mode = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] r1 = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] r2 = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] target_post_rinse_cnt = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] current_post_rinse_cnt = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] + chem_ui_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] self.chemical_disinfect_state = state self.overall_elapsed_time = int(elapsed_time / 1000) self.state_elapsed_time = int(state_elapsed_time / 1000) - self.disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) self.cancellation_mode = cancellation_mode self.r1_level = r1 self.r2_level = r2 self.target_post_rinse_count = target_post_rinse_cnt - self.current_post_rinse_count = current_post_rinse_cnt \ No newline at end of file + self.current_post_rinse_count = current_post_rinse_cnt + self.chemical_disinfect_ui_state = chem_ui_state \ No newline at end of file Index: dialin/dg/heat_disinfect.py =================================================================== diff -u -rcea384a65cd9f07a347924eb760c012f3520d874 -r8ded14e44a1f69305149bfb2cd638252eaae8d1a --- dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision cea384a65cd9f07a347924eb760c012f3520d874) +++ dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 8ded14e44a1f69305149bfb2cd638252eaae8d1a) @@ -71,6 +71,24 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_heat_disinfect_sync) + channel_id = DenaliChannels.dg_to_ui_ch_id + msg_id = MsgIds.MSG_ID_DG_HEAT_DISINFECT_TO_UI_DATA_PUBLISH.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, + self._handler_heat_disinfect_to_ui_sync) + + @_publish(["disinfect_elapsed_time"]) + def _handler_heat_disinfect_to_ui_sync(self, message): + """ + Handles published heat disinfect message + + @param message: published heat disinfect UI data message + @returns none + """ + disinfect_elapsed_time = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + + self.disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) + @_publish(["heat_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", "r1_level", "r2_level"]) def _handler_heat_disinfect_sync(self, message): @@ -86,21 +104,17 @@ message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] state_elapsed_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - disinfect_elapsed_time = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] cancellation_mode = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] r1 = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] r2 = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] self.heat_disinfect_state = state self.overall_elapsed_time = int(elapsed_time / 1000) self.state_elapsed_time = int(state_elapsed_time / 1000) - self.disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) self.cancellation_mode = cancellation_mode - self.r1_level = r1 self.r2_level = r2 Index: tests/dg_heat_and_chemical_disinfect_test.py =================================================================== diff -u -rcea384a65cd9f07a347924eb760c012f3520d874 -r8ded14e44a1f69305149bfb2cd638252eaae8d1a --- tests/dg_heat_and_chemical_disinfect_test.py (.../dg_heat_and_chemical_disinfect_test.py) (revision cea384a65cd9f07a347924eb760c012f3520d874) +++ tests/dg_heat_and_chemical_disinfect_test.py (.../dg_heat_and_chemical_disinfect_test.py) (revision 8ded14e44a1f69305149bfb2cd638252eaae8d1a) @@ -9,20 +9,20 @@ from dialin.dg.thermistors import ThermistorsNames from dialin.dg.temperature_sensors import TemperatureSensorsNames from dialin.dg.dialysate_generator import DGOperationModes +from dialin.ui.hd_simulator import HDSimulator from time import sleep def get_chemical_disinfect_mode_info(): info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time, {}, ' - 'Cancellation_mode, {}, R1_level, {:5.3f}, R1_drift, {:5.3f}, R2_level, {:5.3f}, R2_drift, {:5.3f}, ' - 'Current_rinse_count, {}, Total_rinse_count, {}, ' + 'Cancellation_mode, {}, R1_level, {:5.3f}, R2_level, {:5.3f}, Current_rinse_count, {}, ' + 'Total_rinse_count, {}, ' .format(ChemicalDisinfectStates(dg.chemical_disinfect.chemical_disinfect_state).name, dg.chemical_disinfect.overall_elapsed_time, dg.chemical_disinfect.state_elapsed_time, dg.chemical_disinfect.disinfect_elapsed_time, ChemCancellationModes(dg.chemical_disinfect.cancellation_mode).name, dg.chemical_disinfect.r1_level, - (dg.chemical_disinfect.r1_level - dg.load_cells.load_cell_A1), dg.chemical_disinfect.r2_level, - (dg.chemical_disinfect.r2_level - dg.load_cells.load_cell_B1), + dg.chemical_disinfect.r2_level, dg.chemical_disinfect.current_post_rinse_count, dg.chemical_disinfect.target_post_rinse_count)) return info @@ -158,6 +158,7 @@ f = open("/home/fw/projects/dialin/tests/run_dg.log", "w") """ + Set the broadcast to the fastest for studying a phenomenon dg.valves.cmd_valve_broadcast_interval_override(50) sleep(0.25) dg.pressures.cmd_pressure_broadcast_interval_override(50) @@ -191,7 +192,7 @@ dg.dg_operation_sub_mode == 2 and counter == 1: if timer == 1: - dg.hd_proxy.cmd_switch_reservoirs(reservoirID=1) + dg.hd_proxy.cmd_switch_reservoirs(reservoirID=0) timer += 1 @@ -312,8 +313,11 @@ #run_heat_disinfect() - run_chemical_disinfect() + #run_chemical_disinfect() #run_dg() + ui = HDSimulator(log_level='DEBUG') + sleep(1) + ui.cmd_set_hd_operation_mode_data(2)