Merge remote-tracking branch 'origin/master'
# Conflicts: # config/machine_settings/recipes_defaults.csv
This commit is contained in:
commit
0591b9a126
|
|
@ -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
|
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,,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
|
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,5 +1,5 @@
|
||||||
[machine]
|
[machine]
|
||||||
description = ~~~~~~~~~~ THIS ~~~~~~~~~~
|
description = ~~~~~~~~~~ THIS ~~~~~~~~~~
|
||||||
|
|
||||||
[hardware_config]
|
[hardware_config]
|
||||||
archive_synchronizer: present
|
archive_synchronizer: present
|
||||||
|
|
@ -17,6 +17,10 @@ vision: present
|
||||||
[tecna_t3]
|
[tecna_t3]
|
||||||
model: t3l
|
model: t3l
|
||||||
port: /dev/ttyUSB0
|
port: /dev/ttyUSB0
|
||||||
|
saver: present
|
||||||
|
saver_label_template: 6
|
||||||
|
saver_print_on_fail: yes
|
||||||
|
saver_label_count: 1
|
||||||
|
|
||||||
[multicomp]
|
[multicomp]
|
||||||
port: /dev/ttyACM0
|
port: /dev/ttyACM0
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ python -B -u "./src/main.py" \
|
||||||
--auto-login-admin \
|
--auto-login-admin \
|
||||||
--auto-select \
|
--auto-select \
|
||||||
--debugger-workaround \
|
--debugger-workaround \
|
||||||
--enable-saving-tecna-recipes \
|
|
||||||
--no-edgetpu \
|
--no-edgetpu \
|
||||||
--no-gpu \
|
--no-gpu \
|
||||||
--panel \
|
--panel \
|
||||||
|
|
@ -32,6 +31,7 @@ $* 2> >(sed $'s/.*/\e[31m&\e[m/' >&2) # &
|
||||||
# --auto-login-user \
|
# --auto-login-user \
|
||||||
# --autotests-archive \
|
# --autotests-archive \
|
||||||
# --camera-edits \
|
# --camera-edits \
|
||||||
|
# --enable-saving-tecna-recipes \
|
||||||
# --fail-vision \
|
# --fail-vision \
|
||||||
# --full-screen \
|
# --full-screen \
|
||||||
# --interact \
|
# --interact \
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,10 @@ class TecnaMarpossProvasetT3(ModbusComponent):
|
||||||
self.set_measure_units()
|
self.set_measure_units()
|
||||||
self.units = self.get_measure_units()
|
self.units = self.get_measure_units()
|
||||||
self.max_program_number = self.read("Max number of programs")
|
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}")
|
self.log.info(f"units: {self.units}")
|
||||||
|
|
||||||
# def unlock_tecna(self, **kwargs):
|
# def unlock_tecna(self, **kwargs):
|
||||||
|
|
@ -295,8 +299,9 @@ class TecnaMarpossProvasetT3(ModbusComponent):
|
||||||
"Test program for read/write operation": table,
|
"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
|
**{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
|
**{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
|
**{761 - 1 + i: (recipe_name[i * 2 + 1] << 8) + recipe_name[i * 2] for i in range(8)}, # print field 1
|
||||||
"Print options": 0b0001000000000110,
|
# **{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 type": "Leak Test",
|
||||||
"Test flags": 0b0110000001011100,
|
"Test flags": 0b0110000001011100,
|
||||||
"T0 - Pre-filling time": step.spec["pre_filling_time"],
|
"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):
|
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)}")
|
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):
|
for i, [recipe, step] in enumerate(recipes[:max(self.max_program_number - 1, 0)], start=1):
|
||||||
print(recipe.part_number, 150 + i)
|
self.log.debug(f"saving recipe {recipe.part_number} to table {i}")
|
||||||
self.write_recipe(recipe, step, table=150 + 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.log.info(f"saved {min(len(recipes), max(self.max_program_number - 1, 0))} recipes")
|
||||||
self._store_recipes_lock.release(1)
|
self._store_recipes_lock.release(1)
|
||||||
|
|
|
||||||
|
|
@ -308,9 +308,9 @@ registers = {
|
||||||
"Print options": [739 - 1, {"dt": "16bit_uint", }],
|
"Print options": [739 - 1, {"dt": "16bit_uint", }],
|
||||||
# | 15 14 13 12 | 11 10 9 8 | 7 6 5 4 3 2 1 0 |
|
# | 15 14 13 12 | 11 10 9 8 | 7 6 5 4 3 2 1 0 |
|
||||||
# | STN | STS | STM |
|
# | STN | STS | STM |
|
||||||
# STM: printer template
|
|
||||||
# STS: print failed test 0=NO 1=YES
|
|
||||||
# STN: print copies
|
# STN: print copies
|
||||||
|
# STS: print failed test 0=NO 1=YES
|
||||||
|
# STM: printer template
|
||||||
"AW: Aperture weight time (AT)": [740 - 1, {"dt": "16bit_uint", }],
|
"AW: Aperture weight time (AT)": [740 - 1, {"dt": "16bit_uint", }],
|
||||||
"AN: Aperture number": [741 - 1, {"dt": "16bit_uint", }],
|
"AN: Aperture number": [741 - 1, {"dt": "16bit_uint", }],
|
||||||
# Format x
|
# Format x
|
||||||
|
|
|
||||||
|
|
@ -263,9 +263,9 @@ registers = {
|
||||||
"Print options": [739 - 1, {"dt": "16bit_uint", }],
|
"Print options": [739 - 1, {"dt": "16bit_uint", }],
|
||||||
# | 15 14 13 12 | 11 10 9 | 8 | 7 6 5 4 3 2 1 0 |
|
# | 15 14 13 12 | 11 10 9 | 8 | 7 6 5 4 3 2 1 0 |
|
||||||
# | STN | | STS | STM |
|
# | STN | | STS | STM |
|
||||||
# STM: printer template
|
|
||||||
# STS: print failed test 0=NO 1=YES
|
|
||||||
# STN: print copies
|
# STN: print copies
|
||||||
|
# STS: print failed test 0=NO 1=YES
|
||||||
|
# STM: printer template
|
||||||
"AW: Aperture weight time (AT)": [740 - 1, {"dt": "16bit_uint", }],
|
"AW: Aperture weight time (AT)": [740 - 1, {"dt": "16bit_uint", }],
|
||||||
"AN: Aperture number": [741 - 1, {"dt": "16bit_uint", }],
|
"AN: Aperture number": [741 - 1, {"dt": "16bit_uint", }],
|
||||||
# Format x
|
# Format x
|
||||||
|
|
|
||||||
|
|
@ -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()))
|
# 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:
|
# if "--steps-management" in sys.argv:
|
||||||
# self.main_window.steps_management_a.trigger()
|
# 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.triggered.connect(self.components["tecna_t3"].store_recipes)
|
||||||
self.main_window.save_tecna_recipes_a.setVisible(True)
|
self.main_window.save_tecna_recipes_a.setVisible(True)
|
||||||
if "--save-tecna-recipes" in sys.argv:
|
if "--save-tecna-recipes" in sys.argv:
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ from .about import About
|
||||||
from .archive import Archive
|
from .archive import Archive
|
||||||
from .autotests_archive import Autotests_Archive
|
from .autotests_archive import Autotests_Archive
|
||||||
from .barcodes_step_editor import Barcodes_Step_Editor
|
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,
|
from .crud import (Cell, Combo_Box_Cell_Widget, CopyPastableCrudQTableWidget,
|
||||||
Crud, External_Dialog_Cell_Widget,
|
Crud, External_Dialog_Cell_Widget,
|
||||||
Json_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_autotest import Test_Autotest
|
||||||
from .test_barcodes import Test_Barcodes
|
from .test_barcodes import Test_Barcodes
|
||||||
from .test_connector import Test_Connector
|
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_fail import Test_Fail
|
||||||
from .test_home import Test_Home
|
from .test_home import Test_Home
|
||||||
from .test_leak import Test_Leak
|
from .test_leak import Test_Leak
|
||||||
|
|
|
||||||
1
src/ui/count_step_editor/__init__.py
Normal file
1
src/ui/count_step_editor/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from .count_step_editor import Count_Step_Editor
|
||||||
9
src/ui/count_step_editor/count_step_editor.py
Normal file
9
src/ui/count_step_editor/count_step_editor.py
Normal 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,
|
||||||
|
})
|
||||||
63
src/ui/count_step_editor/count_step_editor.ui
Normal file
63
src/ui/count_step_editor/count_step_editor.ui
Normal 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>
|
||||||
|
|
@ -158,6 +158,9 @@ class Recipe_Selection(Widget):
|
||||||
barcode_serial_field = self.config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
|
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()
|
print_template_field = self.config.get("recipe", {}).get("label_template_field", "modello_etichetta").strip()
|
||||||
return {
|
return {
|
||||||
|
"count": {
|
||||||
|
"amount": row.get("dimensione_lotto", defaults["dimensione_lotto"]),
|
||||||
|
},
|
||||||
"connector": {
|
"connector": {
|
||||||
"connector": row.get("connettore", defaults["connettore"]),
|
"connector": row.get("connettore", defaults["connettore"]),
|
||||||
},
|
},
|
||||||
|
|
@ -166,7 +169,7 @@ class Recipe_Selection(Widget):
|
||||||
},
|
},
|
||||||
"resistance": {
|
"resistance": {
|
||||||
"scale": float(row.get("scala_resistenza", defaults["scala_resistenza"])),
|
"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"])),
|
"tolerance": float(row.get("tolleranza_resistenza", defaults["tolleranza_resistenza"])),
|
||||||
},
|
},
|
||||||
"screws": {
|
"screws": {
|
||||||
|
|
@ -258,6 +261,7 @@ class Recipe_Selection(Widget):
|
||||||
recipe.part_number = row.get(part_number_field, defaults["part_number"])
|
recipe.part_number = row.get(part_number_field, defaults["part_number"])
|
||||||
recipe.description = row.get("descrizione", defaults["descrizione"])
|
recipe.description = row.get("descrizione", defaults["descrizione"])
|
||||||
recipe.spec = {
|
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,
|
"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,
|
"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,
|
"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,
|
"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
|
"steps": [], # should be pks of the enabled steps
|
||||||
"available_steps": {
|
"available_steps": {
|
||||||
|
"count": steps["count"].get_id(),
|
||||||
"connector": steps["connector"].get_id(),
|
"connector": steps["connector"].get_id(),
|
||||||
"barcodes": steps["barcodes"].get_id(),
|
"barcodes": steps["barcodes"].get_id(),
|
||||||
"resistance": steps["resistance"].get_id(),
|
"resistance": steps["resistance"].get_id(),
|
||||||
|
|
@ -315,13 +320,15 @@ class Recipe_Selection(Widget):
|
||||||
recipe_name_field,
|
recipe_name_field,
|
||||||
"cliente",
|
"cliente",
|
||||||
"part_number",
|
"part_number",
|
||||||
|
"dimensione_lotto_abilitata",
|
||||||
|
"dimensione_lotto",
|
||||||
"verifica_connettore_abilitata",
|
"verifica_connettore_abilitata",
|
||||||
"connettore",
|
"connettore",
|
||||||
barcode_enable_field,
|
barcode_enable_field,
|
||||||
barcode_serial_field,
|
barcode_serial_field,
|
||||||
"verifica_resistenza_connettore_abilitata",
|
"verifica_resistenza_connettore_abilitata",
|
||||||
"scala_resistenza",
|
"scala_resistenza",
|
||||||
"R nominale",
|
"resistenza_nominale",
|
||||||
"tolleranza_resistenza",
|
"tolleranza_resistenza",
|
||||||
"avvitatura_abilitata",
|
"avvitatura_abilitata",
|
||||||
"viti",
|
"viti",
|
||||||
|
|
@ -362,13 +369,15 @@ class Recipe_Selection(Widget):
|
||||||
recipe_name_field: recipe.name,
|
recipe_name_field: recipe.name,
|
||||||
"cliente": recipe.client,
|
"cliente": recipe.client,
|
||||||
"part_number": recipe.part_number,
|
"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 "",
|
"verifica_connettore_abilitata": "x" if recipe.spec["connector"] else "",
|
||||||
"connettore": steps["connector"].spec["connector"],
|
"connettore": steps["connector"].spec["connector"],
|
||||||
barcode_enable_field: "x" if recipe.spec["barcodes"] else "",
|
barcode_enable_field: "x" if recipe.spec["barcodes"] else "",
|
||||||
barcode_serial_field: steps["barcodes"].spec["serial"],
|
barcode_serial_field: steps["barcodes"].spec["serial"],
|
||||||
"verifica_resistenza_connettore_abilitata": "x" if recipe.spec["resistance"] else "",
|
"verifica_resistenza_connettore_abilitata": "x" if recipe.spec["resistance"] else "",
|
||||||
"scala_resistenza": steps["resistance"].spec["scale"],
|
"scala_resistenza": steps["resistance"].spec["scale"],
|
||||||
"R nominale": steps["resistance"].spec["expected"],
|
"resistenza_nominale": steps["resistance"].spec["expected"],
|
||||||
"tolleranza_resistenza": steps["resistance"].spec["tolerance"],
|
"tolleranza_resistenza": steps["resistance"].spec["tolerance"],
|
||||||
"avvitatura_abilitata": "x" if recipe.spec["screws"] else "",
|
"avvitatura_abilitata": "x" if recipe.spec["screws"] else "",
|
||||||
"viti": steps["screws"].spec["quantity"],
|
"viti": steps["screws"].spec["quantity"],
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ from lib.db import Steps
|
||||||
from peewee import IntegrityError
|
from peewee import IntegrityError
|
||||||
from ui.barcodes_step_editor import Barcodes_Step_Editor
|
from ui.barcodes_step_editor import Barcodes_Step_Editor
|
||||||
from ui.connector_step_editor import Connector_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.editor import Editor
|
||||||
from ui.helpers import replace_widget
|
from ui.helpers import replace_widget
|
||||||
from ui.leak_step_editor import Leak_Step_Editor
|
from ui.leak_step_editor import Leak_Step_Editor
|
||||||
|
|
@ -15,6 +16,13 @@ class Recipe_Spec_And_Step_Editor(Editor):
|
||||||
def __init__(self, action=None, cell_widget=None, unsupported_steps=None):
|
def __init__(self, action=None, cell_widget=None, unsupported_steps=None):
|
||||||
super().__init__(action=action, cell_widget=cell_widget)
|
super().__init__(action=action, cell_widget=cell_widget)
|
||||||
self.map = {
|
self.map = {
|
||||||
|
"count": {
|
||||||
|
"type": "count",
|
||||||
|
"enable": self.count_enabled_cb,
|
||||||
|
"widget": "count_editor_w",
|
||||||
|
"editor": Count_Step_Editor(),
|
||||||
|
"tab": self.count_t,
|
||||||
|
},
|
||||||
"connector": {
|
"connector": {
|
||||||
"type": "connector",
|
"type": "connector",
|
||||||
"enable": self.connector_enabled_cb,
|
"enable": self.connector_enabled_cb,
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,6 @@
|
||||||
<string>Recipe Spec And Step Editor</string>
|
<string>Recipe Spec And Step Editor</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<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">
|
<item row="1" column="1">
|
||||||
<widget class="QPushButton" name="reset_steps_b">
|
<widget class="QPushButton" name="reset_steps_b">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
|
@ -40,6 +32,49 @@ Fasi di Test</string>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</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">
|
<widget class="QWidget" name="connector_t">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Connettore</string>
|
<string>Connettore</string>
|
||||||
|
|
@ -386,6 +421,14 @@ Fasi di Test</string>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@ from ui.test_assembly import Test_Assembly
|
||||||
from ui.test_autotest import Test_Autotest
|
from ui.test_autotest import Test_Autotest
|
||||||
from ui.test_barcodes import Test_Barcodes
|
from ui.test_barcodes import Test_Barcodes
|
||||||
from ui.test_connector import Test_Connector
|
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_fail import Test_Fail
|
||||||
from ui.test_leak import Test_Leak
|
from ui.test_leak import Test_Leak
|
||||||
from ui.test_resistance import Test_Resistance
|
from ui.test_resistance import Test_Resistance
|
||||||
|
|
@ -46,12 +48,13 @@ class Test(Widget):
|
||||||
self.step = None
|
self.step = None
|
||||||
self.unsupported_steps = set()
|
self.unsupported_steps = set()
|
||||||
self.steps_dependencies = {
|
self.steps_dependencies = {
|
||||||
"leak": {"tecna_t3", },
|
"count": set(),
|
||||||
"print": {"label_printer", },
|
|
||||||
"connector": {"multicomp", },
|
"connector": {"multicomp", },
|
||||||
"resistance": {"multicomp", },
|
|
||||||
"vision": {("uvc_camera", "galaxy_camera", ), "vision", "vision_saver", }, # "neo_pixels", },
|
|
||||||
"screws": {"screwdriver", "tecna_t3", },
|
"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()
|
self.unsupported_steps = set()
|
||||||
for step_name, dependencies in self.steps_dependencies.items():
|
for step_name, dependencies in self.steps_dependencies.items():
|
||||||
|
|
@ -62,23 +65,27 @@ class Test(Widget):
|
||||||
else:
|
else:
|
||||||
if dependency not in self.components or not self.components[dependency].ready:
|
if dependency not in self.components or not self.components[dependency].ready:
|
||||||
self.unsupported_steps.add(step_name)
|
self.unsupported_steps.add(step_name)
|
||||||
|
# INIT PIECES COUNTER
|
||||||
|
self.pieces = {"ok": 0, "ko": 0}
|
||||||
# INIT CYCLE STATES
|
# INIT CYCLE STATES
|
||||||
self.cycle_available_steps = {
|
self.cycle_available_steps = {
|
||||||
# "assembly_1": Test_Assembly(img_path=self.select_step_img("assembly_1"), text="INSERIRE SENSORE", 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="ESEGUIRE PROCEDURA DI AUTOTEST", widget=Test_Autotest()),
|
"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="LEGGERE IL BARCODE DEL PEZZO DA COLLAUDARE", widget=Test_Barcodes()),
|
"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="COLLEGARE IL CONNETTORE INDICATO AL PEZZO E LEGGERE IL SUO BARCODE", widget=Test_Connector(run_once=True)),
|
"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)),
|
||||||
"done": Test_Assembly(img_path=self.select_step_img("success"), text="COLLAUDO COMPLETATO", widget=None),
|
"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)),
|
||||||
"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),
|
"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)),
|
||||||
"fail": Test_Assembly(img_path=self.select_step_img("fail"), text="CICLO INTERROTTO, PREMERE CONTINUA PER COMINCIARE UN NUOVO CICLO", widget=Test_Fail()),
|
"done": Test_Assembly(img_path=self.select_step_img("success"), text=u"COLLAUDO COMPLETATO", widget=None),
|
||||||
"leak": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step)),
|
"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),
|
||||||
"print": Test_Assembly(img_path=self.select_step_img("print"), text="STAMPA ETICHETTA IN CORSO", 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()),
|
||||||
"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)),
|
"leak": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces)),
|
||||||
"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)),
|
"print": Test_Assembly(img_path=self.select_step_img("print"), text=u"STAMPA ETICHETTA IN CORSO", widget=None),
|
||||||
"select_recipe": Test_Assembly(img_path=None, text="SELEZIONARE IL CODICE DA COLLAUDARE", widget=Recipe_Selection(config=self.config, unsupported_steps=self.unsupported_steps)),
|
"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)),
|
||||||
"vision": Test_Assembly(img_path=None, text="VERIFICARE CONTROLLO CON TELECAMERA", widget=Test_Vision(components=self.components, recipe=self.recipe, step=self.step)),
|
"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)),
|
||||||
"wait": Test_Assembly(img_path=self.select_step_img("wait"), text="ATTENDERE - PAUSA INTER CICLO", widget=None),
|
"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)),
|
||||||
None: Test_Assembly(img_path=self.select_step_img("warning"), text="ATTENZIONE - LA RICETTA SELEZIONATA NON CONTIENE FASI DI TEST", widget=None),
|
"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_steps = None
|
||||||
self.cycle_index = -1
|
self.cycle_index = -1
|
||||||
|
|
@ -92,8 +99,6 @@ class Test(Widget):
|
||||||
# INIT TEST DATA
|
# INIT TEST DATA
|
||||||
self.data = {"ok": True, "overridden": False}
|
self.data = {"ok": True, "overridden": False}
|
||||||
self.archived = None
|
self.archived = None
|
||||||
# INIT PIECES COUNTER ([pieces_ok, pieces_failed])
|
|
||||||
self.pieces = [0, 0]
|
|
||||||
# CONNECT CYCLE CONTROLS
|
# CONNECT CYCLE CONTROLS
|
||||||
self.cancel_b.clicked.connect(self.fail_cycle)
|
self.cancel_b.clicked.connect(self.fail_cycle)
|
||||||
self.change_recipe_b.clicked.connect(self.change_recipe)
|
self.change_recipe_b.clicked.connect(self.change_recipe)
|
||||||
|
|
@ -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))
|
w.ok.connect(lambda data=None, step_name=step_name, self=weakref.ref(self): self().set_step(step_name, data))
|
||||||
if hasattr(w, "ko"):
|
if hasattr(w, "ko"):
|
||||||
w.ko.connect(self.fail_cycle)
|
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
|
# TESTING
|
||||||
if "--test" in sys.argv:
|
if "--test" in sys.argv:
|
||||||
self.testing = True
|
self.testing = True
|
||||||
|
|
@ -166,7 +173,10 @@ class Test(Widget):
|
||||||
self.request_autotest("periodic")
|
self.request_autotest("periodic")
|
||||||
|
|
||||||
def next(self, action=None):
|
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
|
current_w = self.centralWidget
|
||||||
if hasattr(current_w, "stop"):
|
if hasattr(current_w, "stop"):
|
||||||
current_w.stop()
|
current_w.stop()
|
||||||
|
|
@ -179,8 +189,8 @@ class Test(Widget):
|
||||||
self.data = {"ok": True, "overridden": False}
|
self.data = {"ok": True, "overridden": False}
|
||||||
self.archived = None
|
self.archived = None
|
||||||
# COUNT RESET
|
# COUNT RESET
|
||||||
self.pieces[0] = 0
|
self.pieces["ok"] = 0
|
||||||
self.pieces[1] = 0
|
self.pieces["ko"] = 0
|
||||||
elif action == "fail":
|
elif action == "fail":
|
||||||
self.log.info(f"cycle next: action: {action!r}")
|
self.log.info(f"cycle next: action: {action!r}")
|
||||||
# FAIL AND RESTART TEST
|
# FAIL AND RESTART TEST
|
||||||
|
|
@ -190,7 +200,7 @@ class Test(Widget):
|
||||||
self.data = {"ok": True, "overridden": False}
|
self.data = {"ok": True, "overridden": False}
|
||||||
self.archived = None
|
self.archived = None
|
||||||
# COUNT FAIL
|
# COUNT FAIL
|
||||||
self.pieces[1] += 1
|
self.pieces["ko"] += 1
|
||||||
elif action is not None:
|
elif action is not None:
|
||||||
raise NotImplementedError(f"cycle next: action {action!r} is not a valid action")
|
raise NotImplementedError(f"cycle next: action {action!r} is not a valid action")
|
||||||
# if action did not set the next cycle step
|
# if action did not set the next cycle step
|
||||||
|
|
@ -222,7 +232,7 @@ class Test(Widget):
|
||||||
"select_recipe",
|
"select_recipe",
|
||||||
"wait",
|
"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
|
# INIT TEST DATA IF STARTING CYCLE LOOP
|
||||||
if self.recipe is not None and "recipe" not in self.data:
|
if self.recipe is not None and "recipe" not in self.data:
|
||||||
self.data["recipe"] = model_to_dict(self.recipe)
|
self.data["recipe"] = model_to_dict(self.recipe)
|
||||||
|
|
@ -230,10 +240,13 @@ class Test(Widget):
|
||||||
self.data = {"ok": True, "overridden": False}
|
self.data = {"ok": True, "overridden": False}
|
||||||
self.archived = None
|
self.archived = None
|
||||||
w = self.cycle_available_steps[self.step.type]
|
w = self.cycle_available_steps[self.step.type]
|
||||||
if w is not current_w:
|
show = None
|
||||||
self.setCentralWidget(w)
|
|
||||||
if hasattr(w, "start"):
|
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":
|
if self.step.type == "done":
|
||||||
self.archived = self.done()
|
self.archived = self.done()
|
||||||
self.next_timer.start(2000)
|
self.next_timer.start(2000)
|
||||||
|
|
@ -247,7 +260,7 @@ class Test(Widget):
|
||||||
elif self.step.type == "wait":
|
elif self.step.type == "wait":
|
||||||
self.next_timer.start(2000)
|
self.next_timer.start(2000)
|
||||||
# UPDATE PIECES DISPLAY
|
# 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):
|
def set_recipe(self, recipe=None):
|
||||||
self.recipe = recipe
|
self.recipe = recipe
|
||||||
|
|
@ -257,9 +270,12 @@ class Test(Widget):
|
||||||
steps = self.recipe.get_steps()
|
steps = self.recipe.get_steps()
|
||||||
skip = set()
|
skip = set()
|
||||||
print_found = False
|
print_found = False
|
||||||
|
count_found = False
|
||||||
for i, step in enumerate(steps):
|
for i, step in enumerate(steps):
|
||||||
if i in skip:
|
if i in skip:
|
||||||
continue
|
continue
|
||||||
|
if step.type == "count":
|
||||||
|
count_found = True
|
||||||
if step.type == "resistance":
|
if step.type == "resistance":
|
||||||
steps.insert(i + 1, Steps(type="resistance", spec={
|
steps.insert(i + 1, Steps(type="resistance", spec={
|
||||||
"scale": 500,
|
"scale": 500,
|
||||||
|
|
@ -271,8 +287,12 @@ class Test(Widget):
|
||||||
steps.insert(i, Steps(type="done"))
|
steps.insert(i, Steps(type="done"))
|
||||||
print_found = True
|
print_found = True
|
||||||
skip.add(i + 1)
|
skip.add(i + 1)
|
||||||
|
if count_found:
|
||||||
|
steps.insert(i + 2, Steps(type="count_end"))
|
||||||
if not print_found:
|
if not print_found:
|
||||||
steps.append(Steps(type="done"))
|
steps.append(Steps(type="done"))
|
||||||
|
if count_found:
|
||||||
|
steps.append(Steps(type="count_end"))
|
||||||
steps.append(Steps(type="wait"))
|
steps.append(Steps(type="wait"))
|
||||||
self.cycle_steps = steps
|
self.cycle_steps = steps
|
||||||
self.check_steps_dependencies(self.cycle_steps)
|
self.check_steps_dependencies(self.cycle_steps)
|
||||||
|
|
@ -281,10 +301,12 @@ class Test(Widget):
|
||||||
w.reset()
|
w.reset()
|
||||||
# UPDATE RECIPE DISPLAY
|
# UPDATE RECIPE DISPLAY
|
||||||
if self.recipe is not None:
|
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.setText(self.recipe.name)
|
||||||
self.recipe_l.setStyleSheet("")
|
self.recipe_l.setStyleSheet("")
|
||||||
self.next()
|
self.next()
|
||||||
else:
|
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.setText("NON SELEZIONATA")
|
||||||
self.recipe_l.setStyleSheet("QLabel { color: red; }")
|
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"])
|
archived = Archive.archive(self.recipe, self.data, ok and self.data["ok"], overridden=self.data["overridden"])
|
||||||
self.log.info(f"cycle archived locally: {archived!r}")
|
self.log.info(f"cycle archived locally: {archived!r}")
|
||||||
# COUNT OK
|
# COUNT OK
|
||||||
self.pieces[0] += 1
|
self.pieces["ok"] += 1
|
||||||
return archived
|
return archived
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ from ui.test_test import Test_Test
|
||||||
|
|
||||||
|
|
||||||
class Test_Barcodes(Test_Test):
|
class Test_Barcodes(Test_Test):
|
||||||
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
|
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, run_once=run_once, enable_override=enable_override)
|
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
|
||||||
self.barcodes_spec = {
|
self.barcodes_spec = {
|
||||||
"serial": self.check_serial_barcode
|
"serial": self.check_serial_barcode
|
||||||
}
|
}
|
||||||
|
|
@ -18,10 +18,10 @@ class Test_Barcodes(Test_Test):
|
||||||
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
|
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
|
||||||
self.barcodes_le.setFocus()
|
self.barcodes_le.setFocus()
|
||||||
|
|
||||||
def start(self, recipe=None, step=None):
|
def start(self, recipe=None, step=None, pieces=None):
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
self.visualize()
|
self.visualize()
|
||||||
self.barcodes_le.setPalette(self.status_palettes[None])
|
self.barcodes_le.setPalette(self.status_palettes[None])
|
||||||
self.barcodes_le.setText("")
|
self.barcodes_le.setText("")
|
||||||
|
|
@ -34,6 +34,7 @@ class Test_Barcodes(Test_Test):
|
||||||
self.test_timer.timeout.connect(self.get)
|
self.test_timer.timeout.connect(self.get)
|
||||||
self.test_timer.start(500)
|
self.test_timer.start(500)
|
||||||
# /TESTING
|
# /TESTING
|
||||||
|
return show
|
||||||
|
|
||||||
# def stop(self):
|
# def stop(self):
|
||||||
# super().stop()
|
# super().stop()
|
||||||
|
|
|
||||||
|
|
@ -8,16 +8,16 @@ from ui.test_test import Test_Test
|
||||||
|
|
||||||
|
|
||||||
class Test_Connector(Test_Test):
|
class Test_Connector(Test_Test):
|
||||||
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
|
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, run_once=run_once, enable_override=enable_override)
|
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("Return"), self).activated.connect(self.get)
|
||||||
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
|
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
|
||||||
self.connector_le.setFocus()
|
self.connector_le.setFocus()
|
||||||
|
|
||||||
def start(self, recipe=None, step=None):
|
def start(self, recipe=None, step=None, pieces=None):
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
self.visualize()
|
self.visualize()
|
||||||
expected = str(self.step.spec.get("connector", "-"))
|
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")
|
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.timeout.connect(self.get)
|
||||||
self.test_timer.start(500)
|
self.test_timer.start(500)
|
||||||
# /TESTING
|
# /TESTING
|
||||||
|
return show
|
||||||
|
|
||||||
# def stop(self):
|
# def stop(self):
|
||||||
# super().stop()
|
# super().stop()
|
||||||
|
|
|
||||||
1
src/ui/test_count/__init__.py
Normal file
1
src/ui/test_count/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from .test_count import Test_Count
|
||||||
59
src/ui/test_count/test_count.py
Normal file
59
src/ui/test_count/test_count.py
Normal 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)
|
||||||
123
src/ui/test_count/test_count.ui
Normal file
123
src/ui/test_count/test_count.ui
Normal 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>
|
||||||
1
src/ui/test_count_end/__init__.py
Normal file
1
src/ui/test_count_end/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from .test_count_end import Test_Count_End
|
||||||
47
src/ui/test_count_end/test_count_end.py
Normal file
47
src/ui/test_count_end/test_count_end.py
Normal 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
|
||||||
98
src/ui/test_count_end/test_count_end.ui
Normal file
98
src/ui/test_count_end/test_count_end.ui
Normal 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>
|
||||||
|
|
@ -10,14 +10,14 @@ from ui.test_test import Test_Test
|
||||||
|
|
||||||
|
|
||||||
class Test_Fail(Test_Test):
|
class Test_Fail(Test_Test):
|
||||||
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
|
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, run_once=run_once, enable_override=enable_override)
|
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.continue_b.clicked.connect(lambda checked, self=weakref.ref(self): self().ok.emit(None))
|
||||||
|
|
||||||
def start(self, recipe=None, step=None):
|
def start(self, recipe=None, step=None, pieces=None):
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
self.visualize()
|
self.visualize()
|
||||||
# TESTING
|
# TESTING
|
||||||
if "--test" in sys.argv:
|
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.timeout.connect(self.continue_b.click)
|
||||||
self.test_timer.start(500)
|
self.test_timer.start(500)
|
||||||
# /TESTING
|
# /TESTING
|
||||||
|
return show
|
||||||
|
|
||||||
# def stop(self):
|
# def stop(self):
|
||||||
# super().stop()
|
# super().stop()
|
||||||
|
|
|
||||||
|
|
@ -5,21 +5,21 @@ from ui.test_test import Test_Test
|
||||||
|
|
||||||
|
|
||||||
class Test_Leak(Test_Test):
|
class Test_Leak(Test_Test):
|
||||||
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
|
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, run_once=run_once, enable_override=enable_override)
|
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.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())
|
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
|
# TESTING
|
||||||
if "--test-leak" in sys.argv or "--test" in sys.argv:
|
if "--test-leak" in sys.argv or "--test" in sys.argv:
|
||||||
self.simulate = True
|
self.simulate = True
|
||||||
else:
|
else:
|
||||||
self.simulate = False
|
self.simulate = False
|
||||||
# /TESTING
|
# /TESTING
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
# setup test loop
|
# setup test loop
|
||||||
self.components["tecna_t3"].write_recipe(self.recipe, self.step)
|
self.components["tecna_t3"].write_recipe(self.recipe, self.step)
|
||||||
self.get_connection = self.components["tecna_t3"].out.connect(self.get)
|
self.get_connection = self.components["tecna_t3"].out.connect(self.get)
|
||||||
|
|
@ -28,6 +28,7 @@ class Test_Leak(Test_Test):
|
||||||
self.parent_assembly_widget().set_text(text="WAIT")
|
self.parent_assembly_widget().set_text(text="WAIT")
|
||||||
self.start_b.setEnabled(False)
|
self.start_b.setEnabled(False)
|
||||||
self.stop_b.setEnabled(False)
|
self.stop_b.setEnabled(False)
|
||||||
|
return show
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
# disable test loop
|
# disable test loop
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@ from ui.test_test import Test_Test
|
||||||
|
|
||||||
|
|
||||||
class Test_Resistance(Test_Test):
|
class Test_Resistance(Test_Test):
|
||||||
def __init__(self, components=None, recipe=None, step=None, run_once=False, enable_override=False):
|
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, run_once=run_once, enable_override=enable_override)
|
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, enable_override=enable_override)
|
||||||
self.ok_counter_limit = 3
|
self.ok_counter_limit = 3
|
||||||
|
|
||||||
def start(self, recipe=None, step=None):
|
def start(self, recipe=None, step=None, pieces=None):
|
||||||
# TESTING
|
# TESTING
|
||||||
if "--test-resistance" in sys.argv or "--test" in sys.argv:
|
if "--test-resistance" in sys.argv or "--test" in sys.argv:
|
||||||
self.simulate = True
|
self.simulate = True
|
||||||
|
|
@ -19,9 +19,9 @@ class Test_Resistance(Test_Test):
|
||||||
expected = step.spec.get("expected", "-")
|
expected = step.spec.get("expected", "-")
|
||||||
if expected == float("+inf"):
|
if expected == float("+inf"):
|
||||||
step.spec["expected"] = 1e9
|
step.spec["expected"] = 1e9
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
# setup test loop
|
# setup test loop
|
||||||
self.components["multicomp"].set_resistance_scale(self.step.spec.get("scale", 500))
|
self.components["multicomp"].set_resistance_scale(self.step.spec.get("scale", 500))
|
||||||
self.get_connection = self.components["multicomp"].out.connect(self.get)
|
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)
|
bg = self.status_palettes[None].color(QPalette.Background)
|
||||||
color = f"rgb({bg.red()}, {bg.green()}, {bg.blue()})"
|
color = f"rgb({bg.red()}, {bg.green()}, {bg.blue()})"
|
||||||
self.resistance_l.setStyleSheet(f"background-color: {color};\nborder: 1px solid black;\n")
|
self.resistance_l.setStyleSheet(f"background-color: {color};\nborder: 1px solid black;\n")
|
||||||
|
return show
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
# disable test loop
|
# disable test loop
|
||||||
|
|
|
||||||
|
|
@ -5,19 +5,19 @@ from ui.test_test import Test_Test
|
||||||
|
|
||||||
|
|
||||||
class Test_Screws(Test_Test):
|
class Test_Screws(Test_Test):
|
||||||
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__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
|
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
|
# TESTING
|
||||||
if "--test-screws" in sys.argv or "--test" in sys.argv:
|
if "--test-screws" in sys.argv or "--test" in sys.argv:
|
||||||
self.simulate = True
|
self.simulate = True
|
||||||
else:
|
else:
|
||||||
self.simulate = False
|
self.simulate = False
|
||||||
# /TESTING
|
# /TESTING
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
# setup test loop
|
# setup test loop
|
||||||
self.get_connection = self.components["screwdriver"].out.connect(self.get)
|
self.get_connection = self.components["screwdriver"].out.connect(self.get)
|
||||||
self.components["tecna_t3"].resume()
|
self.components["tecna_t3"].resume()
|
||||||
|
|
@ -26,6 +26,7 @@ class Test_Screws(Test_Test):
|
||||||
self.screws_counter_l.setText(str(0))
|
self.screws_counter_l.setText(str(0))
|
||||||
self.screws_expected_l.setText(str(self.ok_counter_limit))
|
self.screws_expected_l.setText(str(self.ok_counter_limit))
|
||||||
self.components["screwdriver"].enable(self.ok_counter_limit > 0)
|
self.components["screwdriver"].enable(self.ok_counter_limit > 0)
|
||||||
|
return show
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
# disable test loop
|
# disable test loop
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,12 @@ class Test_Test(Widget):
|
||||||
ok = pyqtSignal(object)
|
ok = pyqtSignal(object)
|
||||||
ko = 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__()
|
super().__init__()
|
||||||
self.components = components
|
self.components = components
|
||||||
self.recipe = recipe
|
self.recipe = recipe
|
||||||
self.step = step
|
self.step = step
|
||||||
|
self.pieces = pieces
|
||||||
self.run_once = run_once
|
self.run_once = run_once
|
||||||
self.enable_override = enable_override
|
self.enable_override = enable_override
|
||||||
# setup variables
|
# setup variables
|
||||||
|
|
@ -70,6 +71,7 @@ class Test_Test(Widget):
|
||||||
self.status_palettes[False].setColor(QPalette.Base, Qt.red)
|
self.status_palettes[False].setColor(QPalette.Base, Qt.red)
|
||||||
self.status_palettes["warning"].setColor(QPalette.Base, QColor(255, 165, 0))
|
self.status_palettes["warning"].setColor(QPalette.Base, QColor(255, 165, 0))
|
||||||
self.status_palettes[""].setColor(QPalette.Base, QColor(255, 255, 0))
|
self.status_palettes[""].setColor(QPalette.Base, QColor(255, 255, 0))
|
||||||
|
self.reset()
|
||||||
self.visualize()
|
self.visualize()
|
||||||
|
|
||||||
def set_parent_assembly_widget(self, parent_assembly_widget=None):
|
def set_parent_assembly_widget(self, parent_assembly_widget=None):
|
||||||
|
|
@ -80,14 +82,13 @@ class Test_Test(Widget):
|
||||||
else:
|
else:
|
||||||
self.parent_assembly_widget = weakref.ref(parent_assembly_widget)
|
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.admin_challenged = False
|
||||||
self.recipe = recipe
|
self.recipe = recipe
|
||||||
self.step = step
|
self.step = step
|
||||||
|
self.pieces = pieces
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if self.run_once is True and self.done is True and self.done_ok is True:
|
||||||
self.emit_ok()
|
return False
|
||||||
return
|
|
||||||
self.reset()
|
|
||||||
if self.enable_override:
|
if self.enable_override:
|
||||||
self.override_b.setVisible(True)
|
self.override_b.setVisible(True)
|
||||||
self.override_b.setEnabled(True)
|
self.override_b.setEnabled(True)
|
||||||
|
|
@ -102,6 +103,7 @@ class Test_Test(Widget):
|
||||||
if self.enable_override and hasattr(self, "_test_overridden_test_"):
|
if self.enable_override and hasattr(self, "_test_overridden_test_"):
|
||||||
del self._test_overridden_test_
|
del self._test_overridden_test_
|
||||||
# /TESTING
|
# /TESTING
|
||||||
|
return True
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
pass
|
pass
|
||||||
|
|
@ -112,7 +114,7 @@ class Test_Test(Widget):
|
||||||
self.done_ok = None
|
self.done_ok = None
|
||||||
self.last = 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
|
if self.done: # avoid proccessing if completed
|
||||||
return
|
return
|
||||||
if data is None:
|
if data is None:
|
||||||
|
|
@ -152,14 +154,20 @@ class Test_Test(Widget):
|
||||||
if hasattr(self, "override_b"):
|
if hasattr(self, "override_b"):
|
||||||
self.override_b.setEnabled(False)
|
self.override_b.setEnabled(False)
|
||||||
self.stop()
|
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:
|
elif self.ok_counter >= self.ok_counter_limit:
|
||||||
self.done = True
|
self.done = True
|
||||||
self.done_ok = True
|
self.done_ok = True
|
||||||
if hasattr(self, "override_b"):
|
if hasattr(self, "override_b"):
|
||||||
self.override_b.setEnabled(False)
|
self.override_b.setEnabled(False)
|
||||||
self.stop()
|
self.stop()
|
||||||
self.ok_timer.start()
|
if skip_delay:
|
||||||
|
self.emit_ok()
|
||||||
|
else:
|
||||||
|
self.ok_timer.start()
|
||||||
self.visualize(self.last)
|
self.visualize(self.last)
|
||||||
# TESTING
|
# TESTING
|
||||||
if "--test" in sys.argv:
|
if "--test" in sys.argv:
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ from ui.test_test import Test_Test
|
||||||
class Test_Vision(Test_Test):
|
class Test_Vision(Test_Test):
|
||||||
request_frame = pyqtSignal()
|
request_frame = pyqtSignal()
|
||||||
|
|
||||||
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__(components=components, recipe=recipe, step=step, run_once=run_once, enable_override=enable_override)
|
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:
|
if "--sim-camera" not in sys.argv:
|
||||||
self.ok_counter_limit = 2
|
self.ok_counter_limit = 2
|
||||||
else:
|
else:
|
||||||
|
|
@ -27,10 +27,10 @@ class Test_Vision(Test_Test):
|
||||||
self.results_tw.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
self.results_tw.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
||||||
self.results_tw.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
self.results_tw.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
||||||
|
|
||||||
def start(self, recipe=None, step=None):
|
def start(self, recipe=None, step=None, pieces=None):
|
||||||
super().start(recipe=recipe, step=step)
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
||||||
if self.run_once is True and self.done is True and self.done_ok is True:
|
if show is False:
|
||||||
return
|
return show
|
||||||
# setup camera-vision loop
|
# setup camera-vision loop
|
||||||
if "uvc_camera" in self.components:
|
if "uvc_camera" in self.components:
|
||||||
self.components["uvc_camera"].set_period(period=None) # only get frame on request
|
self.components["uvc_camera"].set_period(period=None) # only get frame on request
|
||||||
|
|
@ -52,6 +52,7 @@ class Test_Vision(Test_Test):
|
||||||
# DETECTIONS TABLE
|
# DETECTIONS TABLE
|
||||||
# hide previous results
|
# hide previous results
|
||||||
self.results_tw.setRowCount(0)
|
self.results_tw.setRowCount(0)
|
||||||
|
return show
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
# disable camera-vision loop
|
# disable camera-vision loop
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user