1
1
from exception import *
2
2
from evdev import *
3
- from ecodes import *
3
+ from evdev .ecodes import *
4
+ from PyQt5 .QtCore import QObject , pyqtSignal
4
5
import re
5
6
6
7
keycodeToASCII = {
7
- # Scancode: ASCIICode
8
8
KEY_1 : ['1' , '!' ], KEY_2 : ['2' , '@' ], KEY_3 : ['3' , '#' ], KEY_4 : ['4' , '$' ], KEY_5 : ['5' , '%' ], KEY_6 : ['6' , '^' ],
9
9
KEY_7 : ['7' , '*' ], KEY_8 : ['8' , '(' ], KEY_9 : ['9' , '(' ], KEY_0 : ['0' , ')' ], KEY_MINUS : ['-' , '_' ], KEY_EQUAL : ['=' , '+' ],
10
10
KEY_TAB : ['\t ' , '\t ' ], KEY_Q : ['q' , 'Q' ], KEY_W : ['w' , 'W' ], KEY_E : ['e' , 'E' ], KEY_R : ['r' , 'R' ], KEY_T : ['t' , 'T' ],
21
21
KEY_KPPLUS : '+' , KEY_KP1 : '1' , KEY_KP2 : '2' , KEY_KP3 : '3' , KEY_KP0 : '0' , KEY_KPDOT : '.' , KEY_KPSLASH : '/'
22
22
}
23
23
24
- class BarcodeScanner :
24
+ class BarcodeScanner (QObject ):
25
+ # Signal is emitted once a barcode has been scanned and received
26
+ barcodeReceived = pyqtSignal (str )
27
+
25
28
def __init__ (self , usbPortNumber ):
29
+ QObject .__init__ (self )
26
30
self .modifiers = {
27
31
KEY_RIGHTMETA : 0 , # Right GUI - (usually the Windows key)
28
32
KEY_RIGHTALT : 0 , # Right ALT
@@ -34,13 +38,18 @@ def __init__(self, usbPortNumber):
34
38
KEY_LEFTCTRL : 0 # Left Control
35
39
}
36
40
self .state = {
37
- LED_CAPSL : 0 , # Caps Lock
38
- LED_NUML : 0 , # Num Lock
39
- LED_SCROLLL : 0 # Scroll Lock
41
+ KEY_CAPSLOCK : 0 , # Caps Lock
42
+ KEY_NUMLOCK : 0 , # Num Lock
43
+ KEY_SCROLLLOCK : 0 , # Scroll Lock
40
44
}
41
45
46
+ # This regex expression identifies a device on a specified USB port number
47
+ # I am not entirely sure if this is Raspbian specific, Linux specific or what,
48
+ # but it works in this case
42
49
rePhysicalLoc = re .compile ("usb\-.*\..*\-1\.%i.*" % usbPortNumber )
43
50
51
+ # Loop through all available devices and search for a regex match
52
+ # First match found is the device we will use
44
53
devices = [InputDevice (fn ) for fn in list_devices ()]
45
54
self .device = None
46
55
for device in devices :
@@ -54,36 +63,40 @@ def __init__(self, usbPortNumber):
54
63
55
64
# Get the current state of the LED buttons; update self.state with the values that are on
56
65
ledStates = self .device .leds ()
57
- for led in ledStates :
58
- self .state [led ] = 1
66
+ if LED_CAPSL in ledStates : self .state [KEY_CAPSLOCK ] = 1
67
+ if LED_NUML in ledStates : self .state [KEY_NUMLOCK ] = 1
68
+ if LED_SCROLLL in ledStates : self .state [KEY_SCROLLLOCK ] = 1
69
+
70
+ # Set the current string buffer to none
71
+ self .curStr = ""
59
72
60
73
def poll (self ):
61
74
try :
62
75
# Read all of the events from the loop
63
- events = self .device .read ()
76
+ deviceEvents = self .device .read ()
64
77
65
- for event in events :
78
+ for event in deviceEvents :
79
+ # Only accept keyboard events
66
80
if event .type is EV_KEY :
67
81
keyEvent = util .categorize (event )
68
-
69
- if keyEvent .keycode in self .modifiers :
70
- if keyEvent .keystate is events .KeyEvent .key_down :
71
- self .modifiers [keyEvent .keycode ] = 1
72
- elif keyEvent .keystate is events .KeyEvent .key_up :
73
- self .modifiers [keyEvent .keycode ] = 0
74
- elif keyEvent .keycode in self .state :
75
- if keyEvent .keystate is events .KeyEvent .key_down :
76
- self .state [keyEvent .keycode ] = 1
77
- elif keyEvent .keystate is events .KeyEvent .key_up :
78
- self .state [keyEvent .keycode ] = 0
79
- elif keyEvent .keystate is events .KeyEvent .key_down or \
80
- keyEvent .keystate is events .KeyEvent .key_hold :
81
- if keyEvent .keycode in keycodeToASCII :
82
+
83
+ if keyEvent .scancode in self .modifiers :
84
+ if keyEvent .keystate is events .KeyEvent .key_down : self .modifiers [keyEvent .scancode ] = 1
85
+ elif keyEvent .keystate is events .KeyEvent .key_up : self .modifiers [keyEvent .scancode ] = 0
86
+ elif keyEvent .scancode in self .state :
87
+ if keyEvent .keystate is events .KeyEvent .key_down : self .state [keyEvent .scancode ] = 1
88
+ elif keyEvent .keystate is events .KeyEvent .key_up : self .state [keyEvent .scancode ] = 0
89
+ elif keyEvent .keystate is events .KeyEvent .key_down or keyEvent .keystate is events .KeyEvent .key_hold :
90
+ if keyEvent .scancode is KEY_ENTER :
91
+ #print("Current str: %s" % self.curStr)
92
+ self .barcodeReceived .emit (self .curStr )
93
+ self .curStr = ""
94
+ elif keyEvent .scancode in keycodeToASCII :
82
95
shift = (self .modifiers [KEY_LEFTSHIFT ] or self .modifiers [KEY_RIGHTSHIFT ])
83
- str = keycodeToASCII [keyEvent .keycode ][shift ]
84
- elif keyEvent .keycode in numpadcodeToASCII :
85
- str = numpadcodeToASCII [keyEvent .keycode ]
96
+ self . curStr + = keycodeToASCII [keyEvent .scancode ][shift ]
97
+ elif keyEvent .scancode in numpadcodeToASCII and self . state [ KEY_NUMLOCK ] :
98
+ str = numpadcodeToASCII [keyEvent .scancode ]
86
99
except BlockingIOError :
87
100
# If no events are available, this is thrown
88
101
# No actual error, move on
89
- pass
102
+ pass
0 commit comments