This commit is contained in:
neo-dl 2022-07-18 18:51:02 +02:00
parent 9b6645fdf9
commit 2371f3ab7c
18 changed files with 72 additions and 301 deletions

View File

@ -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

View File

@ -1,7 +1,7 @@
item {
id: 1
name: 'hs-ok'
color: '0x555555'
color: '0x444444'
}
item {
id: 2

2
designer.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/bash
venv/lib/python3.9/site-packages/qt5_applications/Qt/bin/designer

2
designer_win.sh Normal file
View File

@ -0,0 +1,2 @@
#!/bin/bash
venv/Lib/site-packages/qt5_applications/Qt/bin/designer

View File

@ -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()

View File

@ -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]]],

View File

@ -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):

View File

@ -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

View File

@ -1 +0,0 @@
from .autotests_archive import Autotests_Archive

View File

@ -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)

View File

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Autotests archive</class>
<widget class="QWidget" name="Autotests archive">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<height>61</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QPushButton" name="print_b">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Stampa</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QWidget" name="crud_w" native="true"/>
</item>
</layout>
</widget>
<tabstops>
<tabstop>print_b</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -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"]

View File

@ -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")

View File

@ -1,57 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Admin permission</class>
<widget class="QWidget" name="Admin permission">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>422</width>
<height>139</height>
</rect>
</property>
<property name="windowTitle">
<string>Admin permission</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="6" column="1">
<widget class="QPushButton" name="cancel_b">
<property name="text">
<string>Annulla</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QPushButton" name="continue_b">
<property name="text">
<string>Continua</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLineEdit" name="password_le">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>password</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="info_l">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
<class>Admin permission</class>
<widget class="QWidget" name="Admin permission">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>422</width>
<height>139</height>
</rect>
</property>
<property name="windowTitle">
<string>Admin permission</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="6" column="1">
<widget class="QPushButton" name="cancel_b">
<property name="text">
<string>Annulla</string>
</property>
</widget>
<tabstops>
<tabstop>password_le</tabstop>
<tabstop>continue_b</tabstop>
<tabstop>cancel_b</tabstop>
</tabstops>
<resources/>
<connections/>
</item>
<item row="6" column="0">
<widget class="QPushButton" name="continue_b">
<property name="text">
<string>Continua</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLineEdit" name="password_le">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>password</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="info_l">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>password_le</tabstop>
<tabstop>continue_b</tabstop>
<tabstop>cancel_b</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -1 +0,0 @@
from .test_autotest import Test_Autotest

View File

@ -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()

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Autotest</class>
<widget class="QWidget" name="Autotest">
<layout class="QGridLayout" name="gridLayout"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -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