- Implemented CardReader class to read data from USB card readers - Added CardSwipePopup with 5-second timeout and visual feedback - Card data is captured and included in edit metadata - Card data sent to server when edited images are uploaded - Added evdev dependency for USB input device handling - Fallback mode when evdev not available (for development) - Created test utility (test_card_reader.py) for card reader testing - Added comprehensive documentation (CARD_READER_AUTHENTICATION.md) - Added access-card.png icon for authentication popup - Edit interface requires card swipe or times out after 5 seconds
115 lines
4.0 KiB
Python
115 lines
4.0 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()]
|
|
|
|
for i, device in enumerate(devices):
|
|
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")
|
|
|
|
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()]
|
|
|
|
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
|
|
device = None
|
|
for dev in devices:
|
|
if 'keyboard' in dev.name.lower() or 'card' in dev.name.lower() or 'reader' in dev.name.lower():
|
|
device = dev
|
|
print(f"Found potential card reader: {dev.name}")
|
|
break
|
|
|
|
if not device and devices:
|
|
# Use first keyboard device
|
|
for dev in devices:
|
|
capabilities = dev.capabilities()
|
|
if ecodes.EV_KEY in capabilities:
|
|
device = dev
|
|
print(f"Using keyboard device: {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()
|