〔パート1〕 〔パート2〕 〔パート3〕 〔パート4〕 〔パート5〕 〔マイコンのトップに戻る〕
unsigned char hid_report_in[3] ; hid_report_in[0] = 0 ; // bite[0][0][0][0][0][Button3][Button2(右)][Button1(左)] hid_report_in[1] = 0 ; // X-Vector -127〜127 X軸(左→右へ移動すると報告値は正で逆は負) hid_report_in[2] = 0 ; // Y-Vector -127〜127 Y軸(上→下へ移動すると報告値は正で逆は負) // データの送信(3バイト) lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 3);X軸/Y軸のデータは、前回の送信したデータからの変化分を報告します。
[レポートディスクリプタ]
下記の様に記述すればX軸/Y軸の移動量を12ビットで行う事も出来ます。
0x05, 0x01, /* Usage Page (Generic Desktop) */ 0x09, 0x30, /* Usage (X) */ 0x09, 0x31, /* Usage (Y) */ 0x16, 0x01, 0xF8, /* Logical Minimum (-2047) */ 0x26, 0xFF, 0x07, /* Logical Maximum (2047) */ 0x75, 0x0C, /* Report Size (12) */ 0x95, 0x02, /* Report Count (2) */ 0x81, 0x06, /* Input (Data, Variable, Relative) */また、ホイールを使用する場合は、
0x05, 0x01, /* Usage Page (Generic Desktop) */ 0x09, 0x30, /* Usage (X) */ 0x09, 0x31, /* Usage (Y) */ 0x09, 0x38, /* Usage (Wheel) */ 0x15, 0x81, /* Logical Minimum (-127) */ 0x25, 0x7F, /* Logical Maximum (127) */ 0x75, 0x08, /* Report Size (8) */ 0x95, 0x03, /* Report Count (3) */ 0x81, 0x06, /* Input (Data, Variable, Relative) */ と記述を変更して hid_report_in[3] = 0 ; // Wheel -127〜127 ホイール(遠→近へ移動すると報告値は負で逆は正) 4バイトデータにしてホストに送信すればOKと思います。
typedef union _INTPUT_CONTROLS_TYPEDEF { struct { struct { BYTE square:1; // Button1(1 bit 0 or 1) BYTE x:1; BYTE o:1; BYTE triangle:1; BYTE L1:1; BYTE R1:1; BYTE L2:1; BYTE R2:1; BYTE select:1; BYTE start:1; BYTE left_stick:1; BYTE right_stick:1; BYTE home:1; // Button13 BYTE :3; // 予備 } buttons ; // ボタンの構造体(2 Byte) struct { BYTE hat_switch:4; // (7-315) BYTE :4; // 予備 } hat_switch; // ハットスイッチの構造体(1 Byte) struct { BYTE X; // X方向の線形変換(0-255:左→右へ移動すると報告値が増加する) BYTE Y; // Y方向の線形変換(0-255:遠→近へ移動すると報告値が増加する) BYTE Z; // Z方向の線形変換(0-255:高→低へ移動すると報告値が増加する) BYTE Rz; // Z軸周りの回転を制御する(0-255) } analog_stick; // スティックの構造体(4 Byte) } members; BYTE val[7]; } INPUT_CONTROLS joystick_input ; // ボタンデータ(ON=1 OFF=0) joystick_input.members.buttons.square = 0; joystick_input.members.buttons.x = 0; joystick_input.members.buttons.o = 0; joystick_input.members.buttons.triangle = 0; joystick_input.members.buttons.L1 = 0; joystick_input.members.buttons.R1 = 0; joystick_input.members.buttons.L2 = 0; joystick_input.members.buttons.R2 = 0; joystick_input.members.buttons.select = 0; joystick_input.members.buttons.start = 0; joystick_input.members.buttons.left_stick = 0; joystick_input.members.buttons.right_stick = 0; joystick_input.members.buttons.home = 0; // ハットスイッチ(0:北 1:北東 2:東 3:南東 4:南 5:南西 6:西 7:北西 8:デフォルト) joystick_input.members.hat_switch.hat_switch = 0x2 ; // 東 // スティックデータ(0-255で0x80が真ん中のデフォルト) joystick_input.members.analog_stick.X = 0; joystick_input.members.analog_stick.Y = 0; // データの送信(7バイト) lastTransmission = HIDTxPacket(HID_EP, (BYTE*)&joystick_input, sizeof(joystick_input));
このディスクリプタにはEP1 OUTのエンドポイントが作成されているが、"Device - HID - Joystick"では
使用されていない、ジョイスティックでホストから報告を受ける場合って....ん、思い浮かばない。
尚、フォースフィードバック機能はHIDクラスではなく[Physical Interface Device (PID)]クラスの
ジョイスティックの様で有る。
"v2016-11-07"用記事とリンク切れ見直し(*1) 2017/01/22
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.