USB HID 消费者音量增量/减量在 Win10 上自动重复相对输入

问题描述 投票:0回答:1

我已经实现了一个旋转编码器来通过 HID 设备控制主机 PC 的音量。这是报告描述符:

0x05, 0x0C, /* Usage Page (Consumer). */
0x09, 0x01, /* Usage (Consumer Control). */
0xA1, 0x01, /* Collection (Application). */
0x85, 0x03,   /* Report ID (3). */
0x05, 0x0C,   /* Usage Page (Consumer). */
0x95, 0x02,   /* Report Count (2). */
0x75, 0x01,   /* Report Size (1). */
0x15, 0x00,   /* Logical Minimum (0). */
0x25, 0x01,   /* Logical Maximum (1). */
0x09, 0xE9,   /* USAGE (Volume Increment). */
0x09, 0xEa,   /* USAGE (Volume Decrement). */
0x81, 0x26,   /* Input (Data,Var,Rel,No Wrap,Linear,No Preferred State,No Null Position). */
0xC0,       /* End Collection. */

在 Linux 上,它可以完美运行。

在 Windows 10 上,它有一个非常奇怪的、可变的行为,具体取决于操作:

  • 如果我将旋钮旋转几圈,它就可以完美工作。
  • 如果我将旋钮沿与最后一个刻度相同的方向旋转一个刻度,则效果完美。
  • 如果我以与最后一个刻度相反的方向旋转旋钮一个刻度,Windows 会愉快地自动重复该命令,直到音量为 0% 或 100%。为什么?

我指定数据是相对的,没有首选状态并且没有空位置。当我的设备停止发送报告时,为什么 Win10 在特定情况下自动重复该操作?

编辑(11 月 28 日 11:14):澄清一下,如果设备在每次非空报告后系统地发送空报告,则可以解决问题。尽管问题仍然存在,但为什么 Windows 自动重复输入明确配置为非重复类型。

usb hid
1个回答
0
投票

音量增量和减量在HID 使用表中定义为重新触发控制,指定为“只要断言就触发重复事件”(3.4.1.5)。因此,如果您发送设置了两个位之一的报告,Windows 似乎会正确实现此行为。正如您所指出的,您需要发送空报告来清除重复。

旁注,将他们定义为亲戚对我来说似乎很可疑。它们应该是绝对的,它们旨在反映瞬时按钮的状态。

最后,如果您确实有一个旋钮,您宁愿将一个反映旋钮旋转量的有符号项目声明为“音量”(消费者页面,0xE0,定义为“线性控制”),您可以在其中实际使用相关项目。 这可能接近规范中的示例 A.2,其中包含 Volume 项目而不是 Tape Jog。比如:

 0x05, 0x0c,                    // UsagePage (consumer)
 0x09, 0x01,                    // Usage (ConsumerControl)
 0xa1, 0x01,                    // Collection (Application)
 0x15, 0x81,                    //     LogicalMinimum (-127)
 0x25, 0x7f,                    //     LogicalMaximum (127)
 0x75, 0x08,                    //     ReportSize (8)
 0x95, 0x01,                    //     ReportCount (1)
 0x09, 0xe0,                    //     Usage (Volume)
 0x81, 0x06,                    //     Input (Variable|Relative)
 0xc0,                          // EndCollection

这将允许将旋转速度反映为精确的体积变化。

© www.soinside.com 2019 - 2024. All rights reserved.