Java Programm als Controller-Gerät

Hallo Leute
Ich habe mit dem Lego Mindstorms NXT (den ich mit Lejos geflasht hab, weil das Orginalbetriebssystem Mist ist) einen Joystick gebaut. Nun will ich diesen verwenden um damit am PC Spiele zu steuern. Zu diesem Zweck schrieb ich ein Programm, was auf dem NXT läuft und eines, das am PC läuft. Diese verbinden sich per USB und das übertragen der Joystickpositionsdaten funktioniert auch ziemlich gut. Problem: Wie krieg ich das PC Programm dazu, dass ich diese Steuerung in echten Videospielen auswählen kann? Ich muss Windows ja irgendwie vorgauckeln, dass das Programm ein tatsächliches Gerät plus Treiber ist, wie krieg ich das hin? (Hab durch Google leider nix gefunden)

Leider nicht konstruktiv: Ohne echten Treiber wird das wohl schwierig.

Aber trotz OT eigentlich wichtiger: Wie dieser Joystick aufgebaut ist bzw. funktioniert, würde mich ja schon mal interessieren…

Ich hab zwei Achsen, die ich mit zwei Motoren abfrage. Das tolle ist, dass man den Winkel eines Motors auch abfragen kann, auch wenn man ihn nicht per Programmierung dreht. Ist eigentlich recht einfach. TMII’s Antwort hab ich leider nicht lesen können, ist ja jetzt gelöscht. Das Programm, das ich am PC laufen hab, ist ja eigentlich genau das, was ein Treiber eigentlich tut. Ich muss jetzt eigentlich bloß noch Windows klarmachen, dass das ein Gerät ist.

1 Like

Interessant. Die grundsäzliche Möglichkeit, den Motordrehstand abzufragen hatte ich noch in Erinnerung (hatte auch mal kurz mit Mindstorms+LeJos rumgespielt), aber … IIRC sind diese Motoren recht “schwergängig”, und stellen sich ja auch nicht von alleine in eine “Nullstellung” zurück. Ich gehe also davon aus, dass das eher ein Geekig-Nerdiges Experiment ist, als ein “echtes” Anwendungsszenario. Unabhängig davon: Wie nah man da wirklich an “den Treiber” ran muss, weiß ich nicht. Mit dem ganzen Maker/Rasperry/…-Thema könnte ich mir vorstellen, dass es sowas wie einen “Universaltreiber” gibt, oder eine Art “Template”, das man relativ leicht anpassen kann. Websuchen liefern ja schnell was, https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/do-you-need-to-write-a-driver- oder auch https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/joystick-support - aber das ist natürlich recht weit von Java weg, … nicht, was mit einem MouseMotionListener vergleichbar wäre :wink:

Ich hatte meinen Beitrag gelöscht weil ich gestern keine Zeit mehr hatte drüber zu schauen ob ich alles geschrieben habe.

Also hier hat sich wer die Mühe gemacht PPJoy in Java zu mappen.

PPJoy verwendet aber das seit Windows XP abgelöste DirectInput. Generell kommt es halt aufs Spiel an welche Controller APIs und damit Controller unterstützt werden.
Eine Standard API wie für Tastaturen gibt es leider nicht.

Ansonsten lohnt sich noch das Google Keyword XInput.

Also diese Treiber, die Marco13 da vorgeschlagen hatte, das ist ja tatsächlich alles sehr unspezifisch und ich hab ehrlich gesagt keine Ahnung wie ich da mit Java irgendwas machen kann. Dieses Virtual Joystick Zeug sieht vielversprechend aus, zumindest wenn ichd as richtig verstanden hab: Es gibt also eine Java Bibliothek in der man “Joysticks” erstellen kann, die dann virtuell steuert und Windows das als Joystick sieht? Soviel dazu, ich hab auch noch eine Neuerung zum Thema: Ich hab etwas ausprobiert, was bei weitem keine gute Lösung ist, aber so eine Mogelei, auf die ich hoffte, falls sich zum Problem keine richtige Lösung ergibt. Ich habe die Richtungen in die vier Richtungen der Pfeiltasten übersetzt und in mein PC Programm eingebaut, dass die Java-Robot Klasse eben dann die entsprechende Pfeiltaste drückt. Wenn nun das Spielfenster im Fokus ist, und man dort zur Steuerung die Pfeiltasten einstellt, dann iste s tatsächlich möglich, mit dem NXT dieses Spiel zu steuern. Je nach Anwendung ist es vllt. auch möglich, den Joystick in virtuelle Mausbewegung zu übersetzen.

Moooch… da geht doch das “wichtigste” verloren: Die analoge Natur des Joysticks. Also, dass man eben nicht nur “nach vorne” gehen kann, sondern auch “ein bißchen nach vorne”. Aber vielleicht klappt das ja mit irgendsoeiner Joystick-Schicht, die man dazwischenhängt.

(BTW: Bei Java+Joystick muss ich an https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.3-Input-handling-with-GLFW#joystick-input denken, aber ob das hilft…!? Hab’ mich nie damit beschäftigt. Im Ernst: Ich habe noch nie einen Joystick besessen. (TODO: Hier anzüglichen Witz einfügen :smiley: ))