This commit is contained in:
matteo porta 2022-07-27 14:54:19 +02:00
parent c450ab75c1
commit 1edfb24415
11 changed files with 57 additions and 65 deletions

View File

@ -556,7 +556,7 @@ class Vision(Component):
zone = self.zones[item_name] zone = self.zones[item_name]
items[str(item_name)] = { items[str(item_name)] = {
"center": zone["center"], "center": zone["center"],
"size": [s + 100 for s in zone["size"]], "size": zone["size"],
"shape": zone["shape"], "shape": zone["shape"],
**style, **style,
"border_color": Qt.green if item["ok"] else Qt.red, "border_color": Qt.green if item["ok"] else Qt.red,

View File

@ -61,26 +61,6 @@ if admin is None or not admin.is_admin:
Users.register(username="USER", password="user") Users.register(username="USER", password="user")
# Recipes.replace(
# id=0,
# name="Ferrari 923578",
# client="Ferrari",
# part_number="923578",
# spec={"steps": []},
# description="Tubo plastica doppia biforcazione con termorestringente centrale",
# archived=False,
# ).execute()
# Recipes.replace(
# id=1,
# name="BLOW-BY 5802814210",
# client="",
# part_number="5802814210",
# spec={"steps": []},
# description="Tubo blow-by",
# archived=False,
# ).execute()
if True: if True:
# crud_db must be imported after db and models_reference are available # crud_db must be imported after db and models_reference are available
from .crud_db import Crud_DB from .crud_db import Crud_DB

View File

@ -77,7 +77,7 @@ try:
self.config = ConfigReader() self.config = ConfigReader()
# INIT COMPONENT # INIT COMPONENT
self.components_specs = { self.components_specs = {
# "archive_synchronizer": {"c": ArchiveSynchronizer}, "archive_synchronizer": {"c": ArchiveSynchronizer},
"galaxy_camera": {"c": GalaxyCamera, "k": {"paused": True}}, "galaxy_camera": {"c": GalaxyCamera, "k": {"paused": True}},
"label_printer": {"c": Os_Label_Printer, "t": False}, "label_printer": {"c": Os_Label_Printer, "t": False},
"neo_pixels": {"c": NeoPixels, "t": False}, "neo_pixels": {"c": NeoPixels, "t": False},

View File

@ -1,5 +1,6 @@
import os
import sys import sys
from glob import iglob from glob import glob
from lib.db import Recipes, Users from lib.db import Recipes, Users
from PyQt5.QtCore import QTimer, pyqtSignal from PyQt5.QtCore import QTimer, pyqtSignal
@ -51,8 +52,8 @@ class Recipe_Selection(Widget):
"spec": { "spec": {
"step_editors": { "step_editors": {
"vision": { "vision": {
# "recipe": iglob("*.ini", root_dir="./config/vision/recipes/"), # only in python3.10 # "recipe": sorted(glob("*.ini", root_dir="./config/vision/recipes/") + glob("*.INI", root_dir="./config/vision/recipes/")), # only in python3.10
"recipe": list(iglob("./config/vision/recipes/*.ini")), "recipe": sorted(map(os.path.basename, glob("./config/vision/recipes/*.ini") + glob("./config/vision/recipes/*.INI"))),
}, },
}, },
}, },

View File

@ -48,7 +48,6 @@ class Test(Widget):
"print": Test_Assembly(self.select_step_img("print"), u"STAMPA ETICHETTA IN CORSO"), "print": Test_Assembly(self.select_step_img("print"), u"STAMPA ETICHETTA IN CORSO"),
"select_recipe": Test_Assembly(None, u"SELEZIONARE IL CODICE DA COLLAUDARE", Recipe_Selection()), "select_recipe": Test_Assembly(None, u"SELEZIONARE IL CODICE DA COLLAUDARE", Recipe_Selection()),
"vision": Test_Assembly(None, u"VERIFICARE CONTROLLO CON TELECAMERA", Test_Vision(components=self.components, recipe=self.recipe, step=self.step)), "vision": Test_Assembly(None, u"VERIFICARE CONTROLLO CON TELECAMERA", Test_Vision(components=self.components, recipe=self.recipe, step=self.step)),
"wait_start": Test_Assembly(self.select_step_img("wait_start"), u"PREMERE START PER INIZIARE PROVA TENUTA"),
"wait": Test_Assembly(self.select_step_img("wait"), u"ATTENDERE - PAUSA INTER CICLO"), "wait": Test_Assembly(self.select_step_img("wait"), u"ATTENDERE - PAUSA INTER CICLO"),
None: Test_Assembly(self.select_step_img("warning"), u"ATTENZIONE - LA RICETTA SELEZIONATA NON CONTIENE FASI DI TEST"), None: Test_Assembly(self.select_step_img("warning"), u"ATTENZIONE - LA RICETTA SELEZIONATA NON CONTIENE FASI DI TEST"),
} }
@ -296,7 +295,7 @@ class Test(Widget):
"TTEST": str(self.data.get("leak", [{}, {}])[0].get("step", {}).get("spec", {}).get("test_time", "-")), "TTEST": str(self.data.get("leak", [{}, {}])[0].get("step", {}).get("spec", {}).get("test_time", "-")),
"MAXLEAK": str(self.data.get("leak", [{}, {}])[0].get("step", {}).get("spec", {}).get("test_pressure_max_delta", "-")), "MAXLEAK": str(self.data.get("leak", [{}, {}])[0].get("step", {}).get("spec", {}).get("test_pressure_max_delta", "-")),
"PTESTMIN": str(self.data.get("leak", [{}, {}])[0].get("step", {}).get("spec", {}).get("test_pressure_min_delta", "-")), "PTESTMIN": str(self.data.get("leak", [{}, {}])[0].get("step", {}).get("spec", {}).get("test_pressure_min_delta", "-")),
"RESULT_L1": "ESITO", "RESULT_L1": "ESITO" + str(" FORZATO" if self.data.get("overridden", False) else ""),
"RESULT_L2": str("CONFORME" if self.data.get("leak", [{}, {}])[0].get("results", {}).get("ok", False) else "SCARTO"), "RESULT_L2": str("CONFORME" if self.data.get("leak", [{}, {}])[0].get("results", {}).get("ok", False) else "SCARTO"),
} }
self.components["label_printer"].print_label("EtichettaR5", context=context) self.components["label_printer"].print_label("EtichettaR5", context=context)

View File

@ -26,8 +26,7 @@ class Test_Barcodes(Test_Test):
# super().stop() # super().stop()
def get(self, data=None, override=False): def get(self, data=None, override=False):
if self.ok_timer.isActive(): if self.done: # avoid proccessing if completed
# avoid proccessing if completed
return return
if data is None: if data is None:
data = self.barcodes_le.text() data = self.barcodes_le.text()

View File

@ -32,6 +32,12 @@
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title"> <property name="title">
<string>Stato</string> <string>Stato</string>
</property> </property>

View File

@ -15,7 +15,6 @@ class Test_Leak(Test_Test):
self.components["tecna_t3"].write_recipe(self.recipe, self.step) self.components["tecna_t3"].write_recipe(self.recipe, self.step)
self.get_connection = self.components["tecna_t3"].out.connect(self.get) self.get_connection = self.components["tecna_t3"].out.connect(self.get)
self.components["tecna_t3"].resume() self.components["tecna_t3"].resume()
self.components["tecna_t3"].start_test()
def stop(self): def stop(self):
# disable tes loop # disable tes loop
@ -25,8 +24,7 @@ class Test_Leak(Test_Test):
super().stop() super().stop()
def get(self, data=None, override=False): def get(self, data=None, override=False):
if self.ok_timer.isActive(): if self.done: # avoid proccessing if completed
# avoid proccessing if completed
return return
if data is None or data[-1] is None: if data is None or data[-1] is None:
super().get(None, override=override) super().get(None, override=override)

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>322</width> <width>244</width>
<height>456</height> <height>456</height>
</rect> </rect>
</property> </property>
@ -475,32 +475,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="14" column="1">
<widget class="QPushButton" name="save_b">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>SALVA IMMAGINE</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QPushButton" name="override_b">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>FORZA ACCETTAZIONE</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
@ -1150,6 +1124,19 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="14" column="0" colspan="2">
<widget class="QPushButton" name="override_b">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>FORZA ACCETTAZIONE</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@ -21,6 +21,7 @@ class Test_Test(Widget):
self.ok_counter = 0 self.ok_counter = 0
self.ok_counter_limit = 1 self.ok_counter_limit = 1
# setup controls # setup controls
self.done = False
self.ok_timer = QTimer() self.ok_timer = QTimer()
self.ok_timer.setSingleShot(True) self.ok_timer.setSingleShot(True)
self.ok_timer.setInterval(2000) self.ok_timer.setInterval(2000)
@ -65,6 +66,8 @@ class Test_Test(Widget):
self.recipe = recipe self.recipe = recipe
self.step = step self.step = step
self.ok_counter = 0 self.ok_counter = 0
self.done = False
self.override_b.setEnabled(True)
self.visualize() self.visualize()
# start test # start test
self.start_time = timing() self.start_time = timing()
@ -78,8 +81,7 @@ class Test_Test(Widget):
pass pass
def get(self, data=None, override=False, fail=False): def get(self, data=None, override=False, fail=False):
if self.ok_timer.isActive() or self.ko_timer.isActive(): if self.done: # avoid proccessing if completed
# avoid proccessing if completed
return return
if data is None: if data is None:
data = self.last if self.last is not None else {} data = self.last if self.last is not None else {}
@ -113,9 +115,13 @@ class Test_Test(Widget):
self.ok_counter = 0 self.ok_counter = 0
# check if completed # check if completed
if fail: if fail:
self.done = True
self.override_b.setEnabled(False)
self.stop() self.stop()
self.ko_timer.start() self.ko_timer.start()
elif self.ok_counter >= self.ok_counter_limit: elif self.ok_counter >= self.ok_counter_limit:
self.done = True
self.override_b.setEnabled(False)
self.stop() self.stop()
self.ok_timer.start() self.ok_timer.start()
self.visualize(self.last) self.visualize(self.last)

View File

@ -22,7 +22,8 @@ class Test_Vision(Test_Test):
self.components["galaxy_camera"].add_sources({"test_vision": self.request_frame}) self.components["galaxy_camera"].add_sources({"test_vision": self.request_frame})
self.request_frame_connection = self.components["vision"].out.connect(self.request_frame) # request new frame as soon as vision finishes self.request_frame_connection = self.components["vision"].out.connect(self.request_frame) # request new frame as soon as vision finishes
self.get_connection = self.components["vision"].out.connect(self.get) self.get_connection = self.components["vision"].out.connect(self.get)
self.components["vision"].set_recipe(self.step.spec.get("recipe", "1.ini")) self.components["neo_pixels"].set_all_pixel_color("#ffffff")
self.components["vision"].set_recipe(self.step.spec.get("recipe", None))
self.components["vision"].resume() self.components["vision"].resume()
self.components["galaxy_camera"].resume() self.components["galaxy_camera"].resume()
self.request_frame.emit() # request first frame self.request_frame.emit() # request first frame
@ -37,8 +38,7 @@ class Test_Vision(Test_Test):
super().stop() super().stop()
def get(self, data=None, override=False): def get(self, data=None, override=False):
if self.ok_timer.isActive(): if self.done: # avoid proccessing if completed
# avoid proccessing if completed
return return
if data is None or data[-1] is None: if data is None or data[-1] is None:
super().get(None, override=override) super().get(None, override=override)
@ -72,6 +72,15 @@ class Test_Vision(Test_Test):
)) ))
else: else:
img = self.status_imgs_full[None] img = self.status_imgs_full[None]
if self.done:
if data.get("overridden", False):
self.components["neo_pixels"].set_all_pixel_color("#ffff00")
elif self.ok_counter >= self.ok_counter_limit:
self.components["neo_pixels"].set_all_pixel_color("#00ff00")
else:
self.components["neo_pixels"].set_all_pixel_color("#ff0000")
else:
self.components["neo_pixels"].set_all_pixel_color("#ffffff")
super().visualize(data, img=img) super().visualize(data, img=img)
def save_last(self): def save_last(self):
@ -81,4 +90,11 @@ class Test_Vision(Test_Test):
def emit_ok(self): def emit_ok(self):
self.last.pop("frame", None) self.last.pop("frame", None)
self.last.pop("render", None) self.last.pop("render", None)
self.ok.emit(self.last) super().emit_ok()
self.components["neo_pixels"].set_all_pixel_color("#000000")
def emit_ko(self):
self.last.pop("frame", None)
self.last.pop("render", None)
super().emit_ko()
self.components["neo_pixels"].set_all_pixel_color("#000000")