Index: dialin/common/dg_defs.py =================================================================== diff -u -rdd7e1a858c5c54f29f432fe2915a645223298aee -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- dialin/common/dg_defs.py (.../dg_defs.py) (revision dd7e1a858c5c54f29f432fe2915a645223298aee) +++ dialin/common/dg_defs.py (.../dg_defs.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -31,8 +31,9 @@ DG_MODE_HEAT = 9 # Heat Disinfect mode DG_MODE_CHEM = 10 # Chemical Disinfect mode DG_MODE_CHFL = 11 # Chemical Disinfect Flush mode - DG_MODE_NLEG = 12 # Not legal - an illegal mode transition occurred - NUM_OF_DG_MODES = 13 # Number of DG operation modes + DG_MODE_HCOL = 12 # Heat Disinfect Active Cool mode + DG_MODE_NLEG = 13 # Not legal - an illegal mode transition occurred + NUM_OF_DG_MODES = 14 # Number of DG operation modes @unique @@ -174,16 +175,12 @@ DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER = 11 # Heat disinfect, fill R2 with hot water state DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 12 # Heat disinfect, disinfect R2 to R1 state DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS = 13 # Heat disinfect, cool down heaters state - DG_HEAT_DISINFECT_STATE_COOL_DOWN_RO_FILTER = 14 # Heat disinfect, cool down RO filter state - DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1 = 15 # Heat disinfect, mix drain R1 state - DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2 = 16 # Heat disinfect, mix drain R2 state - DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2 = 17 # Heat disinfect, rinse R1 to R2 state - DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1 = 18 # Heat disinfect, rinse R2 to R1 and drain R1 state - DG_HEAT_DISINFECT_STATE_RINSE_CIRCULATION = 19 # Heat disinfect, rinse circulation state - DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH = 20 # Heat disinfect, cancel mode basic path state - DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH = 21 # Heat disinfect, cancel mode water path state - DG_HEAT_DISINFECT_STATE_COMPLETE = 22 # Heat disinfect, complete state - NUM_OF_DG_HEAT_DISINFECT_STATES = 23 # Number of heat disinfect mode states + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1 = 14 # Heat disinfect, mix drain R1 state + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2 = 15 # Heat disinfect, mix drain R2 state + DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH = 16 # Heat disinfect, cancel mode basic path state + DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH = 17 # Heat disinfect, cancel mode water path state + DG_HEAT_DISINFECT_STATE_COMPLETE = 18 # Heat disinfect, complete state + NUM_OF_DG_HEAT_DISINFECT_STATES = 19 # Number of heat disinfect mode states @unique @@ -201,6 +198,15 @@ NUM_OF_HEAT_DISINFECT_UI_STATES = 10 @unique +class DGHeatDisinfectActiveCoolStates(DialinEnum): + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_START = 0 + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COOL_DOWN_RO_FILTER = 1 + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_CANCEL_BASIC_PATH = 2 + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE = 3 + NUM_OF_DG_HEAT_DISINFECT_ACTIVE_COOL_STATES = 4 + + +@unique class DGChemicalDisinfectStates(DialinEnum): DG_CHEM_DISINFECT_STATE_START = 0 DG_CHEM_DISINFECT_STATE_DRAIN_R1 = 1 Index: dialin/common/msg_ids.py =================================================================== diff -u -rdd7e1a858c5c54f29f432fe2915a645223298aee -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision dd7e1a858c5c54f29f432fe2915a645223298aee) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -186,13 +186,13 @@ MSG_ID_HD_FANS_DATA = 0xA3 MSG_ID_HD_EVENT = 0xA4 MSG_ID_DG_EVENT = 0xA5 - MSG_ID_DG_DIALYSATE_FLOW_METER_DATA = 0xA6 + MSG_ID_HD_SET_SERVICE_TIME = 0xA6 MSG_ID_DG_ALARM_INFO = 0xA7 MSG_ID_HD_RESERVOIRS_DATA = 0xA8 MSG_ID_HD_REQUEST_DG_CONCENTRATE_MIXING_RATIOS = 0xA9 MSG_ID_DG_CONCENTRATE_MIXING_RATIOS_DATA = 0xAA MSG_ID_DG_SCHEDULED_RUNS_DATA = 0xAB - MSG_ID_DG_SCHEDULED_RUNS_INFO = 0xAC + MSG_ID_DG_SET_SERVICE_TIME = 0xAC MSG_ID_UI_INSTALLATION_CONFIRM_RESPONSE = 0xAD MSG_ID_DG_FILL_MODE_DATA = 0xAE MSG_ID_DG_BAD_FILL_SUB_STATE = 0xAF @@ -217,6 +217,8 @@ MSG_ID_DG_START_STOP_CHEM_DISINFECT_FLUSH = 0xC2 MSG_ID_UI_CHEM_DISINFECT_FLUSH_CONFIRM = 0xC3 MSG_ID_HD_CHEM_DISINFECT_FLUSH_CONFIRM_RESPONSE = 0xC4 + MSG_ID_DG_HEAT_DISINFECT_ACTIVE_COOL_DATA = 0xC5 + MSG_ID_DG_START_STOP_HEAT_DISINFECT_ACTIVE_COOL = 0xC6 MSG_ID_CAN_ERROR_COUNT = 0x999 @@ -316,7 +318,7 @@ MSG_ID_HD_BUBBLE_STATUS_OVERRIDE = 0x805E MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE = 0x805F MSG_ID_HD_BUBBLE_SELF_TEST_REQUEST = 0x8060 - MSG_ID_HD_FAN_RPM_ALARM_START_TIME_OFFSET_OVERRIDE = 0x8061 + MSG_ID_HD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0x8061 MSG_ID_HD_SWITCHES_STATUS_OVERRIDE = 0x8062 MSG_ID_HD_SWITCHES_PUBLISH_INTERVAL_OVERRIDE = 0x8063 MSG_ID_HD_BATTERY_REMAINING_CAP_MWH_OVERRIDE = 0x8064 @@ -356,6 +358,7 @@ MSG_ID_HD_DIAL_IN_SET_PWM = 0x8086 MSG_ID_HD_DIAL_OUT_SET_PWM = 0x8087 MSG_ID_DIALYSATE_INLET_PUMP_ROTOR_COUNT_OVERRIDE = 0x8088 + MSG_ID_HD_NV_RECORD_CRC_OVERRIDE = 0x8089 MSG_ID_DG_TESTER_LOGIN_REQUEST = 0xA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 @@ -446,6 +449,12 @@ MSG_ID_DG_CPLD_PUBLISH_INTERVAL_OVERRIDE = 0xA058 MSG_ID_DG_DRAIN_PUMP_CURRENT_OVERRIDE = 0xA059 MSG_ID_DG_DRAIN_PUMP_DIRECTION_OVERRIDE = 0xA05A + MSG_ID_DG_RO_FEEDBACK_VOLTAGE_OVERRIDE = 0xA05B + MSG_ID_DG_DIALYSATE_FILL_INTEGRATED_VOLUME_OVERRIDE = 0xA05C + MSG_ID_DG_NV_RECORD_CRC_OVERRIDE = 0xA05D + MSG_ID_DG_CONC_PUMP_PARK_STATUS_OVERRIDE = 0xA05E + MSG_ID_DG_CONC_PUMP_PARK_FAULT_STATUS_OVERRIDE = 0xA05F + MSG_ID_DG_CONC_PUMP_PARK_COMMAND = 0xA060 MSG_ID_HD_DEBUG_EVENT = 0xFFF1 MSG_ID_DG_DEBUG_EVENT = 0xFFF2 Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -rdd7e1a858c5c54f29f432fe2915a645223298aee -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision dd7e1a858c5c54f29f432fe2915a645223298aee) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -33,6 +33,7 @@ from .gen_idle import GenIdle from .hd_proxy import DGHDProxy from .heat_disinfect import HeatDisinfect +from .heat_disinfect_active_cool import HeatDisinfectActiveCool from .heaters import Heaters from .load_cells import DGLoadCells from .pressures import DGPressures @@ -175,6 +176,7 @@ self.gen_idle = GenIdle(self.can_interface, self.logger) self.hd_proxy = DGHDProxy(self.can_interface, self.logger) self.heat_disinfect = HeatDisinfect(self.can_interface, self.logger) + self.heat_disinfect_active_cool = HeatDisinfectActiveCool(self.can_interface, self.logger) self.heaters = Heaters(self.can_interface, self.logger) self.load_cells = DGLoadCells(self.can_interface, self.logger) self.pressures = DGPressures(self.can_interface, self.logger) Index: dialin/dg/hd_proxy.py =================================================================== diff -u -rdd7e1a858c5c54f29f432fe2915a645223298aee -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision dd7e1a858c5c54f29f432fe2915a645223298aee) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -273,6 +273,37 @@ self.logger.debug("Timeout!!!!") return False + def cmd_start_stop_dg_heat_disinfect_active_cool(self, start: bool = True) -> int: + """ + Constructs and sends the start/stop DG heat disinfect active cool command + + @param start: (bool) True = start heat disinfect active cool, False = stop heat disinfect active cool. + @return: non-zero integer if successful, False otherwise + """ + # 1 is to start + if start: + cmd = 1 + cmd_str = "Starting" + else: + cmd = 0 + cmd_str = "Stopping" + payload = integer_to_bytearray(cmd) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_START_STOP_HEAT_DISINFECT_ACTIVE_COOL.value, + payload=payload) + + self.logger.debug(cmd_str + " DG heat disinfect active cool") + + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + def cmd_start_stop_dg_flush(self, start: bool = True) -> int: """ Constructs and sends the start/stop DG flush command Index: dialin/hd/alarms.py =================================================================== diff -u -rdd7e1a858c5c54f29f432fe2915a645223298aee -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- dialin/hd/alarms.py (.../alarms.py) (revision dd7e1a858c5c54f29f432fe2915a645223298aee) +++ dialin/hd/alarms.py (.../alarms.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -15,6 +15,8 @@ ############################################################################ import struct from logging import Logger +from enum import unique +from ..utils.base import DialinEnum from .constants import RESET, NO_RESET from ..common.msg_defs import MsgIds, MsgFieldPositions @@ -44,6 +46,14 @@ HD_ALARM_STATE_MEDIUM = 2 HD_ALARM_STATE_HIGH = 3 + # Alarm response buttons + @unique + class AlarmResponseButtons(DialinEnum): + HD_ALARM_RESPONSE_BUTTON_RESUME = 0 + HD_ALARM_RESPONSE_BUTTON_RINSEBACK = 1 + HD_ALARM_RESPONSE_BUTTON_END_TREATMENT = 2 + NUM_OF_HD_ALARM_RESPONSE_BUTTONS = 3 + # Alarm status message field positions START_POS_ALARM_STATE = DenaliMessage.PAYLOAD_START_INDEX END_POS_ALARM_STATE = START_POS_ALARM_STATE + 4 @@ -109,6 +119,8 @@ self.alarm_audio_curr_lg = 0.0 self.alarm_backup_audio_curr = 0.0 self.safety_shutdown_active = False + self.alarm_table_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_HD_ALARM_RESPONSE_BUTTONS.value + self.alarm_state_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_HD_ALARM_RESPONSE_BUTTONS.value def get_current_alarms_state(self): """ @@ -126,6 +138,22 @@ """ return self.alarm_states + def get_alarm_response_button_table_blocker_states(self): + """ + Gets the states (T/F) of the alarm response buttons blocked by alarm table properties. + + @return: List of booleans of size 3 (for resume, rinseback and end treatment buttons) + """ + return self.alarm_table_button_blockers + + def get_alarm_response_button_state_blocker_states(self): + """ + Gets the states (T/F) of the alarm response buttons blocked by state properties. + + @return: List of booleans of size 3 (for resume, rinseback and end treatment buttons) + """ + return self.alarm_state_button_blockers + def get_alarm_conditions(self): """ Gets all alarm condition states for all alarms @@ -433,7 +461,7 @@ self.alarm_conditions[alarm_id[0]] = False @publish(["alarm_volume", "alarm_audio_curr_hg", "alarm_audio_curr_lg", "alarm_backup_audio_curr", - "safety_shutdown_active"]) + "safety_shutdown_active", "alarm_table_button_blockers", "alarm_state_button_blockers"]) def _handler_alarm_information_sync(self, message): """ Handles published HD alarm information broadcast messages. @@ -452,11 +480,30 @@ message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) saf = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) + trs = struct.unpack('B', bytearray( + message['message'][MsgFieldPositions.END_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5+1])) + trb = struct.unpack('B', bytearray( + message['message'][MsgFieldPositions.END_POS_FIELD_5+1:MsgFieldPositions.END_POS_FIELD_5+2])) + tet = struct.unpack('B', bytearray( + message['message'][MsgFieldPositions.END_POS_FIELD_5+2:MsgFieldPositions.END_POS_FIELD_5+3])) + srs = struct.unpack('B', bytearray( + message['message'][MsgFieldPositions.END_POS_FIELD_5+3:MsgFieldPositions.END_POS_FIELD_5+4])) + srb = struct.unpack('B', bytearray( + message['message'][MsgFieldPositions.END_POS_FIELD_5+4:MsgFieldPositions.END_POS_FIELD_5+5])) + set = struct.unpack('B', bytearray( + message['message'][MsgFieldPositions.END_POS_FIELD_5+5:MsgFieldPositions.END_POS_FIELD_5+6])) + self.alarm_volume = vol[0] self.alarm_audio_curr_hg = ach[0] self.alarm_audio_curr_lg = acl[0] self.alarm_backup_audio_curr = bac[0] self.safety_shutdown_active = True if saf[0] == 1 else False + self.alarm_table_button_blockers[self.AlarmResponseButtons.HD_ALARM_RESPONSE_BUTTON_RESUME.value] = True if trs[0] == 1 else False + self.alarm_table_button_blockers[self.AlarmResponseButtons.HD_ALARM_RESPONSE_BUTTON_RINSEBACK.value] = True if trb[0] else False + self.alarm_table_button_blockers[self.AlarmResponseButtons.HD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value] = True if tet[0] else False + self.alarm_state_button_blockers[self.AlarmResponseButtons.HD_ALARM_RESPONSE_BUTTON_RESUME.value] = True if srs[0] else False + self.alarm_state_button_blockers[self.AlarmResponseButtons.HD_ALARM_RESPONSE_BUTTON_RINSEBACK.value] = True if srb[0] else False + self.alarm_state_button_blockers[self.AlarmResponseButtons.HD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value] = True if set[0] else False def cmd_clear_all_alarms(self) -> int: """ Index: tests/dg_nvm_scripts.py =================================================================== diff -u -r293a9792727fc7d9e87ee14055c19316a8f0c907 -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- tests/dg_nvm_scripts.py (.../dg_nvm_scripts.py) (revision 293a9792727fc7d9e87ee14055c19316a8f0c907) +++ tests/dg_nvm_scripts.py (.../dg_nvm_scripts.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -7,8 +7,8 @@ # # @file dg_nvm_scripts.py # -# @author (last) Dara Navaei -# @date (last) 03-Nov-2022 +# @author (last) Steve Jarpe +# @date (last) 30-Nov-2022 # @author (original) Dara Navaei # @date (original) 10-Feb-2022 # Index: tests/dg_tests.py =================================================================== diff -u -rdd7e1a858c5c54f29f432fe2915a645223298aee -r4eebf06e7b22d8bed803d79925fb5e5b32b4cac4 --- tests/dg_tests.py (.../dg_tests.py) (revision dd7e1a858c5c54f29f432fe2915a645223298aee) +++ tests/dg_tests.py (.../dg_tests.py) (revision 4eebf06e7b22d8bed803d79925fb5e5b32b4cac4) @@ -30,7 +30,8 @@ from dialin.hd.temperatures import HDTemperaturesNames from dialin.dg.concentrate_pumps import DGConcentratePumpsStates from dialin.dg.uv_reactors import ReactorsNames -from dialin.common.hd_defs import HDOpModes, HDStandbyStates, PreTreatmentWetSelfTestStates, PostTreatmentStates +from dialin.common.hd_defs import HDOpModes, HDStandbyStates, PreTreatmentWetSelfTestStates, PostTreatmentStates, \ + PreTreatmentDrySelfTestsStates from dialin.hd.post_treatment import HDPostTreatmentDrainStates from dialin.common.dg_defs import DGEventList from dialin.common.hd_defs import HDEventList @@ -46,7 +47,7 @@ from dialin.hd.valves import HDValves from dialin.hd.voltages import HDMonitoredVoltages from dialin.hd.pretreatment import PreTreatmentRsrvrState -from dialin.common.dg_defs import DGFlushStates +from dialin.common.dg_defs import DGFlushStates, DGHeatDisinfectActiveCoolStates from time import sleep from datetime import datetime import sys @@ -79,10 +80,21 @@ return info def get_heat_disinfect_mode_info(): + state = 0 + state_elapsed_time = 0 + overall_elapsed_time = 0 + if dg.dg_operation_mode == 9: + state = DGHeatDisinfectStates(dg.heat_disinfect.heat_disinfect_state).name + overall_elapsed_time = dg.heat_disinfect.overall_elapsed_time + state_elapsed_time = dg.heat_disinfect.state_elapsed_time + elif dg.dg_operation_mode == 12: + state = DGHeatDisinfectActiveCoolStates(dg.heat_disinfect_active_cool.heat_disinfect_active_cool_state).name + overall_elapsed_time = dg.heat_disinfect_active_cool.overall_elapsed_time + state_elapsed_time = dg.heat_disinfect_active_cool.state_elapsed_time + info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time, {}, ' 'R1_level, {:5.3f}, R2_level, {:5.3f}, Top_alarm, {}, UI_state, {}, ' - .format(DGHeatDisinfectStates(dg.heat_disinfect.heat_disinfect_state).name, - dg.heat_disinfect.overall_elapsed_time, dg.heat_disinfect.state_elapsed_time, + .format(state, overall_elapsed_time, state_elapsed_time, dg.heat_disinfect.heat_disinfect_count_down_time, dg.heat_disinfect.r1_level, dg.heat_disinfect.r2_level, hd.alarms.alarm_top, DGHeatDisinfectUIStates(dg.heat_disinfect.heat_disinfect_ui_state).name)) @@ -98,19 +110,21 @@ def get_hd_run_info(): info = ('HD_op_mode, {}, HD_sub_mode, {}, Top_alarm, {}, Target_UF_ml, {:5.3f}, Meas_UF_ml, {:5.3f}, ' 'Wet_test_state, {}, Post_tx_state, {}, Post_tx_drain_state, {}, Prime_state, {}, Pre_Tx_rsrvr_state, {}, ' + 'Pre_Tx_dry_state, {}, ' .format(HDOpModes(hd.hd_operation_mode).name, hd.hd_operation_sub_mode, hd.alarms.alarm_top, hd.dialysate_outlet_flow.reference_dialysate_outlet_uf_volume, hd.dialysate_outlet_flow.measured_dialysate_outlet_uf_volume, PreTreatmentWetSelfTestStates(hd.pretreatment.pre_treatment_wet_self_test_state).name, PostTreatmentStates(hd.post_treatment.post_treatment_sub_mode).name, HDPostTreatmentDrainStates(hd.post_treatment.post_treatment_drain_state).name, hd.pretreatment.pre_treatment_prime_state, - PreTreatmentRsrvrState(hd.pretreatment.pre_treatment_reservoir_state).name)) + PreTreatmentRsrvrState(hd.pretreatment.pre_treatment_reservoir_state).name, + PreTreatmentDrySelfTestsStates(hd.pretreatment.pre_treatment_dry_self_test_state).name)) return info def get_hd_occlusion_pressures_info(): - info = ('Art_pres, {:5.3f}, Venous_pres, {:5.3f}, Blood_pump_pres, {}, DialIn_pres, {}, DialOut_pres, {}, ' + info = ('Art_pres, {:5.3f}, Venous_pres, {:5.3f}, Blood_pump_pres, {:5.3f}, DialIn_pres, {}, DialOut_pres, {}, ' .format(hd.pressure_occlusion.arterial_pressure, hd.pressure_occlusion.venous_pressure, hd.pressure_occlusion.blood_pump_occlusion, hd.pressure_occlusion.dialysate_inlet_pump_occlusion, hd.pressure_occlusion.dialysate_outlet_pump_occlusion)) @@ -178,9 +192,9 @@ def get_load_cells_info(): - info = ('A1, {:5.3f}, A2, {:5.3f}, B1, {:5.3f}, B2, {:5.3f}, '. - format(dg.load_cells.load_cell_A1, dg.load_cells.load_cell_A2, dg.load_cells.load_cell_B1, - dg.load_cells.load_cell_B2)) + info = ('A1, {:5.3f}, A2, {:5.3f}, B1, {:5.3f}, B2, {:5.3f}, ' + .format(dg.load_cells.load_cell_A1, dg.load_cells.load_cell_A2, dg.load_cells.load_cell_B1, + dg.load_cells.load_cell_B2)) return info @@ -277,7 +291,7 @@ info = ('Bicarb_curr_speed, {:5.3f}, Bicarb_speed, {:5.3f}, Acid_curr_speed, {:5.3f}, Acid_speed, {:5.3f}, ' 'CPo, {:5.3f}, CD1, {:5.3f}, CD2, {:5.3f}, CP1_state, {}, CP2_state, {}, CPi_status, {}, CPo_status, {}, ' 'CD1_status, {}, CD2_status, {}, CP1_pulse, {:5.3f}, CP2_pulse, {:5.3f}, Acid_tgt_speed, {:5.3f}, ' - 'Bicarb_tgt_speed, {:5.3f}, ' + 'Bicarb_tgt_speed, {:5.3f}, CP1_parked, {}, CP1_park_fault, {}, CP2_parked, {}, CP2_park_fault, {}, ' .format(dg.concentrate_pumps.concentrate_pump_cp2_current_set_speed, dg.concentrate_pumps.concentrate_pump_cp2_measured_speed, dg.concentrate_pumps.concentrate_pump_cp1_current_set_speed, @@ -291,7 +305,11 @@ dg.conductivity_sensors.cd1_sensor_status, dg.conductivity_sensors.cd2_sensor_status, dg.concentrate_pumps.cp1_temp_pulse, dg.concentrate_pumps.cp2_temp_pulse, dg.concentrate_pumps.concentrate_pump_cp1_target_speed, - dg.concentrate_pumps.concentrate_pump_cp2_target_speed)) + dg.concentrate_pumps.concentrate_pump_cp2_target_speed, + dg.concentrate_pumps.concentrate_pump_cp1_parked, + dg.concentrate_pumps.concentrate_pump_cp1_park_fault, + dg.concentrate_pumps.concentrate_pump_cp2_parked, + dg.concentrate_pumps.concentrate_pump_cp2_park_fault)) return info @@ -322,8 +340,11 @@ return info -def get_hd_valves_info(): - info = ('Air_trap' ) +def get_hd_air_trap_info(): + info = ('Air_trap_high_level, {}, Air_trap_low_level, {}, Air_trap_valve, {}, Air_bubble_status, {}, ' + .format(hd.air_trap.upper_level, hd.air_trap.lower_level, hd.valves.hd_air_trap_status, + hd.air_bubbles.air_bubbles_status)) + return info def get_dg_idle_bad_fill_info(): @@ -445,31 +466,13 @@ idle_bad_fill = get_dg_idle_bad_fill_info() uv = get_uv_reactors_info() hd_fans = get_hd_fans_info() + hd_pressures = 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 + \ - temp + heaters + conc_pumps + dg_fans + valves + blood_leak + hd_pumps + fill_info + uv + hd_fans + '\r' + temp + heaters + conc_pumps + dg_fans + valves + blood_leak + hd_pumps + fill_info + uv + hd_fans + \ + hd_pressures + air_trap + '\r' - if hd.alarms.get_alarm_state(97) and start is False: - dg.conductivity_sensors.cmd_conductivity_sensor_override(ConductivitySensorsEnum.CD2.value, 13700.00) - sleep(0.2) - dg.conductivity_sensors.cmd_conductivity_sensor_override(ConductivitySensorsEnum.CD1.value, 11600.00) - start = True - - """ - var = str(datetime.now()) + ', ' + hd_run + dg_run + load_cell + drain + ro + conc_pumps + valves + \ - idle_bad_fill + fill_info + '\r' - - if dg.dg_operation_mode == 6 and dg.dg_operation_sub_mode == 4 and start is False: - #dg.conductivity_sensors.cmd_conductivity_sensor_override(ConductivitySensorsEnum.CD2.value, 12000.00) - dg.pressures.cmd_pressure_override(dg.pressures.PRESSURE_SENSOR_RO_PUMP_INLET, 14) - start = True - - if start is True: - counter += 1 - - if 10 < counter < 14: - dg.pressures.cmd_pressure_override(dg.pressures.PRESSURE_SENSOR_RO_PUMP_INLET, 14, reset=1) - """ print(var) f.write(var) sleep(sleep_time) @@ -478,36 +481,13 @@ f.close() -def collect_hd_treatment(): - f = open("/home/fw/projects/dialin/tests/treatment_run_hd.log", "w") - - #hd.cmd_hd_software_reset_request() - - hd.dialysate_inlet_flow.cmd_dialysate_inlet_flow_broadcast_interval_override(50) - sleep(1) - hd.dialysate_outlet_flow.cmd_dialysate_outlet_flow_broadcast_interval_override(50) - sleep(1) - hd.voltages.cmd_monitored_voltages_broadcast_interval_override(50) - - try: - while True: - hd_run = get_hd_run_info() - pumps_info = get_hd_pumps_info() - voltages = get_voltages_info() - var = hd_run + pumps_info + voltages + '\r' - print(var) - f.write(var) - sleep(0.05) - except KeyboardInterrupt: - f.close() - - def run_heat_disinfect(): complete_counter = 1 f = open("/home/fw/projects/dialin/tests/Heat_disinfect.log", "w") #dg.heaters.cmd_heaters_broadcast_interval_override(50) #sleep(1) dg.hd_proxy.cmd_start_stop_dg_heat_disinfect() + #dg.hd_proxy.cmd_start_stop_dg_heat_disinfect_active_cool() try: while True: @@ -546,6 +526,8 @@ except KeyboardInterrupt: dg.hd_proxy.cmd_start_stop_dg_heat_disinfect(start=False) + sleep(0.2) + dg.hd_proxy.cmd_start_stop_dg_heat_disinfect_active_cool(start=False) f.close() @@ -696,25 +678,6 @@ dg.drain_pump.cmd_drain_pump_set_rpm(0) -def test_conc_pumps(): - dg.concentrate_pumps.cmd_concentrate_pump_state_change_request(0, True) - sleep(1) - #dg.concentrate_pumps.cmd_concentrate_pump_state_change_request(1, True) - # sleep(1) - dg.concentrate_pumps.cmd_concentrate_pump_target_speed_override(0, 35) - #sleep(1) - #dg.concentrate_pumps.cmd_concentrate_pump_target_speed_override(1, 20) - - try: - while True: - print(get_concentrate_pumps_info()) - sleep(1) - except KeyboardInterrupt: - dg.concentrate_pumps.cmd_concentrate_pump_state_change_request(0, False) - sleep(0.5) - dg.concentrate_pumps.cmd_concentrate_pump_state_change_request(1, False) - - def test_hd_valves(): while True: @@ -751,7 +714,7 @@ # cmd_set_disinfect_ui_screen() - #collect_treatment_data() + collect_treatment_data() #collect_hd_treatment() @@ -775,20 +738,6 @@ #test_hd_valves() - #while True: - # print(get_heaters_info()) - # sleep(1) + #hd.ui.cmd_ui_set_dg_service_time() - #dg.flow_sensors.cmd_measured_flow_sensor_value_lpm_override(1, 0.8, reset=1) - #dg.heaters.cmd_set_primary_and_trimmer_heaters_target_temperature(primary_target_temp=40, trimmer_target_temp=52) - #sleep(1) - #dg.heaters.cmd_start_stop_trimmer_heater(0) - - #dg.valves.cmd_valve_sensed_state_override(4, 1, reset=0) - - #while True: - # print(get_dg_valves_states()) - # sleep(1) - -