Arduino:在理解 <keyboard.h> 库方面需要帮助

Arduino: need assistance in understanding <keyboard.h> library

我有 Leonardo/Micro 设备可以模拟键盘。 我想修改库。原因是我希望能够发送原始扫描码,而图书馆会做一些准备。 我查看了源代码,也是 HID 库的源代码,但难以理解以下几点:

  1. Keyboard_::begin() 和 Keyboard_::end() 应该 start and stop keboard emulation, but they have empty bodies; https://www.arduino.cc/en/Reference/KeyboardBegin
  2. KeyReport特别神秘:
  3. 密钥报告到底发生了什么?我在 HID.cpp 中的 USB_Send 函数中迷路了。无法找到它的来源
  4. 什么是修饰符,它们在做什么?
  5. 发送的密钥数量是否限制为 6 个,或者理论上可以是任意的?

我会尽力回答您的问题。如果您还有问题,请告诉我:

  1. Keyboard_::begin() and Keyboard_::end() are supposed to start and stop keboard emulation, but they have empty bodies

我相信这些只是占位符,以防需要进行任何初始化或清理。其他库具有相同的功能(例如鼠标库)。我怀疑他们在那里是为了保持一致性,以防万一。

  1. KeyReport is especially mysterious.
typedef struct
{
    uint8_t modifiers;
    uint8_t reserved;
    uint8_t keys[6];
} KeyReport;

KeyReport 是表示发送到主机的 USB 消息的数据结构。

  • modifiers 成员是一个 8 位无符号整数,包含各种标志(例如 Left Shift、Left Ctrl、Left Alt 等)
  • 保留成员是一个8位无符号整数,未使用,但必须存在。
  • keys 成员是一个由六个 8 位无符号整数组成的数组,表示当前按下的键。
  1. What exactly happens to the keyreport? I lost track in USB_Send function in HID.cpp.

它被发送到主机。

  1. What are modifiers, what they are doing?

有些键是“常规”键(例如 A、B、1、2、# 等)。其他键是修饰符(例如 Shift、Ctrl、Alt)。修改键在 KeyReport.modifiers 中设置标志。比如Left Shift键是0x02.

  1. Is number of keys sent limited to 1 or, theoretically could be arbitrary?

可以同时按下的“常规”键数量为 6,但您也可以按下修饰键(Shift、Alt、Ctrl 等)。

仅供参考:我已经能够通过向 USBAPI.h 文件添加新的键定义来添加其他键(例如数字键盘键):

#define KEY_NUMPAD_DIVIDE   0xDC
#define KEY_NUMPAD_MULTIPLY 0xDD
#define KEY_NUMPAD_MINUS    0xDE
#define KEY_NUMPAD_PLUS     0xDF
#define KEY_NUMPAD_ENTER    0xE0
#define KEY_NUMPAD_1        0xE1
#define KEY_NUMPAD_2        0xE2
#define KEY_NUMPAD_3        0xE3
#define KEY_NUMPAD_4        0xE4
#define KEY_NUMPAD_5        0xE5
#define KEY_NUMPAD_6        0xE6
#define KEY_NUMPAD_7        0xE7
#define KEY_NUMPAD_8        0xE8
#define KEY_NUMPAD_9        0xE9
#define KEY_NUMPAD_0        0xEA
#define KEY_NUMPAD_DEL      0xEB