Hallo zusammen,
mir ist bewusst, dass das hier eigentlich das ARM Forum ist, mein Problem ist aber eher ein USB Problem in einem Projekt mit einem ARM Microcontroller, nämlich einem STM32F411 auf einem BlackPill Board.
Als Entwicklugsumgebung verwende ich die STM32CubeIDE unter Linux.
Nun zu meinem Projekt. Ich möchte eine eigene Schubsteuerung zu meinem Joystick bauen, also den Teil, der bei einem HOTAS System für die linke Hand gedacht ist. Den Joystick habe ich bereits selbst (um)gebaut, ganz neu ist mir das Thema also nicht. Technisch wird das ganze also ein Custom USB HID Gerät.
Die Schubsteuerung soll 4 Schubregler bekommen, damit ich bei einer 747 jedes Triebwerk einzeln regeln kann :-D
Das Problem ist, dass der PC von den 4 definierten Schubreglern nur einen erkennt, die anderen 3 fallen einfach unter den Tisch.
Mein ReportDescriptor sieht so aus (11 Achsen, davon 4 Schub, ein 8-Wege Hat und 36 Buttons):
Das Tool "jstest" meldet nur 10 Achsen anstatt 13 die es eigentlich sein müssten (der 8-Wege-Hat wird durch zwei Achsen dargestellt), davon nur ein Throttle anstatt der definierten 4:
Driver version is 2.1.0.
Joystick (Hillar ForceThrottle) has 10 axes (X, Y, Z, Rx, Ry, Throttle, Rudder, Wheel, Hat0X, Hat0Y)
and 36 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6, ?, ?, ?, BtnDead, (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null)).
Testing ... (interrupt to exit)
In der grafischen Version sieht es dann so aus:
Es muss aber möglich sein, kommerzielle Joysticks wie der Saitek x56 habe auch mehr als einen (in dem Falls 2) Schubregler.
Wenn jemand eine Idee hat was ich ändern muss damit alle Schubregler erkannt werden wäre ich echt dankbar, ich habe keine Idee mehr woran es liegt.
Schon mal danke im Vorraus
Hillar
mir ist bewusst, dass das hier eigentlich das ARM Forum ist, mein Problem ist aber eher ein USB Problem in einem Projekt mit einem ARM Microcontroller, nämlich einem STM32F411 auf einem BlackPill Board.
Als Entwicklugsumgebung verwende ich die STM32CubeIDE unter Linux.
Nun zu meinem Projekt. Ich möchte eine eigene Schubsteuerung zu meinem Joystick bauen, also den Teil, der bei einem HOTAS System für die linke Hand gedacht ist. Den Joystick habe ich bereits selbst (um)gebaut, ganz neu ist mir das Thema also nicht. Technisch wird das ganze also ein Custom USB HID Gerät.
Die Schubsteuerung soll 4 Schubregler bekommen, damit ich bei einer 747 jedes Triebwerk einzeln regeln kann :-D
Das Problem ist, dass der PC von den 4 definierten Schubreglern nur einen erkennt, die anderen 3 fallen einfach unter den Tisch.
Mein ReportDescriptor sieht so aus (11 Achsen, davon 4 Schub, ein 8-Wege Hat und 36 Buttons):
C:
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
// 6 Byte
// ------------------------- Axes ----------------------------
0xa1, 0x00, // COLLECTION (Physical)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x09, 0x32, // USAGE (Z)
0x09, 0x33, // USAGE (Rx)
0x09, 0x34, // USAGE (Ry)
0x09, 0x37, // USAGE (Dial)
0x09, 0x38, // USAGE (Wheel)
0x09, 0x36, // USAGE (Slider)
0x09, 0x36, // USAGE (Slider)
0x09, 0x36, // USAGE (Slider)
0x09, 0x36, // USAGE (Slider)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x0f, // LOGICAL_MAXIMUM ( 4095 = 12 Bit)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 11, // REPORT_COUNT (11)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
// 36 Byte
// ------------------------- the hat switch, 4 Bit ----------------------------
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x39, // USAGE (Hat switch)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x07, // LOGICAL_MAXIMUM (7)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM (315)
0x75, 0x04, // REPORT_SIZE (4)
0x95, 0x01, // REPORT_COUNT (1)
0x65, 0x14, // UNIT (Eng Rot:Angular Pos)
0x55, 0x00, // UNIT EXPONENT(0)
0x81, 0x42, // INPUT (Data,Var,Abs,Null)
0xc0, // END_COLLECTION
// 26 Bytes
// ------------------------- Buttons ----------------------------
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 36, // REPORT_COUNT (36)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 36, // USAGE_MAXIMUM (Button 36)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
// 23 byte
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
Das Tool "jstest" meldet nur 10 Achsen anstatt 13 die es eigentlich sein müssten (der 8-Wege-Hat wird durch zwei Achsen dargestellt), davon nur ein Throttle anstatt der definierten 4:
Driver version is 2.1.0.
Joystick (Hillar ForceThrottle) has 10 axes (X, Y, Z, Rx, Ry, Throttle, Rudder, Wheel, Hat0X, Hat0Y)
and 36 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6, ?, ?, ?, BtnDead, (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null), (null)).
Testing ... (interrupt to exit)
In der grafischen Version sieht es dann so aus:
Es muss aber möglich sein, kommerzielle Joysticks wie der Saitek x56 habe auch mehr als einen (in dem Falls 2) Schubregler.
Wenn jemand eine Idee hat was ich ändern muss damit alle Schubregler erkannt werden wäre ich echt dankbar, ich habe keine Idee mehr woran es liegt.
Schon mal danke im Vorraus
Hillar