YUREXの“揺れ”を感知する
最初に、YUREX用のセンサークラスを作る必要があります。Sensorクラスから継承したYurexSensorクラスを作っておきましょう。
ここまでのコードは以下のような感じです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack.Sensors;
namespace YurexSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
まずは、YurexSensorクラスの定義。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
public class YurexSensor : Sensor
{
}
}
次に、このYUREXSensorが実際にどのセンサーに対応するのか、指定してあげる必要があります。クラス定義の前にSensorDescriptionを定義してあげるだけでOKです。
[SensorDescription("545C8BA5-B143-4545-868F-CA7FD986B4F6")]
public class YurexSensor : Sensor
{
}
ここで定義したGUIDは前回ドライバーを作成した時に、「sensor2.h」に記述されていたものです。
DEFINE_GUID(SENSOR_TYPE_BOOLEAN_SWITCH_ARRAY, 0x545c8ba5, 0xb143, 0x4545, 0x86, 0x8f, 0xca, 0x7f, 0xd9, 0x86, 0xb4, 0xf6);
今回はデモンストレーションなのでそのまま使ってしまいましたが、自分のセンサータイプを定義する場合は、新たにGUIDを指定します。
とりあえず揺すられたタイミングだけ取得できればいいので、イベントを作成します。前回、デバイスドライバでデータレポートを送信していましたが、Sensorクラスはデータレポートを受け取って、DataReportChangedというイベントを発生させます。ですので、ここでレポートの内容を見て処理を振り分けることができます。前回作ったドライバーでは1種類しかレポートを送らないので、発生したイベントはすべて揺すられたタイミングだと判断できます。
public class YurexSensor : Sensor
{
public new event EventHandler StateChanged;
public YurexSensor()
{
// SensorクラスのDataReportChangedイベントでYurexSensor_DataReportChangedを実行する
DataReportChanged += YurexSensor_DataReportChanged;
}
void YurexSensor_DataReportChanged(Sensor sender, EventArgs e)
{
// StateChangedイベントを実行する
if (StateChanged != null) StateChanged.Invoke(sender, e);
}
}
ここまではいいですか? YurexSensor_DataReportChangedはDataReportChangedをそのまま投げているだけなので意味はないのですが、後々拡張するときのために記述しておきます。
動かすためにはForm1のコンストラクタでセンサーを列挙して、イベントハンドラを追加します。SensorManager.GetSensorsByTypeIdというメソッドを使うと、特定のIDを持ったセンサーのみを列挙できます。
public Form1()
{
InitializeComponent();
foreach (YurexSensor s in SensorManager.GetSensorsByTypeId<YurexSensor>())
{
s.DataReportChanged += new DataReportChangedEventHandler(s_DataReportChanged);
}
}
void s_DataReportChanged(Sensor sender, EventArgs e)
{
Console.WriteLine("YURE!");
}
揺すられたタイミングでコンソールに「YURE!」と出力するだけの簡単なアプリケーションです。ここまで書けたら、メニューのデバッグ(Debug)から、デバッグ開始(Start Debugging)を選択して実行してください。結果は出力パネルに表示されるので、出力パネルが表示されていない場合はメニューの表示(View)から出力(Output)を選択してください。あ、コントロールパネルの「位置センサーとその他のセンサー」でYUREXを有効にしておくのもお忘れなく。
Visual Studioの出力パネルに「YURE!」と表示されましたね。ちゃんと揺すったことを認識しているのが分かりました。
ここまでで、ひとまずYUREXの揺れを検知するプログラムの完成です! あとはお好みで拡張していくだけです。こうやって簡単にプログラムを書くだけでも、結構遊べることが増えそうですね。何より、現実の動きとPCを連動させられるってだけで相当楽しいです。ちなみに、Wiiリモコンのセンサードライバなんてのもあるみたいですよ。
Writing a Sensor Driver for the Wiimote on Windows 7 - CodeProject
http://www.codeproject.com/KB/system/wiisensor.aspx
センサーにできるのはUSBに限らないので、もしかしたらゲーム機の周辺機器をことごとくセンサーにできるかも……?
次回はさらに上位層に行って、YUREXとSilverlightで遊ぶ方法を紹介します!
■Amazon.co.jpで購入
YUREX面白法人 カヤック