Index: dialin/common/hd_defs.py =================================================================== diff -u -r8ff49bb248b9b98b18dde057d836b5c2d308922c -r6052189ad455e04a98d23cff2ded8e0fee8b3edf --- dialin/common/hd_defs.py (.../hd_defs.py) (revision 8ff49bb248b9b98b18dde057d836b5c2d308922c) +++ dialin/common/hd_defs.py (.../hd_defs.py) (revision 6052189ad455e04a98d23cff2ded8e0fee8b3edf) @@ -127,6 +127,23 @@ @unique +class PreTreatmentWetSelfTesStates(DialinEnum): + WET_SELF_TESTS_START_STATE = 0 + WET_SELF_TESTS_SETUP_STATE = 1 + WET_SELF_TESTS_BUBBLES_STATE = 2 + WET_SELF_TESTS_PRIME_CHECK_STATE = 3 + WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE = 4 + WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE = 5 + WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE = 6 + WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE = 7 + WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE = 8 + WET_SELF_TESTS_SECOND_DISPLACEMENT_STATE = 9 + WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE = 10 + WET_SELF_TESTS_STOPPED_STATE = 11 + WET_SELF_TESTS_COMPLETE_STATE = 12 + + +@unique class PreTreatmentPrimeStates(DialinEnum): HD_PRIME_START_STATE = 0 HD_PRIME_WAIT_FOR_USER_START_STATE = 1 Index: dialin/dg/fans.py =================================================================== diff -u -rd69bbb975b2a422eafc323038b48d2febbb72a66 -r6052189ad455e04a98d23cff2ded8e0fee8b3edf --- dialin/dg/fans.py (.../fans.py) (revision d69bbb975b2a422eafc323038b48d2febbb72a66) +++ dialin/dg/fans.py (.../fans.py) (revision 6052189ad455e04a98d23cff2ded8e0fee8b3edf) @@ -64,7 +64,7 @@ self.outlet_1_rpm = 0.0 self.outlet_2_rpm = 0.0 self.outlet_3_rpm = 0.0 - self.rpm_alarm_time_offset = 0 + self.rpm_alarm_time = 0 def get_fans_target_duty_cycle(self): """ @@ -130,8 +130,16 @@ """ return self.dg_fans_target_rpm + def get_dg_fans_time_left_to_rpm_alarm(self): + """ + Gets the fans time left to RPM alarm + + @return: Fans time left to RPM alarm + """ + return self.rpm_alarm_time + @publish(['dg_fans_duty_cycle', 'dg_fans_target_rpm', 'inlet_1_rpm', 'inlet_2_rpm', 'inlet_3_rpm', 'outlet_1_rpm', - 'outlet_2_rpm', 'outlet_3_rpm', 'rpm_alarm_time_offset']) + 'outlet_2_rpm', 'outlet_3_rpm', 'rpm_alarm_time']) def _handler_fans_sync(self, message): """ Handles published thermistors message. @@ -155,7 +163,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] self.outlet_3_rpm = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.rpm_alarm_time_offset = struct.unpack('i', bytearray( + self.rpm_alarm_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] def cmd_fans_rpm_override(self, fan: int, rpm: float, reset: int = NO_RESET) -> int: Index: dialin/hd/fans.py =================================================================== diff -u -rd69bbb975b2a422eafc323038b48d2febbb72a66 -r6052189ad455e04a98d23cff2ded8e0fee8b3edf --- dialin/hd/fans.py (.../fans.py) (revision d69bbb975b2a422eafc323038b48d2febbb72a66) +++ dialin/hd/fans.py (.../fans.py) (revision 6052189ad455e04a98d23cff2ded8e0fee8b3edf) @@ -56,7 +56,7 @@ self.duty_cycle = 0.0 self.target_rpm = 0.0 self.inlet_1_rpm = 0.0 - self.rpm_alarm_time_offset = 0 + self.rpm_alarm_time = 0 def get_fans_target_duty_cycle(self): """ @@ -82,7 +82,15 @@ """ return self.target_rpm - @publish(['duty_cycle', 'target_rpm', 'inlet_1_rpm', 'rpm_alarm_time_offset']) + def get_hd_fans_time_left_to_rpm_alarm(self): + """ + Gets the fans time left to RPM alarm + + @return: Fans time left to RPM alarm + """ + return self.rpm_alarm_time + + @publish(['duty_cycle', 'target_rpm', 'inlet_1_rpm', 'rpm_alarm_time']) def _handler_fans_sync(self, message): """ Handles published thermistors message. @@ -96,7 +104,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] self.inlet_1_rpm = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.rpm_alarm_time_offset = struct.unpack('i', bytearray( + self.rpm_alarm_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] def cmd_fans_rpm_override(self, fan: int, rpm: float, reset: int = NO_RESET) -> int: Index: dialin/hd/pretreatment.py =================================================================== diff -u -r3a70bfb451b74106348c064c34f19934aadd9119 -r6052189ad455e04a98d23cff2ded8e0fee8b3edf --- dialin/hd/pretreatment.py (.../pretreatment.py) (revision 3a70bfb451b74106348c064c34f19934aadd9119) +++ dialin/hd/pretreatment.py (.../pretreatment.py) (revision 6052189ad455e04a98d23cff2ded8e0fee8b3edf) @@ -70,6 +70,7 @@ self.pre_treatment_prime_state = 0 self.pre_treatment_recirc_state = 0 self.pre_treatment_patient_connection_state = 0 + self.pre_treatment_wet_self_test_state = 0 self.no_cart_self_test_timeout = 0 self.no_cart_self_test_time_countdown = 0 @@ -210,6 +211,7 @@ "pre_treatment_prime_state", "pre_treatment_recirc_state", "pre_treatment_patient_connection_state", + "pre_treatment_wet_self_test_state" ]) def _handler_pre_treatment_state_sync(self, message): """ @@ -237,6 +239,8 @@ message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] self.pre_treatment_patient_connection_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] + self.pre_treatment_wet_self_test_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] self.pre_treatment_submode = 'Unknown SubMode' if PreTreatmentSubModes.has_value(pt_submode): Index: tests/dg_tests.py =================================================================== diff -u -rd69bbb975b2a422eafc323038b48d2febbb72a66 -r6052189ad455e04a98d23cff2ded8e0fee8b3edf --- tests/dg_tests.py (.../dg_tests.py) (revision d69bbb975b2a422eafc323038b48d2febbb72a66) +++ tests/dg_tests.py (.../dg_tests.py) (revision 6052189ad455e04a98d23cff2ded8e0fee8b3edf) @@ -27,7 +27,7 @@ from dialin.dg.dialysate_generator import DGOperationModes from dialin.hd.temperatures import HDTemperaturesNames from dialin.dg.uv_reactors import ReactorsNames -from dialin.common.hd_defs import HDOpModes, HDOpSubModes +from dialin.common.hd_defs import HDOpModes, HDOpSubModes, PreTreatmentWetSelfTesStates from dialin.common.dg_defs import DGEventList from dialin.common.hd_defs import HDEventList from dialin.hd.reservoirs import HDReservoirStates @@ -68,9 +68,11 @@ 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, {}, ' .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)) + hd.dialysate_outlet_flow.measured_dialysate_outlet_uf_volume, + PreTreatmentWetSelfTesStates(hd.pretreatment.pre_treatment_wet_self_test_state).name)) return info @@ -97,17 +99,11 @@ def get_dg_reservoirs_info(): info = ('Time_rsrvr_cycle, {}, Time_rsrvr_fill_2_switch, {}, Time_uf_decay, {:5.3f}, Temp_uf_fill, {:5.3f}, ' 'Temp_rsrvr_use_actual, {:5.3f}, Temp_rsrvr_end_fill, {:5.3}, Temp_avg_fill, {:5.3f}, ' - 'Temp_last_fill, {:5.3f}, Time_rsrvr_fill, {:5.3f}, drain_flow, {:5.3f}, load_cell_w, {:5.3f}, start_time, {}, ' - .format(dg.reservoirs.time_reservoir_cycle, - dg.reservoirs.time_reservoir_fill_2_switch, - dg.reservoirs.time_uf_decay, - dg.reservoirs.temp_uf_fill, - dg.reservoirs.temp_reservoir_use_actual, - dg.reservoirs.temp_reservoir_end_fill, - dg.reservoirs.temp_avg_fill, - dg.reservoirs.temp_last_fill, - dg.reservoirs.time_rsrvr_fill, - dg.reservoirs.drainFlow, dg.reservoirs.previousLoad, dg.reservoirs.startTime)) + 'Temp_last_fill, {:5.3f}, Time_rsrvr_fill, ' + .format(dg.reservoirs.time_reservoir_cycle, dg.reservoirs.time_reservoir_fill_2_switch, + dg.reservoirs.time_uf_decay, dg.reservoirs.temp_uf_fill, dg.reservoirs.temp_reservoir_use_actual, + dg.reservoirs.temp_reservoir_end_fill, dg.reservoirs.temp_avg_fill, dg.reservoirs.temp_last_fill, + dg.reservoirs.time_rsrvr_fill)) return info @@ -213,22 +209,22 @@ dg.temperatures.temperatures[DGTemperaturesNames.FPGA_BOARD_SENSOR.name], dg.temperatures.temperatures[DGTemperaturesNames.LOAD_CELL_A1_B1.name], dg.temperatures.temperatures[DGTemperaturesNames.LOAD_CELL_A2_B2.name], - dg.fans.rpm_alarm_time_offset)) + dg.fans.rpm_alarm_time)) return info def get_hd_fans_info(): info = ('HD_Fan_DC, {:5.3f}, Target_HD_RPM, {:5.3f}, Inlet1_RPM, {:5.3f}, HD_Board_temp, {:5.3f}, ' 'HD_Power_supply, {:5.3f}, HD_FPGA_temp, {:5.3f}, PBA_ADC_temp, {:5.3f}, Venous_temp, {:5.3f}, ' - 'Arterial_temp, {:5.3f}, RPM_time_offset, {}, start_time, {}, ' + 'Arterial_temp, {:5.3f}, RPM_time_offset, {}, ' .format(hd.fans.duty_cycle, hd.fans.target_rpm, hd.fans.inlet_1_rpm, hd.temperatures.hd_temperatures[HDTemperaturesNames.THERMISTOR_ONBOARD_NTC.name], hd.temperatures.hd_temperatures[HDTemperaturesNames.THERMISTOR_POWER_SUPPLY_1.name], hd.temperatures.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_FPGA_BOARD.name], hd.temperatures.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_PBA_ADC_SENSOR.name], hd.temperatures.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_VENOUS_PRESS_TEMP.name], hd.temperatures.hd_temperatures[HDTemperaturesNames.TEMPSENSOR_ARTERIAL_PRESS_TEMP.name], - hd.fans.rpm_alarm_time_offset, hd.fans.remove)) + hd.fans.rpm_alarm_time)) return info @@ -253,14 +249,21 @@ def get_blood_leak_info(): info = ('Blood_leak_status, {}, Blood_leak_zero_status_counter, {}, Blood_leak_zeroed_status, {}, ' 'Blood_leak_detect_set_point, {}, Blood_leak_detect_level, {}, Blood_leak_st_count, {}, ' - 'Blood_leak_led_intensity, {}, ' + 'Blood_leak_led_intensity, {}, Blood_leak_state, {}, ' .format(hd.blood_leak.get_blood_leak_status(), hd.blood_leak.get_blood_leak_zero_status_counter(), hd.blood_leak.get_blood_leak_zeroed_status(), hd.blood_leak.get_blood_leak_detect_set_point(), hd.blood_leak.get_blood_leak_detect_level(), hd.blood_leak.get_blood_leak_st_count(), - hd.blood_leak.get_blood_leak_led_intensity())) + hd.blood_leak.get_blood_leak_led_intensity(), hd.blood_leak.blood_leak_state)) return info +def get_hd_pumps_info(): + info = ('DialIn_tgt_flow, {}, DialIn_meas_flow, {:5.3f}, ' + .format(hd.dialysate_inlet_flow.target_dialysate_inlet_flow_rate, + hd.dialysate_inlet_flow.measured_dialysate_inlet_flow_rate)) + return info + + def run_dg(): counter = 1 timer = 0.1 @@ -336,9 +339,10 @@ dg_fans = get_dg_fans_info() conc_pumps = get_concentrate_pumps_info() blood_leak = get_blood_leak_info() + hd_pumps = get_hd_pumps_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 + '\r' + temp + heaters + conc_pumps + dg_fans + valves + blood_leak + hd_pumps + '\r' print(var) f.write(var) @@ -558,10 +562,10 @@ # cmd_set_disinfect_ui_screen() - # collect_treatment_data() + collect_treatment_data() # collect_hd_treatment() # test_hd_fans_alarms() - test_dg_fans_alarms() + # test_dg_fans_alarms() Index: tests/hd_nvm_scripts.py =================================================================== diff -u -r88b4967ce6b9ac816ac21b26326450de4b540887 -r6052189ad455e04a98d23cff2ded8e0fee8b3edf --- tests/hd_nvm_scripts.py (.../hd_nvm_scripts.py) (revision 88b4967ce6b9ac816ac21b26326450de4b540887) +++ tests/hd_nvm_scripts.py (.../hd_nvm_scripts.py) (revision 6052189ad455e04a98d23cff2ded8e0fee8b3edf) @@ -27,12 +27,12 @@ # It creates a folder called HD_NV_Records in the destination that is called # If no address is provided, the default location is one folder above the dialin folder wherever it is installed # in your computer. - hd.sw_configs.cmd_get_hd_sw_config_record() + #hd.sw_configs.cmd_get_hd_sw_config_record() # Use cmd_update_hd_sw_config_record() set the changes back to firmware # This function requires an address for the excel report. Use the absolute address of your excel report like the # example below - #hd.sw_configs.cmd_update_hd_sw_config_record('/home/fw/projects/HD_NV_Records/2022-02-14-HD-SW-CONFIGS-Record.xlsx') + hd.sw_configs.cmd_update_hd_sw_config_record('/home/fw/projects/HD_NV_Records/2022-03-09-HD-SW-CONFIGS-Record_EP_File.xlsx') # Use this function to reset the configuration records to all be 0 # hd.sw_configs.cmd_reset_hd_sw_config_record() @@ -67,7 +67,7 @@ if hd.cmd_log_in_to_hd(): # Comment this function if not needed - #run_sw_configs_commands() + run_sw_configs_commands() # Comment this function if not needed - run_calibration_commands() + #run_calibration_commands()