11import multiprocessing
22import queue
3+ import time
34
45from PyQt4 import QtGui , QtCore
56
67from dls_barcode .config import BarcodeConfig , BarcodeConfigDialog
7- from dls_barcode .camera import CameraScanner , CameraSwitch
8+ from dls_barcode .camera import CameraScanner , CameraSwitch , NoNewBarcodeMessage
89from dls_util import Beeper
910from dls_util .file import FileManager
1011from dls_util .message import MessageType , Message
1415from .message_display import MessageDisplay
1516
1617
18+ RESULT_TIMER_PERIOD = 1000 # ms
19+ VIEW_TIMER_PERIOD = 1 # ms
20+ MESSAGE_TIMER_PERIOD = 1 # ms
21+
22+
1723class DiamondBarcodeMainWindow (QtGui .QMainWindow ):
1824 """ Main GUI window for the Barcode Scanner App.
1925 """
@@ -39,19 +45,20 @@ def __init__(self, config_file):
3945 self ._view_queue = multiprocessing .Queue ()
4046 self ._message_queue = multiprocessing .Queue ()
4147 self ._initialise_scanner ()
48+ self ._reset_test_timer ()
4249
4350 # Timer that controls how often new scan results are looked for
4451 self ._result_timer = QtCore .QTimer ()
4552 self ._result_timer .timeout .connect (self ._read_result_queue )
46- self ._result_timer .start (1000 )
53+ self ._result_timer .start (RESULT_TIMER_PERIOD )
4754
4855 self ._view_timer = QtCore .QTimer ()
4956 self ._view_timer .timeout .connect (self ._read_view_queue )
50- self ._view_timer .start (1 )
57+ self ._view_timer .start (VIEW_TIMER_PERIOD )
5158
5259 self ._message_timer = QtCore .QTimer ()
5360 self ._message_timer .timeout .connect (self ._read_message_queue )
54- self ._message_timer .start (1 )
61+ self ._message_timer .start (MESSAGE_TIMER_PERIOD )
5562
5663 self ._camera_switch .restart_live_capture_from_side ()
5764
@@ -195,11 +202,45 @@ def _read_view_queue(self):
195202 def _read_message_queue (self ):
196203 if not self ._message_queue .empty ():
197204 try :
198- message = self ._message_queue .get (False )
199- self ._message_display .display_message (message )
205+ scanner_msg = self ._message_queue .get (False )
206+ if self ._camera_switch .is_side () and isinstance (scanner_msg , NoNewBarcodeMessage ):
207+ if not self ._test_timer_is_running ():
208+ self ._start_test_timer ()
209+ elif self ._has_test_timer_timeout ():
210+ self ._message_display .display_message (self ._get_duplicate_barcode_message ())
211+ else :
212+ self ._reset_test_timer ()
213+ self ._message_display .display_message (self ._get_message_from_scanner_msg (scanner_msg ))
200214 except queue .Empty :
201215 return
202216
217+ def _get_duplicate_barcode_message (self ):
218+ return Message (MessageType .WARNING , "Puck barcode already in database" )
219+
220+ def _get_message_from_scanner_msg (self , scanner_msg ):
221+ return Message (MessageType .WARNING , scanner_msg .content ())
222+
223+ def _get_puck_recorded_message (self ):
224+ return Message (MessageType .INFO , "Puck barcode recorded" )
225+
226+ def _get_scan_timeout_message (self ):
227+ return Message (MessageType .WARNING , "Scan timeout" )
228+
229+ def _get_scan_completed_message (self ):
230+ return Message (MessageType .INFO , "Scan completed" )
231+
232+ def _reset_test_timer (self ):
233+ self ._test_timer = None
234+
235+ def _start_test_timer (self ):
236+ self ._test_timer = time .time ()
237+
238+ def _test_timer_is_running (self ):
239+ return self ._test_timer is not None
240+
241+ def _has_test_timer_timeout (self ):
242+ return self ._test_timer_is_running () and time .time () - self ._test_timer > 2 * RESULT_TIMER_PERIOD / 1000
243+
203244 def _read_result_queue (self ):
204245 """ Called every second; read any new results from the scan results queue, store them and display them.
205246 """
@@ -222,17 +263,19 @@ def _read_side_scan(self):
222263
223264 # Barcode successfully read
224265 Beeper .beep ()
225- print ("MAIN: holder barcode recorded" )
266+ print ("MAIN: puck barcode recorded" )
226267 if self ._record_table .unique_side_barcode (plate ): # if new side barcode
227268 self .original_plate = plate
228269 self ._latest_holder_image = holder_image
229- self ._message_display .display_message (Message ( MessageType . INFO , "Plate barcode recorded" ))
270+ self ._message_display .display_message (self . _get_puck_recorded_message ( ))
230271 self ._camera_switch .restart_live_capture_from_top ()
272+ else :
273+ self ._message_display .display_message (self ._get_duplicate_barcode_message ())
231274
232275 def _read_top_scan (self ):
233276 if self ._result_queue .empty ():
234277 if self ._camera_switch .is_top_scan_timeout ():
235- self ._message_display .display_message (Message ( MessageType . INFO , "Scan timeout" , lifetime = 4 ))
278+ self ._message_display .display_message (self . _get_scan_timeout_message ( ))
236279 print ("\n *** Scan timeout ***" )
237280 self ._camera_switch .restart_live_capture_from_side ()
238281 return
@@ -248,6 +291,6 @@ def _read_top_scan(self):
248291 # Barcodes successfully read
249292 Beeper .beep ()
250293 print ("Scan Completed" )
251- self ._message_display .display_message (Message ( MessageType . INFO , "Scan completed" ))
294+ self ._message_display .display_message (self . _get_scan_completed_message ( ))
252295 self ._camera_switch .restart_live_capture_from_side ()
253296
0 commit comments