Управление светодиодами клавиатуры с помощью USB Host Shield

У меня есть USB-клавиатура, подключенная к моему Arduino Uno с помощью USB Host Shield. Я читаю нажатия клавиш, используя этот пример с USB-хоста Библиотека щитов.

Мне нужно переключить светодиоды на клавиатуре (которые показывают состояние Caps Lock, Num Lock и т. д.)

В этой теме упоминается использование Usb.setReport(), но это метод больше не существует: такого метода нет в Usb.cpp в библиотеке. Кажется, существует метод, называемый SetReport в классе USBHID, который, похоже, принимает те же аргументы, что и я.

Что я сейчас делаю:

void keyboard_setup(){
    static HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
    if (Usb.Init() == -1) {
        Serial.println("OSC did not start.");
    }
    delay(200);
    HidKeyboard.SetReportParser(0, &Prs);

    static USBHID usbhid(&Usb);
    uint8_t leds = 1;
#define KBD_ADDR 1
#define KBD_IF 0
    usbhid.SetReport( KBD_ADDR, 0, 1, KBD_IF, 0, &leds );
    delay(100);
    leds = 255;
    usbhid.SetReport( KBD_ADDR, 0, 1, KBD_IF, 0, &leds );
    delay(100);

Кажется, ни один из вызовов SetReport не работает, и я не уверен, что значения KBD_ADDR или KBD_IF верны (я использую те, что видел в примерах), или что вызов SetReport является правильным .

Что я делаю не так?

, 👍1

Обсуждение

Я отправил ответ, но удалил его. Моя первая мысль заключалась в том, что вы создаете свой собственный экземпляр метода SetReport (которым вы и являетесь), который не работает ни с одним USB-устройством. Но, глядя на ваш код еще раз - я не уверен., @st2000

@ st2000 Я создаю свой собственный экземпляр USBHID, который я больше не использую, потому что мне кажется, что он нужен для использования SetReport(). Хотя я не уверен, что это правильный подход., @Joe Malt

Это займет у меня немного размышлений. Но я думаю, что лучший способ управлять светодиодами клавиатуры — это предоставить SetReport вашему Sketch, добавив метод-оболочку в библиотеку USBHost. В противном случае, я думаю, вам нужно настроить все USB-устройства в вашем Sketch, на что уже способен драйвер., @st2000

Я думал, что [NicoHood/HID](https://github.com/NicoHood/HID/tree/master/src/HID-APIs) страница github была ответом, но я думаю, что она работает с пользовательской клавиатурой и не обязательно работает с /стандартные светодиоды USB-клавиатуры., @st2000

NicoHood/HID использует Arduino для эмуляции клавиатуры... на самом деле клавиатура не задействована, @jsotola


1 ответ


2

Кажется, существует метод, называемый SetReport в классе USBHID, который, похоже, принимает те же аргументы, что и я.

Аргументы нового метода SetReport() не совсем совпадают, а некоторые расположены в другом порядке.

Сигнатура старого метода была такой:

uint8_t setReport( uint8_t addr, uint8_t ep, unsigned int nbytes, uint8_t interface, uint8_t report_type, uint8_t report_id, uint8_t* dataptr );

...а новый:

uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);

Мне кажется, эквивалентным вызовом будет:

usbhid.SetReport( 0, KBD_IF, 0x02, 0, 1, &leds );
,