C# Advent Calendar jp: 2010用の記事を書かなきゃいけないということで、12/06分の記事として書いておく。
12/25まで参加者だけに楽しい思いをさせるのはやめていただきたいな、出来れば皆さんも後に続いてくれればと思う。
Windows7 になって Sensor Platform API というものがあり、C++ から簡単に呼び出せるようになっているが、最近話題のスレートPC にも3軸加速度センサーと照度センサーが付属しているものがある。
一部の方にはなんてタイムリーなと思っていただける話題であるが、私としては実にがっかりした結果だった。
たとえば、照度センサーの場合以下のようにする。
参照設定に「Microsoft.WindowsAPICodePack」「Microsoft.WindowsAPICodePack.Sensors」「Microsoft.WindowsAPICodePack.Shell」を追加しておく。
using Microsoft.WindowsAPICodePack.Sensors;
// 初期時にパーミッションが必要
SensorList<Sensor> sl = SensorManager.GetAllSensors();
SensorManager.RequestPermission( this.Handle, true, sl );
// AmbientLightSensor の一覧を作る
SensorList<AmbientLightSensor> alsList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>( );
foreach( AmbientLightSensor sensor in alsList )
{
// 照度データを取得するならこれだけ
sensor.TryUpdateData( );
float current = sensor.CurrentLuminousIntensity.Intensity;
// 適当に表示するとか
// イベントが必要ならイベントを登録する
sensor.AutoUpdateDataReport = true;
sensor.DataReportChanged += new DataReportChangedEventHandler( DataReportChanged );
}
// イベント
void DataReportChanged( Sensor sender, EventArgs e )
{
AmbientLightSensor als = sender as AmbientLightSensor;
// 別スレッドからイベントが来るのでInvoke
BeginInvoke( new MethodInvoker( delegate {
float current = als.CurrentLuminousIntensity.Intensity;
} ) );
}
今回は ONKYO さんの TW217A5 を使用した。
照度センサーはデバイスドライバーにも登録されていてコントロールパネルにもセンサーの項目に出ているのできちんと取れる。
ただし、3軸加速度センサーのデータはとれない。
// Accelerometer3D の一覧を作る
SensorList<Accelerometer3D> acList = SensorManager.GetSensorsByTypeId<Accelerometer3D>( );
このリストの数が0になるのだ。
3軸加速度センサーはついていてWindowsの縦横切り替えに利用されているのだが、デバイスドライバーにも登録されていないしコントロールパネルのセンサーの項目に出てこない。
大変残念な結果になってしまった。