This commit is contained in:
matteo porta 2022-08-23 16:00:04 +02:00
parent cc59c09fd5
commit fa9921c9bc
19 changed files with 734 additions and 96 deletions

View File

@ -2,7 +2,7 @@
tecna_t3: present tecna_t3: present
neo_pixels: present neo_pixels: present
galaxy_camera: present galaxy_camera: present
multimeter: absent multicomp: present
[galaxy_camera] [galaxy_camera]
horizontal_resolution: 2448 horizontal_resolution: 2448
@ -45,6 +45,10 @@ admin_pin: 603
modify_pin: 603 modify_pin: 603
select_pin: 603 select_pin: 603
[multicomp]
port: COM3
baudrate: 115200
[neo_pixels] [neo_pixels]
port: COM1 port: COM1
baudrate: 9600 baudrate: 9600

View File

@ -1,2 +1,5 @@
[tecna_t3] [tecna_t3]
port: /dev/ttyUSB0 port: /dev/ttyUSB0
[multicomp]
port: /dev/ttyUSB1

View File

@ -2,11 +2,12 @@ from .archive_synchronizer import ArchiveSynchronizer
from .consumer import Consumer from .consumer import Consumer
from .galaxy_camera import GalaxyCamera from .galaxy_camera import GalaxyCamera
from .modbus_component import ModbusComponent from .modbus_component import ModbusComponent
from .multicomp_730424 import Multicomp730424
from .neo_pixels import NeoPixels from .neo_pixels import NeoPixels
from .os_label_printer import Os_Label_Printer from .os_label_printer import Os_Label_Printer
from .remote_api import RemoteAPI from .remote_api import RemoteAPI
from .serial_label_printer import Serial_Label_Printer from .serial_label_printer import Serial_Label_Printer
from .tecna_marposs_provaset_t3p import TecnaMarpossProvasetT3P from .tecna_marposs_provaset_t3p import TecnaMarpossProvasetT3P
from .test_component import TestComponent from .test_component import TestComponent
#from .vision import Vision from .vision import Vision
from .vision_saver import VisionSaver from .vision_saver import VisionSaver

View File

@ -1,33 +1,70 @@
import sys import sys
import traceback
if "--sim-multimeter" in sys.argv: if "--sim-serial" in sys.argv:
from components.dummies.serial import serial from components.dummies.serial import serial
else: else:
import serial import serial
from PyQt5.QtWidgets import QMessageBox
from .component import Component from .component import Component
class SerialMultimeter(Component): class Multicomp730424(Component):
def __init__(self, config=None, name=None): def __init__(self, config=None, name=None, period=1, lazy=True, paused=False, threaded=True):
super().__init__(config=config, name=name, threaded=False) self.conn = None
super().__init__(config=config, name=name, period=period, lazy=lazy, paused=paused, threaded=threaded)
def config_changed(self):
self.port = self.config[self.name]["port"]
self.baudrate = int(self.config[self.name]["baudrate"])
self.stopbits = getattr(serial, self.config[self.name].get("stopbits", "stopbits_one").upper())
self.parity = getattr(serial, self.config[self.name].get("parity", "parity_none").upper())
self.bytesize = getattr(serial, self.config[self.name].get("bytesize", "eightbits").upper())
if self.conn is not None:
self.conn.close()
self.conn = serial.Serial(
self.port,
baudrate=self.baudrate,
stopbits=self.stopbits,
parity=self.parity,
bytesize=self.bytesize,
)
def set_resistance_scale(self, resistance):
self.write(f"CONF:RES {resistance}")
def read(self):
try:
response = self.conn.readline()
except serial.serialutil.SerialException:
self.log.exception(traceback.format_exc())
return None
try:
decoded = response.decode("ascii")
except UnicodeDecodeError:
return response
try:
value = float(decoded)
except ValueError:
return decoded
return value
def write(self, command): def write(self, command):
try: try:
conn = serial.Serial( self.conn.write(f"{command}\n".encode("ascii"))
self.address, except serial.serialutil.SerialException:
baudrate=self.baudrate, self.log.exception(traceback.format_exc())
stopbits=self.stopbits,
parity=self.parity, def _get(self):
bytesize=self.bytesize, info = {}
) try:
conn.write(bytes(command, encoding="ascii")) for value_name, command in {
conn.close() "scale": "CONF:RES?",
except serial.serialutil.SerialException as e: "measure": "MEAS?",
QMessageBox.critical( }.items():
None, self.write(command)
"Errore Connessione Multimetro", info[value_name] = self.read()
"Non e stato possibile connettersi al multimetro digitale.\n Verificare che lo strumento sia acceso e collegato\nErrore: " + str(e) except serial.serialutil.SerialException:
) self.log.exception(traceback.format_exc())
self.log.debug(str(info))
super()._get([info])

View File

@ -48,7 +48,6 @@ class NeoPixels(Component):
response = self.conn.readline() response = self.conn.readline()
if response != b"ok\n": if response != b"ok\n":
self.log.error(response.strip()) self.log.error(response.strip())
# self.conn.close()
except serial.serialutil.SerialException: except serial.serialutil.SerialException:
self.log.exception(traceback.format_exc()) self.log.exception(traceback.format_exc())

View File

@ -52,8 +52,8 @@ logging.basicConfig(
try: try:
# IMPORT PROJECT ONLY AFTER SETTING UP SIGNAL, FAULTHANDLER AND LOGGHING # IMPORT PROJECT ONLY AFTER SETTING UP SIGNAL, FAULTHANDLER AND LOGGHING
from components import (ArchiveSynchronizer, GalaxyCamera, NeoPixels, from components import (ArchiveSynchronizer, GalaxyCamera, Multicomp730424,
Os_Label_Printer, RemoteAPI, NeoPixels, Os_Label_Printer, RemoteAPI,
TecnaMarpossProvasetT3P, VisionSaver) TecnaMarpossProvasetT3P, VisionSaver)
from lib.db import Users from lib.db import Users
from lib.helpers import ConfigReader from lib.helpers import ConfigReader
@ -78,22 +78,13 @@ try:
# 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}},
"label_printer": {"c": Os_Label_Printer, "t": False}, "label_printer": {"c": Os_Label_Printer, "t": False},
"neo_pixels": {"c": NeoPixels, "t": False}, "multicomp": {"c": Multicomp730424, "k": {"paused": True}},
"remote_api": {"c": RemoteAPI, "k": {"main": self}}, "remote_api": {"c": RemoteAPI, "k": {"main": self}},
"tecna_t3": {"c": TecnaMarpossProvasetT3P, "k": {"paused": True}},
"vision_saver": {"c": VisionSaver, "t": False},
} }
for component_name in list(self.components_specs):
for key in self.components_specs.copy().keys(): if self.config.get("hardware_config", {}).get(component_name, None) != "present":
if key in self.config["hardware_config"].keys() and self.config["hardware_config"][key] != "present": self.components_specs.pop(component_name)
self.components_specs.pop(key)
if self.config["hardware_config"]["vision"] is "present":
from src.components.vision import Vision
self.components_specs["vision"]= {"c": Vision, "k": {"paused": True}}
self.components = {} self.components = {}
self.threads = {} self.threads = {}
for component_name, spec in self.components_specs.items(): for component_name, spec in self.components_specs.items():

View File

@ -14,14 +14,15 @@ conn = serial.Serial(
timeout=1 timeout=1
) )
cmd_list = (("*IDN?\n", True), # QUERY ID cmd_list = [
("CONF:RES 500\n", False), # SET RESISTANCE MEASURE, 500 Ohm range ["*IDN?\n", True], # QUERY ID
("MEAS?\n", True), # GET MEASURE ["CONF:RES 500\n", False], # SET RESISTANCE MEASURE, 500 Ohm range
("MEAS?\n", True), # GET MEASURE ["MEAS?\n", True], # GET MEASURE
("MEAS?\n", True)) # GET MEASURE ["MEAS?\n", True], # GET MEASURE
["MEAS?\n", True], # GET MEASURE
]
for cmditem in cmd_list: for [cmd, expect_response] in cmd_list:
cmd, expect_response = cmditem
conn.write(bytes(cmd, encoding="ascii")) conn.write(bytes(cmd, encoding="ascii"))
if expect_response: if expect_response:
response = conn.readline() response = conn.readline()

View File

@ -20,6 +20,7 @@ from .recipe_selection import Recipe_Selection
from .recipe_spec_and_step_editor import Recipe_Spec_And_Step_Editor from .recipe_spec_and_step_editor import Recipe_Spec_And_Step_Editor
from .recipe_spec_editor import Recipe_Spec_Editor from .recipe_spec_editor import Recipe_Spec_Editor
from .recipes_management import Recipes_Management from .recipes_management import Recipes_Management
from .resistance_step_editor import Resistance_Step_Editor
from .steps_management import Steps_Management from .steps_management import Steps_Management
from .test import Test from .test import Test
from .test_admin_permission import Test_Admin_Permission from .test_admin_permission import Test_Admin_Permission
@ -28,6 +29,7 @@ from .test_autotest import Test_Autotest
from .test_barcodes import Test_Barcodes from .test_barcodes import Test_Barcodes
from .test_home import Test_Home from .test_home import Test_Home
from .test_leak import Test_Leak from .test_leak import Test_Leak
from .test_resistance import Test_Resistance
from .test_test import Test_Test from .test_test import Test_Test
from .test_vision import Test_Vision from .test_vision import Test_Vision
from .users_management import Users_Management from .users_management import Users_Management

View File

@ -2,6 +2,7 @@ from lib.db import Steps
from ui.editor import Editor from ui.editor import Editor
from ui.helpers import replace_widget from ui.helpers import replace_widget
from ui.leak_step_editor import Leak_Step_Editor from ui.leak_step_editor import Leak_Step_Editor
from ui.resistance_step_editor import Resistance_Step_Editor
from ui.vision_step_editor import Vision_Step_Editor from ui.vision_step_editor import Vision_Step_Editor
@ -27,6 +28,12 @@ class Recipe_Spec_And_Step_Editor(Editor):
"widget": "leak_editor_2_w", "widget": "leak_editor_2_w",
"editor": Leak_Step_Editor(), "editor": Leak_Step_Editor(),
}, },
"resistance": {
"type": "resistance",
"enable": self.resistance_eabled_cb,
"widget": "resistance_editor_w",
"editor": Resistance_Step_Editor(),
},
"vision": { "vision": {
"type": "vision", "type": "vision",
"enable": self.vision_enabled_cb, "enable": self.vision_enabled_cb,

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>739</width> <width>292</width>
<height>190</height> <height>152</height>
</rect> </rect>
</property> </property>
<property name="font"> <property name="font">
@ -169,6 +169,49 @@ Fasi di Test</string>
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_6">
<attribute name="title">
<string>Test resistenza</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>66</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_12">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>65</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="resistance_eabled_cb">
<property name="text">
<string>Fase Abilitata</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QWidget" name="resistance_editor_w" native="true"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4"> <widget class="QWidget" name="tab_4">
<attribute name="title"> <attribute name="title">
<string>Test telecamera</string> <string>Test telecamera</string>

View File

@ -0,0 +1 @@
from .resistance_step_editor import Resistance_Step_Editor

View File

@ -0,0 +1,11 @@
from ui.editor import Editor
class Resistance_Step_Editor(Editor):
def __init__(self, cell_widget=None):
super().__init__(cell_widget=cell_widget)
self.spec.update({
"scale": self.scale_sb,
"expected": self.expected_sb,
"tolerance": self.tolerance_sb,
})

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Resistance_Step_Editor</class>
<widget class="QWidget" name="Resistance_Step_Editor">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>197</width>
<height>130</height>
</rect>
</property>
<property name="windowTitle">
<string>Resistance Step Editor</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="title">
<string>Resistenza</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="1">
<widget class="QSpinBox" name="expected_sb">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="scale_sb">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Scala</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_19">
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Valore atteso</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Tolleranza</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="tolerance_sb">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_20">
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,6 +1,7 @@
import logging import logging
import os import os
import sys import sys
import weakref
from datetime import datetime from datetime import datetime
from lib.db import Archive, Steps, Users from lib.db import Archive, Steps, Users
@ -13,6 +14,7 @@ from ui.test_assembly import Test_Assembly
from ui.test_autotest import Test_Autotest from ui.test_autotest import Test_Autotest
from ui.test_barcodes import Test_Barcodes from ui.test_barcodes import Test_Barcodes
from ui.test_leak import Test_Leak from ui.test_leak import Test_Leak
from ui.test_resistance import Test_Resistance
from ui.test_vision import Test_Vision from ui.test_vision import Test_Vision
from ui.widget import Widget from ui.widget import Widget
@ -46,6 +48,7 @@ class Test(Widget):
"fail": Test_Assembly(img_path=self.select_step_img("fail"), text=u"CICLO INTERROTTO", widget=None), "fail": Test_Assembly(img_path=self.select_step_img("fail"), text=u"CICLO INTERROTTO", widget=None),
"leak": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step)), "leak": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step)),
"print": Test_Assembly(img_path=self.select_step_img("print"), text=u"STAMPA ETICHETTA IN CORSO", widget=None), "print": Test_Assembly(img_path=self.select_step_img("print"), text=u"STAMPA ETICHETTA IN CORSO", widget=None),
"resistance": Test_Assembly(img_path=None, text=u"VERIFICARE CONTROLLO RESISTENZA", widget=Test_Resistance(components=self.components, recipe=self.recipe, step=self.step)),
"select_recipe": Test_Assembly(img_path=None, text=u"SELEZIONARE IL CODICE DA COLLAUDARE", widget=Recipe_Selection()), "select_recipe": Test_Assembly(img_path=None, text=u"SELEZIONARE IL CODICE DA COLLAUDARE", widget=Recipe_Selection()),
"vision": Test_Assembly(img_path=None, text=u"VERIFICARE CONTROLLO CON TELECAMERA", widget=Test_Vision(components=self.components, recipe=self.recipe, step=self.step)), "vision": Test_Assembly(img_path=None, text=u"VERIFICARE CONTROLLO CON TELECAMERA", widget=Test_Vision(components=self.components, recipe=self.recipe, step=self.step)),
"wait": Test_Assembly(img_path=self.select_step_img("wait"), text=u"ATTENDERE - PAUSA INTER CICLO", widget=None), "wait": Test_Assembly(img_path=self.select_step_img("wait"), text=u"ATTENDERE - PAUSA INTER CICLO", widget=None),
@ -68,17 +71,13 @@ class Test(Widget):
# CONNECT CYCLE CONTROLS # CONNECT CYCLE CONTROLS
self.cancel_b.clicked.connect(self.fail_cycle) self.cancel_b.clicked.connect(self.fail_cycle)
self.change_recipe_b.clicked.connect(self.change_recipe) self.change_recipe_b.clicked.connect(self.change_recipe)
for w in self.cycle_available_steps.values(): for step_name, w in self.cycle_available_steps.items():
if hasattr(w, "ok"): if hasattr(w, "ok"):
# custom ok handlers should call next again # custom ok handlers should call next again
if type(w.widget) is Recipe_Selection: if isinstance(w.widget, (Recipe_Selection)):
w.ok.connect(self.set_recipe) w.ok.connect(self.set_recipe)
elif type(w.widget) is Test_Barcodes: elif isinstance(w.widget, (Test_Barcodes, Test_Leak, Test_Resistance, Test_Vision)):
w.ok.connect(self.set_barcodes) w.ok.connect(lambda data=None, step_name=step_name, self=weakref.ref(self): self().set_step(step_name, data))
elif type(w.widget) is Test_Leak:
w.ok.connect(self.set_leak)
elif type(w.widget) is Test_Vision:
w.ok.connect(self.set_vision)
else: else:
w.ok.connect(self.next) w.ok.connect(self.next)
if hasattr(w, "ko"): if hasattr(w, "ko"):
@ -247,42 +246,28 @@ class Test(Widget):
self.recipe_l.setText("NON SELEZIONATA") self.recipe_l.setText("NON SELEZIONATA")
self.recipe_l.setStyleSheet("QLabel { color: red; }") self.recipe_l.setStyleSheet("QLabel { color: red; }")
def set_barcodes(self, barcodes=None): def set_step(self, step_name, data=None):
if "barcodes" not in self.data: if step_name not in self.data:
self.data["barcodes"] = {} self.data[step_name] = {}
self.data["barcodes"].update(barcodes) data["step"] = model_to_dict(self.step)
self.next() self.data[step_name][len(self.data[step_name])] = data
self.data["overridden"] = self.data["overridden"] or data.get("overridden", False)
def set_leak(self, leak=None): self.data["ok"] = self.data["ok"] and data.get("ok", False)
if "leak" not in self.data:
self.data["leak"] = {}
leak["step"] = model_to_dict(self.step)
self.data["leak"][len(self.data["leak"])] = leak
self.data["overridden"] = self.data["overridden"] or leak.get("overridden", False)
self.data["ok"] = self.data["ok"] and leak.get("ok", False)
self.next()
def set_vision(self, vision=None):
if "vision" not in self.data:
self.data["vision"] = {}
vision["step"] = model_to_dict(self.step)
self.data["vision"][len(self.data["vision"])] = vision
self.data["overridden"] = self.data["overridden"] or vision.get("overridden", False)
self.data["ok"] = self.data["ok"] and vision.get("ok", False)
self.next() self.next()
def done(self, ok=True): def done(self, ok=True):
self.log.info("cycle done") self.log.info("cycle done")
vision_test_1 = self.data.get("vision", {}).get(0, {}) if "vision" in self.data:
out_paths = self.components["vision_saver"].save( vision_test_1 = self.data.get("vision", {}).get(0, {})
save_time=vision_test_1.get("time", None), out_paths = self.components["vision_saver"].save(
frame=vision_test_1.get("frame", None), save_time=vision_test_1.get("time", None),
# vision=vision_test_1.get("detections", None), frame=vision_test_1.get("frame", None),
) # vision=vision_test_1.get("detections", None),
self.log.info(f"cycle vision saved locally: {out_paths!r}") )
for vision in self.data["vision"].values(): self.log.info(f"cycle vision saved locally: {out_paths!r}")
vision.pop("frame", None) for vision in self.data.get("vision", {}).values():
vision.pop("render", None) vision.pop("frame", None)
vision.pop("render", None)
archived = Archive.archive(self.recipe, self.data, ok and self.data["ok"], overridden=self.data["overridden"]) archived = Archive.archive(self.recipe, self.data, ok and self.data["ok"], overridden=self.data["overridden"])
self.log.info(f"cycle archived locally: {archived!r}") self.log.info(f"cycle archived locally: {archived!r}")
# COUNT OK # COUNT OK

View File

@ -21,7 +21,7 @@ class Test_Leak(Test_Test):
self.stop_b.setEnabled(False) self.stop_b.setEnabled(False)
def stop(self): def stop(self):
# disable tes loop # disable test loop
self.components["tecna_t3"].stop_test() self.components["tecna_t3"].stop_test()
self.components["tecna_t3"].pause() self.components["tecna_t3"].pause()
self.disconnect(self.get_connection) self.disconnect(self.get_connection)

View File

@ -0,0 +1 @@
from .test_resistance import Test_Resistance

View File

@ -0,0 +1,73 @@
from ui.test_test import Test_Test
class Test_Resistance(Test_Test):
def __init__(self, components=None, recipe=None, step=None):
super().__init__(components=components, recipe=recipe, step=step)
def start(self, recipe=None, step=None):
super().start(recipe=recipe, step=step)
# setup test loop
self.components["multicomp"].set_resistance_scale(self.step.spec.get("expected", 0))
self.get_connection = self.components["multicomp"].out.connect(self.get)
self.components["multicomp"].resume()
if self.step is not None:
self.expected_l.setText(str(self.step.spec.get("expected", "-")))
self.tolerance_l.setText(str(self.step.spec.get("tolerance", "-")))
else:
self.expected_l.setText("-")
self.tolerance_l.setText("-")
def stop(self):
# disable test loop
self.components["multicomp"].pause()
self.disconnect(self.get_connection)
self.expected_l.setText("-")
self.tolerance_l.setText("-")
super().stop()
def get(self, data=None, override=False):
if self.done: # avoid proccessing if completed
return
if data is None or data[-1] is None:
super().get(None, override=override)
return
data = data[-1]
result = data["multicomp"].get("measure", None)
expected = self.step.spec.get("expected", "-")
tolerance = self.step.spec.get("tolerance", "-")
if all([
isinstance(result, (int, float)),
isinstance(expected, (int, float)),
isinstance(tolerance, (int, float)),
abs(result - expected) <= tolerance
]):
ok = True
else:
ok = None
super().get([{
"time": data.get("time", None),
"results": {
"ok": ok,
"result": result,
"data": data["multicomp"],
},
}], override=override, fail=ok is False)
def visualize(self, data=None):
if data is None:
data = {}
d = data.get("results", {}).get("data", {})
for k, l in {
"scale": self.scale_l,
"measure": self.resistance_l,
}.items():
v = d.get(k, "-")
if type(v) is float:
v = round(v, 2)
l.setText(str(v))
super().visualize(data)
def save_last(self):
if self.last is None:
return

View File

@ -0,0 +1,360 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Test_Resistance</class>
<widget class="QWidget" name="Test_Resistance">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>301</width>
<height>324</height>
</rect>
</property>
<property name="windowTitle">
<string>Test Resistance</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>PROVA RESISTENZA</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Scala misura</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="img_l">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="expected_l">
<property name="maximumSize">
<size>
<width>130</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);
border: 1px solid black;
</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="tolerance_l">
<property name="maximumSize">
<size>
<width>130</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);
border: 1px solid black;
</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="scale_l">
<property name="maximumSize">
<size>
<width>130</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);
border: 1px solid black;
</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Resistenza attesa</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_9">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Tolleranza</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_8">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Resistenza effettiva</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="resistance_l">
<property name="maximumSize">
<size>
<width>130</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);
border: 1px solid black;
</string>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>ohm</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Risultato</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QProgressBar" name="ok_counter_pb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="format">
<string>%v / %m</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="state_l">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="12" 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="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>FORZA ACCETTAZIONE</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -34,7 +34,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["neo_pixels"].set_all_pixel_color("#ffffff") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#ffffff")
self.components["vision"].set_recipe(self.step.spec.get("recipe", None)) 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()
@ -113,13 +114,17 @@ class Test_Vision(Test_Test):
img = self.status_imgs_full[None] img = self.status_imgs_full[None]
if self.done: if self.done:
if data.get("overridden", False): if data.get("overridden", False):
self.components["neo_pixels"].set_all_pixel_color("#ffff00") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#ffff00")
elif self.ok_counter >= self.ok_counter_limit: elif self.ok_counter >= self.ok_counter_limit:
self.components["neo_pixels"].set_all_pixel_color("#00ff00") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#00ff00")
else: else:
self.components["neo_pixels"].set_all_pixel_color("#ff0000") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#ff0000")
else: else:
self.components["neo_pixels"].set_all_pixel_color("#ffffff") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#ffffff")
# DETECTIONS TABLE # DETECTIONS TABLE
if results is not None: if results is not None:
self.results_tw.setRowCount(len(results)) self.results_tw.setRowCount(len(results))
@ -201,8 +206,10 @@ class Test_Vision(Test_Test):
def emit_ok(self): def emit_ok(self):
super().emit_ok() super().emit_ok()
self.components["neo_pixels"].set_all_pixel_color("#000000") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#000000")
def emit_ko(self): def emit_ko(self):
super().emit_ko() super().emit_ko()
self.components["neo_pixels"].set_all_pixel_color("#000000") if "neo_pixels" in self.components:
self.components["neo_pixels"].set_all_pixel_color("#000000")