![]() |
в Ардуино есть библиотека Keyboard
и там есть просто метод: Keyboard.press(keyCode); так вот какой keyCode я должен запихнуть?))) 128 для увеличения звука 129 для уменьшения 234 предыдущий трек 235 следующий трек так?) |
Цитата:
На дня приедет планшет (EMS говорит, что он уже в Москве) На выходных (на этих или следующих) будет большой разбор!))) |
Цитата:
Если второе - то лучше так не делать. Если первое - то тебе надо привязываться не к либе ардуйно, а к стандарту хид клавы. И в репорте передавать коды. Для хид клавы описаны все сканкоды, которые не зависят от того что у тебя на другом конце - андроид или винда. Вот сканкоды для мультимедиа клавы: Код:
// PAGE 00xC: А для обычных кнопок репорт должен быть настроен на обычную клаву (0x07) Я у себя сделал две коллекции в одном дескрипторе: Код:
0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
Цитата:
|
дописать в ReportDecription вторую коллекцию с другим reportID. Я тебе привел пример репорта для двух коллекций. Первая - это обычная клава (страница 0х07), а вторая - это мультимедийная (страница 0х0С).
Потом вспоминаешь, что в репорте первый байт у тебя задан reportID, и в нем выбираешь что шлешь. 1 - обычная клавиша, 2 - мультимедия. И соответственно строишь тело пакета. Что где в теле лежит - смотришь из reportDescription. Если что - стучись в аську: 307342375 |
С ReportDecription разобрался кажется.
Теперь по поводу самого репорта, для страницы 7 структура такая: uint8_t Modifier; uint8_t Reserved; uint8_t KeyCode[6]; (в моем случае размер указан именно 6) Для страницы 0х0С такая же? Только коды клавиш двух-байтные? В репорт записывать сначала младший, потом старший байт? Я правильно понял? |
нет, не такая же.
Давай на примере моего репорта. Надеюсь, ты заметил, что я показал только смысловую часть, опустив начало и конец.. ) Репортдескрипшн (описалово репорта) как раз и показывает какие данные и как мы будем передавать. Тут мы говорим, что будет новая коллекция (вариант репорта) под обычную клаву: 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) РепортИД для этой коллекции - 1: 0x85, 0x01, // REPORT_ID (1) Используем клавиатуру: 0x05, 0x07, // USAGE_PAGE (Keyboard) Диапазон значений следующего поля - от 0хе0 до 0хе7) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) Каждое значение может быть либо 0 либо 1: 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) Размер поля - 1 бит. Кол-во полей - 8: 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) То, что мы описали - вход для хоста, и данные идут как массив битов: 0x81, 0x02, // INPUT (Data,Var,Abs) Это мы описали первый блок в репорте. Иными словами и по-русски - мы передаем 1 байт (8 бит), каждый бит в котором соответствует одной из клавиш от Keyboard LeftControl до Keyboard Right GUI. Следующий блок передает опять данные клавы: 0x05, 0x07, // USAGE_PAGE (Keyboard) Размер поля - 8 бит. Кол-во полей - 1шт: 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) Диапазон значений - от 0до 0х65, транслируется 1:1 : 0x25, 0x65, // LOGICAL_MAXIMUM (101) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) Опять же - вход, но уже как значения: 0x81, 0x00, // INPUT (Data,Ary,Abs) На этом первая коллекция закончилась. Больше в этом репорте мы ничего не шлем. 0xc0, // END_COLLECTION Итого вышло три байта: байт 1 - reportID = 1 (говорит о том, что дальше данные из первой коллекции) байт 2 - массив для функциональных клавиш байт 3 - одна из обычных. Теперь вторая коллекция 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) 0x09, 0x01, // USAGE (Consumer Control) 0xa1, 0x01, // COLLECTION (Application) Именно такой репортид мы будем слать для нее: 0x85, 0x02, // REPORT_ID (2) Страница - Сonsumer Devices (именно там у нас коды мультимедийных клавиш): 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) Диапазон значений и его отображение. Обрати внимание, что он двухбайтный: 0x19, 0x00, // USAGE_MINIMUM (Unassigned) 0x2a, 0x08, 0x01, // USAGE_MAXIMUM (Police Alarm) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0x08, 0x01, // LOGICAL_MAXIMUM (264) Слать будем два поля по 8 байт (те же два байта): 0x95, 0x02, // REPORT_COUNT (2) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x00, // INPUT (Data,Ary,Abs) 0xc0, // END_COLLECTION Иными словами: байт 1 - репортид = 2 байты 2и3 - код клавиши в соответствии с таблицей, что я давал выше. Все. Теперь в общем.. Если мы хотим послать событие обычной кнопки - то шлем данные только для коллекции 1. Если для мультимедийной - то данные для коллекции 2. И там и там мы задали слать по 3 байта. |
До меня постепенно доходит суть и смысл.
Только я пользуюсь библиотекой lufa, поэтому у меня всё тоже самое, только другими словами. Исходя из информации от тебя, я описал такой вот дескриптор: Код:
#define HID_DESCRIPTOR_KEYBOARD(MaxKeys) \ Сам report у меня создается в функции Код:
bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, |
баааалин... да что все это значит вообще?)))))
|
Цитата:
+1 )) жду готового продукта ) |
Часовой пояс GMT +4, время: 02:14. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot