163 lines
6.2 KiB
Python
163 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script for USB card reader functionality
|
|
"""
|
|
|
|
import evdev
|
|
from evdev import InputDevice, categorize, ecodes
|
|
import time
|
|
|
|
def list_input_devices():
|
|
"""List all available input devices"""
|
|
print("\n=== Available Input Devices ===")
|
|
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
|
|
|
|
# Exclusion keywords that help identify non-card-reader devices
|
|
exclusion_keywords = [
|
|
'touch', 'touchscreen', 'mouse', 'mice', 'trackpad',
|
|
'touchpad', 'pen', 'stylus', 'video', 'button', 'lid'
|
|
]
|
|
|
|
for i, device in enumerate(devices):
|
|
device_name_lower = device.name.lower()
|
|
is_excluded = any(keyword in device_name_lower for keyword in exclusion_keywords)
|
|
is_likely_card = 'card' in device_name_lower or 'reader' in device_name_lower or 'rfid' in device_name_lower
|
|
|
|
print(f"\n[{i}] {device.path}")
|
|
print(f" Name: {device.name}")
|
|
print(f" Phys: {device.phys}")
|
|
|
|
capabilities = device.capabilities()
|
|
if ecodes.EV_KEY in capabilities:
|
|
print(f" Type: Keyboard/HID Input Device")
|
|
|
|
# Add helpful hints
|
|
if is_likely_card:
|
|
print(f" ** LIKELY CARD READER **")
|
|
elif is_excluded:
|
|
print(f" (Excluded: appears to be touch/mouse/other non-card device)")
|
|
elif 'usb' in device_name_lower and 'keyboard' in device_name_lower:
|
|
print(f" (USB Keyboard - could be card reader)")
|
|
|
|
return devices
|
|
|
|
def test_card_reader(device_index=None):
|
|
"""Test reading from a card reader device"""
|
|
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
|
|
|
|
# Exclusion keywords (same as in main app)
|
|
exclusion_keywords = [
|
|
'touch', 'touchscreen', 'mouse', 'mice', 'trackpad',
|
|
'touchpad', 'pen', 'stylus', 'video', 'button', 'lid'
|
|
]
|
|
|
|
if device_index is not None:
|
|
if device_index >= len(devices):
|
|
print(f"Error: Device index {device_index} out of range")
|
|
return
|
|
device = devices[device_index]
|
|
else:
|
|
# Try to find a card reader automatically using same logic as main app
|
|
device = None
|
|
|
|
# Priority 1: Explicit card readers
|
|
for dev in devices:
|
|
device_name_lower = dev.name.lower()
|
|
if any(keyword in device_name_lower for keyword in exclusion_keywords):
|
|
continue
|
|
if 'card' in device_name_lower or 'reader' in device_name_lower or 'rfid' in device_name_lower or 'hid' in device_name_lower:
|
|
capabilities = dev.capabilities()
|
|
if ecodes.EV_KEY in capabilities:
|
|
device = dev
|
|
print(f"Found card reader: {dev.name}")
|
|
break
|
|
|
|
# Priority 2: USB keyboards
|
|
if not device:
|
|
for dev in devices:
|
|
device_name_lower = dev.name.lower()
|
|
if any(keyword in device_name_lower for keyword in exclusion_keywords):
|
|
continue
|
|
if 'usb' in device_name_lower and 'keyboard' in device_name_lower:
|
|
capabilities = dev.capabilities()
|
|
if ecodes.EV_KEY in capabilities:
|
|
device = dev
|
|
print(f"Using USB keyboard as card reader: {dev.name}")
|
|
break
|
|
|
|
# Priority 3: Any non-excluded keyboard
|
|
if not device:
|
|
for dev in devices:
|
|
device_name_lower = dev.name.lower()
|
|
if any(keyword in device_name_lower for keyword in exclusion_keywords):
|
|
continue
|
|
capabilities = dev.capabilities()
|
|
if ecodes.EV_KEY in capabilities:
|
|
device = dev
|
|
print(f"Using keyboard device as card reader: {dev.name}")
|
|
break
|
|
|
|
if not device:
|
|
print("No suitable input device found!")
|
|
return
|
|
|
|
print(f"\n=== Testing Card Reader ===")
|
|
print(f"Device: {device.name}")
|
|
print(f"Path: {device.path}")
|
|
print("\nSwipe your card now (press Ctrl+C to exit)...\n")
|
|
|
|
card_data = ""
|
|
|
|
try:
|
|
for event in device.read_loop():
|
|
if event.type == ecodes.EV_KEY:
|
|
key_event = categorize(event)
|
|
|
|
if key_event.keystate == 1: # Key down
|
|
key_code = key_event.keycode
|
|
|
|
# Handle Enter key (card read complete)
|
|
if key_code == 'KEY_ENTER':
|
|
print(f"\n✓ Card data received: '{card_data}'")
|
|
print(f" Length: {len(card_data)} characters")
|
|
print(f" Processed ID: card_{card_data.strip().upper()}")
|
|
print("\nReady for next card swipe...")
|
|
card_data = ""
|
|
|
|
# Build card data string
|
|
elif key_code.startswith('KEY_'):
|
|
char = key_code.replace('KEY_', '')
|
|
if len(char) == 1: # Single character
|
|
card_data += char
|
|
print(f"Reading: {card_data}", end='\r', flush=True)
|
|
elif char.isdigit(): # Handle numeric keys
|
|
card_data += char
|
|
print(f"Reading: {card_data}", end='\r', flush=True)
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n\nTest stopped by user")
|
|
except Exception as e:
|
|
print(f"\nError: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
print("USB Card Reader Test Tool")
|
|
print("=" * 50)
|
|
|
|
devices = list_input_devices()
|
|
|
|
if not devices:
|
|
print("\nNo input devices found!")
|
|
exit(1)
|
|
|
|
print("\n" + "=" * 50)
|
|
choice = input("\nEnter device number to test (or press Enter for auto-detect): ").strip()
|
|
|
|
if choice:
|
|
try:
|
|
device_index = int(choice)
|
|
test_card_reader(device_index)
|
|
except ValueError:
|
|
print("Invalid device number!")
|
|
else:
|
|
test_card_reader()
|