A Weird Imagination

Identifying joystick devices

Posted in

Too many input devices

On a modern computer there are often many input devices,

$ ls /dev/input/event* | wc -l

They are just identified by numbers, so it can be difficult to choose the right one and trial-and-error can get tiresome with so many. There is some help from the by-id and by-path listings:

$ ls -go --time-style=+ /dev/input/by-id/
lrwxrwxrwx 1 10  usb-045e_0291-if06-event-joystick -> ../event26
lrwxrwxrwx 1  6  usb-045e_0291-if06-joystick -> ../js6
lrwxrwxrwx 1 10  usb-0b43_0003-event-if00 -> ../event20
lrwxrwxrwx 1 10  usb-0b43_0003-event-joystick -> ../event19
lrwxrwxrwx 1  6  usb-0b43_0003-joystick -> ../js1
lrwxrwxrwx 1  9  usb-BTC_USB_Multimedia_Keyboard-event-if01 -> ../event2
lrwxrwxrwx 1  9  usb-BTC_USB_Multimedia_Keyboard-event-kbd -> ../event1

$ ls -go --time-style=+ /dev/input/by-path/
lrwxrwxrwx 1  9  pci-0000:00:1a.2-usb-0:2:1.0-event-kbd -> ../event1
lrwxrwxrwx 1  9  pci-0000:00:1a.2-usb-0:2:1.1-event -> ../event2
lrwxrwxrwx 1 10  pci-0000:00:1d.0-usb-0:1:1.6-event-joystick -> ../event26
lrwxrwxrwx 1  6  pci-0000:00:1d.0-usb-0:1:1.6-joystick -> ../js6
lrwxrwxrwx 1 10  pci-0000:00:1d.0-usb-0:2:1.0-event -> ../event20
lrwxrwxrwx 1 10  pci-0000:00:1d.0-usb-0:2:1.0-event-joystick -> ../event19

But, for the most part, those names aren't very helpful, especially since many joystick devices support 2 or 4 joysticks connected to the same device.


Enter identify_evdev.py:

$ identify_evdev.py

Where /dev/input/event22 is the device of the joystick I touched after running identify_evdev.py.

The script waits until it detects input from any joystick and outputs the device name of that joystick. It attaches to every /dev/input/event* device it has permissions to using Python's evdev library and waits for input on any of them using select.

Shell script example

This is designed for use inside a shell script:

echo -n "Press a button on the controller... "
evdev="$($(dirname "$0")/identify_evdev.py)"
echo using device "$evdev".

Python example

For use inside a Python program, use the list_active_evdev() function:

from identify_evdev import list_active_evdev
filenames = None
while filenames is None or len(filenames) != 1:
    print("Press any button on only the joystick to be identified.")
    filenames = list_active_evdev()
evdev_filename = fns[0]
print("Selected event device: %s" % evdev_filename)


Have something to add? Post a comment by sending an email to comments@aweirdimagination.net. You may use Markdown for formatting.

There are no comments yet.