Merge remote-tracking branch 'origin/master'

# Conflicts:
#	config/machine_settings/recipes_defaults.csv
This commit is contained in:
neo-dl 2022-10-24 18:28:30 +02:00
commit 0591b9a126
29 changed files with 617 additions and 105 deletions

View File

@ -1,2 +1,2 @@
codice_ricetta,cliente,part_number,verifica_connettore_abilitata,connettore,verifica_codice_a_barre_abilitata,codice_a_barre,avvitatura_abilitata,viti,verifica_resistenza_connettore_abilitata,scala_resistenza,R nominale,tolleranza_resistenza,prova_tenuta_abilitata,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotmento,prova_tenuta_abilitata_2,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_riempimento_2,tempo_assestamento_2,percentuale_minima_pressione_assestamento_2,percentuale_massima_pressione_assestamento_2,tempo_di_test_2,pressione_di_test_delta_minimo_2,pressione_di_test_2,pressione_di_test_delta_massimo_2,tempo_svuotamento_2,pressione_svuotmento_2,test_visione_abilitato,ricetta_visione,stampa_etichetta_abilitata,modello_etichetta,descrizione
specificare ricetta,specificare cliente,specificare part number,,SCRx,,,,0,,500,1000000000,20,x,0,1000,5,5,5,5,5,200,1000,200,1,100,,0,1000,5,5,5,5,5,200,1000,200,1,100,,termorestringente_923578.ini,x,EtichettaR5.prn,inserire descrizione ricetta
codice_ricetta,cliente,part_number,dimensione_lotto_abilitata,dimensione_lotto,verifica_connettore_abilitata,connettore,verifica_codice_a_barre_abilitata,codice_a_barre,avvitatura_abilitata,viti,verifica_resistenza_connettore_abilitata,scala_resistenza,R nominale,tolleranza_resistenza,prova_tenuta_abilitata,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotmento,prova_tenuta_abilitata_2,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_riempimento_2,tempo_assestamento_2,percentuale_minima_pressione_assestamento_2,percentuale_massima_pressione_assestamento_2,tempo_di_test_2,pressione_di_test_delta_minimo_2,pressione_di_test_2,pressione_di_test_delta_massimo_2,tempo_svuotamento_2,pressione_svuotmento_2,test_visione_abilitato,ricetta_visione,stampa_etichetta_abilitata,modello_etichetta,descrizione
specificare ricetta,specificare cliente,specificare part number,,0,,SCRx,,,,0,,500,1000000000,20,x,0,1000,5,5,5,5,5,200,1000,200,1,100,,0,1000,5,5,5,5,5,200,1000,200,1,100,,termorestringente_923578.ini,x,EtichettaR5.prn,inserire descrizione ricetta

1 codice_ricetta cliente part_number dimensione_lotto_abilitata dimensione_lotto verifica_connettore_abilitata connettore verifica_codice_a_barre_abilitata codice_a_barre avvitatura_abilitata viti verifica_resistenza_connettore_abilitata scala_resistenza R nominale tolleranza_resistenza prova_tenuta_abilitata tempo_pre_riempimento pressione_pre_riempimento tempo_riempimento tempo_assestamento percentuale_minima_pressione_assestamento percentuale_massima_pressione_assestamento tempo_di_test pressione_di_test_delta_minimo pressione_di_test pressione_di_test_delta_massimo tempo_svuotamento pressione_svuotmento prova_tenuta_abilitata_2 tempo_pre_riempimento_2 pressione_pre_riempimento_2 tempo_riempimento_2 tempo_assestamento_2 percentuale_minima_pressione_assestamento_2 percentuale_massima_pressione_assestamento_2 tempo_di_test_2 pressione_di_test_delta_minimo_2 pressione_di_test_2 pressione_di_test_delta_massimo_2 tempo_svuotamento_2 pressione_svuotmento_2 test_visione_abilitato ricetta_visione stampa_etichetta_abilitata modello_etichetta descrizione
2 specificare ricetta specificare cliente specificare part number 0 SCRx 0 500 1000000000 20 x 0 1000 5 5 5 5 5 200 1000 200 1 100 0 1000 5 5 5 5 5 200 1000 200 1 100 termorestringente_923578.ini x EtichettaR5.prn inserire descrizione ricetta

View File

@ -1,5 +1,5 @@
[machine]
description = ~~~~~~~~~~ THIS ~~~~~~~~~~
description = ~~~~~~~~~~ THIS ~~~~~~~~~~
[hardware_config]
archive_synchronizer: present
@ -17,6 +17,10 @@ vision: present
[tecna_t3]
model: t3l
port: /dev/ttyUSB0
saver: present
saver_label_template: 6
saver_print_on_fail: yes
saver_label_count: 1
[multicomp]
port: /dev/ttyACM0

View File

@ -17,7 +17,6 @@ python -B -u "./src/main.py" \
--auto-login-admin \
--auto-select \
--debugger-workaround \
--enable-saving-tecna-recipes \
--no-edgetpu \
--no-gpu \
--panel \
@ -32,6 +31,7 @@ $* 2> >(sed $'s/.*/\e[31m&\e[m/' >&2) # &
# --auto-login-user \
# --autotests-archive \
# --camera-edits \
# --enable-saving-tecna-recipes \
# --fail-vision \
# --full-screen \
# --interact \

View File

@ -46,6 +46,10 @@ class TecnaMarpossProvasetT3(ModbusComponent):
self.set_measure_units()
self.units = self.get_measure_units()
self.max_program_number = self.read("Max number of programs")
self.saver_label_count = min(abs(int(self.config[self.name].get("saver_label_count", 1))), 0b1111)
self.saver_print_on_fail = 1 if self.config[self.name].get("saver_print_on_fail", "no").lower() in {"yes", "y", "on", "true", "1", "x"} else 0
self.saver_label_template = min(abs(int(self.config[self.name].get("saver_label_template", 1))), 0b11111111)
self.model = self.config[self.name]["model"].lower()
self.log.info(f"units: {self.units}")
# def unlock_tecna(self, **kwargs):
@ -295,8 +299,9 @@ class TecnaMarpossProvasetT3(ModbusComponent):
"Test program for read/write operation": table,
**{719 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # program name
**{727 - 1 + i: (recipe_barcode[i * 2 + 1] << 8) + recipe_barcode[i * 2] for i in range(12)}, # program associated bar-code
**{761 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # program name
"Print options": 0b0001000000000110,
**{761 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # print field 1
# **{769 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # print field 2
"Print options": 0b0000000000000000 | self.saver_label_count << 12 | self.saver_print_on_fail << 8 | self.saver_label_template,
"Test type": "Leak Test",
"Test flags": 0b0110000001011100,
"T0 - Pre-filling time": step.spec["pre_filling_time"],
@ -364,7 +369,7 @@ class TecnaMarpossProvasetT3(ModbusComponent):
if len(recipes) > max(self.max_program_number - 1, 0):
self.log.warning(f"too many recipes ({len(recipes)}) saving only first {max(self.max_program_number - 1, 0)}")
for i, [recipe, step] in enumerate(recipes[:max(self.max_program_number - 1, 0)], start=1):
print(recipe.part_number, 150 + i)
self.write_recipe(recipe, step, table=150 + i)
self.log.debug(f"saving recipe {recipe.part_number} to table {i}")
self.write_recipe(recipe, step, table=i)
self.log.info(f"saved {min(len(recipes), max(self.max_program_number - 1, 0))} recipes")
self._store_recipes_lock.release(1)

View File

@ -308,9 +308,9 @@ registers = {
"Print options": [739 - 1, {"dt": "16bit_uint", }],
# | 15 14 13 12 | 11 10 9 8 | 7 6 5 4 3 2 1 0 |
# | STN | STS | STM |
# STM: printer template
# STS: print failed test 0=NO 1=YES
# STN: print copies
# STS: print failed test 0=NO 1=YES
# STM: printer template
"AW: Aperture weight time (AT)": [740 - 1, {"dt": "16bit_uint", }],
"AN: Aperture number": [741 - 1, {"dt": "16bit_uint", }],
# Format x

View File

@ -263,9 +263,9 @@ registers = {
"Print options": [739 - 1, {"dt": "16bit_uint", }],
# | 15 14 13 12 | 11 10 9 | 8 | 7 6 5 4 3 2 1 0 |
# | STN | | STS | STM |
# STM: printer template
# STS: print failed test 0=NO 1=YES
# STN: print copies
# STS: print failed test 0=NO 1=YES
# STM: printer template
"AW: Aperture weight time (AT)": [740 - 1, {"dt": "16bit_uint", }],
"AN: Aperture number": [741 - 1, {"dt": "16bit_uint", }],
# Format x

View File

@ -154,7 +154,7 @@ try:
# self.main_window.steps_management_a.triggered.connect(lambda checked, self=weakref.ref(self): self().main_window.open_dialog(Steps_Management()))
# if "--steps-management" in sys.argv:
# self.main_window.steps_management_a.trigger()
if "tecna_t3" in self.components and "--enable-saving-tecna-recipes" in sys.argv:
if "tecna_t3" in self.components and ("--enable-saving-tecna-recipes" in sys.argv or self.config.get("tecna_t3", {}).get("saver", None) == "present"):
self.main_window.save_tecna_recipes_a.triggered.connect(self.components["tecna_t3"].store_recipes)
self.main_window.save_tecna_recipes_a.setVisible(True)
if "--save-tecna-recipes" in sys.argv:

View File

@ -2,6 +2,8 @@ from .about import About
from .archive import Archive
from .autotests_archive import Autotests_Archive
from .barcodes_step_editor import Barcodes_Step_Editor
from .connector_step_editor import Connector_Step_Editor
from .count_step_editor import Count_Step_Editor
from .crud import (Cell, Combo_Box_Cell_Widget, CopyPastableCrudQTableWidget,
Crud, External_Dialog_Cell_Widget,
Json_External_Dialog_Cell_Widget,
@ -31,6 +33,8 @@ from .test_assembly import Test_Assembly
from .test_autotest import Test_Autotest
from .test_barcodes import Test_Barcodes
from .test_connector import Test_Connector
from .test_count import Test_Count
from .test_count_end import Test_Count_End
from .test_fail import Test_Fail
from .test_home import Test_Home
from .test_leak import Test_Leak

View File

@ -0,0 +1 @@
from .count_step_editor import Count_Step_Editor

View File

@ -0,0 +1,9 @@
from ui.editor import Editor
class Count_Step_Editor(Editor):
def __init__(self, action=None, cell_widget=None):
super().__init__(action=action, cell_widget=cell_widget)
self.spec.update({
"amount": self.amount_sb,
})

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Count_Step_Editor</class>
<widget class="QWidget" name="Count_Step_Editor">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>138</width>
<height>68</height>
</rect>
</property>
<property name="windowTitle">
<string>Count 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">
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="title">
<string>Lotto</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Quantità</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="amount_sb">
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -158,6 +158,9 @@ class Recipe_Selection(Widget):
barcode_serial_field = self.config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
print_template_field = self.config.get("recipe", {}).get("label_template_field", "modello_etichetta").strip()
return {
"count": {
"amount": row.get("dimensione_lotto", defaults["dimensione_lotto"]),
},
"connector": {
"connector": row.get("connettore", defaults["connettore"]),
},
@ -166,7 +169,7 @@ class Recipe_Selection(Widget):
},
"resistance": {
"scale": float(row.get("scala_resistenza", defaults["scala_resistenza"])),
"expected": float(row.get("R nominale", defaults["R nominale"]).replace(" ", "").replace("Ω", "")),
"expected": float(row.get("resistenza_nominale", defaults["resistenza_nominale"]).replace(" ", "").replace("Ω", "")),
"tolerance": float(row.get("tolleranza_resistenza", defaults["tolleranza_resistenza"])),
},
"screws": {
@ -258,6 +261,7 @@ class Recipe_Selection(Widget):
recipe.part_number = row.get(part_number_field, defaults["part_number"])
recipe.description = row.get("descrizione", defaults["descrizione"])
recipe.spec = {
"count": len(row.get("dimensione_lotto_abilitata", defaults["dimensione_lotto_abilitata"])) and "count" not in self.unsupported_steps,
"connector": len(row.get("verifica_connettore_abilitata", defaults["verifica_connettore_abilitata"])) and "connector" not in self.unsupported_steps,
"barcodes": len(row.get(barcode_enable_field, defaults["verifica_codice_a_barre_abilitata"])) and "barcodes" not in self.unsupported_steps,
"resistance": len(row.get("verifica_resistenza_connettore_abilitata", defaults["verifica_resistenza_connettore_abilitata"])) and "resistance" not in self.unsupported_steps,
@ -268,6 +272,7 @@ class Recipe_Selection(Widget):
"print": len(row.get("stampa_etichetta_abilitata", defaults["stampa_etichetta_abilitata"])) and "print" not in self.unsupported_steps,
"steps": [], # should be pks of the enabled steps
"available_steps": {
"count": steps["count"].get_id(),
"connector": steps["connector"].get_id(),
"barcodes": steps["barcodes"].get_id(),
"resistance": steps["resistance"].get_id(),
@ -315,13 +320,15 @@ class Recipe_Selection(Widget):
recipe_name_field,
"cliente",
"part_number",
"dimensione_lotto_abilitata",
"dimensione_lotto",
"verifica_connettore_abilitata",
"connettore",
barcode_enable_field,
barcode_serial_field,
"verifica_resistenza_connettore_abilitata",
"scala_resistenza",
"R nominale",
"resistenza_nominale",
"tolleranza_resistenza",
"avvitatura_abilitata",
"viti",
@ -362,13 +369,15 @@ class Recipe_Selection(Widget):
recipe_name_field: recipe.name,
"cliente": recipe.client,
"part_number": recipe.part_number,
"dimensione_lotto_abilitata": "x" if recipe.spec["count"] else "",
"dimensione_lotto": steps["count"].spec["amount"],
"verifica_connettore_abilitata": "x" if recipe.spec["connector"] else "",
"connettore": steps["connector"].spec["connector"],
barcode_enable_field: "x" if recipe.spec["barcodes"] else "",
barcode_serial_field: steps["barcodes"].spec["serial"],
"verifica_resistenza_connettore_abilitata": "x" if recipe.spec["resistance"] else "",
"scala_resistenza": steps["resistance"].spec["scale"],
"R nominale": steps["resistance"].spec["expected"],
"resistenza_nominale": steps["resistance"].spec["expected"],
"tolleranza_resistenza": steps["resistance"].spec["tolerance"],
"avvitatura_abilitata": "x" if recipe.spec["screws"] else "",
"viti": steps["screws"].spec["quantity"],

View File

@ -2,6 +2,7 @@ from lib.db import Steps
from peewee import IntegrityError
from ui.barcodes_step_editor import Barcodes_Step_Editor
from ui.connector_step_editor import Connector_Step_Editor
from ui.count_step_editor import Count_Step_Editor
from ui.editor import Editor
from ui.helpers import replace_widget
from ui.leak_step_editor import Leak_Step_Editor
@ -15,6 +16,13 @@ class Recipe_Spec_And_Step_Editor(Editor):
def __init__(self, action=None, cell_widget=None, unsupported_steps=None):
super().__init__(action=action, cell_widget=cell_widget)
self.map = {
"count": {
"type": "count",
"enable": self.count_enabled_cb,
"widget": "count_editor_w",
"editor": Count_Step_Editor(),
"tab": self.count_t,
},
"connector": {
"type": "connector",
"enable": self.connector_enabled_cb,

View File

@ -19,14 +19,6 @@
<string>Recipe Spec And Step Editor</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QPushButton" name="save_steps_b">
<property name="text">
<string>Salva configurazione
Fasi di Test</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="reset_steps_b">
<property name="text">
@ -40,6 +32,49 @@ Fasi di Test</string>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="count_t">
<attribute name="title">
<string>Lotto</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="0">
<spacer name="horizontalSpacer_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>457</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="count_enabled_cb">
<property name="text">
<string>Fase Abilitata</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_18">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>457</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="3">
<widget class="QWidget" name="count_editor_w" native="true"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="connector_t">
<attribute name="title">
<string>Connettore</string>
@ -386,6 +421,14 @@ Fasi di Test</string>
</widget>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="save_steps_b">
<property name="text">
<string>Salva configurazione
Fasi di Test</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>

View File

@ -15,6 +15,8 @@ from ui.test_assembly import Test_Assembly
from ui.test_autotest import Test_Autotest
from ui.test_barcodes import Test_Barcodes
from ui.test_connector import Test_Connector
from ui.test_count import Test_Count
from ui.test_count_end import Test_Count_End
from ui.test_fail import Test_Fail
from ui.test_leak import Test_Leak
from ui.test_resistance import Test_Resistance
@ -46,12 +48,13 @@ class Test(Widget):
self.step = None
self.unsupported_steps = set()
self.steps_dependencies = {
"leak": {"tecna_t3", },
"print": {"label_printer", },
"count": set(),
"connector": {"multicomp", },
"resistance": {"multicomp", },
"vision": {("uvc_camera", "galaxy_camera", ), "vision", "vision_saver", }, # "neo_pixels", },
"screws": {"screwdriver", "tecna_t3", },
"resistance": {"multicomp", },
"leak": {"tecna_t3", },
"vision": {("uvc_camera", "galaxy_camera", ), "vision", "vision_saver", }, # "neo_pixels", },
"print": {"label_printer", },
}
self.unsupported_steps = set()
for step_name, dependencies in self.steps_dependencies.items():
@ -62,23 +65,27 @@ class Test(Widget):
else:
if dependency not in self.components or not self.components[dependency].ready:
self.unsupported_steps.add(step_name)
# INIT PIECES COUNTER
self.pieces = {"ok": 0, "ko": 0}
# INIT CYCLE STATES
self.cycle_available_steps = {
# "assembly_1": Test_Assembly(img_path=self.select_step_img("assembly_1"), text="INSERIRE SENSORE", widget=None),
"autotest": Test_Assembly(img_path=None, text="ESEGUIRE PROCEDURA DI AUTOTEST", widget=Test_Autotest()),
"barcodes": Test_Assembly(img_path=self.select_step_img("scan"), text="LEGGERE IL BARCODE DEL PEZZO DA COLLAUDARE", widget=Test_Barcodes()),
"connector": Test_Assembly(img_path=self.select_step_img("scan"), text="COLLEGARE IL CONNETTORE INDICATO AL PEZZO E LEGGERE IL SUO BARCODE", widget=Test_Connector(run_once=True)),
"done": Test_Assembly(img_path=self.select_step_img("success"), text="COLLAUDO COMPLETATO", widget=None),
"emergency": Test_Assembly(img_path=self.select_step_img("reset_emergency"), text="EMERGENZA INTERVENUTA - RIPRISTINARE PULSANTE E SELEZIONARE \"RESET EMERGENZA\" DAL MEN\u00d9 \"STRUMENTI\"", widget=None),
"fail": Test_Assembly(img_path=self.select_step_img("fail"), text="CICLO INTERROTTO, PREMERE CONTINUA PER COMINCIARE UN NUOVO CICLO", widget=Test_Fail()),
"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="STAMPA ETICHETTA IN CORSO", widget=None),
"resistance": Test_Assembly(img_path=None, text="COLLEGARE CONNETTORE ELETTRICO PER EFFETTUARE PROVA RESISTENZA", widget=Test_Resistance(components=self.components, recipe=self.recipe, step=self.step)),
"screws": Test_Assembly(img_path=None, text="AVVITARE TUTE LE VITI COME INDICATO", widget=Test_Screws(components=self.components, recipe=self.recipe, step=self.step)),
"select_recipe": Test_Assembly(img_path=None, text="SELEZIONARE IL CODICE DA COLLAUDARE", widget=Recipe_Selection(config=self.config, unsupported_steps=self.unsupported_steps)),
"vision": Test_Assembly(img_path=None, text="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="ATTENDERE - PAUSA INTER CICLO", widget=None),
None: Test_Assembly(img_path=self.select_step_img("warning"), text="ATTENZIONE - LA RICETTA SELEZIONATA NON CONTIENE FASI DI TEST", widget=None),
# "assembly_1": Test_Assembly(img_path=self.select_step_img("assembly_1"), text=u"INSERIRE SENSORE", widget=None),
"autotest": Test_Assembly(img_path=None, text=u"ESEGUIRE PROCEDURA DI AUTOTEST", widget=Test_Autotest()),
"barcodes": Test_Assembly(img_path=self.select_step_img("scan"), text=u"LEGGERE IL BARCODE DEL PEZZO DA COLLAUDARE", widget=Test_Barcodes()),
"connector": Test_Assembly(img_path=self.select_step_img("scan"), text=u"COLLEGARE IL CONNETTORE INDICATO AL PEZZO E LEGGERE IL SUO BARCODE", widget=Test_Connector(run_once=True)),
"count": Test_Assembly(img_path=None, text=u"INSERIRE IL NUMERO DI PEZZI ATTESI PER IL LOTTO", widget=Test_Count(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces, run_once=True)),
"count_end": Test_Assembly(img_path=None, text=u"LOTTO TERMINATO, PREMERE CONTINUA PERCOMINCIARNE UNO NUOVO", widget=Test_Count_End(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces)),
"done": Test_Assembly(img_path=self.select_step_img("success"), text=u"COLLAUDO COMPLETATO", widget=None),
"emergency": Test_Assembly(img_path=self.select_step_img("reset_emergency"), text=u"EMERGENZA INTERVENUTA - RIPRISTINARE PULSANTE E SELEZIONARE \"RESET EMERGENZA\" DAL MEN\u00d9 \"STRUMENTI\"", widget=None),
"fail": Test_Assembly(img_path=self.select_step_img("fail"), text=u"CICLO INTERROTTO, PREMERE CONTINUA PER COMINCIARE UN NUOVO CICLO", widget=Test_Fail()),
"leak": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces)),
"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"COLLEGARE CONNETTORE ELETTRICO PER EFFETTUARE PROVA RESISTENZA", widget=Test_Resistance(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces)),
"screws": Test_Assembly(img_path=None, text=u"AVVITARE TUTE LE VITI COME INDICATO", widget=Test_Screws(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces)),
"select_recipe": Test_Assembly(img_path=None, text=u"SELEZIONARE IL CODICE DA COLLAUDARE", widget=Recipe_Selection(config=self.config, unsupported_steps=self.unsupported_steps)),
"vision": Test_Assembly(img_path=None, text=u"VERIFICARE CONTROLLO CON TELECAMERA", widget=Test_Vision(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces)),
"wait": Test_Assembly(img_path=self.select_step_img("wait"), text=u"ATTENDERE - PAUSA INTER CICLO", widget=None),
None: Test_Assembly(img_path=self.select_step_img("warning"), text=u"ATTENZIONE - LA RICETTA SELEZIONATA NON CONTIENE FASI DI TEST", widget=None),
}
self.cycle_steps = None
self.cycle_index = -1
@ -92,8 +99,6 @@ class Test(Widget):
# INIT TEST DATA
self.data = {"ok": True, "overridden": False}
self.archived = None
# INIT PIECES COUNTER ([pieces_ok, pieces_failed])
self.pieces = [0, 0]
# CONNECT CYCLE CONTROLS
self.cancel_b.clicked.connect(self.fail_cycle)
self.change_recipe_b.clicked.connect(self.change_recipe)
@ -106,6 +111,8 @@ class Test(Widget):
w.ok.connect(lambda data=None, step_name=step_name, self=weakref.ref(self): self().set_step(step_name, data))
if hasattr(w, "ko"):
w.ko.connect(self.fail_cycle)
# CUSTOM STEP CONNECTIONS
self.cycle_available_steps["count"].ok.connect(self.cycle_available_steps["count_end"].widget.set_amount)
# TESTING
if "--test" in sys.argv:
self.testing = True
@ -166,7 +173,10 @@ class Test(Widget):
self.request_autotest("periodic")
def next(self, action=None):
self.log.debug(f"cycle next: cycle step: {self.step!r} action: {action!r}")
if self.step is not None:
self.log.debug(f"cycle next: cycle step: {model_to_dict(self.step)!r} action: {action!r}")
else:
self.log.debug(f"cycle next: cycle step: {self.step!r} action: {action!r}")
current_w = self.centralWidget
if hasattr(current_w, "stop"):
current_w.stop()
@ -179,8 +189,8 @@ class Test(Widget):
self.data = {"ok": True, "overridden": False}
self.archived = None
# COUNT RESET
self.pieces[0] = 0
self.pieces[1] = 0
self.pieces["ok"] = 0
self.pieces["ko"] = 0
elif action == "fail":
self.log.info(f"cycle next: action: {action!r}")
# FAIL AND RESTART TEST
@ -190,7 +200,7 @@ class Test(Widget):
self.data = {"ok": True, "overridden": False}
self.archived = None
# COUNT FAIL
self.pieces[1] += 1
self.pieces["ko"] += 1
elif action is not None:
raise NotImplementedError(f"cycle next: action {action!r} is not a valid action")
# if action did not set the next cycle step
@ -222,7 +232,7 @@ class Test(Widget):
"select_recipe",
"wait",
})
self.log.info(f"cycle next: next cycle step: {self.step!r}")
self.log.info(f"cycle next: next cycle step: {model_to_dict(self.step)!r}")
# INIT TEST DATA IF STARTING CYCLE LOOP
if self.recipe is not None and "recipe" not in self.data:
self.data["recipe"] = model_to_dict(self.recipe)
@ -230,10 +240,13 @@ class Test(Widget):
self.data = {"ok": True, "overridden": False}
self.archived = None
w = self.cycle_available_steps[self.step.type]
if w is not current_w:
self.setCentralWidget(w)
show = None
if hasattr(w, "start"):
w.start(recipe=self.recipe, step=self.cycle_steps[self.cycle_index])
show = w.start(recipe=self.recipe, step=self.cycle_steps[self.cycle_index], pieces=self.pieces)
if show is not False and w is not current_w:
self.setCentralWidget(w)
elif show is False:
self.next_timer.start(0)
if self.step.type == "done":
self.archived = self.done()
self.next_timer.start(2000)
@ -247,7 +260,7 @@ class Test(Widget):
elif self.step.type == "wait":
self.next_timer.start(2000)
# UPDATE PIECES DISPLAY
self.pieces_count_l.setText(f"{self.pieces[0]} OK / {self.pieces[1]} NOK / {sum(self.pieces)} TOT")
self.pieces_count_l.setText(f"{self.pieces['ok']} OK / {self.pieces['ko']} NOK / {sum(self.pieces.values())} TOT")
def set_recipe(self, recipe=None):
self.recipe = recipe
@ -257,9 +270,12 @@ class Test(Widget):
steps = self.recipe.get_steps()
skip = set()
print_found = False
count_found = False
for i, step in enumerate(steps):
if i in skip:
continue
if step.type == "count":
count_found = True
if step.type == "resistance":
steps.insert(i + 1, Steps(type="resistance", spec={
"scale": 500,
@ -271,8 +287,12 @@ class Test(Widget):
steps.insert(i, Steps(type="done"))
print_found = True
skip.add(i + 1)
if count_found:
steps.insert(i + 2, Steps(type="count_end"))
if not print_found:
steps.append(Steps(type="done"))
if count_found:
steps.append(Steps(type="count_end"))
steps.append(Steps(type="wait"))
self.cycle_steps = steps
self.check_steps_dependencies(self.cycle_steps)
@ -281,10 +301,12 @@ class Test(Widget):
w.reset()
# UPDATE RECIPE DISPLAY
if self.recipe is not None:
self.log.info(f"cycle recipe: cycle recipe: {model_to_dict(self.recipe)!r} cycle steps: {[model_to_dict(s) for s in self.cycle_steps]}")
self.recipe_l.setText(self.recipe.name)
self.recipe_l.setStyleSheet("")
self.next()
else:
self.log.info(f"cycle recipe: cycle recipe: {self.recipe!r} cycle steps: {self.cycle_steps}")
self.recipe_l.setText("NON SELEZIONATA")
self.recipe_l.setStyleSheet("QLabel { color: red; }")
@ -353,7 +375,7 @@ class Test(Widget):
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
self.pieces[0] += 1
self.pieces["ok"] += 1
return archived
@staticmethod

View File

@ -9,8 +9,8 @@ from ui.test_test import Test_Test
class Test_Barcodes(Test_Test):
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
self.barcodes_spec = {
"serial": self.check_serial_barcode
}
@ -18,10 +18,10 @@ class Test_Barcodes(Test_Test):
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
self.barcodes_le.setFocus()
def start(self, recipe=None, step=None):
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
def start(self, recipe=None, step=None, pieces=None):
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
self.visualize()
self.barcodes_le.setPalette(self.status_palettes[None])
self.barcodes_le.setText("")
@ -34,6 +34,7 @@ class Test_Barcodes(Test_Test):
self.test_timer.timeout.connect(self.get)
self.test_timer.start(500)
# /TESTING
return show
# def stop(self):
# super().stop()

View File

@ -8,16 +8,16 @@ from ui.test_test import Test_Test
class Test_Connector(Test_Test):
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
QShortcut(QKeySequence("Return"), self).activated.connect(self.get)
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
self.connector_le.setFocus()
def start(self, recipe=None, step=None):
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
def start(self, recipe=None, step=None, pieces=None):
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
self.visualize()
expected = str(self.step.spec.get("connector", "-"))
self.parent_assembly_widget().set_text(f"COLLEGARE IL CONNETTORE {expected} AL MULTIMETRO E LEGGERE IL SUO BARCODE")
@ -33,6 +33,7 @@ class Test_Connector(Test_Test):
self.test_timer.timeout.connect(self.get)
self.test_timer.start(500)
# /TESTING
return show
# def stop(self):
# super().stop()

View File

@ -0,0 +1 @@
from .test_count import Test_Count

View File

@ -0,0 +1,59 @@
import sys
import weakref
from lib.helpers import timing
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QShortcut
from ui.test_test import Test_Test
class Test_Count(Test_Test):
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
self.amount_sb.setRange(0, 9999)
self.amount = 0
self.continue_b.clicked.connect(lambda checked, self=weakref.ref(self): self().get(self().amount_sb.value()))
self.ignore_b.clicked.connect(lambda checked, self=weakref.ref(self): self().get(0))
def start(self, recipe=None, step=None, pieces=None):
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
self.visualize()
self.amount = self.step.spec.get("amount", 0)
self.amount_sb.setValue(self.amount)
# TESTING
if "--test-count" in sys.argv or "--test" in sys.argv:
self.amount_sb.setValue(1)
self.test_timer = QTimer()
self.test_timer.setSingleShot(True)
self.test_timer.timeout.connect(self.continue_b.click)
self.test_timer.start(500)
# /TESTING
return show
# def stop(self):
# super().stop()
# def reset(self):
# super().reset()
def get(self, data=None, override=False):
if self.done: # avoid proccessing if completed
return
# if data is None:
# data = self.amount_sb.value()
if data is None:
super().get(None, override=override)
return
result = data
ok = True
super().get([{
"time": timing(),
"results": {
"ok": ok,
"result": result,
"data": data,
},
}], override=override, fail=ok is False, skip_delay=True)

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Test_Count</class>
<widget class="QWidget" name="Test_Count">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>380</width>
<height>229</height>
</rect>
</property>
<property name="windowTitle">
<string>Test Count</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">
<widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Dimensione lotto</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="1">
<widget class="QSpinBox" name="amount_sb">
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Dimensione Lotto</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="continue_b">
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color:rgb(85, 255, 127);</string>
</property>
<property name="text">
<string>CONTINUA</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="ignore_b">
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color:rgb(254, 254, 114);</string>
</property>
<property name="text">
<string>COONTINUA SENZA LOTTO</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="13" column="0">
<widget class="QPushButton" name="override_b">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>FORZA ACCETTAZIONE</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>override_b</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1 @@
from .test_count_end import Test_Count_End

View File

@ -0,0 +1,47 @@
import sys
import weakref
from lib.helpers import timing
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QShortcut
from ui.test_test import Test_Test
class Test_Count_End(Test_Test):
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
self.continue_b.clicked.connect(lambda checked, self=weakref.ref(self): self().ok.emit(None))
self.amount = 0
self.lots = 0
self.previous_pieces = 0
def set_amount(self, data=None):
self.amount = data.get("results", {}).get("data", 0)
def start(self, recipe=None, step=None, pieces=None):
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False or self.amount == 0 or self.pieces["ok"] - self.previous_pieces < self.amount: # current piece counted since this step is after the "done" step
if show is not False:
self.ok.emit(None)
return False
self.visualize()
self.lots += 1
self.previous_pieces = self.pieces["ok"]
# TESTING
if "--test-count" in sys.argv or "--test" in sys.argv:
self.test_timer = QTimer()
self.test_timer.setSingleShot(True)
self.test_timer.timeout.connect(self.continue_b.click)
self.test_timer.start(500)
# /TESTING
return show
# def stop(self):
# super().stop()
def reset(self):
super().reset()
self.amount = 0
self.lots = 0
self.previous_pieces = 0

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Test_Count_End</class>
<widget class="QWidget" name="Test_Count_End">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>468</width>
<height>173</height>
</rect>
</property>
<property name="windowTitle">
<string>Test Count End</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">
<widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Dimensione lotto</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0" colspan="2">
<widget class="QPushButton" name="continue_b">
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color:rgb(85, 255, 127);</string>
</property>
<property name="text">
<string>CONTINUA CON UN ALTRO LOTTO</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Lotto terminato</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="13" column="0">
<widget class="QPushButton" name="override_b">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>FORZA ACCETTAZIONE</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>override_b</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -10,14 +10,14 @@ from ui.test_test import Test_Test
class Test_Fail(Test_Test):
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
self.continue_b.clicked.connect(lambda checked, self=weakref.ref(self): self().ok.emit(None))
def start(self, recipe=None, step=None):
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
def start(self, recipe=None, step=None, pieces=None):
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
self.visualize()
# TESTING
if "--test" in sys.argv:
@ -26,6 +26,7 @@ class Test_Fail(Test_Test):
self.test_timer.timeout.connect(self.continue_b.click)
self.test_timer.start(500)
# /TESTING
return show
# def stop(self):
# super().stop()

View File

@ -5,21 +5,21 @@ from ui.test_test import Test_Test
class Test_Leak(Test_Test):
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
self.start_b.clicked.connect(lambda checked, self=weakref.ref(self): self().components["tecna_t3"].start_test())
self.stop_b.clicked.connect(lambda checked, self=weakref.ref(self): self().components["tecna_t3"].stop_test())
def start(self, recipe=None, step=None):
def start(self, recipe=None, step=None, pieces=None):
# TESTING
if "--test-leak" in sys.argv or "--test" in sys.argv:
self.simulate = True
else:
self.simulate = False
# /TESTING
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
# setup test loop
self.components["tecna_t3"].write_recipe(self.recipe, self.step)
self.get_connection = self.components["tecna_t3"].out.connect(self.get)
@ -28,6 +28,7 @@ class Test_Leak(Test_Test):
self.parent_assembly_widget().set_text(text="WAIT")
self.start_b.setEnabled(False)
self.stop_b.setEnabled(False)
return show
def stop(self):
# disable test loop

View File

@ -5,11 +5,11 @@ from ui.test_test import Test_Test
class Test_Resistance(Test_Test):
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=False):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
self.ok_counter_limit = 3
def start(self, recipe=None, step=None):
def start(self, recipe=None, step=None, pieces=None):
# TESTING
if "--test-resistance" in sys.argv or "--test" in sys.argv:
self.simulate = True
@ -19,9 +19,9 @@ class Test_Resistance(Test_Test):
expected = step.spec.get("expected", "-")
if expected == float("+inf"):
step.spec["expected"] = 1e9
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
# setup test loop
self.components["multicomp"].set_resistance_scale(self.step.spec.get("scale", 500))
self.get_connection = self.components["multicomp"].out.connect(self.get)
@ -50,6 +50,7 @@ class Test_Resistance(Test_Test):
bg = self.status_palettes[None].color(QPalette.Background)
color = f"rgb({bg.red()}, {bg.green()}, {bg.blue()})"
self.resistance_l.setStyleSheet(f"background-color: {color};\nborder: 1px solid black;\n")
return show
def stop(self):
# disable test loop

View File

@ -5,19 +5,19 @@ from ui.test_test import Test_Test
class Test_Screws(Test_Test):
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=True):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=True):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
def start(self, recipe=None, step=None):
def start(self, recipe=None, step=None, pieces=None):
# TESTING
if "--test-screws" in sys.argv or "--test" in sys.argv:
self.simulate = True
else:
self.simulate = False
# /TESTING
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
# setup test loop
self.get_connection = self.components["screwdriver"].out.connect(self.get)
self.components["tecna_t3"].resume()
@ -26,6 +26,7 @@ class Test_Screws(Test_Test):
self.screws_counter_l.setText(str(0))
self.screws_expected_l.setText(str(self.ok_counter_limit))
self.components["screwdriver"].enable(self.ok_counter_limit > 0)
return show
def stop(self):
# disable test loop

View File

@ -13,11 +13,12 @@ class Test_Test(Widget):
ok = pyqtSignal(object)
ko = pyqtSignal(object)
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=True):
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=True):
super().__init__()
self.components = components
self.recipe = recipe
self.step = step
self.pieces = pieces
self.run_once = run_once
self.enable_override = enable_override
# setup variables
@ -70,6 +71,7 @@ class Test_Test(Widget):
self.status_palettes[False].setColor(QPalette.Base, Qt.red)
self.status_palettes["warning"].setColor(QPalette.Base, QColor(255, 165, 0))
self.status_palettes[""].setColor(QPalette.Base, QColor(255, 255, 0))
self.reset()
self.visualize()
def set_parent_assembly_widget(self, parent_assembly_widget=None):
@ -80,14 +82,13 @@ class Test_Test(Widget):
else:
self.parent_assembly_widget = weakref.ref(parent_assembly_widget)
def start(self, recipe=None, step=None):
def start(self, recipe=None, step=None, pieces=None):
self.admin_challenged = False
self.recipe = recipe
self.step = step
self.pieces = pieces
if self.run_once is True and self.done is True and self.done_ok is True:
self.emit_ok()
return
self.reset()
return False
if self.enable_override:
self.override_b.setVisible(True)
self.override_b.setEnabled(True)
@ -102,6 +103,7 @@ class Test_Test(Widget):
if self.enable_override and hasattr(self, "_test_overridden_test_"):
del self._test_overridden_test_
# /TESTING
return True
def stop(self):
pass
@ -112,7 +114,7 @@ class Test_Test(Widget):
self.done_ok = None
self.last = None
def get(self, data=None, override=False, fail=False, preserve_counter=False):
def get(self, data=None, override=False, fail=False, preserve_counter=False, skip_delay=False):
if self.done: # avoid proccessing if completed
return
if data is None:
@ -152,14 +154,20 @@ class Test_Test(Widget):
if hasattr(self, "override_b"):
self.override_b.setEnabled(False)
self.stop()
self.ko_timer.start()
if skip_delay:
self.emit_ko()
else:
self.ko_timer.start()
elif self.ok_counter >= self.ok_counter_limit:
self.done = True
self.done_ok = True
if hasattr(self, "override_b"):
self.override_b.setEnabled(False)
self.stop()
self.ok_timer.start()
if skip_delay:
self.emit_ok()
else:
self.ok_timer.start()
self.visualize(self.last)
# TESTING
if "--test" in sys.argv:

View File

@ -10,8 +10,8 @@ from ui.test_test import Test_Test
class Test_Vision(Test_Test):
request_frame = pyqtSignal()
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=True):
super().__init__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, enable_override=True):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
if "--sim-camera" not in sys.argv:
self.ok_counter_limit = 2
else:
@ -27,10 +27,10 @@ class Test_Vision(Test_Test):
self.results_tw.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.results_tw.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
def start(self, recipe=None, step=None):
super().start(recipe=recipe, step=step)
if self.run_once is True and self.done is True and self.done_ok is True:
return
def start(self, recipe=None, step=None, pieces=None):
show = super().start(recipe=recipe, step=step, pieces=pieces)
if show is False:
return show
# setup camera-vision loop
if "uvc_camera" in self.components:
self.components["uvc_camera"].set_period(period=None) # only get frame on request
@ -52,6 +52,7 @@ class Test_Vision(Test_Test):
# DETECTIONS TABLE
# hide previous results
self.results_tw.setRowCount(0)
return show
def stop(self):
# disable camera-vision loop