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 = {