st-ten-1/src/ui/test_leak/test_leak.py

297 lines
12 KiB
Python
Raw Normal View History

2022-09-13 11:01:00 +00:00
import sys
2023-02-16 11:11:45 +00:00
import time
2022-07-12 12:49:39 +00:00
import weakref
2023-08-24 16:20:52 +00:00
from PyQt5.QtGui import QPixmap
2023-06-29 17:09:16 +00:00
from PyQt5.QtWidgets import QMessageBox, QDialog, QApplication
2023-08-24 16:20:52 +00:00
from PyQt5.QtCore import Qt
from ui import Dialog
2023-07-18 14:47:06 +00:00
from ui.test_instructions_reminder import Test_Instructions_Reminder
2023-02-16 14:58:09 +00:00
from ui.test_test import Test_Test
2022-07-12 08:48:04 +00:00
2023-07-25 13:44:45 +00:00
VALVE_TIME=0.5
2022-07-12 08:48:04 +00:00
class Test_Leak(Test_Test):
2023-03-30 10:57:49 +00:00
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, reset_on_start=True, enable_override=False,parent=None):
2022-11-02 13:11:32 +00:00
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, reset_on_start=reset_on_start, enable_override=enable_override)
2023-07-30 20:06:10 +00:00
self.get_connection = None
2023-07-24 12:31:52 +00:00
self.io_ok = True
2023-07-25 13:44:45 +00:00
self.blow_on = False
self.parent=parent
2023-03-31 08:11:44 +00:00
self.step=step
2023-07-30 19:42:26 +00:00
self.recipe_written = False
2023-03-31 08:11:44 +00:00
self.start_b.clicked.connect(self.start_test)
2023-08-24 16:20:52 +00:00
self.stop_b.clicked.connect(self.stop_test)
self.show_instruction_b.setVisible("show_instructions" in self.parent.config["hardware_config"].keys())
self.show_instruction_b.clicked.connect(self.show_instruction)
def show_instruction(self):
dialog=Dialog()
2023-07-18 14:47:06 +00:00
dialog.setCentralWidget(Test_Instructions_Reminder(recipe=self.parent.recipe,bench_name=self.parent.config.machine_id))
dialog.show()
2022-07-12 12:28:19 +00:00
2023-09-03 15:27:54 +00:00
def reset(self):
2023-10-11 13:15:42 +00:00
self.components[self.tester_component].stop_test()
2023-09-05 13:07:28 +00:00
super().reset()
2023-09-03 15:27:54 +00:00
2023-08-24 16:20:52 +00:00
def stop_test(self):
2023-10-11 13:15:42 +00:00
self.components[self.tester_component].stop_test()
2023-08-24 16:20:52 +00:00
self.display_text(text="PROVA INTERROTTA", bg_color="yellow")
time.sleep(1)
self.start_b.setEnabled(True)
self.stop_b.setEnabled(False)
2023-03-31 08:11:44 +00:00
def start_test(self):
# print extra labels
if self.step.type == "leak_1":
self.parent.print_extra_labels()
2023-05-11 10:16:01 +00:00
2023-07-24 12:31:52 +00:00
# SELECT TEST CHANNEL
2023-10-05 16:39:09 +00:00
if self.parent.config["hardware_config"].get("external_flush_blow", None) == "present":
2023-07-24 16:11:47 +00:00
if self.parent.config["hardware_config"].get("dual_channel", None) == "present":
2023-07-24 12:31:52 +00:00
chan_sel = self.step.spec["chan_sel"] # 0=CH1, 1=CH2
self.set_digital_out("out_channel_select", chan_sel)
self.set_digital_out("in_channel_select", chan_sel)
2023-07-25 13:44:45 +00:00
time.sleep(VALVE_TIME)
2023-07-24 12:31:52 +00:00
# SET LED INDICATORS
2023-07-24 16:11:47 +00:00
if chan_sel == 0:
self.set_digital_out("ch1_led", True)
2023-07-24 12:31:52 +00:00
else:
2023-07-24 16:11:47 +00:00
self.set_digital_out("ch2_led", True)
2023-07-24 12:31:52 +00:00
2023-07-25 13:44:45 +00:00
self.blow_on=True
2023-07-24 12:31:52 +00:00
self.display_text("SOFFIAGGIO IN CORSO...")
self.set_digital_out("blow_led",True)
self.set_digital_out("blow_on",True)
2023-07-24 16:11:47 +00:00
self.set_digital_out("flush_on", True)
2023-10-05 16:39:09 +00:00
blow_time=int(self.step.spec.get('ext_blow_time',3))
2023-07-24 16:11:47 +00:00
self.set_digital_out("blow_led", True)
2023-07-24 12:31:52 +00:00
time.sleep(blow_time)
self.set_digital_out("blow_led", False)
self.set_digital_out("blow_on", False)
2023-07-24 16:11:47 +00:00
self.set_digital_out("flush_on", False)
2023-07-24 12:31:52 +00:00
2023-07-25 13:44:45 +00:00
self.blow_on = False
2023-08-25 16:51:03 +00:00
if not self.simulate:
2023-10-11 13:15:42 +00:00
self.components[self.tester_component].start_test()
2023-08-25 16:51:03 +00:00
2023-03-31 08:11:44 +00:00
2022-10-18 09:57:08 +00:00
def start(self, recipe=None, step=None, pieces=None):
2022-09-13 11:01:00 +00:00
# TESTING
2023-08-25 16:51:03 +00:00
if "--test-leak" in sys.argv:
2022-09-13 11:01:00 +00:00
self.simulate = True
else:
self.simulate = False
# /TESTING
2022-10-18 09:57:08 +00:00
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
2023-03-30 10:57:49 +00:00
2023-05-12 14:13:22 +00:00
if "leak_2" in [s.type for s in self.parent.cycle_steps]:
if self.step.type=="leak_1":
self.test_num_l.setText("1/2")
else:
self.test_num_l.setText("2/2")
else:
self.test_num_l.setText("1/1")
self.recipe_pressure_l.setText(f"{self.step.spec['test_pressure']}")
2023-06-10 09:22:26 +00:00
self.leak_min_l.setText(f"{self.step.spec['test_pressure_qneg']}")
self.leak_max_l.setText(f"{self.step.spec['test_pressure_qpos']}")
2023-10-11 20:01:05 +00:00
self.fill_time_l.setText(f"{self.step.spec['filling_time']}")
self.settle_time_l.setText(f"{self.step.spec['settling_time']}")
self.meas_time_l.setText(f"{self.step.spec['test_time']}")
2023-07-30 19:42:26 +00:00
2023-07-30 20:06:10 +00:00
# SETUP TEST LOOP
2023-10-12 17:37:39 +00:00
if self.step.spec.get("autotest", False): # IF AUTOTESTING UPLOAD RECIPE EVERY TIME
2023-07-30 20:06:10 +00:00
self.recipe_written = False
2023-10-05 16:39:09 +00:00
2023-10-13 15:52:41 +00:00
if self.parent.config["hardware_config"].get("second_leak_test", "absent") == "present": # IF SECOND LEAK TEST ENABLED UPLOAD RECIPE EVERY TIME
2023-10-05 16:39:09 +00:00
self.recipe_written = False
2023-07-30 20:06:10 +00:00
if not self.recipe_written:
2023-10-11 13:15:42 +00:00
self.components[self.tester_component].write_recipe(self.recipe, self.step)
2023-07-30 20:06:10 +00:00
self.recipe_written=True
2023-07-30 19:42:26 +00:00
2023-10-11 13:15:42 +00:00
self.get_connection = self.components[self.tester_component].out.connect(self.get)
self.components[self.tester_component].resume()
2022-08-02 16:15:30 +00:00
if self.parent_assembly_widget is not None:
2023-07-25 13:44:45 +00:00
self.display_text(text="ATTENDERE")
2022-08-02 16:15:30 +00:00
self.start_b.setEnabled(False)
self.stop_b.setEnabled(False)
2023-02-15 15:07:00 +00:00
2023-07-25 13:44:45 +00:00
if self.step.spec.get("autotest", False) == "ok_check":
self.display_text(text="AUTOTEST: RIMUOVERE FUGA CALIBRATA E PREMERE START PER INIZIARE LA PROVA TENUTA",
bg_color="blue", text_color="white")
2023-08-24 16:20:52 +00:00
super().visualize(None, img=self.status_imgs_full["calibrated-leak-remove"])
2023-07-25 13:44:45 +00:00
elif self.step.spec.get("autotest", False) == "ko_check":
self.display_text(
text="AUTOTEST: COLLEGARE TUBO-TUBO + FUGA CALIBRATA E PREMERE START PER INIZIARE LA PROVA TENUTA DI PROVA",
bg_color="blue", text_color="white")
2023-08-24 16:20:52 +00:00
super().visualize(None, img=self.status_imgs_full["calibrated-leak"])
2023-07-25 13:44:45 +00:00
else:
self.display_text(text="COLLEGARE GLI ATTACCHI PNEUMATICI E PREMERE START PER INIZIARE LA PROVA TENUTA")
2023-08-24 16:20:52 +00:00
2023-07-25 13:44:45 +00:00
if self.simulate:
QApplication.processEvents()
time.sleep(2)
2023-07-24 12:31:52 +00:00
# AUTO START SECOND TEST
if step.type == "leak_2":
2023-07-30 19:42:26 +00:00
self.recipe_written = False
time.sleep(1)
2023-07-24 12:31:52 +00:00
self.start_b.setEnabled(True)
self.start_b.click()
2022-10-18 09:57:08 +00:00
return show
2022-07-12 08:48:04 +00:00
def stop(self):
2022-08-23 14:00:04 +00:00
# disable test loop
2023-10-11 13:15:42 +00:00
self.components[self.tester_component].stop_test()
self.components[self.tester_component].pause()
2022-07-12 08:48:04 +00:00
self.disconnect(self.get_connection)
super().stop()
2022-08-02 16:15:30 +00:00
self.start_b.setEnabled(False)
self.stop_b.setEnabled(False)
2022-07-12 08:48:04 +00:00
def get(self, data=None, override=False):
if self.done: # avoid processing if completed
2022-07-12 08:48:04 +00:00
return
if data is None or data[-1] is None:
super().get(None, override=override)
return
data = data[-1]
2023-02-21 22:36:27 +00:00
2022-09-13 11:01:00 +00:00
# TESTING
if self.simulate:
2023-08-25 16:51:03 +00:00
if "--fail-leak" in sys.argv:
2023-10-11 13:15:42 +00:00
data[self.tester_component] = {
2023-08-25 16:51:03 +00:00
"Running test: active phase": "WAITING START",
"Running test: result": "-----TESTING----- fail",
"Running test: filling pressure":"5000",
"Running test: measured leak":"50",
"Running test: pressure at the end of settling":"4999",
}
else:
2023-10-11 13:15:42 +00:00
data[self.tester_component] = {
2023-08-25 16:51:03 +00:00
"Running test: active phase": "WAITING START",
"Running test: result": "-----TESTING----- passed",
"Running test: filling pressure":"5000",
"Running test: measured leak":"5",
"Running test: pressure at the end of settling":"4999",
}
2023-02-21 22:36:27 +00:00
2023-10-11 13:15:42 +00:00
if "Running test: result" in data[self.tester_component]:
2023-07-24 12:31:52 +00:00
# TEST ENDED
2023-10-11 13:15:42 +00:00
result = data[self.tester_component]["Running test: result"]
2023-04-11 12:13:53 +00:00
step=self.step.spec.get("autotest", "")
if step == "ok_check":
ok = type(result) is str and "passed" in result.lower() # AUTOTEST - NO LEAK
2023-08-09 09:00:34 +00:00
self.recipe_written=False
2023-04-11 12:13:53 +00:00
elif step == "ko_check":
2023-05-31 13:02:06 +00:00
ok = type(result) is str and "passed" in result.lower() # AUTOTEST - LEAK
2023-08-09 09:00:34 +00:00
self.recipe_written=False
2022-11-15 16:17:59 +00:00
else:
2023-04-11 12:13:53 +00:00
ok = type(result) is str and "passed" in result.lower() # NORMAL TEST
2023-02-21 22:36:27 +00:00
2023-07-24 13:16:12 +00:00
# SET DIGITAL OUTPUTS
2023-07-24 12:31:52 +00:00
if self.parent.config["hardware_config"].get("external_flush_blow", None) == "present":
2023-07-25 13:44:45 +00:00
self.blow_on = True
2023-07-24 12:31:52 +00:00
self.display_text("SCARICO ESTERNO IN CORSO...")
self.set_digital_out("flush_led", True)
self.set_digital_out("flush_on", True)
2023-07-25 13:44:45 +00:00
time.sleep(VALVE_TIME)
2023-10-05 16:39:09 +00:00
flush_time = int(self.step.spec.get('ext_flush_time',3))
2023-07-24 12:31:52 +00:00
time.sleep(flush_time)
self.set_digital_out("flush_led", False)
2023-07-25 13:44:45 +00:00
#self.set_digital_out("flush_on", False)
2023-07-24 16:11:47 +00:00
if self.parent.config["hardware_config"].get("dual_channel", None) == "present":
2023-07-24 13:16:12 +00:00
self.set_digital_out("out_channel_select", False)
self.set_digital_out("in_channel_select", False)
2023-07-24 16:11:47 +00:00
self.set_digital_out("ch1_led", False)
self.set_digital_out("ch2_led", False)
2022-07-18 10:32:05 +00:00
else:
2023-05-18 14:12:40 +00:00
#result = None
2022-07-19 09:59:00 +00:00
ok = None
2023-05-18 14:12:40 +00:00
results={"ok":ok}
results.update(data)
2023-05-20 13:28:57 +00:00
super().get([{
2022-07-12 08:48:04 +00:00
"time": data.get("time", None),
2023-05-18 14:12:40 +00:00
"results": results
#"results": {
#"ok": ok,
#"result": result,
2023-10-11 13:15:42 +00:00
#"data": data[self.tester_component],
2023-05-18 14:12:40 +00:00
#},
2023-05-20 13:28:57 +00:00
}], override=override, fail=ok is False)
2022-07-12 08:48:04 +00:00
def visualize(self, data=None):
if data is None:
data = {}
2023-10-11 13:15:42 +00:00
d = data.get("results", {}).get(self.tester_component, {})
2022-07-25 13:36:42 +00:00
for k, l in {
2022-07-18 10:32:05 +00:00
"Running test: active phase": self.test_phase_l,
"Real time test pressure output": self.circuit_pressure_l,
2023-05-18 08:40:16 +00:00
#"Real time differential pressure output": self.leak_l,
"Running test: measured leak": self.leak_l,
2022-07-18 10:32:05 +00:00
"Real time pressure line regulator": self.regulated_pressure_l,
2022-07-12 08:48:04 +00:00
# "Active alarm flags": self._l,
2022-07-18 10:32:05 +00:00
"Running test: test type": self.test_type_l,
"Running test: sequence index": self.sequence_index_l,
2022-07-12 08:48:04 +00:00
}.items():
2022-07-27 15:09:17 +00:00
v = d.get(k, "-")
if type(v) is float:
v = round(v, 2)
l.setText(str(v))
2022-08-02 16:15:30 +00:00
if d.get("Running test: active phase", None) in {
"WAITING START",
"ATTESA START",
2022-09-14 12:47:09 +00:00
"END TEST, WAITING THE START OF A NEW TEST"
2022-08-02 16:15:30 +00:00
"FINE TEST",
2023-10-13 15:52:41 +00:00
"STANDBY",
"PRESSIONE BASSA",
"PRESSIONE ALTA",
"ERRORE"
2022-08-02 16:15:30 +00:00
}:
2023-06-29 17:09:16 +00:00
2022-08-02 16:15:30 +00:00
self.start_b.setEnabled(True)
2023-05-31 13:02:06 +00:00
self.start_b.setDefault(True)
self.start_b.setFocus()
2022-08-02 16:15:30 +00:00
self.stop_b.setEnabled(False)
else:
2023-07-25 13:44:45 +00:00
if self.step is not None and not self.blow_on:
2022-11-15 16:17:59 +00:00
if self.step.spec.get("autotest", False) is not True:
2023-07-24 12:31:52 +00:00
self.display_text(text="PROVA TENUTA IN CORSO")
2022-11-15 16:17:59 +00:00
else:
2023-07-24 12:31:52 +00:00
self.display_text(text="AUTOTEST: PROVA TENUTA IN CORSO")
2022-08-02 16:15:30 +00:00
self.start_b.setEnabled(False)
self.stop_b.setEnabled(True)
2023-08-24 16:20:52 +00:00
ok = data.get("results", {}).get("ok", None)
super().visualize(data, img=self.status_imgs_full[ok])
2022-07-12 08:48:04 +00:00
2023-07-24 12:31:52 +00:00
def display_text(self,text="", bg_color=None,text_color=None):
if self.parent_assembly_widget is not None:
self.parent_assembly_widget().set_text(text=text, bg_color=bg_color,text_color=text_color)
2023-07-24 16:11:47 +00:00
QApplication.processEvents()
2023-07-25 13:44:45 +00:00
time.sleep(0.3)
QApplication.processEvents()
2023-08-24 16:20:52 +00:00
2023-10-05 16:39:09 +00:00
def set_digital_out(self,out_name=None,state=1,component_name="digital_io_flush_blow"):
2023-07-24 12:31:52 +00:00
if self.io_ok:
2023-10-05 16:39:09 +00:00
bit = int(self.parent.config[component_name][out_name])
ret = self.components[component_name].set_bit_verify(0,bit,state)
2023-07-24 12:31:52 +00:00
if not ret:
QMessageBox.critical(None, "ERRORE", f"ERRORE I/O DIGITALE - VERIFICARE CONNESSIONE USB")
2023-09-23 10:58:55 +00:00
self.io_ok = False
2023-07-24 12:31:52 +00:00
2022-07-12 08:48:04 +00:00
def save_last(self):
if self.last is None:
return