Mahlzeit!
Um alte Joysticks vom C-64 oder Amiga auch am PC betreiben zu können
baue ich mir gerade einen Adapter. Das funktioniert auch prinzipiell
schon überraschend gut.
Es gibt jedoch ein paar Feinheiten, welche ich gerne noch ändern würde.
So verwende ich die "Adafruit TinyUSB" Library und arbeite in der
ArduinoIDE mit C++. Wenn ich jetzt folgendes als Beschreibung für HID
verwende funktioniert alles super:
1
uint8_tconstdesc_hid_report[]=
2
{
3
TUD_HID_REPORT_DESC_GAMEPAD()
4
};
Dann hat der Adapter aber angeblich 8 Achsen und 32 Buttons. Achse 0 und
1 sowie Button 0 funktionieren und ich kann auch im Emulator problemlos
damit spielen.
Ich würde aber gerne angeben, dass es 2 Achsen mit 1 Button sind. Dazu
habe ich folgendes gebastelt:
1
uint8_tconstdesc_hid_report[]=
2
{
3
0x05,0x01,// Usage Page (Generic Desktop)
4
0x09,0x05,// Usage (Game Pad)
5
0xA1,0x01,// Collection (Application)
6
7
// X und Y Achsen
8
0x09,0x30,// Usage (X)
9
0x09,0x31,// Usage (Y)
10
0x15,0x81,// Logical Minimum (-127)
11
0x25,0x7F,// Logical Maximum (127)
12
0x75,0x08,// Report Size (8)
13
0x95,0x02,// Report Count (2)
14
0x81,0x02,// Input (Data,Var,Abs)
15
16
// Buttons (nur 1 Button)
17
0x05,0x09,// Usage Page (Button)
18
0x19,0x01,// Usage Minimum (Button 1)
19
0x29,0x01,// Usage Maximum (Button 1)
20
0x15,0x00,// Logical Minimum (0)
21
0x25,0x01,// Logical Maximum (1)
22
0x75,0x01,// Report Size (1)
23
0x95,0x01,// Report Count (1)
24
0x81,0x02,// Input (Data,Var,Abs)
25
26
// Padding auf Bytegröße
27
0x75,0x07,// Report Size (7)
28
0x95,0x01,// Report Count (1)
29
0x81,0x03,// Input (Const,Var,Abs)
30
31
0xC0// End Collection
32
};
Dann bekomme ich auch 2 Achsen und 1 Button angezeigt. Allerdings
funktionieren die dann nicht mehr. Ändere ich es wieder funktioniert es
sofort. Also an der Verkabelung kann es nicht liegen.
Das wäre der eine Punkt. Der Andere wäre dann noch, derzeit wird der
Adapter vom PC als "Raspberry Pi Pico" erkannt. Ist kein Beinbruch aber
der kleine Monk in mir würde da gerne etwas individuelles angezeigt
sehen. Nur scheint mir, dass die Bibliothek das nicht zulässt. Mein
Versuch die Funktion zu überschreiben schlug leider fehl.
Hier kommt dann der ganze Code, falls ich sonst wo einen Fehler gemacht
habe.
Dany T. schrieb:> hid_gamepad_report_t gp;
Passt die Struktur denn zu deinem veränderten ›desc_hid_report‹?
Die sollte nun nur noch drei Bytes haben, zweimal int8_t und einmal
uint8_t.
Und von dem Letzten wird nur ein Bit verwendet.
Norbert schrieb:> Passt die Struktur denn zu deinem veränderten ›desc_hid_report‹?
Die hat natürlich nicht gestimmt. Vielen Dank für den Hinweis, jetzt
funktioniert es! 2 Achsen und 1 Button und die werden auch einwandfrei
gelesen.
Früher mal gab es bei PCs einen Joystickanschluss bzw. zwei (SubD15) und
daran konnte man je einen analogen Joystick mit 2 Achsen und 2 Tasten
anschliessen. Willst du an so einen Anschluss einen digitalen Joysteick
anschliessen?