From b3568e34179effeba98c57caac5a9bfe033bde39 Mon Sep 17 00:00:00 2001
From: neo-dl
Date: Mon, 18 Jul 2022 18:20:16 +0200
Subject: [PATCH 1/4] localdev
---
config/machine_settings/defaults.ini | 8 ++++---
config/vision/labels/labels.pbtxt | 4 ++--
config/vision/recipes/1.ini | 14 ++++--------
config/vision/recipes/2.ini | 34 ----------------------------
simulate.sh | 2 --
src/components/component.py | 2 +-
src/components/vision.py | 20 +++++++++++++---
src/main.py | 3 +++
8 files changed, 32 insertions(+), 55 deletions(-)
delete mode 100644 config/vision/recipes/2.ini
diff --git a/config/machine_settings/defaults.ini b/config/machine_settings/defaults.ini
index 38347cc..0b9aa09 100644
--- a/config/machine_settings/defaults.ini
+++ b/config/machine_settings/defaults.ini
@@ -9,9 +9,9 @@ exposure_time: 10000
; vertical_crop_resolution: 2048
; rotate_90_clockwise times: 0
; auto_white_balance: off
-; balance_red: 1.0
-; balance_green: 1.0
-; balance_blue: 1.0
+balance_red: 1.66
+balance_green: 1.0
+balance_blue: 1.12
[vision_saver]
time_format: %Y-%m-%d_%H-%M-%S
@@ -44,4 +44,6 @@ baudrate: 9600
[vision]
detection_threshold: 0.3
+neural_network: hs2-50000
+
; recipes_path: ./config/vision_test_recipes
diff --git a/config/vision/labels/labels.pbtxt b/config/vision/labels/labels.pbtxt
index 66912e7..5e6c94c 100644
--- a/config/vision/labels/labels.pbtxt
+++ b/config/vision/labels/labels.pbtxt
@@ -1,7 +1,7 @@
item {
id: 1
name: 'hs-ok'
- color: '0x00ff00'
+ color: '0x555555'
}
item {
id: 2
@@ -11,5 +11,5 @@ item {
item {
id: 3
name: 'hs-empty'
- color: '0x0000ff'
+ color: '0xaaaaaa'
}
diff --git a/config/vision/recipes/1.ini b/config/vision/recipes/1.ini
index bee1461..c0f6df7 100644
--- a/config/vision/recipes/1.ini
+++ b/config/vision/recipes/1.ini
@@ -1,8 +1,8 @@
# LIEBHER RUBBER FLANGE
[general]
-name: RICETTA 1
-instruction: APPORRE I SEGNI CON IL PENNARELLO COME INDICATO IN FIGURA
+name: TERMORESTRINGENTE
+instruction: CONTROLLARE PRESENZA TERMORESTRINGENTE
# POINTS FORMAT:
# point_name: point_center point_size fill_color border_color border_thickness shape
@@ -20,15 +20,9 @@ instruction: APPORRE I SEGNI CON IL PENNARELLO COME INDICATO IN FIGURA
# name: X,Y S 0xAARRGGBB 0xAARRGGBB T TEXT
[markers]
-cross: 1100,1100 100,100 0x000000ff 0xff0000ff 25 cross
-center: 1100,1100 2050,2050 0x0000ff00 0xff0000ff 50 ellipse
[zones]
-p1: 610,550 200 hs-ok # TOP LEFT WHITE POINT
-p2: 1790,1290 200 hs-ok # RIGHT SIDE WHITE POINT
-p3: 350,1190 200 hs-ok # LEFT SIDE BLUE POINT
+p1: 800,700 100,200 hs-ok # HEATSINK PRESENT
[labels]
-p1: 510,825 100 0xffffffff 0xff000000 10 BIANCO
-p2: 1690,1565 100 0xffffffff 0xff000000 10 BIANCO
-p3: 250,1465 100 0xff0000ff 0xff000000 10 BLU
+p1: 600,500 100 0xffffffff 0xffffffff 10 TERMORESTRINGENTE
diff --git a/config/vision/recipes/2.ini b/config/vision/recipes/2.ini
deleted file mode 100644
index 31e321a..0000000
--- a/config/vision/recipes/2.ini
+++ /dev/null
@@ -1,34 +0,0 @@
-# LIEBHER RUBBER FLANGE
-
-[general]
-name: RICETTA 2
-instruction: APPORRE I SEGNI CON IL PENNARELLO COME INDICATO IN FIGURA
-
-# POINTS FORMAT:
-# point_name: point_center point_size fill_color border_color border_thickness shape
-# EXAMPLE:
-# name: X,Y W,H 0xAARRGGBB 0xAARRGGBB T SHAPE CLASS
-# ZONES FORMAT:
-# region_name: region_center region_margin class
-# margin can be a box (XM*2,YM*2) or a radius (R)
-# EXAMPLES:
-# name: X,Y XM,YM T SHAPE CLASS
-# name: X,Y R T SHAPE CLASS
-# LABELS FORMAT:
-# label_name: label_start_location font_size fill_color border_color border_thickness text
-# EXAMPLE:
-# name: X,Y S 0xAARRGGBB 0xAARRGGBB T TEXT
-
-[markers]
-cross: 1100,1100 100,100 0x000000ff 0xff0000ff 25 cross
-center: 1100,1100 2050,2050 0x0000ff00 0xff0000ff 50 ellipse
-
-[zones]
-p1: 610,550 200 hs-ok # TOP LEFT WHITE POINT
-p2: 1790,1290 200 hs-ok # RIGHT SIDE WHITE POINT
-p3: 350,1190 200 hs-ok # LEFT SIDE BLUE POINT
-
-[labels]
-p1: 510,825 100 0xffffffff 0xff000000 10 BIANCO
-p2: 1690,1565 100 0xffffffff 0xff000000 10 BIANCO
-p3: 250,1465 100 0xff0000ff 0xff000000 10 BLU
diff --git a/simulate.sh b/simulate.sh
index 5cbbaeb..56f8ada 100755
--- a/simulate.sh
+++ b/simulate.sh
@@ -14,12 +14,10 @@ export QT_NO_WARNING_OUTPUT=0
# export QT_QPA_PLATFORM=${XDG_SESSION_TYPE}
python -B -u "./src/main.py" \
--auto-login-admin \
---auto-select \
--no-autotest \
--no-edgetpu \
--no-gpu \
--panel \
---sim-camera \
--sim-modbus \
--sim-os-label-printer \
--sim-serial \
diff --git a/src/components/component.py b/src/components/component.py
index 93c8a33..bd13e51 100644
--- a/src/components/component.py
+++ b/src/components/component.py
@@ -109,7 +109,7 @@ class Component(QObject):
self._lock.release()
return running
- def wait_ready(self, timeout=5):
+ def wait_ready(self, timeout=10):
"""
waits untill the requested action has been completed by the component
this will return immediately if threaded=False was passed at component initialization
diff --git a/src/components/vision.py b/src/components/vision.py
index b489bb0..302703f 100644
--- a/src/components/vision.py
+++ b/src/components/vision.py
@@ -7,6 +7,11 @@ from pathlib import Path
import cv2
import numpy as np
+from PyQt5.QtWidgets import QApplication
+
+if "--no-gpu" in sys.argv:
+ os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
+
import tensorflow as tf
from lib.helpers.object_detection.utils import label_map_util
from PyQt5.QtCore import (QFileSystemWatcher, QLineF, QMutex, QPointF, QRectF,
@@ -17,6 +22,7 @@ from PyQt5.QtGui import (QBrush, QColor, QFont, QImage, QPainter, QPainterPath,
from .component import Component
from .consumer import Consumer
+
if "--no-edgetpu" not in sys.argv:
try:
from pycoral.utils.edgetpu import make_interpreter
@@ -42,8 +48,6 @@ else:
def Interpreter(*args, **kwargs):
raise ValueError("\"--no-tflite\" in sys.argv")
-if "--no-gpu" in sys.argv:
- os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
# # Patch the location of gfile
# tf.gfile = tf.io.gfile
@@ -69,6 +73,9 @@ class Vision(Component):
self.vision_consumer.moveToThread(self.vision_consumer_thread)
self.vision_consumer_thread.started.connect(self.vision_consumer.start)
self.vision_consumer_thread.start()
+ QApplication.processEvents()
+ QThread.msleep(1000)
+ QApplication.processEvents()
self.vision_consumer.wait_ready()
# RENDER THREAD
self.render_consumer = Consumer(work=self.render_consumer_work, work_fifo=True, drop_fifo=True, work_maxlen=1, name="render_consumer", paused=False)
@@ -77,6 +84,9 @@ class Vision(Component):
self.render_consumer.moveToThread(self.render_consumer_thread)
self.render_consumer_thread.started.connect(self.render_consumer.start)
self.render_consumer_thread.start()
+ QApplication.processEvents()
+ QThread.msleep(1000)
+ QApplication.processEvents()
self.render_consumer.wait_ready()
# CONNECT CONSUMERS
self.vision_consumer.out.connect(self.process_vision_consumed)
@@ -275,6 +285,8 @@ class Vision(Component):
"none",
]:
model_name = sorted([d for d in os.listdir(self.models_dir) if os.path.isdir(self.models_dir / d)], reverse=True)[0]
+ else:
+ model_name = model
self.log.info(f"loading neural network: {model_name!r}")
self.loading_model_signal.emit({"status": "loading"})
self.lock.lock()
@@ -429,8 +441,10 @@ class Vision(Component):
# filtering out those that do not contain the detection
min_distance = sys.maxsize
closest_zone = None
+ outside_zone = True
for zone_name, zone in self.zones.items():
if zone["shape"] == "rect":
+ distance = self.get_distance(detection["center"], zone["center"])
if self.zone_detection_filter_mode == "center_inside":
outside_zone = any([
detection["center"][0] < zone["box"][0],
@@ -512,7 +526,7 @@ class Vision(Component):
"detection": detection,
}
return {
- "ok": all(map(lambda detection: detection["ok"] is True, checked.values())),
+ "ok": False, # all(map(lambda detection: detection["ok"] is True, checked.values())),
"results": checked,
}
diff --git a/src/main.py b/src/main.py
index 701c4ce..33f9386 100644
--- a/src/main.py
+++ b/src/main.py
@@ -100,6 +100,9 @@ try:
component = self.components[component_name]
thread.started.connect(component.start)
thread.start()
+ QApplication.processEvents()
+ QThread.msleep(1000)
+ QApplication.processEvents()
if component_name == "vision":
component.wait_ready(timeout=60)
else:
From 2371f3ab7c3c118587b35ea18d6d03b16e983a69 Mon Sep 17 00:00:00 2001
From: neo-dl
Date: Mon, 18 Jul 2022 18:51:02 +0200
Subject: [PATCH 2/4] localdev
---
config/machine_settings/defaults.ini | 4 +-
config/vision/labels/labels.pbtxt | 2 +-
designer.sh | 2 +
designer_win.sh | 2 +
src/components/galaxy_camera.py | 2 +
src/components/vision.py | 2 +-
src/main.py | 2 +-
src/ui/__init__.py | 2 -
src/ui/autotests_archive/__init__.py | 1 -
src/ui/autotests_archive/autotests_archive.py | 70 -----------
src/ui/autotests_archive/autotests_archive.ui | 37 ------
src/ui/test/test.py | 9 +-
.../test_admin_permission.py | 1 +
.../test_admin_permission.ui | 109 ++++++++--------
src/ui/test_autotest/__init__.py | 1 -
src/ui/test_autotest/test_autotest.py | 117 ------------------
src/ui/test_autotest/test_autotest.ui | 9 --
src/ui/test_test/test_test.py | 1 +
18 files changed, 72 insertions(+), 301 deletions(-)
create mode 100755 designer.sh
create mode 100644 designer_win.sh
delete mode 100755 src/ui/autotests_archive/__init__.py
delete mode 100755 src/ui/autotests_archive/autotests_archive.py
delete mode 100755 src/ui/autotests_archive/autotests_archive.ui
delete mode 100755 src/ui/test_autotest/__init__.py
delete mode 100755 src/ui/test_autotest/test_autotest.py
delete mode 100755 src/ui/test_autotest/test_autotest.ui
diff --git a/config/machine_settings/defaults.ini b/config/machine_settings/defaults.ini
index 0b9aa09..4e7f8a4 100644
--- a/config/machine_settings/defaults.ini
+++ b/config/machine_settings/defaults.ini
@@ -43,7 +43,7 @@ port: COM1
baudrate: 9600
[vision]
-detection_threshold: 0.3
-neural_network: hs2-50000
+detection_threshold: 0.5
+neural_network: hs1-50000
; recipes_path: ./config/vision_test_recipes
diff --git a/config/vision/labels/labels.pbtxt b/config/vision/labels/labels.pbtxt
index 5e6c94c..a4766de 100644
--- a/config/vision/labels/labels.pbtxt
+++ b/config/vision/labels/labels.pbtxt
@@ -1,7 +1,7 @@
item {
id: 1
name: 'hs-ok'
- color: '0x555555'
+ color: '0x444444'
}
item {
id: 2
diff --git a/designer.sh b/designer.sh
new file mode 100755
index 0000000..2fc12f4
--- /dev/null
+++ b/designer.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+venv/lib/python3.9/site-packages/qt5_applications/Qt/bin/designer
diff --git a/designer_win.sh b/designer_win.sh
new file mode 100644
index 0000000..11fefa5
--- /dev/null
+++ b/designer_win.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+venv/Lib/site-packages/qt5_applications/Qt/bin/designer
diff --git a/src/components/galaxy_camera.py b/src/components/galaxy_camera.py
index 319d110..6f79a02 100644
--- a/src/components/galaxy_camera.py
+++ b/src/components/galaxy_camera.py
@@ -1,5 +1,6 @@
import pathlib
import sys
+import time
from itertools import cycle
import cv2
@@ -122,6 +123,7 @@ class GalaxyCamera(Component):
img_path = next(self.sim_imgs)
self.log.debug(f"loading image {img_path}")
frame = cv2.cvtColor(cv2.imread(str(img_path)), cv2.COLOR_BGR2RGB)
+ time.sleep(1)
else:
self.camera.TriggerSoftware.send_command()
frame = self.camera.data_stream[0].get_image()
diff --git a/src/components/vision.py b/src/components/vision.py
index 7bf794f..968b0f3 100644
--- a/src/components/vision.py
+++ b/src/components/vision.py
@@ -342,7 +342,7 @@ class Vision(Component):
# Run inference
if lock:
self.lock.lock()
- if self.simulate or tf_mode == "simulation":
+ if self.simulate or self.tf_mode == "simulation":
detections = {
"detection_scores": [[1.0]],
"detection_boxes": [[[0.2, 0.2, 0.8, 0.8]]],
diff --git a/src/main.py b/src/main.py
index 33f9386..d73a718 100644
--- a/src/main.py
+++ b/src/main.py
@@ -60,7 +60,7 @@ try:
from lib.helpers import ConfigReader
from PyQt5.QtCore import QObject, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMessageBox
- from ui import (About, Archive, Autotests_Archive, Login, Main_Window,
+ from ui import (About, Archive, Login, Main_Window,
Test, Users_Management)
class Main(QObject):
diff --git a/src/ui/__init__.py b/src/ui/__init__.py
index 8960c4a..1ae87e2 100644
--- a/src/ui/__init__.py
+++ b/src/ui/__init__.py
@@ -1,6 +1,5 @@
from .about import About
from .archive import Archive
-from .autotests_archive import Autotests_Archive
from .dialog import Dialog
from .login import Login
from .main_window import Main_Window
@@ -12,7 +11,6 @@ from .recipe_editor import Recipe_Editor
from .recipe_selection import Recipe_Selection
from .test import Test
from .test_admin_permission import Test_Admin_Permission
-from .test_autotest import Test_Autotest
from .test_home import Test_Home
from .test_leak import Test_Leak
from .test_test import Test_Test
diff --git a/src/ui/autotests_archive/__init__.py b/src/ui/autotests_archive/__init__.py
deleted file mode 100755
index b80d471..0000000
--- a/src/ui/autotests_archive/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from .autotests_archive import Autotests_Archive
diff --git a/src/ui/autotests_archive/autotests_archive.py b/src/ui/autotests_archive/autotests_archive.py
deleted file mode 100755
index 8768564..0000000
--- a/src/ui/autotests_archive/autotests_archive.py
+++ /dev/null
@@ -1,70 +0,0 @@
-from lib.db import Users
-from PyQt5.QtWidgets import QAbstractItemView
-from ui.crud import Crud, Json_External_Dialog_Cell_Widget
-from ui.helpers import replace_widget
-from ui.widget import Widget
-
-
-class Autotests_Archive(Widget):
- def __init__(self, printer=None):
- super().__init__()
- self.printer = printer
- session = Users.get_session()
- if session is not None and session.is_admin:
- crud_aliases = {
- "id": "Id",
- "time": "Data e ora",
- "user": "Operatore",
- "recipe": "Ricetta",
- "result": "Esito",
- "reason": "Motivo",
- "overridden": "Esito forzato",
- "test_data": "Dati del test",
- }
- readonly = ["id"]
- else:
- crud_aliases = {
- "time": "Data e ora",
- "user": "Operatore",
- "recipe": "Ricetta",
- "result": "Esito",
- "reason": "Motivo",
- "overridden": "Esito forzato",
- "test_data": "Dati del test",
- }
- readonly = True
- self.crud = Crud(
- "autotests",
- display_name="Archivio autotest",
- readonly=readonly,
- select=list(crud_aliases.keys()),
- fields_aliases=crud_aliases,
- widget_classes={
- "test_data": Json_External_Dialog_Cell_Widget,
- },
- )
- replace_widget(self, "crud_w", self.crud)
- self.selected = None
- self.print_b.setEnabled(False)
- self.crud.db_tw.setSelectionBehavior(QAbstractItemView.SelectRows)
- self.crud.db_tw.setSelectionMode(QAbstractItemView.SingleSelection)
- self.crud.db_tw.itemSelectionChanged.connect(self.check)
- self.print_b.clicked.connect(self.print_label)
-
- def check(self):
- if not self.crud.modified:
- selected = self.crud.get_selected_rows()
- if len(selected) == 1:
- selected = selected[0] - 1 # - 1 because rn starts from 1 (filters line)
- if selected >= 0 and selected < len(self.crud.data_index):
- selected = self.crud.data_index[selected]
- self.selected = self.crud.db.table_model.get_by_id(selected)
- self.print_b.setEnabled(True)
- return
- self.selected = None
- self.print_b.setEnabled(False)
-
- def print_label(self):
- self.check()
- if self.selected is not None and self.printer is not None:
- self.printer.print_autotest_label(self.selected)
diff --git a/src/ui/autotests_archive/autotests_archive.ui b/src/ui/autotests_archive/autotests_archive.ui
deleted file mode 100755
index f4cf414..0000000
--- a/src/ui/autotests_archive/autotests_archive.ui
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
- Autotests archive
-
-
-
- 0
- 0
- 98
- 61
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Stampa
-
-
-
- -
-
-
-
-
-
- print_b
-
-
-
-
diff --git a/src/ui/test/test.py b/src/ui/test/test.py
index 612252d..f45f472 100755
--- a/src/ui/test/test.py
+++ b/src/ui/test/test.py
@@ -8,7 +8,6 @@ from PyQt5.QtCore import QTimer
from ui.helpers import replace_widget
from ui.recipe_selection import Recipe_Selection
from ui.test_assembly import Test_Assembly
-from ui.test_autotest import Test_Autotest
from ui.test_leak import Test_Leak
from ui.test_vision import Test_Vision
from ui.widget import Widget
@@ -36,13 +35,11 @@ class Test(Widget):
self.cycle_state = None
self.cycle_states = {
# "assembly_1": Test_Assembly(self.select_step_img("assembly_1"), u"INSERIRE SENSORE"),
- "autotest": Test_Assembly(None, u"ESEGUIRE PROCEDURA DI AUTOTEST", Test_Autotest()),
- "done": Test_Assembly(self.select_step_img("success"), u"COLLAUDO COMPLETATO - RIMUOVERE IL SENSORE"),
- "emergency": Test_Assembly(self.select_step_img("reset_emergency"), u"EMERGENZA INTERVENUTA - RIPRISTINARE PULSANTE E SELEZIONARE \"RESET EMERGENZA\" DAL MEN\u00d9 \"STRUMENTI\""),
- "fail": Test_Assembly(self.select_step_img("fail"), u"CICLO INTERROTTO - RIMUOVERE IL SENSORE"),
+ "done": Test_Assembly(self.select_step_img("success"), u"COLLAUDO COMPLETATO - RIMUOVERE IL PEZZO SOTTO TEST"),
+ "fail": Test_Assembly(self.select_step_img("fail"), u"CICLO INTERROTTO - RIMUOVERE IL PEZZO SOTTO TEST"),
"run_test": Test_Assembly(self.select_step_img("wait"), u"ESECUZIONE TEST IN CORSO - ATTENDERE", Test_Leak(components=self.components, recipe=self.recipe)),
"select_recipe": Test_Assembly(None, u"SELEZIONARE IL CODICE DA COLLAUDARE", Recipe_Selection()),
- "vision": Test_Assembly(None, u"ESEGUIRE PROCEDURA DI AUTOTEST", Test_Vision(components=self.components, recipe=self.recipe)),
+ "vision": Test_Assembly(None, u"VERIFICARE TEST TELECAMERA", Test_Vision(components=self.components, recipe=self.recipe)),
"wait": Test_Assembly(self.select_step_img("wait"), u"ATTENDERE - PAUSA INTER CICLO"),
}
self.cycle_loop = ["run_test", "vision", "done", "wait"]
diff --git a/src/ui/test_admin_permission/test_admin_permission.py b/src/ui/test_admin_permission/test_admin_permission.py
index ccff315..3614e59 100644
--- a/src/ui/test_admin_permission/test_admin_permission.py
+++ b/src/ui/test_admin_permission/test_admin_permission.py
@@ -19,6 +19,7 @@ class Test_Admin_Permission(Widget):
self.info_l.setText(self.txt)
self.continue_b.clicked.connect(self.verify)
self.cancel_b.clicked.connect(self.cancel)
+
# TESTING
if "--test" in sys.argv:
self.password_le.setText("123123")
diff --git a/src/ui/test_admin_permission/test_admin_permission.ui b/src/ui/test_admin_permission/test_admin_permission.ui
index 1d4d08b..5bcb7ed 100644
--- a/src/ui/test_admin_permission/test_admin_permission.ui
+++ b/src/ui/test_admin_permission/test_admin_permission.ui
@@ -1,57 +1,60 @@
- Admin permission
-
-
-
- 0
- 0
- 422
- 139
-
-
-
- Admin permission
-
-
- -
-
-
- Annulla
-
-
-
- -
-
-
- Continua
-
-
-
- -
-
-
- QLineEdit::Password
-
-
- password
-
-
-
- -
-
-
- -
-
-
-
-
+ Admin permission
+
+
+
+ 0
+ 0
+ 422
+ 139
+
+
+
+ Admin permission
+
+
+ -
+
+
+ Annulla
+
-
- password_le
- continue_b
- cancel_b
-
-
-
+
+ -
+
+
+ Continua
+
+
+ true
+
+
+
+ -
+
+
+ QLineEdit::Password
+
+
+ password
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+ password_le
+ continue_b
+ cancel_b
+
+
+
diff --git a/src/ui/test_autotest/__init__.py b/src/ui/test_autotest/__init__.py
deleted file mode 100755
index 362f749..0000000
--- a/src/ui/test_autotest/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from .test_autotest import Test_Autotest
diff --git a/src/ui/test_autotest/test_autotest.py b/src/ui/test_autotest/test_autotest.py
deleted file mode 100755
index 2a70e25..0000000
--- a/src/ui/test_autotest/test_autotest.py
+++ /dev/null
@@ -1,117 +0,0 @@
-import sys
-from datetime import datetime
-
-# from lib.db import Autotests
-from PyQt5.QtCore import Qt, QTimer, pyqtSignal, pyqtSlot
-# from PyQt5.QtGui import QPixmap
-from ui.widget import Widget
-
-
-class Test_Autotest(Widget):
- ok = pyqtSignal()
-
- def set_reason(self, reason):
- print(reason)
- # def __init__(self, bench, drawing, reason):
- # self.reason = reason
- # self.autotest_cycle = [
- # ["autotest_nok", "Inserire campione autotest \"NOK\"", "autotest_nok"],
- # ["autotest_ok", "Inserire campione autotest \"OK\"", "autotest_ok"],
- # ]
- # self.autotest_cycle_state = 0
- # test = self.autotest_cycle[self.autotest_cycle_state]
- # recipe = bench.recipes[test[0]]
- # for h in ["wires", "terminals"]:
- # bench.parsers[h].set_recipe(recipe)
- # self.instructions_img = QPixmap("src/ui/imgs/{}.png".format(test[2]))
- # log_msg("autotest {}".format(test[0]))
- # super().__init__(bench, drawing)
- # if "--sim-autotest" not in sys.argv:
- # self.vision_ok_counter_limit = 3
- # else:
- # self.vision_ok_counter_limit = 1
- # self.autotest_frames = {}
- # self.cycle_state_timer = QTimer()
- # self.cycle_state_timer.setSingleShot(True)
- # self.cycle_state_timer.setInterval(2000)
- # self.cycle_state_timer.timeout.connect(self.cycle_state)
- # self.sources = ["frame", "wires", "terminals"]
- # self.bench.inputs["renderer"].checklist = ["wires", "terminals"]
- # self.bench.inputs["datamatrix"].update.disconnect()
- # self.bench.inputs["datamatrix"].out.disconnect()
- # self.instruction_l.setText(test[1])
- # self.autotest_cycle_state_leds = [
- # self.nok_state_l,
- # self.ok_state_l,
- # ]
- # self.update_leds()
- #
- # @pyqtSlot()
- # def resizeEvent(self, event=None):
- # super().resizeEvent(event=event)
- # self.instructions_img_l.setPixmap(self.instructions_img.scaled(self.instructions_img_l.width(), self.instructions_img_l.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
- #
- # @pyqtSlot()
- # @pyqtSlot(str)
- # def check_barcodes(self, barcode=None):
- # pass
- #
- # def check_ok(self):
- # # CHECK IF COMPLETED AUTOTEST
- # if (
- # all([t in self.vision and self.vision[t]["ok"] for t in ["wires", "terminals"]])
- # and self.vision_ok_counter >= self.vision_ok_counter_limit
- # ):
- # self.autotest_frames[self.autotest_cycle[self.autotest_cycle_state][0]] = self.frame
- # self.instructions_img = QPixmap("src/ui/imgs/success.png")
- # self.resizeEvent()
- # self.autotest_cycle_state += 1
- # self.cycle_state_timer.start()
- #
- # @pyqtSlot()
- # def cycle_state(self, override=False):
- # if self.autotest_cycle_state < len(self.autotest_cycle) and not override:
- # test = self.autotest_cycle[self.autotest_cycle_state]
- # recipe = self.bench.recipes[test[0]]
- # for h in ["wires", "terminals"]:
- # self.bench.parsers[h].set_recipe(recipe)
- # self.instruction_l.setText(test[1])
- # self.instructions_img = QPixmap("src/ui/imgs/{}.png".format(test[2]))
- # self.resizeEvent()
- # log_msg("autotest {}".format(test[0]))
- # self.request_vision.emit()
- # else:
- # if override:
- # self.bench.outputs["autotest_recorder"].save(self.frame[0], self.frame[1])
- # self.save(overridden=True)
- # else:
- # self.save()
- # # RESET RECIPES TO ACTUAL ONES
- # if self.drawing is not None:
- # recipe = self.bench.recipes[self.drawing.vision_recipe]
- # for h in ["wires", "terminals"]:
- # self.bench.parsers[h].set_recipe(recipe)
- # self.ok.emit()
- # self.update_leds()
- #
- # @pyqtSlot()
- # def update_leds(self):
- # for n, led in enumerate(self.autotest_cycle_state_leds):
- # if n < self.autotest_cycle_state:
- # led.setPixmap(self.sled.cmp(True))
- # elif n == self.autotest_cycle_state:
- # led.setPixmap(self.sled.cmp("right"))
- # elif n > self.autotest_cycle_state:
- # led.setPixmap(self.sled.cmp(False))
- #
- # @pyqtSlot()
- # def override_vision(self):
- # if self.challenge_admin("Si sta tentando di bypassare il l'autotest"):
- # self.cycle_state(override=True)
- #
- # def save(self, overridden=False):
- # frames = []
- # for k, f in self.autotest_frames.items():
- # frames.append(self.bench.outputs["autotest_recorder"].save(f[0], f[1]))
- # Autotests.archive(result=True, vision_tests=[t[0] for t in self.autotest_cycle], reason=self.reason, overridden=overridden, frames=frames)
- # self.bench.last_autotest = datetime.now()
diff --git a/src/ui/test_autotest/test_autotest.ui b/src/ui/test_autotest/test_autotest.ui
deleted file mode 100755
index 9ef8444..0000000
--- a/src/ui/test_autotest/test_autotest.ui
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- Autotest
-
-
-
-
-
-
diff --git a/src/ui/test_test/test_test.py b/src/ui/test_test/test_test.py
index 19e4220..a18d278 100644
--- a/src/ui/test_test/test_test.py
+++ b/src/ui/test_test/test_test.py
@@ -150,6 +150,7 @@ class Test_Test(Widget):
d.setCentralWidget(Test_Admin_Permission(info))
d.setModal(True)
d.show()
+ d.centralWidget.password_le.setFocus()
r = d.exec()
if r == d.Accepted:
self.admin_challenged = True
From cdfbc6b64080e07b1cabd10189eb970f9e583f8f Mon Sep 17 00:00:00 2001
From: neo-dl
Date: Tue, 19 Jul 2022 16:09:26 +0200
Subject: [PATCH 3/4] multimeter test ok & component wip
---
src/components/multicomp_730424.py | 33 ++++++++++++++++++++++++++++++
src/test/multicomp.py | 29 ++++++++++++++++++++++++++
2 files changed, 62 insertions(+)
create mode 100644 src/components/multicomp_730424.py
create mode 100644 src/test/multicomp.py
diff --git a/src/components/multicomp_730424.py b/src/components/multicomp_730424.py
new file mode 100644
index 0000000..80851b9
--- /dev/null
+++ b/src/components/multicomp_730424.py
@@ -0,0 +1,33 @@
+import sys
+
+if "--sim-multimeter" in sys.argv:
+ from components.dummies.serial import serial
+else:
+ import serial
+
+from PyQt5.QtWidgets import QMessageBox
+
+from .component import Component
+
+
+class SerialMultimeter(Component):
+ def __init__(self, config=None, name=None):
+ super().__init__(config=config, name=name, threaded=False)
+
+ def write(self, command):
+ try:
+ conn = serial.Serial(
+ self.address,
+ baudrate=self.baudrate,
+ stopbits=self.stopbits,
+ parity=self.parity,
+ bytesize=self.bytesize,
+ )
+ conn.write(bytes(command, encoding="ascii"))
+ conn.close()
+ except serial.serialutil.SerialException as e:
+ QMessageBox.critical(
+ None,
+ "Errore Connessione Multimetro",
+ "Non e stato possibile connettersi al multimetro digitale.\n Verificare che lo strumento sia acceso e collegato\nErrore: " + str(e)
+ )
diff --git a/src/test/multicomp.py b/src/test/multicomp.py
new file mode 100644
index 0000000..276dde0
--- /dev/null
+++ b/src/test/multicomp.py
@@ -0,0 +1,29 @@
+import time
+
+import serial
+
+conn = serial.Serial(
+ "/dev/ttyUSB0",
+ baudrate=115200,
+ stopbits=serial.STOPBITS_ONE,
+ parity=serial.PARITY_NONE,
+ bytesize=serial.EIGHTBITS,
+ timeout=1
+)
+
+cmd_list= (("*IDN?\n",True), # QUERY ID
+ ("CONF:RES 500\n",False), # SET RESISTANCE MEASURE, 500 Ohm range
+ ("MEAS?\n",True), # GET MEASURE
+ ("MEAS?\n",True), # GET MEASURE
+ ("MEAS?\n", True)) # GET MEASURE
+
+for cmditem in cmd_list:
+ cmd,expect_response=cmditem
+ conn.write(bytes(cmd, encoding="ascii"))
+ if expect_response:
+ response = conn.readline()
+ print(f"{cmd} RESPONSE: "+response.decode("ascii"))
+ else:
+ print(f"{cmd}")
+ time.sleep(1)
+conn.close()
From 94bef68fd77ea375054db5d226b2055070f0b1db Mon Sep 17 00:00:00 2001
From: neo-dl
Date: Wed, 20 Jul 2022 11:25:07 +0200
Subject: [PATCH 4/4] dev
---
config/machine_settings/defaults.ini | 2 +-
config/vision/labels/labels.pbtxt | 7 +------
config/vision/recipes/1.ini | 4 ++--
src/components/vision.py | 4 ++++
src/main.py | 2 +-
src/ui/test_test/test_test.py | 2 +-
6 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/config/machine_settings/defaults.ini b/config/machine_settings/defaults.ini
index 4e7f8a4..c5ca5f5 100644
--- a/config/machine_settings/defaults.ini
+++ b/config/machine_settings/defaults.ini
@@ -44,6 +44,6 @@ baudrate: 9600
[vision]
detection_threshold: 0.5
-neural_network: hs1-50000
+neural_network: hs3-20000
; recipes_path: ./config/vision_test_recipes
diff --git a/config/vision/labels/labels.pbtxt b/config/vision/labels/labels.pbtxt
index a4766de..5cc99f0 100644
--- a/config/vision/labels/labels.pbtxt
+++ b/config/vision/labels/labels.pbtxt
@@ -1,15 +1,10 @@
item {
id: 1
name: 'hs-ok'
- color: '0x444444'
+ color: '0x000000'
}
item {
id: 2
name: 'hs-ko'
color: '0xff0000'
}
-item {
- id: 3
- name: 'hs-empty'
- color: '0xaaaaaa'
-}
diff --git a/config/vision/recipes/1.ini b/config/vision/recipes/1.ini
index c0f6df7..a68160e 100644
--- a/config/vision/recipes/1.ini
+++ b/config/vision/recipes/1.ini
@@ -22,7 +22,7 @@ instruction: CONTROLLARE PRESENZA TERMORESTRINGENTE
[markers]
[zones]
-p1: 800,700 100,200 hs-ok # HEATSINK PRESENT
+p1: 800,850 300,100 hs-ok # HEATSINK PRESENT
[labels]
-p1: 600,500 100 0xffffffff 0xffffffff 10 TERMORESTRINGENTE
+p1: 500,600 120 0xffffffff 0xff000000 4 TERMORESTRINGENTE
diff --git a/src/components/vision.py b/src/components/vision.py
index 968b0f3..33a7413 100644
--- a/src/components/vision.py
+++ b/src/components/vision.py
@@ -1,6 +1,7 @@
import logging
import os
import sys
+import time
import traceback
from configparser import ConfigParser
from pathlib import Path
@@ -692,7 +693,10 @@ class Vision(Component):
# VISION_CONSUMER TASK
if consumable is None:
return
+ t1=time.time()
detections = self.check_features(consumable["frame"])
+ t2=time.time()
+ print(f"detection time: {(t2-t1):.3f}")
results = self.process_detections(detections)
return {"detections": detections, "results": results}
diff --git a/src/main.py b/src/main.py
index d73a718..83de2b7 100644
--- a/src/main.py
+++ b/src/main.py
@@ -79,7 +79,7 @@ try:
self.config = ConfigReader()
# INIT COMPONENT
self.components_specs = {
- "archive_synchronizer": {"c": ArchiveSynchronizer},
+ #"archive_synchronizer": {"c": ArchiveSynchronizer},
"galaxy_camera": {"c": GalaxyCamera, "k": {"paused": True}},
"label_printer": {"c": Os_Label_Printer, "t": False},
"neo_pixels": {"c": NeoPixels, "t": False},
diff --git a/src/ui/test_test/test_test.py b/src/ui/test_test/test_test.py
index a18d278..82c784a 100644
--- a/src/ui/test_test/test_test.py
+++ b/src/ui/test_test/test_test.py
@@ -80,7 +80,7 @@ class Test_Test(Widget):
else:
data = data[-1]
if not override:
- result_ok = data.get("results", {}).get("ok", False)
+ result_ok = False# data.get("results", {}).get("ok", False)
else:
result_ok = True
self.last = {