我是 HID 设备和创建 USB 外围设备的新手。作为一个研究项目,我创建了一个在单个设备上使用两个操纵杆的项目。
#include <Arduino.h>
#include <USBComposite.h>
const uint8_t reportDescription[] = {
HID_MOUSE_REPORT_DESCRIPTOR(),
HID_KEYBOARD_REPORT_DESCRIPTOR(),
HID_JOYSTICK_REPORT_DESCRIPTOR(),
HID_JOYSTICK_REPORT_DESCRIPTOR(HID_JOYSTICK_REPORT_ID+1),
};
USBCompositeSerial CompositeSerial;
USBHID HID;
HIDJoystick Joystick(HID);
HIDJoystick Joystick2(HID, HID_JOYSTICK_REPORT_ID+1);
void setup(){
// Setup device
HID.begin(CompositeSerial, reportDescription, sizeof(reportDescription));
while (!USBComposite);
Joystick.setManualReportMode(true);
Joystick2.setManualReportMode(true);
}
void loop(){
Joystick.send();
Joystick2.send();
}
此代码片段使用:https://github.com/arpruss/USBComposite_stm32f1(库)
https://github.com/arpruss/USBComposite_stm32f1/blob/master/examples/twojoysticks/twojoysticks.ino
问题是,当我尝试校准它们时,两个操纵杆具有相同的名称。因此,我想在其中使用此设备的许多程序每次运行都会丢失其设置。
不幸的是,操纵 USBComposite 实例的解决方案是更改其 VendorID 和 ProductString 或在 regEdit 中手动更改其名称,如下所示:
和https://www.stm32duino.com/viewtopic.php?t=624
对我不起作用,因为它再次更改名称,以便两个操纵杆具有相同的名称。
OEMName
下的HKEY_CURRENT_USER\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM\VID_XXXX&PID_XXXX\
用于缓存操纵杆名称以供DirectInput使用。
joy.cpl
是一个 DirectInput 面板。
根据泄露的Windows XP源代码中的
dihid.c
代码(在DIPROP_PRODUCTNAME
方法中查找CHid_GetProperty
),DirectInput正在尝试从几个不同的地方获取操纵杆设备名称。其中之一是 HidD_GetProductString 调用。
所以看来你只需要为你的操纵杆设备接口设置
USB_INTERFACE_DESCRIPTOR.iInterface
。