Skip to content

Commit 32c9aaa

Browse files
authored
Merge pull request #50 from DiamondLightSource/I04_1-177_allow_duplicates
I04 1 177 allow duplicates
2 parents b3a26b1 + 8e13a95 commit 32c9aaa

File tree

3 files changed

+33
-28
lines changed

3 files changed

+33
-28
lines changed

dls_barcode/gui/main_window.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def __init__(self, config_file, version):
3232
# UI elements
3333
self._record_table = None
3434
self._barcode_table = None
35-
self.sideBarcodeWindow = None
3635
self._image_frame = None
3736

3837
# Scan elements
@@ -61,7 +60,7 @@ def __init__(self, config_file, version):
6160
self._message_timer.timeout.connect(self._read_message_queue)
6261
self._message_timer.start(MESSAGE_TIMER_PERIOD)
6362

64-
self._camera_switch.restart_live_capture_from_side()
63+
self._restart_live_capture_from_side()
6564

6665
def _init_ui(self):
6766
""" Create the basic elements of the user interface.
@@ -166,7 +165,7 @@ def _on_scan_action_clicked(self):
166165
if not self._camera_capture_alive():
167166
self._initialise_scanner()
168167

169-
self._camera_switch.restart_live_capture_from_side()
168+
self._restart_live_capture_from_side()
170169

171170
def _on_options_action_clicked(self):
172171
result_ok = self._open_options_dialog()
@@ -175,7 +174,7 @@ def _on_options_action_clicked(self):
175174

176175
self._cleanup()
177176
self._initialise_scanner()
178-
self._camera_switch.restart_live_capture_from_side()
177+
self._restart_live_capture_from_side()
179178

180179
def _open_options_dialog(self):
181180
dialog = BarcodeConfigDialog(self._config, self._before_test_camera)
@@ -237,22 +236,23 @@ def _read_message_queue(self):
237236
# The result queue is read at a slower rate - use a timer to give it time to process a new barcode
238237
self._start_msg_timer()
239238
elif self._has_msg_timer_timeout():
240-
self._message_box.display(MessageFactory.duplicate_barcode_message())
239+
self._message_box.display(MessageFactory.latest_barcode_message())
241240
else:
242241
self._reset_msg_timer()
243242
self._message_box.display(MessageFactory.from_scanner_message(scanner_msg))
244243

245244
def _reset_msg_timer(self):
246-
self._duplicate_msg_timer = None
245+
self._duplicate_record_msg_timer = None
247246

248247
def _start_msg_timer(self):
249-
self._duplicate_msg_timer = time.time()
248+
self._duplicate_record_msg_timer = time.time()
250249

251250
def _msg_timer_is_running(self):
252-
return self._duplicate_msg_timer is not None
251+
return self._duplicate_record_msg_timer is not None
253252

254253
def _has_msg_timer_timeout(self):
255-
return self._msg_timer_is_running() and time.time() - self._duplicate_msg_timer > 2 * RESULT_TIMER_PERIOD / 1000
254+
timeout = 2 * RESULT_TIMER_PERIOD / 1000
255+
return self._msg_timer_is_running() and time.time() - self._duplicate_record_msg_timer > timeout
256256

257257
def _read_result_queue(self):
258258
""" Called every second; read any new results from the scan results queue, store them and display them.
@@ -277,33 +277,40 @@ def _read_side_scan(self):
277277
# Barcode successfully read
278278
Beeper.beep()
279279
print("MAIN: puck barcode recorded")
280-
if self._record_table.unique_side_barcode(plate): # if new side barcode
281-
self.original_plate = plate
280+
if not self._record_table.is_latest_holder_barcode(plate):
281+
self._latest_holder_plate = plate
282282
self._latest_holder_image = holder_image
283283
self._message_box.display(MessageFactory.puck_recorded_message())
284-
self._camera_switch.restart_live_capture_from_top()
284+
self._restart_live_capture_from_top()
285285
else:
286-
self._message_box.display(MessageFactory.duplicate_barcode_message())
286+
self._message_box.display(MessageFactory.latest_barcode_message())
287287

288288
def _read_top_scan(self):
289289
if self._result_queue.empty():
290290
if self._camera_switch.is_top_scan_timeout():
291291
self._message_box.display(MessageFactory.scan_timeout_message())
292292
print("\n*** Scan timeout ***")
293-
self._camera_switch.restart_live_capture_from_side()
293+
self._restart_live_capture_from_side()
294294
return
295295

296296
# Get the result
297297
plate, pins_image = self._result_queue.get(False)
298298

299-
# Add new record to the table - side is the original_plate read first, top is the plate
300-
self._record_table.add_record_frame(self.original_plate, plate, self._latest_holder_image, pins_image)
299+
# Add new record to the table - side is the _latest_holder_plate read first, top is the plate
300+
self._record_table.add_record_frame(self._latest_holder_plate, plate, self._latest_holder_image, pins_image)
301301
if not plate.is_full_valid():
302302
return
303303

304304
# Barcodes successfully read
305305
Beeper.beep()
306306
print("Scan Completed")
307307
self._message_box.display(MessageFactory.scan_completed_message())
308+
self._restart_live_capture_from_side()
309+
310+
def _restart_live_capture_from_top(self):
311+
self._camera_switch.restart_live_capture_from_top()
312+
313+
def _restart_live_capture_from_side(self):
314+
self._reset_msg_timer()
308315
self._camera_switch.restart_live_capture_from_side()
309316

dls_barcode/gui/message_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
class MessageFactory:
55
@staticmethod
6-
def duplicate_barcode_message():
7-
return Message(MessageType.WARNING, "Puck barcode already in database", lifetime=3)
6+
def latest_barcode_message():
7+
return Message(MessageType.WARNING, "Puck barcode already in latest record", lifetime=3)
88

99
@staticmethod
1010
def from_scanner_message(scanner_msg):

dls_barcode/gui/record_table.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,12 @@ def _delete_selected_records(self):
136136
self._store.delete_records(records_to_delete)
137137
self._load_store_records()
138138

139-
def unique_side_barcode(self, plate):
140-
barcodes = []
141-
plate_barcodes = plate.barcodes()
142-
store = self._store
143-
rec = store.records
144-
for m,record in enumerate(rec):
145-
barcodes = barcodes + record.barcodes[:]
146-
if plate_barcodes[0] in barcodes:
147-
return False
148-
return True
139+
def is_latest_holder_barcode(self, plate):
140+
latest_record = self._store.get_record(0)
141+
142+
if latest_record is not None and plate.barcodes()[0] in latest_record.barcodes:
143+
return True
144+
145+
return False
146+
149147

0 commit comments

Comments
 (0)