Windows 7 Sensor APIのCOM Wrapper

このポスト、書いて公開するのをすっかり忘れていることに、今気がつきました。既にNESLが出てしまったので、このままお蔵入りさせようかとも思ったのですが、考えてみたらガジェットでセンサーAPI使う時、これの類がないと駄目じゃん。ってことで、3ヶ月遅れぐらいで公開です。以下、当時のままポストします。 お疲れ様です。 結構前からTwitterでつぶやいたり、PDC TokyoやTech Fieldersセミナーのネタでちら見せしてきましたが、COM Wrapper作ってCodePlexに登録してあります。これ使うと、Windows 7 Sensor & Location Platformのセンサーのほうの機能が、SilverlightのOOBで使えたり、デスクトップガジェットで利用できたりするんですね。 http://sensor7dotnet.codeplex.com まぁ、久々のNative系プログラミングだったので、結構しんどかったですが、もしよければ開発に参加してくださいまっせ。 で、使い方ですが、ビルドして出来上がったやつ、SensorCOMW.exe、を引数 /RegServer 付けてコマンドラインでまずは実行してください。これで、このWrapperがレジストリに登録されますんで。そして、Silverlightのアプリケーション作って、以下のような感じで使う訳っす。 using System.Runtime.InteropServices.Automation;…    if (Application.Current.IsRunningOutOfBrowser){ // OOBで実行していることを確認        // センサーCOM Wrapperを取り出す。取り出したオブジェクトはSensorManagerに相当        dynamic sensorcom = AutomationFactory.CreateObject(“Sensr7COMW.DispSensorManager”);        dynamic sensors = sensorcom.GetAllSensors(); // すべてのセンサーを取得        dynamic aSensor = sensors.GetAt(0); // センサーの取出し        // TypeIdを指定して特定の種別のセンサーを取り出す。        dynamic lightSensor = sensorcom.GetSensorsByTypeId(“{97F115C8-599A-…”});  後は、コードを見てお試しください。 …てな感じで。ガジェットで使う方法は、また別途ポストしますね。

0

.NET Framework 4.0のCode Contractsを組込み開発で活用する

今、ある講演向けに、再度、Visual Studio 2010、.NET Framework 4.0の新機能をじっくり見てます。昔私はオブジェクト指向とかモデル駆動型開発とか、CMMとかで組込みソフトウェア開発プロセス改善をやっていたこともあり、ソフトウェアの品質や生産性が上がりそうなトピックスを見ると、直ぐに体が反応してしまいます。 次のポストは、UMLから組込み機器向けのC/C++コードを生成する方法を紹介しようと思っていたのですが、Code Contractに惹きつけられてしまったので、そちらを紹介します。 昔々、Bertrand Meyerさんが、“Design By Contract”(以下DBCと略します)という概念を提唱しました。(所謂、「契約による設計」ってやつですな) DBCを簡単に紹介すると、コードを利用する側に対して、このコードを利用する場合、 事前条件(Pre Condition):こういう条件が整っている時に、このコードは正しく動きますよ。 事後条件(Post Condition):このコードが正しく動いたら、こういう条件になりますよ。 不変条件(Invariant):このコードが動いてもこの条件は変化しないよ。 という表明であり、逆にコードを実装する側にとっては、この3種類の条件を満たすよう実装しなければならない、というプラクティスです。こうすることによって、コードの仕様が明確になる、実装側と利用側のコミュニケーションが良くなる、バグが減って品質が上がり、生産性が上がる、というメリットを得ることができます。よく見かける(見かけないか普通?)、C++やJavaのassertを使って、実装のデバッグの利便性を高めているのは、道具は使っているけれど、DBCではないのでご注意。 そしてDBCを.NET上で積極的に活用できるように、.NET Framework 4.0に、Code Contractsという機能が追加されました。 ちょっと紹介すると、 using System;using System.Diagnostics.Contracts; class CFoo {    ….    [ContractInvariantMethod]    // Invariantを使う場合に必要    public int MethodFoo(int x)    {        Contract.Requires(x!=0&&this.Something>0); // 事前条件。引数は非ゼロ、Somethingプロパティは正        Contract.Ensures(Contract.Result<int>()!=0);// 事後条件。戻り値は、非ゼロ        Contract.Invariant(this.Something!=0);      // Somethingプロパティは非ゼロ        ….    } こんな感じになります。詳細は、http://msdn.microsoft.com/ja-jp/library/dd264808.aspxをご覧いただくとして、Code Contractsを記述すると、以下の3つのケースで、品質を上げるのに寄与することになります。 動的テスト時 静的テスト時 ドキュメンテーション これ、TDDのPracticeを廻すのに凄く便利だと思うのですが、残念ながら、Managedコードでしか使えないんですね。 で、これでこのポストを終わらせてしまうと、タイトルに対して嘘をついたことになってしまうので、これから組込みの濃い世界に踏み込んでいきます。私が思うに、Desktop向けやWeb向けのソフトウェアは、開発環境や実行環境がリッチなので、障害解析は比較的楽なのに対して、組込み機器向けソフトウェアは実行環境が何よりプアなので、DBCの様な仕組みがあれば非常に助かると思うんですよね。 さて、組込み機器開発の場合、Windows目線で分類すると、以下のケースが考えられます。 Windows Embedded…

1

Visual Studio 2010 Launch Event – Visual Studio Ready Day

本日、東京ミッドタウンで、Visual Studio Ready Dayが開催され、Visual Studio 2010のLaunchが発表されました。午前中のキーノートで、Native Code開発のデモを担当させていただきました。 ご参加いただいていない皆様(残念ながらストリーミングはなかったですね)向けに、披露した技を紹介すると、VC++ Native Code開発向けに、 Navigate Toメニューの紹介Native Codeのクラスメソッド(宣言・定義とも)を楽々見つけられるサーチ機能。メニューのEditの下です。 アニメーションコードの追加 MFCアプリへのRibbon Interfaceの追加方法プロジェクトを右クリック→Add選択→Resource選択で、ダイアログでRibbon Barを選択 MFC Class Wizardの復活Ctrl+Shift+x でダイアログ表示です!! MFC Class Wizardによる、MFCクラスへのメンバー変数追加、及び、Message Handlerの追加 Multi-touchによるFrickとZoom機能追加 ソースファイルからヘッダーファイルへの移動あ、これはVS2008にもありますね。 をデモしました。特に、MFC Class Wizardは、昔々、私もWindows NTをベースにした組込み機器を開発しているときにお世話になり、便利なものだなぁと思っていて、その後MFCアプリを作る機会がとんとなく、最近はWPF/Managedな日々だったので、てっきり2008にもあるのかなと勝手に思い込んでいたのですが、実はなかったんですね。MFC Class Wizardがなくて、Visual Studioの.NET以降版に乗り換えをためらった皆さんも多数いらっしゃるとのこと。もう一度書きますね。 MFC Class Wizard復活しました!! また、これまでRibbon IFをMFCに追加したいんだけど、面倒くさくてやらなかった皆さん、お待たせしました。ぜひ、この機能を使ってRibbon UIをMFCに入れてください。Ribbon IF以前のメニューバーに慣れた方からはよく、リボン使いにく~いと憎々しげに言われたりするのですが、慣れてしまうと二度と昔には戻れません。最近は、リボン、良いんじゃないという方も増えていますね。 NativeコードでのAnimationや、Multi-touchについて、別のエバが書いていないようでしたら、後日機会があれば、このブログでも説明してみようと思います。 最後に、MFC Photoviewerアプリが表示する写真の中に、私がTechdays2010でキーノートでデモした時のサラサラヘアー+ドライヤーのデモを記念して、ドライヤーの写真を紛れ込ませておきました。参加されたみなさん、気がつきました?(ストリーミングがあればなぁ)

0

Windows 7 Sensor & Locationを使ってみよう Series !!

今までブログにポストしてきた関連項目の目次です。 Windows Mobile 7 Seriesの発表にあやかり、最後にSeriesをつけてみました。(でへ) では早速過去のポストへのリンクを、まとめて一挙公開です。 「Windows 7 Sensor & Locationを使ってみよう!!」シリーズ http://blogs.msdn.com/hirosho/archive/2009/11/22/windows-7-sensor-location-platform-1.aspx先ずは準備を兼ねて肩慣らしの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/11/26/windows-7-sensor-location-platform-2.aspxManaged Code(Windows API CodepackのSensor)で、センサーを取り出すの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/11/28/windows-7-sensor-location-platform-3.aspxManaged Code(Windows API CodepackのSensor)で、センサーからデータを取り出すの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/11/29/windows-7-sensor-location-platform-4.aspx.NET 4のSystem.Device.Locationでロケーションをいぢるの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/12/08/windows-7-sensor-location-platform-5.aspxNative CodeでSensor COM APIごりごり開発、VC++ Native Codeが書けるなんてかっこ良~いの巻ぃ http://blogs.msdn.com/hirosho/archive/2009/12/22/windows-7-sensor-location-platform-6.aspx.NET 4 WPF Chartを使って、取り出したデータを見える化だぁ、の巻ぃ http://blogs.msdn.com/hirosho/archive/2010/02/05/windows-7-api-codepack.aspxサイドスト~リー(番外編):Windows API Codepackに新たな秘密兵器を装着しようぜっ、の巻ぃ http://blogs.msdn.com/hirosho/archive/2010/03/10/neurosky-mindset-windows-7-sensor-api.aspxサイドスト~リー(番外編):Mindsetで頭の中を覗いてみようっ、の巻ぃ 新しくネタが出たら、順次追加の予定なので、偶にチェックしてねっ!!

0

Windows 7 Sensor & Location Platformを使ってみよう – その5

さて、5回目、さっそくいってみようっ 4回目までは、本質が見えにくくならないよう、Managedコードでの使い方を紹介してきました。(Sensor & Location Platformの概念や使い方はわかっていただけましたか?)しかし、やはり場合によっては、COMを使った、Nativeコード開発も必要です。ざっとVC++(Native)でプログラムを組む場合のコードを、まずは、紹介してしまいます。 センサーリストの取得: // SensorMangaerのCOMインターフェイス取り出しCComPtr<ISensorManager> pSensorManager; HRESULT hr = CoCreateInstance(  __uuidof(SensorManager),NULL,CLSCTX_INPROC_SERVER,  __uuidof(ISensorManager),(LPVOID*)&pSensorManager);// SensorCollectionインターフェイスの作成CComPtr<ISensorCollection> pSensorCollection;hr = pSensorCollection.CoCreateInstance(CLSID_SensorCollection);// センサーリスト(照度センサー)を取得hr = this->m_pSensorManager->GetSensorsByType(SENSOR_TYPE_AMBIENT_LIGHT, &pSensorCollection); まずは、こんな感じです。もちろん実際には、HRESULT型の戻り値はちゃんとチェックして(!SUCCEEDED(hr)って感じ)エラーの場合には処理が必要です。また、”Sensors.h”の#includeも必要になります。Managedのときと違って、長ったらしいですね。全てのコードを見せていくのは煩雑なので、以後、Windows API Code Packで使っているCOM Interopの紹介を通じて、読者の皆さんに使い方のあたりをつけてもらいます。 Code PackのSensorsプロジェクトのObjectModelフォルダーにある、SensorManager.csを見てください。この中で、SensorManagerクラスが定義されていて、GetAllSensorsやGetSensorsByCategory等のメソッドは、内部で、nativeISensorManagerというインスタンスを使っているのがわかります。このnativeISensorManagerをC#テキストエディタ上で選択し、右クリック→”定義へ移動”を選択すると、InteropフォルダーのISensorManager.csが開き、nativeISensorManagerに表示が変わります。そこには、 using System.Runtime.InteropService;…[ComImport, InterfaceType( ComInterfaceType.InterfaceIsIUnknown ), Guid( “BD77DB67-45A8-42DC-8D00-6DCF15F8377A” )]internal interface nativeISensorManager{….   [PreserveSig]    HRESULT GetSensorsByCategory(        [In, MarshalAs( UnmanagedType.LPStruct )] REFSENSOR_CATEGORY_ID sensorCategory,        [Out, MarshalAs( UnmanagedType.Interface )] out ISensorCollection ppSensorsFound ); という、定義がなされています。インターフェイスに付与されたComImportやPreserveSig、In,…

0