#!/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()