〔パート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.