Joystick funktioniert nicht

sterum

Well-Known Member
Hallo Leute,

Ich wollte mal wieder eine Runde FlightGear spielen, jedoch scheint mein Joystich unter FreeBSD nicht zu funktionieren. Damals, unter Linux, hat er aber funktioniert.

Der uhid Treiber findet den Joystick zwar:

dmesg:
Code:
uhid0: <STD Interact Gaming Device, class 0/0, rev 1.00/11.00, addr 2> on uhub0

aber die mit FlightGear mitgelieferten Programme js_demo bzw. fgjs finden ihn nicht.

fgjs:
Code:
Found 0 joystick(s)
Can't find any joysticks ...

js_demo:
Code:
Joystick test program.
~~~~~~~~~~~~~~~~~~~~~~
Joystick 0 not detected
Joystick 1 not detected
Joystick 2 not detected
Joystick 3 not detected
Joystick 4 not detected
Joystick 5 not detected
Joystick 6 not detected
Joystick 7 not detected

Was also tun?

Und kommt mir jetzt bloß nicht mit: kauf dir einen neuen Joystick :)
 
Obwohl ich nur sehr bescheidene C und noch schlechtere C++ Kenntnisse habe, hab ich nun mal in die Sourcen von FlightGear geschaut.

In js_demo.cxx steht folgendes:
Code:
  for ( i = 0; i < Z; i++ )
  { useful[i] = ! ( js[i]->notWorking () );
    if ( useful[i] ) {
         t++;
         printf ( "Joystick %i: \"%s\"\n", i, js[i]->getName() ) ;
    } else
	 printf ( "Joystick %i nicht gefunden\n", i ) ;
  }

In meinem Fall gibt also "js->notWorking ()" 1 zurück.

Also mal weitergeschaut. In der Datei js.h steht unter anderem:

Code:
class jsJoystick
{
  int          id ;
protected:
  struct os_specific_s *os ;
  friend struct os_specific_s ;
  int          error        ;
  char         name [ 128 ] ;
  int          num_axes     ;
  int          num_buttons  ;
.
.
.
  int   notWorking    () const { return error ;    }
.
.
.

Jetzt stellt sich mir die Frage, wo und wie die Variable "error" (auf 1?) gesetzt wird.
 
Hi, du kannst ja mal gucken wo das Objekt "js" erzeugt wird und dann den Verlauf weiterverfolgen.
Außerdem musst du gucken in welchen Methode aus der Klassendefinition auf die "error" Variable noch zugegriffen wird. Irgendwo wird die ja gesetzt.

Gruß, Daniel_S
 
Ich hab gestern in der js.h wohl die Methode

Code:
void setError () { error = JS_TRUE; }

übersehen.

Werd jetzt mal schauen wo der Methodenaufruf stattfindet.
 
So, hab mich mal weiter im Programmcode vorgewühlt.
Der Fehler passiert in der plib, in der Datei jsBSD.cxx.

Code:
  if ( !joy_initialize_hid(os, &num_axes, &num_buttons ) )
  {
     ::close(os->fd);
     error = 1;
     return;
  }

Ich nähere mich wohl langsam dem uhid Treiber:confused:
 
So, hab mich mal weiter im Programmcode vorgewühlt.
Der Fehler passiert in der plib, in der Datei jsBSD.cxx.

Code:
  if ( !joy_initialize_hid(os, &num_axes, &num_buttons ) )
  {
     ::close(os->fd);
     error = 1;
     return;
  }

Ich nähere mich wohl langsam dem uhid Treiber:confused:

Wenn mich nicht alles täuscht, gehört jsBSD.cxx zum Port x11-toolkits/plib und hat zurzeit die Version 1.8.5_2.
In dieser Version wird bereits auf den neuen USB Stack gepatcht.

Irgendetwas könnte da schieflaufen oder je nach Joystick falsch initialisieren ...
 
Ich denke nicht, das es am plib Code liegt.
In der Funktion (Methode?) "joy_initialize_hid ()" gibt es z.B. einen Funktionsaufruf aus dev/usb/hid.c der die Byteanzahl des jeweiligen HID Geräts zurückgibt.
Dieser Rückgabewert ist aber in meinem Fall 0.

[edit]
Code:
size = hid_report_size(rd, hid_input, report_id);
gibt 0 zurück.
 
Last edited:
Hallo Leute,

Ich hab jetzt eine anderen Joystick hier zum testen. Es handelt sich um einen Logitech
Freedom 2.4 Cordless Joystick. Dieser wird von FreeBSD auch wieder anstandslos
erkannt. Jedoch plib erkennt ihn wieder nicht. Langsam denke ich, das plib überhaupt keine
USB Joysticks mehr erkennt. Aber ich lasse mich gerne vom Gegenteil überzeugen.
 
Leider kann ich bis dato meinen Joystick noch immer nicht für flightgear benutzen.
Deshalb frage ich mal so in die Runde ob es hier überhaupt jemanden gibt der einen
funktionierenden USB Joystick mit flightgear am laufen hat.
Vielleich that ja jemand ein paar Tips für mich.
 
Kurzer Statusbericht:

ein
Code:
usbhidctl -f /dev/uhid0 -r

ergibt
Code:
Report descriptor:
Collection page=Generic_Desktop usage=Joystick
Total   input size 0 bytes
Total  output size 0 bytes
Total feature size 0 bytes

Das sieht nicht gut aus. :mad:
 
Deshalb frage ich mal so in die Runde ob es hier überhaupt jemanden gibt der einen
funktionierenden USB Joystick mit flightgear am laufen hat.

Ja ich. Mein USB Attack3 Joystick läuft ohne Probleme mit Flightgear. Habe gerade getestet. FreeBSD. 8.0, Flightgear 2.0.
 
@sterum
Bei mir heisst dass Device uhid1
Code:
usbhidctl -f /dev/uhid1 -r
Report descriptor:
Collection page=Generic_Desktop usage=Joystick
Collection page=0x0000 usage=0x0000
Input   size=8 count=1 page=Generic_Desktop usage=X, logical range 0..255, physi                                                                                                                          cal range 0..255
Input   size=8 count=1 page=Generic_Desktop usage=Y, logical range 0..255, physi                                                                                                                          cal range 0..255
Input   size=8 count=1 page=Generic_Desktop usage=Z, logical range 0..255, physi                                                                                                                          cal range 0..255
Input   size=1 count=1 page=Button usage=Button_1, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_2, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_3, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_4, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_5, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_6, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_7, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_8, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_9, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_10, logical range 0..1, physical                                                                                                                           range 0..1
Input   size=1 count=1 page=Button usage=Button_11, logical range 0..1, physical                                                                                                                           range 0..1
End collection
Collection page=0x0000 usage=0x0000
Feature size=8 count=1 page=Microsoft usage=0x0001, logical range 0..255, physic                                                                                                                          al range 0..255
Feature size=8 count=1 page=Microsoft usage=0x0001, logical range 0..255, physic                                                                                                                          al range 0..255
Feature size=8 count=1 page=Microsoft usage=0x0001, logical range 0..255, physic                                                                                                                          al range 0..255
Feature size=8 count=1 page=Microsoft usage=0x0001, logical range 0..255, physic                                                                                                                          al range 0..255
End collection
End collection
Total   input size 5 bytes
Total  output size 0 bytes
Total feature size 4 bytes
 
Ok, scheinbar liegt's am uhid Treiber, welcher meinen Joystick nicht wirklich mag.

Der Joystick wird zwar als HID Gerät erkannt, aber das war's dann schon.
 
Ok, scheinbar liegt's am uhid Treiber, welcher meinen Joystick nicht wirklich mag.
Sieht so au.:grumble:
Hast du aber die aktuellste Version von Flighgear und Plib? Es gab vor kurzem tatsächlich Probleme mit Joysticksupport und Plib. Wurde aber anscheinend wieder gefixt.
Kostet das Gerät viel? Sonst musst du dir halt ein Joystick kaufen welcher wirklich von FreeBSD unterstützt wird.
 
Ja, plib und flightgear sind aktuell.
Aber wie gesagt, es liegt am Treiber und nicht an plib bzw flightgear.

Eine anderen Joystick kaufen ist wohl die einfachste Lösung. Dennoch würde mich brennend interessieren warum mein Joystick nicht richtig erkannt wird.
 
Falls es überhaupt jemanden interessiert:

Mittlerweile hab ich nun auf FreeBSD 8.1 aktualisiert und flightgear und plib sind auch auch aktuell.

FlightGear's js_demo erkennt nun meinen Joystick, bleibt aber beim Auslesen der Werte hängen.

Code:
Joystick test program.
~~~~~~~~~~~~~~~~~~~~~~
Joystick 0 not detected
Joystick 1 not detected
Joystick 2: "uhid0"
Joystick 3 not detected
Joystick 4 not detected
Joystick 5 not detected
Joystick 6 not detected
Joystick 7 not detected
+--------------------JS.2----------------------+
| Btns Ax:0 Ax:1 Ax:2 Ax:3 Ax:4 Ax:5           |
+----------------------------------------------+

Der Joystick wird nun also als "uhid0" erkannt. Ebenso wird erkannt, das er 6 Achsen hat, das war es dann aber auch schon wieder.;'(

Das Programm js_demo bleibt wie es aussieht hier "hängen".
Code:
        js[i]->read ( &b, ax[i] ) ;

js->read ist ein Aufruf in der plib
Code:
void jsJoystick::read ( int *buttons, float *axes )
{
  if ( error )
  {
    if ( buttons )
      *buttons = 0 ;

    if ( axes )
      for ( int i = 0 ; i < num_axes ; i++ )
        axes[i] = 0.0f ;

    return ;
  }

  float raw_axes [ _JS_MAX_AXES ] ;

  rawRead ( buttons, raw_axes ) ;

  if ( axes )
    for ( int i = 0 ; i < num_axes ; i++ )
      axes[i] = fudge_axis ( raw_axes[i], i ) ;
}

...und hier komm ich nun nicht mehr weiter.
 
Also bei mir funktioniert mit neustem Flighgear / FreeBSD der Joystick ohne Probleme. Ist ein Logitech Attack 3
 
Nach langer Zeit hab ich mich mal wieder mit meinem Joystick beschäftigt und kann zumindest einen Teilerfolg verzeichnen.

Das Joystich Testprogramm erkennt nun die Buttons und auch bei den Achsen bekomme ich entsprechende Werte geliefert.

Was ich getan habe war folgendes:

Im plib Code hab ich in der jsBSD.cxx die Variable report_id händisch auf eins gesetzt.
Code:
static int joy_initialize_hid(struct os_specific_s *os,
	int *num_axes, int *num_buttons)
{
  int size, is_joystick;
#ifdef HAVE_USBHID_H
  int report_id = 0;
#endif
  struct hid_data *d;
  struct hid_item h;
  report_desc_t rd;

  if ((rd = hid_get_report_desc(os->fd)) == 0)
    {
      fprintf(stderr, "error: %s: %s", os->fname, strerror(errno));
      return FALSE;
    }

  os->hids = NULL;

#ifdef HAVE_USBHID_H
  if (ioctl(os->fd, USB_GET_REPORT_ID, &report_id) < 0)
    {
      fprintf(stderr, "error: %s: %s", os->fname, strerror(errno));
      return FALSE;
    }
  report_id = 1;                                          // Zu Testzwecken auf 1 gesetzt
  size = hid_report_size(rd, hid_input, report_id);
Jetzt frage ich mich natürlich warum diese Variable nicht automatisch einen Wert zugewiesen bekommt. Vielleicht hat ja von euch jemand eine Idee.

Wie dem auch sei. Jetzt erstmal schnell FlightGear installieren und testen :)
 
Die uhid-Implementierung auf 8.2R ist leider hoffnungslos kaputt. Ich habe hier einen Adapter, der einen Report-Descriptor hat und auch liefert, denn Linux hat den nicht statisch gespeichert für das Gerät und es erkennt das Teil als ein Joypad.

Beim Abholen des Descriptors hängt das Gerät bei FreeBSD irgendwo im Kernel-Treiber und macht nichts weiter. Zuerst war der Entwickler von uhidd Feuer und Flamme das Teil zu unterstützen, aber als ich ihm Debug-Sachen geschickt habe vom Kernel, hat er sich nicht mehr gemeldet. LOL!

Irgendwo ist das im USB-Support Mist implementiert. Leider kenne ich mich mit dem "Standard" nicht so aus.

Hat eigentlich FreeBSD Support für Joypads (als spezielles Device unterhalb von uhid) inzwischen oder mappt der Treiber alles auf das alte joy(4) für Analog-Joysticks mit 2 Knöpfen? Das joy(4) Teil ist ja wohl lächerlich, um es als "Joystick-Support" zu bezeichnen.
 
Also mein PS2-Gamepad mit Speedlink-Adapter wird korrekt erkannt. Alle Buttons, das Steurkreuz, der Analogstick-Krempel, sogar der eingebaute Vibrator funktioniert...
 
Mit Speed Link funktioniert aber Stepmania nicht, weil die Logik falsch implementiert ist (gegenüberliegende Steuerkreuzbuttons funktionieren in Negation zueinander).

Ich habe deswegen einen anderen Adapter und der geht, aber FreeBSD sagt, dass es keinen Report Descriptor bekommt und es erscheint nicht als USB-Device.

Ich müsste auch mal gucken ob mein anderes Device erkannt wird (emuliert PS3 Sixaxis) und ob Stepmania überhaupt auf FreeBSD geht mit dem uhidd-Zeug.
 
Beim testen mit Flightgear bin ich auf ein weiteres Problem gestossen. Und zwar wurden die X und Y Achse nicht richtig skaliert, weil für jede Achse in der plib einfach eine Auflösung von 0 bis 255 angenommen wird. Jedoch gibt mein Joystick für diese Achsen Werte von 0 bis 1023 zurück. Also hab ich im plib Code noch eine Ausnahme für diese beiden Achsen hinzugefügt. Nun funktioniert zwar Flightgear mit meinem Joystick zufriedenstellend, aber halt auch nur für mich.
Eigentlich soll sich ja der uhid Treiber um die korrekten Werte für min, max und center kümmern, und nicht plib.

Hat eigentlich jemand eine Ahnung wozu die report_id gut ist, wenn auch eine statische 1 funktioniert?
 
Manche Geräte haben mehr als einen Report-Deskriptor. Das hat zum Beispiel mein USB-to-PS2-Adapter auch. Man darf das nicht einfach statisch auf "1" setzen.
 
Back
Top