2022-09-20 15:42:59 +00:00
|
|
|
import re
|
2022-09-13 11:01:00 +00:00
|
|
|
import sys
|
|
|
|
|
|
2022-07-25 13:36:42 +00:00
|
|
|
from lib.helpers import timing
|
2022-09-13 11:01:00 +00:00
|
|
|
from PyQt5.QtCore import QTimer
|
2022-07-25 13:36:42 +00:00
|
|
|
from PyQt5.QtGui import QKeySequence
|
|
|
|
|
from PyQt5.QtWidgets import QShortcut
|
|
|
|
|
from ui.test_test import Test_Test
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Test_Barcodes(Test_Test):
|
2022-11-02 13:11:32 +00:00
|
|
|
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, reset_on_start=True, enable_override=False):
|
|
|
|
|
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, reset_on_start=reset_on_start, enable_override=enable_override)
|
2024-05-23 12:26:01 +00:00
|
|
|
self.current_step_barcode_name = None
|
2024-05-23 13:08:22 +00:00
|
|
|
self.start_counter = 0
|
2022-07-25 13:36:42 +00:00
|
|
|
self.barcodes_spec = {
|
2024-05-23 07:09:05 +00:00
|
|
|
"serial": self.check_serial_barcode,
|
|
|
|
|
"barcode_input_2": self.check_serial_barcode,
|
|
|
|
|
"barcode_input_3": self.check_serial_barcode,
|
|
|
|
|
"barcode_input_4": self.check_serial_barcode,
|
2024-05-23 12:26:01 +00:00
|
|
|
"barcode_input_5": self.check_serial_barcode,
|
2024-05-23 07:09:05 +00:00
|
|
|
|
2022-07-25 13:36:42 +00:00
|
|
|
}
|
|
|
|
|
QShortcut(QKeySequence("Return"), self).activated.connect(self.get)
|
|
|
|
|
QShortcut(QKeySequence("Enter"), self).activated.connect(self.get)
|
|
|
|
|
self.barcodes_le.setFocus()
|
2023-03-03 17:51:35 +00:00
|
|
|
self.focus_timer = QTimer()
|
|
|
|
|
self.focus_timer.setSingleShot(True)
|
|
|
|
|
self.focus_timer.timeout.connect(self.set_focus)
|
2022-07-25 13:36:42 +00:00
|
|
|
|
2022-10-18 09:57:08 +00:00
|
|
|
def start(self, recipe=None, step=None, pieces=None):
|
|
|
|
|
show = super().start(recipe=recipe, step=step, pieces=pieces)
|
2024-05-23 13:08:22 +00:00
|
|
|
self.start_counter += 1
|
|
|
|
|
npieces = self.step.spec.get("n_pieces")
|
|
|
|
|
npieces = int(npieces) if npieces is not None else 0
|
2024-06-11 04:58:03 +00:00
|
|
|
display_str = "PEZZI RIMANENTI {}".format(npieces)
|
2024-05-23 13:08:22 +00:00
|
|
|
self.counter_l.setText(display_str)
|
2022-10-18 09:57:08 +00:00
|
|
|
if show is False:
|
|
|
|
|
return show
|
2024-05-23 12:26:01 +00:00
|
|
|
self.current_step_barcode_name = self.step.spec.get('barcode_name')
|
|
|
|
|
self.expected_barcode.setText(self.step.spec.get(self.current_step_barcode_name))
|
2022-07-26 14:05:04 +00:00
|
|
|
self.visualize()
|
2022-07-25 13:36:42 +00:00
|
|
|
self.barcodes_le.setPalette(self.status_palettes[None])
|
|
|
|
|
self.barcodes_le.setText("")
|
|
|
|
|
self.barcodes_le.setFocus()
|
2023-03-03 17:51:35 +00:00
|
|
|
self.focus_timer.start(500)
|
|
|
|
|
|
2022-09-13 10:39:09 +00:00
|
|
|
# TESTING
|
2022-09-13 10:40:33 +00:00
|
|
|
if "--test-barcodes" in sys.argv or "--test" in sys.argv:
|
2022-09-13 10:39:09 +00:00
|
|
|
self.barcodes_le.setText("-----TEST_BARCODE-----")
|
|
|
|
|
self.test_timer = QTimer()
|
|
|
|
|
self.test_timer.setSingleShot(True)
|
|
|
|
|
self.test_timer.timeout.connect(self.get)
|
|
|
|
|
self.test_timer.start(500)
|
|
|
|
|
# /TESTING
|
2022-10-18 09:57:08 +00:00
|
|
|
return show
|
2022-07-25 13:36:42 +00:00
|
|
|
|
|
|
|
|
# def stop(self):
|
|
|
|
|
# super().stop()
|
|
|
|
|
|
2022-08-24 10:59:16 +00:00
|
|
|
def reset(self):
|
|
|
|
|
super().reset()
|
|
|
|
|
self.barcodes = {}
|
|
|
|
|
|
2022-07-25 13:36:42 +00:00
|
|
|
def get(self, data=None, override=False):
|
2022-07-27 12:54:19 +00:00
|
|
|
if self.done: # avoid proccessing if completed
|
2022-07-25 13:36:42 +00:00
|
|
|
return
|
|
|
|
|
if data is None:
|
|
|
|
|
data = self.barcodes_le.text()
|
|
|
|
|
if not len(data):
|
|
|
|
|
data = None
|
|
|
|
|
if data is None:
|
|
|
|
|
super().get(None, override=override)
|
|
|
|
|
return
|
|
|
|
|
barcode_ok = False
|
2024-05-23 07:09:05 +00:00
|
|
|
self.current_step_barcode_name = self.step.spec.get('barcode_name') # get current step's barcode name
|
|
|
|
|
barcode_check = self.barcodes_spec.get(self.current_step_barcode_name)
|
|
|
|
|
|
|
|
|
|
# If the current step's barcode type exists in barcodes_spec and it's valid, store it
|
|
|
|
|
if barcode_check and barcode_check(data):
|
|
|
|
|
self.barcodes[self.current_step_barcode_name] = data
|
|
|
|
|
barcode_ok = True
|
2022-07-25 13:36:42 +00:00
|
|
|
self.barcodes_le.setPalette(self.status_palettes[True])
|
2024-05-23 07:09:05 +00:00
|
|
|
if self.current_step_barcode_name in self.barcodes: # if the barcode for the current step is stored in self.barcodes
|
|
|
|
|
result = self.barcodes
|
|
|
|
|
ok = True
|
|
|
|
|
else:
|
|
|
|
|
result = None
|
|
|
|
|
ok = None
|
|
|
|
|
super().get([{
|
|
|
|
|
"time": timing(),
|
|
|
|
|
"results": {
|
|
|
|
|
"ok": ok,
|
|
|
|
|
"result": result,
|
|
|
|
|
"data": self.barcodes,
|
|
|
|
|
},
|
|
|
|
|
}], override=override, fail=ok is False)
|
2022-07-25 13:36:42 +00:00
|
|
|
else:
|
|
|
|
|
self.barcodes_le.setPalette(self.status_palettes[False])
|
|
|
|
|
self.barcodes_le.setText("")
|
|
|
|
|
self.barcodes_le.setFocus()
|
|
|
|
|
|
|
|
|
|
def visualize(self, data=None):
|
|
|
|
|
if data is None:
|
|
|
|
|
data = {}
|
|
|
|
|
d = data.get("results", {}).get("data", {})
|
|
|
|
|
for k, l in {
|
|
|
|
|
"serial": self.serial_l,
|
2024-05-24 06:45:04 +00:00
|
|
|
"barcode_input_2": self.serial_l,
|
|
|
|
|
"barcode_input_3": self.serial_l,
|
|
|
|
|
"barcode_input_4": self.serial_l,
|
|
|
|
|
"barcode_input_5": self.serial_l,
|
2022-07-25 13:36:42 +00:00
|
|
|
}.items():
|
|
|
|
|
l.setText(str(d.get(k, "-")))
|
|
|
|
|
super().visualize(data)
|
|
|
|
|
|
|
|
|
|
def check_serial_barcode(self, barcode=None):
|
2022-09-20 15:42:59 +00:00
|
|
|
if not isinstance(barcode, str) or len(barcode) == 0:
|
|
|
|
|
return False
|
2024-05-23 07:09:05 +00:00
|
|
|
barcode_regex = self.step.spec.get(self.current_step_barcode_name, ".*")
|
2022-10-12 14:23:34 +00:00
|
|
|
barcode_regex = barcode_regex.replace("{RECIPE}", self.recipe.name)
|
|
|
|
|
for n in range(32):
|
|
|
|
|
barcode_regex = barcode_regex.replace(f"{{N{n}}}", f"[0-9]{{{n}}}")
|
2022-09-27 13:38:26 +00:00
|
|
|
return re.fullmatch(barcode_regex, barcode) is not None
|
2023-03-03 17:51:35 +00:00
|
|
|
|
|
|
|
|
def set_focus(self):
|
|
|
|
|
self.barcodes_le.setFocus()
|