HardWareMan - RESPECT. Я бы сам лучше не написал бы...
20 - ого будет MultiTap и, ->
софт в делЬфи под переходник
Хер-то, ТОЛЬКО С,С++ или на крайняк #C, "DELPHI - программирование для баб" - это не я сказал это сказал Никлаус Вирт (Niclaus Wirth). Кто не знает, известен как создатель языка Pascal. Мож ещё на FORTRAN'e набабахать? Где я тебе найду DDK под дельфи? (Тут на каком то стайте в форуме надыбал вопрос, - "Где найти дизассемблер чтоб сразу в код паскаля переводил программы?", ржал под столом... типа где найти? мне так проще в програмном коде разбираться.
SORRY за OFFTOP)
Самое чего забавно что этот девайс как раз точно такое же диалоговое окно показывает абсолютно
Оно универсально походу для аналоговых джойстиков
Так, к делу, штоб развеять весь бред по поводу...ну в общем щас понятно будет.
Почему же почему независимо от того в каком режиме находится джойстик мы видим X, Y, Z, Rz, 12 buttons, POV? А всё веселье в том, что любое HID устройство для USB, способно сообщать свои аппаратные возможности только один раз, при включении. Вот оно и сообщает сразу максимум, чтоб в последствии не "обосраться". На примере, (мне почемуто всегда казалось что живой пример значительно лучше чем долгая болтовня "на тему"):
В любом, в том числе и в моем устройстве, прежде чем сообщать состояние джойстика драйверу мы должны вначале определится со структурой информационного пакета определяющего состоянии джойстика. Это делает
REPORT_DESCRIPTOR, и высылается он по требованию от хоста
GET_REPORT_DESCRIPTOR, у меня он выглядит так:
.db 0x05, 0x01 ; USAGE_PAGE (Generic Desktop)
.db 0x09, 0x04 ; USAGE (Joystick)
.db 0xa1, 0x01 ; COLLECTION (Application)
.db 0xa1, 0x01 ; COLLECTION (Logical)
.db 0x85, 0x01 ; REPORT_ID (1)
.db 0x75, 0x01 ; REPORT_SIZE (1)
.db 0x15, 0x00 ; LOGICAL_MINIMUM (0)
.db 0x35, 0x00 ; PHYSICAL_MINIMUM (0)
.db 0x09, 0x01 ;USAGE (Pointer)
.db 0x95, 0x0C ;REPORT_COUNT (12)
.db 0x05, 0x09 ;USAGE_PAGE (Button)
.db 0x19, 0x01 ;USAGE_MINIMUM (Button 1)
.db 0x29, 0x0C ;USAGE_MAXIMUM (Button 12)
.db 0x81, 0x02 ;INPUT (Data,Var,Abs)
.db 0x95, 0x01 ;REPORT_COUNT (1)
.db 0x75, 0x04 ;REPORT_SIZE (4)
.db 0x25, 0x07 ;LOGICAL_MAXIMUM (7)
.db 0x46, 0x3b, 0x01;PHYSICAL_MAXIMUM (315)
.db 0x66, 0x14, 0x00;UNIT (Eng Rot:0x114)
.db 0x05, 0x01 ;USAGE_PAGE (Generic Desktop)
.db 0x09, 0x39 ;USAGE (Hat switch)
.db 0x81, 0x42 ;INPUT (Data,Var,Abs,Null)
.db 0x95, 0x04 ;REPORT_COUNT (4)
.db 0x75, 0x08 ;REPORT_SIZE (8)
.db 0x26, 0xff, 0x00 ;LOGICAL_MAXIMUM (255)
.db 0x46, 0xff, 0x00 ;PHYSICAL_MAXIMUM (255)
.db 0x09, 0x32 ;USAGE (Z)
.db 0x09, 0x35 ;USAGE (Rz)
.db 0x09, 0x30 ;USAGE (X)
.db 0x09, 0x31 ;USAGE (Y)
.db 0x81, 0x02 ;INPUT (Data,Var,Abs)
.db 0xc0 ;END_COLLECTION
.db 0xc0 ;END_COLLECTIONА если коротко, то так:
Если первый байт = 1 (нужно для того чтобы рулить несколькоми подключенными джоями, или если в один репрт не влазит), то это состояние джойстика для данного репорта,
следующие 12 бит состояние кнопок,
затем 4 бита состояние HAT(POV),
затем 1 байт - Z
затем 1 байт - Rz
затем 1 байт - X
затем 1 байт - Y
Исходя из репорта, состояние "ничё не нажато" будет выглядеть так:
0-----1-----2----3----4----5
0х01 0х00 0х80 0х80 0х80 0х80Ну и к чему я всё это, а к тому, что репорт мы сообщаем 1 раз, а переключить джойстик можно из аналогового в цифровой или наоботот режим и после сообщения репорта, вот поэтому и при инициализации высылается "максимальный " репорт, а потом устройиство само в зависимости отрежима работы джоя крнфигурит информативный пакет. То есть у меня например в цифровом режиме 2-ой и 3-ий байт всегда 0х80, а направления Х и У могут быть только 0,0х80,0хFF и складываются в 4-ый и 5-ый байты, а в аналоговом я направления засовываю в HAT (POV). А левый стик в 4-ый и 5-ый байты информативного пакета. Можно конечно и репорт менять в зависимости от того в каком режиме джой, тока постоянно придется перевтыкать USB, то бишь лазить под стол, или постоянно выбырать конфигурацию... помоему так полная жопа.
Короче, намудрил я чё-то, но надеюсь понятно...