スポンサーサイト

--.--.--.--.--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Windows8.1でJoystick(GamePad)の状態を取得する

2013.08.15.Thu.01:00
久しぶりに余裕ができたので、すごい広島に行ってきました。


さて、Windows8.1からストアアプリでHIDがサポートされるようになりました。
http://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#one

これにより、ゲームパッドやジョイスティックはもちろん、HIDで通信するカスタムデバイスとのデータのやり取りも可能になりました。
ただし、HIDのうち下記のようなマウスやキーボードなどシステムが使用するものについては、APIでブロックされ使用できないため、注意が必要です。
http://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#limitations_of_the_hid_api

•HID_USAGE_PAGE_UNDEFINED
•HID_USAGE_PAGE_GENERIC
•HID_USAGE_GENERIC_KEYBOARD
•HID_USAGE_GENERIC_KEYPAD
•HID_USAGE_GENERIC_SYSTEM_CTL
•HID_USAGE_PAGE_KEYBOARD
•HID_USAGE_PAGE_CONSUMER
•HID_USAGE_PAGE_DIGITIZER
•HID_USAGE_PAGE_SENSOR
•HID_USAGE_PAGE_BARCODE_SCANNER
•HID_USAGE_PAGE_WEIGHING_DEVICE
•HID_USAGE_PAGE_MAGNETIC_STRIPE_READER
•HID_USAGE_PAGE_TELEPHONY

今回は、安価で入手しやすいゲームパッドでAPIについてチェックしてみたいと思います。
なお、使用したゲームパッドはこれです。
http://buffalo.jp/products/catalog/supply/input/gamepad/wire/bsgp1001/index.html

□ ManifestのCapabilitiesに、使用するデバイスについて記載する


HIDデバイスなど、外部機器をストアアプリから使用する場合、Capabilitiesにどのデバイスを使用するか明記する必要があります。
今回使用するゲームパッドは、HIDのデバイスのUsage Pageが0x01、Usage IDが0x04のJoystickになりますので、Capabilitiesには下記のように記載します









今回は、使用するデバイスのベンダーやデバイスIDなどは指定しないため、としています。

□ PCに接続されているJoystickを検索する


HidDevice.GetDeviceSelectorを使用して、セレクタ文字列を生成します。
http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.humaninterfacedevice.hiddevice.getdeviceselector.aspx

引数が(UsagePage, UsageId)のものと、(UsagePage, UsageId, VenderId, ProductID)のものがありますが、今回は前述の通り、メーカーは指定しないので引数2つのほうを使用します。

その後、セレクタ文字列を引数にDeviceInformation.FindAllAsyncを実行し、PCに接続されているJoystickを検索します。

ushort usagePage = 0x01;
ushort usageId = 0x04;

// セレクタ文字列を生成する
string selector = HidDevice.GetDeviceSelector(usagePage, usageId);

// セレクタ文字列を使ってデバイスを列挙する
var devices = await DeviceInformation.FindAllAsync(selector);


□ InputReport受信時のハンドラをセットする


使用したいJoystickが見つかったら、HidDevice.FromIdAsyncを使って、HidDeviceを取得します。
このままでは、Joystickの入力状態が取得できないため、Joystickからの情報を受信した時のイベントハンドラを登録します。


// ターゲットのHIDをオープンする
HidDevice device = await HidDevice.FromIdAsync(deviceInformation.Id, FileAccessMode.Read);

if (device == null)
{
return;
}

// InputReport受信時のハンドラを登録する
device.InputReportReceived += device_InputReportReceived;


□ InputReportからJoystickの状態を調べる


受信時はargs.Report.DataにJoystickの情報が格納されています。
下記コードでは、1バイトずつ読み取ってデバッグ用に文字列をTextBlockに表示しています。


async void device_InputReportReceived(HidDevice sender, HidInputReportReceivedEventArgs args)
{
var data = args.Report.Data;
var dataReader = DataReader.FromBuffer(data);

StringBuilder sb = new StringBuilder();
for (int index = 0; index < data.Length; index++)
{
sb.Append(dataReader.ReadByte().ToString() + ":");
}
//Debug.WriteLine("data = " + sb.ToString());
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(() =>
{
textBlockLog.Text = sb.ToString();
}));
}


なにも押していない状態で出力される値は下記の通りです。
0:128:128:0:0:0:0:0:0:

ボタン1を押下した状態では
0:128:128:1:0:0:0:0:0:

ボタン2を押下した状態では
0:128:128:2:0:0:0:0:0:

ボタン3を押下した状態では
0:128:128:4:0:0:0:0:0:

もうお分かりですね。
4バイト目は押下されたボタンのビットフラグが立った値のようです。

もちろん、ボタン1と2を両方押すと
0:128:128:3:0:0:0:0:0:
になりました

ちなみに、ボタン9を押下すると
0:128:128:0:1:0:0:0:0:
になり、5バイト目のビットフラグが変わりました。

このあたりの、何ボタンのコントローラか等の情報は何かで取得できる気はしているのですが、まだ調べていません。

2,3バイト目の128が気になりますが、これは十字キーの値になります。
左を押すと
0:0:128:0:0:0:0:0:0:

右を押すと
0:255:128:0:0:0:0:0:0:
でしたので、アナログジョイスティックのついたコントローラでは0~255まで連続的に変化するものと思われます。

こんな感じでJoystickの状態が取得できますので、ストアアプリをジョイスティックを使ったアプリを作る場合はこんな感じになると思います。
スポンサーサイト
コメント

管理者のみに表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。