Informatik und Kram

Da wir lange nicht wußten, wo wir das für die Uni ausgearbeitete Material unterbringen sollten und auch einen schrecklichen Drang hatten der Welt diverse Sachen aufzudrücken...

Joystick mit c auslesen


In diesem Artikel lese ich einen Joystick (mit linux-treibern) mithilfe eines kleinen c-programms aus.

Der Joystick ist ein Saitek ST30, USB, und wird als HID-device und mit dem joydev-modul ins System eingebunden.
Der Joystick wurde sofort nach dem Einstecken erkannt (dmesg) und als /dev/hidraw0 eingebunden.

Vorbereitung

Um zu sehen, ob da jetzt überhaupt was ankommt, hämmert man ein
cat /dev/hidraw0

in die Console.
Wenn man nun den Joystick bewegt, buttons drückt sollten wirre Zeichen auf dem Bildschirm erscheinen.

Das würde im Prinzip schon reichen, um ein Program darauf aufzubauen, aber ich wollte, dass es auch als reguläres joystick-device angelegt wird, deshalb ein schnelles
modprobe joydev

...und schon wird /dev/input/js0 angelegt (auf das auch die meisten Spiele zugreifen wollen)

Code



Eiiiiigentlich ziemlich einfaches Ding, aber ich musste ziemlich lang googlen, um was brauchbares zu finden. Linux stellt eine joystick-bib zur Verfügung, die bereits alles erforderliche enthält, um den Joystick auszulesen, also einfach mal /linux/joystick.h einbinden.
dann kann man zwei structs anlegen,
js_event und JS_DATA_TYPE
struct js_event e;
struct JS_DATA_TYPE js;


Man öffnet das Joystick-Device zum lesen
fd = open("/dev/input/js0" O_RDONLY);

und liest dann in einer Schleife alles in das js_event-struct ein.
while(1){
read(fd, &e, sizeof(struct js_event);

Angenommen, das js_event-struct heisst e, dann kann man mit
if(e.type == JS_EVENT_AXIS)

überprüfen, ob sich etwas an den Achsen geändert hat, und entsprechend mit
if(e.type == JS_EVENT_BUTTON)

überprüfen, ob ein Button gedrückt wurde.

Leider ist es mir nicht gelungen, mit dem js_event-struct die Nummer der gedrückten Buttons auszulesen, also bemühte ich noch ein anderes, vordefiniertes struct, JS_DATA_TYPE.
Nennen wir JS_DATA_TYPE mal js, dann bekommt man mit
read(device, &js, JS_RETURN);
printf("%u",js.buttons);

einen bit-wert geliefert (1,2,4,8), der den jeweiligen Button identifiziert.

Für was das alles?

Einmal könnte man ein paar kleine joystick-spiele damit bauen, den Desktop steuern oder den Joystick als Maus benutzen (wenn man die xlib noch ein bisschen bemüht).
Aber ich will den Joystick benutzen, um meinen (hoffentlich bald fertigen) Robo damit fernzusteuern, deshalb sind im Code auch Stufen für (links/rechts/vorwärts/rückwärts) eingebaut.

Kommentare

Kommentar schreiben