hid scanner support
This commit is contained in:
85
hid-scanner/hid.py
Normal file
85
hid-scanner/hid.py
Normal file
@@ -0,0 +1,85 @@
|
||||
import usb.core
|
||||
import usb.util
|
||||
import usb.backend.libusb1
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Your exact scanner IDs
|
||||
VENDOR_ID = 0xFFFF
|
||||
PRODUCT_ID = 0x0035
|
||||
|
||||
# Basic HID to ASCII translation dictionary
|
||||
HID_MAP = {
|
||||
4: 'a', 5: 'b', 6: 'c', 7: 'd', 8: 'e', 9: 'f', 10: 'g', 11: 'h', 12: 'i',
|
||||
13: 'j', 14: 'k', 15: 'l', 16: 'm', 17: 'n', 18: 'o', 19: 'p', 20: 'q',
|
||||
21: 'r', 22: 's', 23: 't', 24: 'u', 25: 'v', 26: 'w', 27: 'x', 28: 'y', 29: 'z',
|
||||
30: '1', 31: '2', 32: '3', 33: '4', 34: '5', 35: '6', 36: '7', 37: '8', 38: '9', 39: '0',
|
||||
44: ' ', 45: '-', 46: '=', 55: '.', 56: '/'
|
||||
}
|
||||
|
||||
def main():
|
||||
# Force the local DLL backend
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
dll_path = os.path.join(current_dir, "libusb-1.0.dll")
|
||||
|
||||
if not os.path.exists(dll_path):
|
||||
print(f"Error: Missing {dll_path}")
|
||||
sys.exit(1)
|
||||
|
||||
backend = usb.backend.libusb1.get_backend(find_library=lambda x: dll_path)
|
||||
|
||||
# Find the scanner using the forced backend
|
||||
dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID, backend=backend)
|
||||
|
||||
if dev is None:
|
||||
print("Scanner not found. Check Zadig driver again.")
|
||||
sys.exit(1)
|
||||
|
||||
# Claim device
|
||||
dev.set_configuration()
|
||||
cfg = dev.get_active_configuration()
|
||||
intf = cfg[(0,0)]
|
||||
|
||||
endpoint = usb.util.find_descriptor(
|
||||
intf,
|
||||
custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN
|
||||
)
|
||||
|
||||
print("Scanner locked. Waiting for barcodes...")
|
||||
|
||||
current_barcode = ""
|
||||
|
||||
while True:
|
||||
try:
|
||||
# Read 8 bytes from the scanner
|
||||
data = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, timeout=1000)
|
||||
|
||||
keycode = data[2]
|
||||
modifier = data[0]
|
||||
is_shift = modifier == 2 or modifier == 32
|
||||
|
||||
if keycode == 0:
|
||||
continue
|
||||
|
||||
if keycode == 40: # Enter key
|
||||
print(f"Captured Barcode: {current_barcode}")
|
||||
current_barcode = ""
|
||||
elif keycode in HID_MAP:
|
||||
char = HID_MAP[keycode]
|
||||
if is_shift and char.isalpha():
|
||||
char = char.upper()
|
||||
current_barcode += char
|
||||
|
||||
except usb.core.USBError as e:
|
||||
if e.args[0] == 10060 or e.args[0] == 110:
|
||||
continue
|
||||
else:
|
||||
print(f"USB Error: {e}")
|
||||
break
|
||||
except KeyboardInterrupt:
|
||||
print("\nExiting and releasing scanner...")
|
||||
usb.util.dispose_resources(dev)
|
||||
break
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user