wip
This commit is contained in:
parent
cc59c09fd5
commit
fa9921c9bc
@ -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
|
||||
|
||||
@ -1,2 +1,5 @@
|
||||
[tecna_t3]
|
||||
port: /dev/ttyUSB0
|
||||
|
||||
[multicomp]
|
||||
port: /dev/ttyUSB1
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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])
|
||||
|
||||
@ -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())
|
||||
|
||||
|
||||
21
src/main.py
21
src/main.py
@ -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():
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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>
|
||||
|
||||
1
src/ui/resistance_step_editor/__init__.py
Normal file
1
src/ui/resistance_step_editor/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .resistance_step_editor import Resistance_Step_Editor
|
||||
11
src/ui/resistance_step_editor/resistance_step_editor.py
Normal file
11
src/ui/resistance_step_editor/resistance_step_editor.py
Normal 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,
|
||||
})
|
||||
112
src/ui/resistance_step_editor/resistance_step_editor.ui
Normal file
112
src/ui/resistance_step_editor/resistance_step_editor.ui
Normal 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>
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
1
src/ui/test_resistance/__init__.py
Normal file
1
src/ui/test_resistance/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .test_resistance import Test_Resistance
|
||||
73
src/ui/test_resistance/test_resistance.py
Normal file
73
src/ui/test_resistance/test_resistance.py
Normal 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
|
||||
360
src/ui/test_resistance/test_resistance.ui
Normal file
360
src/ui/test_resistance/test_resistance.ui
Normal 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>
|
||||
@ -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")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user