【问题标题】:Understanding Keyboard LED status了解键盘 LED 状态
【发布时间】:2020-04-29 19:21:02
【问题描述】:

我正在使用 Arduino Leonardo 作为键盘 (BadUSB),我想获取键盘 LED 状态(例如 CAPS_LOCK)。

使用https://github.com/NicoHood/HID/blob/master/examples/Keyboard/KeyboardLed/KeyboardLed.ino 我已经设法使用以下代码使其工作:

(不包括键盘库,因为它已经包含在 HID-Project 中)

#include <HID-Project.h>

#define LED_NUM_LOCK (1 << 0)       // B00000001
#define LED_CAPS_LOCK (1 << 1)      // B00000010
#define LED_SCROLL_LOCK (1 << 2)    // B00000100
#define LED_COMPOSE (1 << 3)        // B00001000
#define LED_KANA (1 << 4)           // B00010000
#define LED_POWER (1 << 5)          // B00100000
#define LED_SHIFT (1 << 6)          // B01000000
#define LED_DO_NOT_DISTURB (1 << 7) // B10000000

void setup() {
  Keyboard.begin();
  delay(500);

  if (BootKeyboard.getLeds() & LED_CAPS_LOCK) {
    // caps lock is on
    Keyboard.write("a"); // C
  } else {
    // caps lock is off
    Keyboard.write("b"); // e
  };

  Keyboard.end();
}

void loop() {}

问题是我想将此特定功能添加到我自己的库中(并避免加载大型 HID-Project 库)。

我相信 BootKeyboard.getLeds() 返回一个 8 位长数字,每个字符代表每个键的状态,如上面代码中定义的那样。 但是我不明白它是如何获得的,因为代码对我来说似乎并不清晰 https://github.com/NicoHood/HID/blob/master/src/SingleReport/BootKeyboard.cpp(第 190-192 行):

uint8_t BootKeyboard_::getLeds(void) { return leds; }

因为它只返回我猜想分配在其他地方的变量 leds,但我无法找到在哪里以及如何...

【问题讨论】:

    标签: c++ arduino keyboard led capslock


    【解决方案1】:

    看看

    • line53/54(程序中的_hidReportDescriptorKeyboard定义)
    • line168-172 设置led的值(0/1)
    • line190-192 获取值

    BootKeyboard.cpp的定义在头文件BootKeyboard.h中

    • 第 78 行为 uint8_t

    由于某些功能使用 _hidReportDescriptorKeyboard,您应该尝试使用文件作为基础,然后摆脱您不需要的功能。如果您有一个最小的工作集,您可以开始重构代码 - 对于代码分析和依赖关系,您可以使用静态工具(快照),如 doxygen 或支持代码分析的 IDE
    编辑
    继承人 wiki to the Hood Loader 喝点茶和时间阅读和学习
    看到links for details and infoAlternative Keyboard Firmware这些都是repos on github你可以搜索

    【讨论】:

    • 我已经设法摆脱了一堆文件......现在这是我目前对 leds 变量赋值的理解:。 . - 第 74 行:BootKeyboard_ 构造函数将其设置为 null (B00000000)。 - line180:使用 USB_RecvControl 函数重新分配。 - USB_RecvControl 在 HID-settings.h line116 中定义为 USBDevice.recvControl。 . .但我无法找到 USBDevice.recvControl 函数的代码。我认为它与“USB/PluggableUSB.h”有关(参见 HID-Settings.h 中的第 107 行)但是我在网上找不到任何有用的东西......
    • 您可能需要查看 Leonardo 的 HID 源(固件芯片)或 Nico Lib 中用于 uNO/MEGA 的 HIDdriver。关于 HID 驱动你必须搜索 howto write an HID driver Microsoft 了解概念
    • 你知道我如何访问芯片的源代码吗? (atmega32u4) 你知道 BootKeyboard_::setup 函数在哪里被调用,变量 setup 和 variabletype USBSetup& 是什么吗? (第 107 行)
    猜你喜欢
    • 2014-04-04
    • 2014-08-19
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多