297 lines
12 KiB
Python
297 lines
12 KiB
Python
import sys
|
|
import time
|
|
import weakref
|
|
|
|
from PyQt5.QtGui import QPixmap
|
|
from PyQt5.QtWidgets import QMessageBox, QDialog, QApplication
|
|
from PyQt5.QtCore import Qt
|
|
from ui import Dialog
|
|
from ui.test_instructions_reminder import Test_Instructions_Reminder
|
|
from ui.test_test import Test_Test
|
|
|
|
VALVE_TIME=0.5
|
|
|
|
class Test_Leak(Test_Test):
|
|
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, reset_on_start=True, enable_override=False,parent=None):
|
|
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, reset_on_start=reset_on_start, enable_override=enable_override)
|
|
self.get_connection = None
|
|
self.io_ok = True
|
|
self.blow_on = False
|
|
self.parent=parent
|
|
self.step=step
|
|
self.recipe_written = False
|
|
self.start_b.clicked.connect(self.start_test)
|
|
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()
|
|
dialog.setCentralWidget(Test_Instructions_Reminder(recipe=self.parent.recipe,bench_name=self.parent.config.machine_id))
|
|
dialog.show()
|
|
|
|
def reset(self):
|
|
self.components[self.tester_component].stop_test()
|
|
super().reset()
|
|
|
|
def stop_test(self):
|
|
self.components[self.tester_component].stop_test()
|
|
self.display_text(text="PROVA INTERROTTA", bg_color="yellow")
|
|
time.sleep(1)
|
|
self.start_b.setEnabled(True)
|
|
self.stop_b.setEnabled(False)
|
|
|
|
def start_test(self):
|
|
# print extra labels
|
|
if self.step.type == "leak_1":
|
|
self.parent.print_extra_labels()
|
|
|
|
# SELECT TEST CHANNEL
|
|
if self.parent.config["hardware_config"].get("external_flush_blow", None) == "present":
|
|
if self.parent.config["hardware_config"].get("dual_channel", None) == "present":
|
|
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)
|
|
time.sleep(VALVE_TIME)
|
|
|
|
# SET LED INDICATORS
|
|
if chan_sel == 0:
|
|
self.set_digital_out("ch1_led", True)
|
|
else:
|
|
self.set_digital_out("ch2_led", True)
|
|
|
|
self.blow_on=True
|
|
self.display_text("SOFFIAGGIO IN CORSO...")
|
|
self.set_digital_out("blow_led",True)
|
|
self.set_digital_out("blow_on",True)
|
|
self.set_digital_out("flush_on", True)
|
|
blow_time=int(self.step.spec.get('ext_blow_time',3))
|
|
self.set_digital_out("blow_led", True)
|
|
time.sleep(blow_time)
|
|
self.set_digital_out("blow_led", False)
|
|
self.set_digital_out("blow_on", False)
|
|
self.set_digital_out("flush_on", False)
|
|
|
|
|
|
self.blow_on = False
|
|
if not self.simulate:
|
|
self.components[self.tester_component].start_test()
|
|
|
|
|
|
def start(self, recipe=None, step=None, pieces=None):
|
|
# TESTING
|
|
if "--test-leak" in sys.argv:
|
|
self.simulate = True
|
|
else:
|
|
self.simulate = False
|
|
# /TESTING
|
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
|
if show is False:
|
|
return show
|
|
|
|
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']}")
|
|
self.leak_min_l.setText(f"{self.step.spec['test_pressure_qneg']}")
|
|
self.leak_max_l.setText(f"{self.step.spec['test_pressure_qpos']}")
|
|
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']}")
|
|
|
|
# SETUP TEST LOOP
|
|
if self.step.spec.get("autotest", False): # IF AUTOTESTING UPLOAD RECIPE EVERY TIME
|
|
self.recipe_written = False
|
|
|
|
if self.parent.config["hardware_config"].get("second_leak_test", "absent") == "present": # IF SECOND LEAK TEST ENABLED UPLOAD RECIPE EVERY TIME
|
|
self.recipe_written = False
|
|
|
|
if not self.recipe_written:
|
|
self.components[self.tester_component].write_recipe(self.recipe, self.step)
|
|
self.recipe_written=True
|
|
|
|
self.get_connection = self.components[self.tester_component].out.connect(self.get)
|
|
self.components[self.tester_component].resume()
|
|
if self.parent_assembly_widget is not None:
|
|
self.display_text(text="ATTENDERE")
|
|
self.start_b.setEnabled(False)
|
|
self.stop_b.setEnabled(False)
|
|
|
|
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")
|
|
super().visualize(None, img=self.status_imgs_full["calibrated-leak-remove"])
|
|
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")
|
|
super().visualize(None, img=self.status_imgs_full["calibrated-leak"])
|
|
else:
|
|
self.display_text(text="COLLEGARE GLI ATTACCHI PNEUMATICI E PREMERE START PER INIZIARE LA PROVA TENUTA")
|
|
|
|
if self.simulate:
|
|
QApplication.processEvents()
|
|
time.sleep(2)
|
|
|
|
# AUTO START SECOND TEST
|
|
if step.type == "leak_2":
|
|
self.recipe_written = False
|
|
time.sleep(1)
|
|
self.start_b.setEnabled(True)
|
|
self.start_b.click()
|
|
|
|
return show
|
|
|
|
def stop(self):
|
|
# disable test loop
|
|
self.components[self.tester_component].stop_test()
|
|
self.components[self.tester_component].pause()
|
|
self.disconnect(self.get_connection)
|
|
super().stop()
|
|
self.start_b.setEnabled(False)
|
|
self.stop_b.setEnabled(False)
|
|
|
|
def get(self, data=None, override=False):
|
|
if self.done: # avoid processing if completed
|
|
return
|
|
if data is None or data[-1] is None:
|
|
super().get(None, override=override)
|
|
return
|
|
data = data[-1]
|
|
|
|
# TESTING
|
|
if self.simulate:
|
|
if "--fail-leak" in sys.argv:
|
|
data[self.tester_component] = {
|
|
"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:
|
|
data[self.tester_component] = {
|
|
"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",
|
|
}
|
|
|
|
if "Running test: result" in data[self.tester_component]:
|
|
# TEST ENDED
|
|
result = data[self.tester_component]["Running test: result"]
|
|
step=self.step.spec.get("autotest", "")
|
|
if step == "ok_check":
|
|
ok = type(result) is str and "passed" in result.lower() # AUTOTEST - NO LEAK
|
|
self.recipe_written=False
|
|
elif step == "ko_check":
|
|
ok = type(result) is str and "passed" in result.lower() # AUTOTEST - LEAK
|
|
self.recipe_written=False
|
|
else:
|
|
ok = type(result) is str and "passed" in result.lower() # NORMAL TEST
|
|
|
|
# SET DIGITAL OUTPUTS
|
|
|
|
if self.parent.config["hardware_config"].get("external_flush_blow", None) == "present":
|
|
self.blow_on = True
|
|
self.display_text("SCARICO ESTERNO IN CORSO...")
|
|
self.set_digital_out("flush_led", True)
|
|
self.set_digital_out("flush_on", True)
|
|
time.sleep(VALVE_TIME)
|
|
flush_time = int(self.step.spec.get('ext_flush_time',3))
|
|
time.sleep(flush_time)
|
|
self.set_digital_out("flush_led", False)
|
|
#self.set_digital_out("flush_on", False)
|
|
|
|
if self.parent.config["hardware_config"].get("dual_channel", None) == "present":
|
|
self.set_digital_out("out_channel_select", False)
|
|
self.set_digital_out("in_channel_select", False)
|
|
self.set_digital_out("ch1_led", False)
|
|
self.set_digital_out("ch2_led", False)
|
|
else:
|
|
#result = None
|
|
ok = None
|
|
|
|
results={"ok":ok}
|
|
results.update(data)
|
|
super().get([{
|
|
"time": data.get("time", None),
|
|
"results": results
|
|
#"results": {
|
|
#"ok": ok,
|
|
#"result": result,
|
|
#"data": data[self.tester_component],
|
|
#},
|
|
}], override=override, fail=ok is False)
|
|
|
|
def visualize(self, data=None):
|
|
if data is None:
|
|
data = {}
|
|
d = data.get("results", {}).get(self.tester_component, {})
|
|
for k, l in {
|
|
"Running test: active phase": self.test_phase_l,
|
|
"Real time test pressure output": self.circuit_pressure_l,
|
|
#"Real time differential pressure output": self.leak_l,
|
|
"Running test: measured leak": self.leak_l,
|
|
"Real time pressure line regulator": self.regulated_pressure_l,
|
|
# "Active alarm flags": self._l,
|
|
"Running test: test type": self.test_type_l,
|
|
"Running test: sequence index": self.sequence_index_l,
|
|
}.items():
|
|
v = d.get(k, "-")
|
|
if type(v) is float:
|
|
v = round(v, 2)
|
|
l.setText(str(v))
|
|
if d.get("Running test: active phase", None) in {
|
|
"WAITING START",
|
|
"ATTESA START",
|
|
"END TEST, WAITING THE START OF A NEW TEST"
|
|
"FINE TEST",
|
|
"STANDBY",
|
|
"PRESSIONE BASSA",
|
|
"PRESSIONE ALTA",
|
|
"ERRORE"
|
|
}:
|
|
|
|
self.start_b.setEnabled(True)
|
|
self.start_b.setDefault(True)
|
|
self.start_b.setFocus()
|
|
|
|
self.stop_b.setEnabled(False)
|
|
else:
|
|
if self.step is not None and not self.blow_on:
|
|
if self.step.spec.get("autotest", False) is not True:
|
|
self.display_text(text="PROVA TENUTA IN CORSO")
|
|
else:
|
|
self.display_text(text="AUTOTEST: PROVA TENUTA IN CORSO")
|
|
self.start_b.setEnabled(False)
|
|
self.stop_b.setEnabled(True)
|
|
ok = data.get("results", {}).get("ok", None)
|
|
|
|
super().visualize(data, img=self.status_imgs_full[ok])
|
|
|
|
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)
|
|
QApplication.processEvents()
|
|
time.sleep(0.3)
|
|
QApplication.processEvents()
|
|
|
|
def set_digital_out(self,out_name=None,state=1,component_name="digital_io_flush_blow"):
|
|
if self.io_ok:
|
|
bit = int(self.parent.config[component_name][out_name])
|
|
ret = self.components[component_name].set_bit_verify(0,bit,state)
|
|
if not ret:
|
|
QMessageBox.critical(None, "ERRORE", f"ERRORE I/O DIGITALE - VERIFICARE CONNESSIONE USB")
|
|
self.io_ok = False
|
|
|
|
def save_last(self):
|
|
if self.last is None:
|
|
return
|