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
neo_pixels: present
galaxy_camera: present
multimeter: absent
multicomp: present
[galaxy_camera]
horizontal_resolution: 2448
@ -45,6 +45,10 @@ admin_pin: 603
modify_pin: 603
select_pin: 603
[multicomp]
port: COM3
baudrate: 115200
[neo_pixels]
port: COM1
baudrate: 9600

View File

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

View File

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

View File

@ -1,33 +1,70 @@
import sys
import traceback
if "--sim-multimeter" in sys.argv:
if "--sim-serial" in sys.argv:
from components.dummies.serial import serial
else:
import serial
from PyQt5.QtWidgets import QMessageBox
from .component import Component
class SerialMultimeter(Component):
def __init__(self, config=None, name=None):
super().__init__(config=config, name=name, threaded=False)
class Multicomp730424(Component):
def __init__(self, config=None, name=None, period=1, lazy=True, paused=False, threaded=True):
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):
try:
conn = serial.Serial(
self.address,
baudrate=self.baudrate,
stopbits=self.stopbits,
parity=self.parity,
bytesize=self.bytesize,
)
conn.write(bytes(command, encoding="ascii"))
conn.close()
except serial.serialutil.SerialException as e:
QMessageBox.critical(
None,
"Errore Connessione Multimetro",
"Non e stato possibile connettersi al multimetro digitale.\n Verificare che lo strumento sia acceso e collegato\nErrore: " + str(e)
)
self.conn.write(f"{command}\n".encode("ascii"))
except serial.serialutil.SerialException:
self.log.exception(traceback.format_exc())
def _get(self):
info = {}
try:
for value_name, command in {
"scale": "CONF:RES?",
"measure": "MEAS?",
}.items():
self.write(command)
info[value_name] = self.read()
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()
if response != b"ok\n":
self.log.error(response.strip())
# self.conn.close()
except serial.serialutil.SerialException:
self.log.exception(traceback.format_exc())

View File

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

View File

@ -14,14 +14,15 @@ conn = serial.Serial(
timeout=1
)
cmd_list = (("*IDN?\n", True), # QUERY ID
("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
cmd_list = [
["*IDN?\n", True], # QUERY ID
["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
]
for cmditem in cmd_list:
cmd, expect_response = cmditem
for [cmd, expect_response] in cmd_list:
conn.write(bytes(cmd, encoding="ascii"))
if expect_response:
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_editor import Recipe_Spec_Editor
from .recipes_management import Recipes_Management
from .resistance_step_editor import Resistance_Step_Editor
from .steps_management import Steps_Management
from .test import Test
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_home import Test_Home
from .test_leak import Test_Leak
from .test_resistance import Test_Resistance
from .test_test import Test_Test
from .test_vision import Test_Vision
from .users_management import Users_Management

View File

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

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>739</width>
<height>190</height>
<width>292</width>
<height>152</height>
</rect>
</property>
<property name="font">
@ -169,6 +169,49 @@ Fasi di Test</string>
</item>
</layout>
</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">
<attribute name="title">
<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 os
import sys
import weakref
from datetime import datetime
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_barcodes import Test_Barcodes
from ui.test_leak import Test_Leak
from ui.test_resistance import Test_Resistance
from ui.test_vision import Test_Vision
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),
"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),
"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()),
"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),
@ -68,17 +71,13 @@ class Test(Widget):
# CONNECT CYCLE CONTROLS
self.cancel_b.clicked.connect(self.fail_cycle)
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"):
# 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)
elif type(w.widget) is Test_Barcodes:
w.ok.connect(self.set_barcodes)
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)
elif isinstance(w.widget, (Test_Barcodes, Test_Leak, Test_Resistance, Test_Vision)):
w.ok.connect(lambda data=None, step_name=step_name, self=weakref.ref(self): self().set_step(step_name, data))
else:
w.ok.connect(self.next)
if hasattr(w, "ko"):
@ -247,42 +246,28 @@ class Test(Widget):
self.recipe_l.setText("NON SELEZIONATA")
self.recipe_l.setStyleSheet("QLabel { color: red; }")
def set_barcodes(self, barcodes=None):
if "barcodes" not in self.data:
self.data["barcodes"] = {}
self.data["barcodes"].update(barcodes)
self.next()
def set_leak(self, leak=None):
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)
def set_step(self, step_name, data=None):
if step_name not in self.data:
self.data[step_name] = {}
data["step"] = model_to_dict(self.step)
self.data[step_name][len(self.data[step_name])] = data
self.data["overridden"] = self.data["overridden"] or data.get("overridden", False)
self.data["ok"] = self.data["ok"] and data.get("ok", False)
self.next()
def done(self, ok=True):
self.log.info("cycle done")
vision_test_1 = self.data.get("vision", {}).get(0, {})
out_paths = self.components["vision_saver"].save(
save_time=vision_test_1.get("time", 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():
vision.pop("frame", None)
vision.pop("render", None)
if "vision" in self.data:
vision_test_1 = self.data.get("vision", {}).get(0, {})
out_paths = self.components["vision_saver"].save(
save_time=vision_test_1.get("time", 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.get("vision", {}).values():
vision.pop("frame", None)
vision.pop("render", None)
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}")
# COUNT OK

View File

@ -21,7 +21,7 @@ class Test_Leak(Test_Test):
self.stop_b.setEnabled(False)
def stop(self):
# disable tes loop
# disable test loop
self.components["tecna_t3"].stop_test()
self.components["tecna_t3"].pause()
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.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.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"].resume()
self.components["galaxy_camera"].resume()
@ -113,13 +114,17 @@ class Test_Vision(Test_Test):
img = self.status_imgs_full[None]
if self.done:
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:
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:
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:
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
if results is not None:
self.results_tw.setRowCount(len(results))
@ -201,8 +206,10 @@ class Test_Vision(Test_Test):
def emit_ok(self):
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):
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")