Index: dialin/common/msg_ids.py =================================================================== diff -u -r0e68ec6bb733a8ab7b21a82f8b571f1678f9d2cd -r5dc79b5e29a9cd78d5991525472859238f1df8ae --- dialin/common/msg_ids.py (.../msg_ids.py) (revision 0e68ec6bb733a8ab7b21a82f8b571f1678f9d2cd) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 5dc79b5e29a9cd78d5991525472859238f1df8ae) @@ -457,6 +457,7 @@ MSG_ID_DG_CONC_PUMP_PARK_FAULT_STATUS_OVERRIDE = 0xA05F MSG_ID_DG_CONC_PUMP_PARK_COMMAND = 0xA060 MSG_ID_DG_HEATERS_DUTY_CYCLE_OVERRIDE = 0xA061 + MSG_ID_DG_NELSON_DISINFECT_SUPPORT = 0xA062 MSG_ID_HD_DEBUG_EVENT = 0xFFF1 MSG_ID_DG_DEBUG_EVENT = 0xFFF2 Index: dialin/dg/chemical_disinfect.py =================================================================== diff -u -rae43c05f20c84d0d1ff8954d9e2b78df43ec5352 -r5dc79b5e29a9cd78d5991525472859238f1df8ae --- dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision ae43c05f20c84d0d1ff8954d9e2b78df43ec5352) +++ dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision 5dc79b5e29a9cd78d5991525472859238f1df8ae) @@ -50,6 +50,7 @@ self.r1_level = 0 self.r2_level = 0 self.chemical_disinfect_ui_state = 0 + self.chem_nelson_support = 0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id @@ -78,6 +79,7 @@ self.r1_level = 0 self.r2_level = 0 self.chemical_disinfect_ui_state = 0 + self.chem_nelson_support = 0 @publish(["chemical_disinfect_elapsed_time", "chemical_disinfect_target_time"]) def _handler_chemical_disinfect_to_ui_sync(self, message): @@ -96,7 +98,7 @@ self.chemical_disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) @publish(["chemical_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", - "r1_level", "r2_level", "chemical_disinfect_ui_state"]) + "r1_level", "r2_level", "chemical_disinfect_ui_state", "chem_nelson_support"]) def _handler_chemical_disinfect_sync(self, message): """ Handles published chemical disinfect message @@ -118,6 +120,8 @@ message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] chem_ui_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + nelson = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] self.chemical_disinfect_state = state self.overall_elapsed_time = int(elapsed_time / 1000) @@ -126,3 +130,4 @@ self.r1_level = r1 self.r2_level = r2 self.chemical_disinfect_ui_state = chem_ui_state + self.chem_nelson_support = nelson Index: dialin/dg/heat_disinfect.py =================================================================== diff -u -rd8c3144d4fc5612981aa1bcee798a7c4756295bd -r5dc79b5e29a9cd78d5991525472859238f1df8ae --- dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision d8c3144d4fc5612981aa1bcee798a7c4756295bd) +++ dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 5dc79b5e29a9cd78d5991525472859238f1df8ae) @@ -18,8 +18,9 @@ from logging import Logger from ..common.msg_defs import MsgIds, MsgFieldPositions -from ..protocols.CAN import DenaliChannels +from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import AbstractSubSystem, publish, DialinEnum +from ..utils.conversions import integer_to_bytearray @unique @@ -56,6 +57,17 @@ CANCELLATION_MODE_COLD = 3 +@unique +class NelsonSupportModes(DialinEnum): + NELSON_NONE = 0 + NELSON_INOCULATE = 1 + NELSON_HEAT_DISINFECT = 2 + NELSON_POS_CONTROL_CHEM_DISINFECT = 3 + NELSON_CHEM_DISINFECT = 4 + NELSON_DRAIN_SAMPLE = 5 + NUM_OF_NELSON_SUPPORT = 6 + + class HeatDisinfect(AbstractSubSystem): """ Heat Disinfection class with APIs to set the timing of each of the stages. @@ -79,6 +91,7 @@ self.cancellation_mode = 0 self.r1_level = 0 self.r2_level = 0 + self.heat_nelson_support = 0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id @@ -107,6 +120,7 @@ self.r1_level = 0 self.r2_level = 0 self.heat_disinfect_ui_state = 0 + self.heat_nelson_support = 0 @publish(["heat_disinfect_target_time", "heat_disinfect_count_down_time"]) def _handler_heat_disinfect_to_ui_sync(self, message): @@ -134,7 +148,7 @@ self.disinfect_r_82_time_s = r_82 @publish(["heat_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", "r1_level", - "r2_level", "heat_disinfect_ui_state"]) + "r2_level", "heat_disinfect_ui_state", "heat_nelson_support"]) def _handler_heat_disinfect_sync(self, message): """ Handles published heat disinfect message @@ -156,6 +170,8 @@ message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] ui = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + nelson = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] self.heat_disinfect_state = state self.overall_elapsed_time = int(elapsed_time / 1000) @@ -164,3 +180,28 @@ self.r1_level = r1 self.r2_level = r2 self.heat_disinfect_ui_state = ui + self.heat_nelson_support = nelson + + def cmd_set_nelson_support_mode(self, support: int): + """ + Constructs and sends a command to set the firmware to a certain Nelson support + Constraints: + Must be logged into DG. This code only works on a firmware that has been built in debug mode. + + @param support: (int) the type of Nelson support + NELSON_NONE = 0 + NELSON_INOCULATE = 1 + NELSON_HEAT_DISINFECT = 2 + NELSON_POS_CONTROL_CHEM_DISINFECT = 3 + NELSON_CHEM_DISINFECT = 4 + NELSON_DRAIN_SAMPLE = 5 + @returns none + """ + payload = integer_to_bytearray(support) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_NELSON_DISINFECT_SUPPORT.value, + payload=payload) + + self.logger.debug("Setting Nelson support to " + NelsonSupportModes(support).name) + self.can_interface.send(message, 0) + Index: dialin/dg/heaters.py =================================================================== diff -u -r0e68ec6bb733a8ab7b21a82f8b571f1678f9d2cd -r5dc79b5e29a9cd78d5991525472859238f1df8ae --- dialin/dg/heaters.py (.../heaters.py) (revision 0e68ec6bb733a8ab7b21a82f8b571f1678f9d2cd) +++ dialin/dg/heaters.py (.../heaters.py) (revision 5dc79b5e29a9cd78d5991525472859238f1df8ae) @@ -253,7 +253,7 @@ Must be logged into DG There must be a minimum flow available for the heaters (FMP for primary and FMD for trimmer) - @param heater the heater to override its value (primary, trimmer) + @param heater the heater to override its value (primary, trimmer) (0-1.0 order) @param duty_cycle the duty cycle value to override in percent @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise Index: tests/dg_tests.py =================================================================== diff -u -rd8c3144d4fc5612981aa1bcee798a7c4756295bd -r5dc79b5e29a9cd78d5991525472859238f1df8ae --- tests/dg_tests.py (.../dg_tests.py) (revision d8c3144d4fc5612981aa1bcee798a7c4756295bd) +++ tests/dg_tests.py (.../dg_tests.py) (revision 5dc79b5e29a9cd78d5991525472859238f1df8ae) @@ -19,7 +19,7 @@ from dialin.hd.hemodialysis_device import HD from dialin.ui.hd_simulator import HDSimulator from dialin.common.dg_defs import DGHeatDisinfectStates, DGHeatDisinfectUIStates -from dialin.dg.heat_disinfect import HeatCancellationModes +from dialin.dg.heat_disinfect import HeatCancellationModes, NelsonSupportModes from dialin.common.dg_defs import DGChemicalDisinfectStates, DGChemDisinfectUIStates from dialin.common.dg_defs import DGChemDisinfectFlushStates, DGChemDisinfectFlushUIStates from dialin.dg.chemical_disinfect import ChemCancellationModes @@ -59,25 +59,28 @@ state = 0 state_elapsed_time = 0 overall_elapsed_time = 0 + nelson_support = 0 if dg.dg_operation_mode == 10: state = DGChemicalDisinfectStates(dg.chemical_disinfect.chemical_disinfect_state).name overall_elapsed_time = dg.chemical_disinfect.overall_elapsed_time state_elapsed_time = dg.chemical_disinfect.state_elapsed_time + nelson_support = NelsonSupportModes(dg.heat_disinfect.heat_nelson_support).name elif dg.dg_operation_mode == 11: state = DGChemDisinfectFlushStates(dg.chemical_disinfect_flush.flush_state).name overall_elapsed_time = dg.chemical_disinfect_flush.overall_elapsed_time state_elapsed_time = dg.chemical_disinfect_flush.state_elapsed_time + nelson_support = NelsonSupportModes(dg.chemical_disinfect.chem_nelson_support).name info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time, {}, ' 'Cancellation_mode, {}, R1_level, {:5.3f}, R2_level, {:5.3f}, Current_rinse_count, {}, ' - 'Total_rinse_count, {}, UI_state, {}, Top_alarm, {}, ' + 'Total_rinse_count, {}, UI_state, {}, Top_alarm, {}, Nelson_support_mode, {}, ' .format(state, overall_elapsed_time, state_elapsed_time, dg.chemical_disinfect.chemical_disinfect_elapsed_time, ChemCancellationModes(dg.chemical_disinfect.cancellation_mode).name, dg.chemical_disinfect.r1_level, dg.chemical_disinfect.r2_level, dg.chemical_disinfect_flush.rinse_count, 0, #dg.chemical_disinfect_flush.target_rinse_count, DGChemDisinfectUIStates(dg.chemical_disinfect.chemical_disinfect_ui_state).name, - hd.alarms.alarm_top)) + hd.alarms.alarm_top, nelson_support)) return info @@ -308,8 +311,9 @@ def get_uv_reactors_info(): - info = ('Inlet_status, {}, Outlet_status, {}, ' - .format(dg.uv_reactors.inlet_uv_reactor_state, dg.uv_reactors.outlet_uv_reactor_state)) + info = ('Inlet_status, {}, Outlet_status, {}, Inlet_health, {}, Outlet_health, {}, ' + .format(dg.uv_reactors.inlet_uv_reactor_state, dg.uv_reactors.outlet_uv_reactor_state, + dg.uv_reactors.inlet_uv_reactor_health, dg.uv_reactors.outlet_uv_reactor_health)) return info @@ -463,6 +467,7 @@ #dg.heaters.cmd_heaters_broadcast_interval_override(50) #sleep(1) + #dg.uv_reactors.cmd_uv_reactors_data_broadcast_interval_override(50) #dg.voltages.cmd_monitored_voltages_broadcast_interval_override(50) #dg.concentrate_pumps.cmd_concentrate_pump_broadcast_interval_override(50) #sleep(1) @@ -486,13 +491,13 @@ heaters = get_heaters_info() dg_fans = get_dg_fans_info() conc_pumps = get_concentrate_pumps_info() - blood_leak = get_blood_leak_info() + blood_leak = '0' #get_blood_leak_info() hd_pumps = get_hd_pumps_info() fill_info = get_dg_fill_info() - idle_bad_fill = get_dg_idle_bad_fill_info() + idle_bad_fill = 0 #get_dg_idle_bad_fill_info() uv = get_uv_reactors_info() hd_fans = get_hd_fans_info() - hd_pressures = get_hd_occlusion_pressures_info() + hd_pressures = '0' #get_hd_occlusion_pressures_info() air_trap = get_hd_air_trap_info() var = str(datetime.now()) + ', ' + hd_run + dg_run + hd_rsrvrs + dg_rsrvrs + load_cell + drain + ro + \ @@ -731,7 +736,7 @@ hd.cmd_log_in_to_hd() sleep(1) - run_heat_disinfect() + #run_heat_disinfect() #run_flush_mode() @@ -743,7 +748,7 @@ # cmd_set_disinfect_ui_screen() - #collect_treatment_data() + collect_treatment_data() #collect_hd_treatment()