Joystick Device öffnen

31/10/2007 - 23:36 von Andreas Volz | Report spam
Hallo,

Ich greife wie folgt auf einen Joystick zu:

int Joystick::open (const string &device)
{
fd = ::open (device.c_str(), O_RDONLY);
if (fd == -1)
{
cerr << "Error opening joystick device!" << endl;
}
else
{
// wait on joystick to identify
usleep (3);
getJoyInfo (); // Infos von Joystick lesen mit read()
}

return fd;
}

Funktioniert ganz gut. Leider ist da ein Problem im Zeitverhalten. Nach
dem öffnen des Joystick Device muss ich "etwas" warten. Ansonsten
bekomme ich beim folgenden Lesen des Button- und Achsenanzahl immer 0.
Leider ist dieses etwas warten nicht in jedem Fall gleich. Jetzt könnte
ich den Wert einfach entsprechend hoch setzten, aber das finde ich
irgendwie unsauber. Sollte nach der Rückkehr von open() nicht in jedem
Fall ein korrektes read() möglich sein.

Deutet das auf einen Bug im Joystick-Treiber hin? Oder nutze ich das
Joystick-Interface falsch?

Gruß
Andreas
 

Lesen sie die antworten

#1 Frederik Sausmikat
01/11/2007 - 00:36 | Warnen spam
Andreas Volz wrote:
Funktioniert ganz gut. Leider ist da ein Problem im Zeitverhalten. Nach
dem öffnen des Joystick Device muss ich "etwas" warten. Ansonsten
bekomme ich beim folgenden Lesen des Button- und Achsenanzahl immer 0.
Leider ist dieses etwas warten nicht in jedem Fall gleich. Jetzt könnte
ich den Wert einfach entsprechend hoch setzten, aber das finde ich
irgendwie unsauber. Sollte nach der Rückkehr von open() nicht in jedem
Fall ein korrektes read() möglich sein.




Du zeigst leider nur Deinen Workaround, nicht den Code aber selbst.
Was genau tut getJoyInfo()? Du schreibst, dass Du die Infos mit
read(2) liest. Ich kann nicht behaupten, dass ich mich mit dem
Linux-Kernel auskenne, aber der Weg Joystick-Infos abzufragen, war
der über ioctl(2).

Anzahl der Achsen: ioctl(fd, JSIOCGAXES, (char *)&n);
Anzahl der Knöpfe: ioctl(fd, JSIOCGBUTTONS, (char *)&n);

siehe <linux/joystick.h> für weitere

Vielleicht machst Du es ja auch schon so. Wenn nicht, und das
Verhalten bleibt unveràndert, stimmt was mit dem Treiber nicht.

Gruß,
Freddy


Of course it runs NetBSD - http://www.netbsd.org

Ähnliche fragen