Показать сообщение отдельно
Старый 14.03.2013, 19:44   #27
Alex_St
Старший Пользователь
 
Аватар для Alex_St
 
Регистрация: 09.04.2008
Возраст: 44
Город: Одесса
Регион: Украина
Машина: Chevrolet Aveo-II LS 2008
Сообщений: 896
Alex_St is a name known to allAlex_St is a name known to allAlex_St is a name known to allAlex_St is a name known to allAlex_St is a name known to allAlex_St is a name known to all
По умолчанию

нет, не такая же.
Давай на примере моего репорта. Надеюсь, ты заметил, что я показал только смысловую часть, опустив начало и конец.. )
Репортдескрипшн (описалово репорта) как раз и показывает какие данные и как мы будем передавать.

Тут мы говорим, что будет новая коллекция (вариант репорта) под обычную клаву:
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 байта.
__________________
Мой журнал: http://www.pccar.ru/showthread.php?p=79335
Alex_St вне форума   Ответить с цитированием