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

259 lines
9.5 KiB
Python
Raw Normal View History

2022-07-12 08:48:04 +00:00
import sys
2023-05-18 08:40:16 +00:00
import time
2022-08-02 16:15:30 +00:00
import weakref
2023-05-18 08:40:16 +00:00
from datetime import datetime
2022-07-12 08:48:04 +00:00
from lib.helpers import timing
from PyQt5.QtCore import Qt, QTimer, pyqtSignal
from PyQt5.QtGui import QColor, QPalette, QPixmap
from ui import Dialog
from ui.test_admin_permission import Test_Admin_Permission
from ui.widget import Widget
class Test_Test(Widget):
2022-09-13 11:01:00 +00:00
ok = pyqtSignal(object)
ko = pyqtSignal(object)
2022-07-12 08:48:04 +00:00
2022-11-02 13:11:32 +00:00
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, reset_on_start=True, enable_override=True):
2022-07-12 08:48:04 +00:00
super().__init__()
self.components = components
self.recipe = recipe
2022-07-19 09:59:00 +00:00
self.step = step
2022-10-18 09:57:08 +00:00
self.pieces = pieces
2022-08-24 10:59:16 +00:00
self.run_once = run_once
2022-11-02 13:11:32 +00:00
self.reset_on_start = reset_on_start
2022-09-06 13:15:01 +00:00
self.enable_override = enable_override
2022-07-12 08:48:04 +00:00
# setup variables
self.ok_counter = 0
self.ok_counter_limit = 1
# setup controls
2022-07-27 12:54:19 +00:00
self.done = False
2022-08-24 10:59:16 +00:00
self.done_ok = None
2022-07-12 08:48:04 +00:00
self.ok_timer = QTimer()
self.ok_timer.setSingleShot(True)
2022-10-19 12:09:15 +00:00
self.ok_timer.setInterval(1000)
2022-07-12 08:48:04 +00:00
self.ok_timer.timeout.connect(self.emit_ok)
2022-07-19 09:59:00 +00:00
self.ko_timer = QTimer()
self.ko_timer.setSingleShot(True)
2022-10-19 12:09:15 +00:00
self.ko_timer.setInterval(1000)
2022-07-19 09:59:00 +00:00
self.ko_timer.timeout.connect(self.emit_ko)
2022-07-12 08:48:04 +00:00
# setup save frame button
self.last = None
2022-07-25 13:36:42 +00:00
if hasattr(self, "save_b"):
self.save_b.setEnabled(False)
self.save_b.clicked.connect(self.save_last)
2022-07-12 08:48:04 +00:00
# setup override
self.admin_challenged = False
2022-09-06 13:15:01 +00:00
if hasattr(self, "override_b"):
2023-06-26 17:21:12 +00:00
if self.enable_override:
self.override_b.setVisible(True)
self.override_b.setEnabled(True)
else:
self.override_b.setVisible(False)
self.override_b.setEnabled(False)
2022-09-06 13:15:01 +00:00
self.override_b.clicked.connect(self.override)
2022-07-12 08:48:04 +00:00
# setup vision staus gui
2022-08-02 16:15:30 +00:00
self.parent_assembly_widget = None
2022-07-12 08:48:04 +00:00
self.status_imgs_full = {
True: QPixmap("src/ui/imgs/success.png"),
"": QPixmap("src/ui/imgs/neo.ico"),
"warning": QPixmap("src/ui/imgs/warning.png"),
2023-01-05 11:16:04 +00:00
"wait": QPixmap("src/ui/imgs/wait.png"),
2023-08-24 16:20:52 +00:00
"calibrated-leak": QPixmap("src/ui/imgs/calibrated-leak.png"),
"calibrated-leak-remove": QPixmap("src/ui/imgs/calibrated-leak-remove.png"),
2022-07-12 08:48:04 +00:00
False: QPixmap("src/ui/imgs/fail.png"),
None: QPixmap("src/ui/imgs/wait.png"),
}
self.status_imgs_small = {k: i.scaled(32, 32, Qt.KeepAspectRatio, Qt.SmoothTransformation) for k, i in self.status_imgs_full.items()}
self.status_palettes = {
True: QPalette(),
"": QPalette(),
"warning": QPalette(),
False: QPalette(),
None: QPalette(),
}
self.status_palettes[True].setColor(QPalette.Base, Qt.green)
self.status_palettes[False].setColor(QPalette.Base, Qt.red)
self.status_palettes["warning"].setColor(QPalette.Base, QColor(255, 165, 0))
self.status_palettes[""].setColor(QPalette.Base, QColor(255, 255, 0))
2022-10-24 14:51:58 +00:00
self.reset()
2022-07-12 08:48:04 +00:00
self.visualize()
2022-08-02 16:15:30 +00:00
def set_parent_assembly_widget(self, parent_assembly_widget=None):
if parent_assembly_widget is None:
self.parent_assembly_widget = None
elif type(parent_assembly_widget) is weakref.ReferenceType:
self.parent_assembly_widget = parent_assembly_widget
else:
self.parent_assembly_widget = weakref.ref(parent_assembly_widget)
2022-10-18 09:57:08 +00:00
def start(self, recipe=None, step=None, pieces=None):
2022-07-26 15:27:51 +00:00
self.admin_challenged = False
2022-07-12 08:48:04 +00:00
self.recipe = recipe
2022-07-19 09:59:00 +00:00
self.step = step
2022-10-18 09:57:08 +00:00
self.pieces = pieces
2022-08-24 10:59:16 +00:00
if self.run_once is True and self.done is True and self.done_ok is True:
2022-10-18 09:57:08 +00:00
return False
2022-11-02 13:11:32 +00:00
if self.reset_on_start:
self.reset()
2022-09-06 13:15:01 +00:00
if self.enable_override:
self.override_b.setVisible(True)
self.override_b.setEnabled(True)
elif hasattr(self, "override_b"):
self.override_b.setVisible(False)
self.override_b.setEnabled(False)
2022-07-12 08:48:04 +00:00
self.visualize()
# start test
self.start_time = timing()
# TESTING
if "--test" in sys.argv:
2022-09-06 13:15:01 +00:00
if self.enable_override and hasattr(self, "_test_overridden_test_"):
2022-07-12 08:48:04 +00:00
del self._test_overridden_test_
# /TESTING
2022-10-18 09:57:08 +00:00
return True
2022-07-12 08:48:04 +00:00
def stop(self):
pass
2022-08-24 10:59:16 +00:00
def reset(self):
self.ok_counter = 0
self.done = False
self.done_ok = None
self.last = None
2022-10-18 09:57:08 +00:00
def get(self, data=None, override=False, fail=False, preserve_counter=False, skip_delay=False):
2023-05-18 08:40:16 +00:00
cur_timing = timing()
2022-07-27 12:54:19 +00:00
if self.done: # avoid proccessing if completed
2022-07-12 08:48:04 +00:00
return
if data is None:
2022-07-19 09:59:00 +00:00
data = self.last if self.last is not None else {}
2022-07-12 08:48:04 +00:00
else:
2022-07-19 09:59:00 +00:00
data_usable = [d is not None for d in reversed(data)]
if not any(data_usable):
data = self.last if self.last is not None else {}
else:
data = data[-data_usable.index(True) - 1]
2023-05-20 07:13:03 +00:00
data["time"] = datetime.now().strftime("%H:%M:%S")
2022-07-20 17:29:11 +00:00
if fail:
result_ok = False
elif override:
2022-07-12 08:48:04 +00:00
result_ok = True
2022-07-20 17:29:11 +00:00
else:
result_ok = data.get("results", {}).get("ok", None)
2023-05-18 08:40:16 +00:00
duration=cur_timing - self.start_time
2023-05-20 07:13:03 +00:00
data.pop("step",None)
2022-07-12 08:48:04 +00:00
self.last = {
**data,
"overridden": override,
2023-05-18 14:12:40 +00:00
"duration": float(f"{duration:.2f}"),
2022-07-12 08:48:04 +00:00
"ok": result_ok,
}
2022-07-19 09:59:00 +00:00
if fail:
self.ok_counter = 0
elif override:
self.ok_counter = self.ok_counter_limit
2022-07-20 17:29:11 +00:00
elif result_ok is True:
self.ok_counter += 1
2022-10-04 11:51:36 +00:00
elif not preserve_counter:
2022-07-20 17:29:11 +00:00
self.ok_counter = 0
2022-07-12 08:48:04 +00:00
# check if completed
2022-07-19 09:59:00 +00:00
if fail:
2022-07-27 12:54:19 +00:00
self.done = True
2022-08-24 10:59:16 +00:00
self.done_ok = False
2022-09-06 13:15:01 +00:00
if hasattr(self, "override_b"):
self.override_b.setEnabled(False)
2022-07-19 09:59:00 +00:00
self.stop()
2022-10-18 09:57:08 +00:00
if skip_delay:
self.emit_ko()
else:
self.ko_timer.start()
2022-07-19 09:59:00 +00:00
elif self.ok_counter >= self.ok_counter_limit:
2022-07-27 12:54:19 +00:00
self.done = True
2022-08-24 10:59:16 +00:00
self.done_ok = True
2022-09-06 13:15:01 +00:00
if hasattr(self, "override_b"):
self.override_b.setEnabled(False)
2022-07-12 08:48:04 +00:00
self.stop()
2022-10-18 09:57:08 +00:00
if skip_delay:
self.emit_ok()
else:
self.ok_timer.start()
2022-07-12 08:48:04 +00:00
self.visualize(self.last)
# TESTING
if "--test" in sys.argv:
2022-09-06 13:15:01 +00:00
if self.enable_override and not hasattr(self, "_test_overridden_test_"):
2022-07-12 08:48:04 +00:00
self._test_overridden_test_ = True
self.override_b.click()
# /TESTING
def visualize(self, data=None, img=None):
if data is None:
data = {}
overridden = data.get("overridden", False)
results = data.get("results", None)
2022-07-25 13:36:42 +00:00
if hasattr(self, "save_b"):
self.save_b.setEnabled(self.last is not None)
if hasattr(self, "state_l"):
2022-07-12 08:48:04 +00:00
if overridden:
2022-07-25 13:36:42 +00:00
self.state_l.setPixmap(self.status_imgs_small["warning"])
elif results is None:
self.state_l.setPixmap(self.status_imgs_small[None])
elif results.get("ok", None) is True:
self.state_l.setPixmap(self.status_imgs_small[True])
2022-07-12 08:48:04 +00:00
else:
2022-07-25 13:36:42 +00:00
self.state_l.setPixmap(self.status_imgs_small[False])
if hasattr(self, "ok_counter_pb"):
self.ok_counter_pb.setMaximum(self.ok_counter_limit)
self.ok_counter_pb.setValue(min(self.ok_counter, self.ok_counter_limit))
if self.ok_counter >= self.ok_counter_limit:
self.ok_counter_pb.setPalette(self.status_palettes[True])
else:
self.ok_counter_pb.setPalette(self.status_palettes[False])
if hasattr(self, "img_l"):
if img is None:
if overridden:
self.img = self.status_imgs_full["warning"]
elif results is None or results.get("ok", None) is None:
self.img = self.status_imgs_full[None]
elif results.get("ok", None) is False:
self.img = self.status_imgs_full[False]
else:
self.img = self.status_imgs_full[None]
else:
self.img = img
2022-07-12 08:48:04 +00:00
self.resizeEvent()
def save_last(self):
if self.last is None:
return
def resizeEvent(self, event=None):
2022-07-25 13:36:42 +00:00
if hasattr(self, "img_l"):
self.img_l.setPixmap(self.img.scaled(self.img_l.width(), self.img_l.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
2022-07-12 08:48:04 +00:00
def challenge_admin(self, info):
if not self.admin_challenged:
d = Dialog(parent=self)
d.setCentralWidget(Test_Admin_Permission(info))
d.setModal(True)
d.show()
2022-07-18 16:51:02 +00:00
d.centralWidget.password_le.setFocus()
2022-07-12 08:48:04 +00:00
r = d.exec()
if r == d.Accepted:
self.admin_challenged = True
elif r == d.Rejected:
self.admin_challenged ^= False
else:
raise AssertionError("Bad admin challenge dialog return code")
return self.admin_challenged
def override(self):
if self.challenge_admin("Si sta tentando di bypassare il test"):
self.get(override=True)
def emit_ok(self):
self.ok.emit(self.last)
2022-07-19 09:59:00 +00:00
def emit_ko(self):
self.ko.emit(self.last)