.NET Micro Frameworkのカスタムエミュレータの作り方

ニッチなネタですみません。備忘録的に書いておきます。

組込み機器は千差万別。製品が違えば必ずどこかしらHWは違うもの。ついているセンサーやアクチュエーター、UI全部違います。C#で書いてPC上でエミュレートできるのも、.NET Micro Frameworkのメリットの一つ。で、カスタムなハードウェアを作って.NET Micro Frameworkを移植すると、カスタムなエミュレーターが必要になります。複雑なアルゴリズムやネットワーク通信系は、エミュレーター上で動作確認しておけば、実ハードウェアで動かない場合は、ハードウェアのせいか、実ハードウェアの動作に起因するタイミングのせいか、とにかくソフトとハードの問題の切り分けができるからね。

で、カスタムエミュレーターが欲しいケースは、

  • デフォルトのエミュレーターには装備されていないセンサーやアクチュエーターをエミュレートしたい
  • デフォルトのエミュレーターとは違うUI(表示やキーなど)を使いたい
  • デフォルトのエミュレーターのRuntimeライブラリを弄りたい

あたりです。エミュレーターは、Windows上に.NET Micro Frameworkを移植したものなんですね。だから、この作業は、各自のハードウェアに.NET Micro Frameworkを移植するのと基本同じ作業になります。ただ、Windows上で動くので、Visual Studioでビルドできてランタイムもデフォルトのエミュレーターとして公開されているモノをほぼそのまま使えるので、他の諸々のハードウェアに移植するよりは楽。

Runtimeをカスタマイズする、やり方は、https://netmf.codeplex.com の”Documentation”タブの”HowTo Manual to Build a Custom Version of the Runtime for a Device Emulator"に結構詳しく書いてあり、基本これに従ってやっていけばOK。ただ、ちょっと説明が足りなかったりするので、ここで補足しておきます。

あ、この作業やるには、Codeplexのサイトの”DOWNLOADS”タブをクリックして表示されたページの右上の.NETMF 4.3 RTM(QFE1)という項目をクリックして、表示された”PORTING KIT 4.3(QFE1)”をクリックしてZIPファイルをダウンロードし、中に入っているMSIファイルをたたいてポーティングキットのインストールが必要。Runtimeには2種類あって、C++で実装された部分(Porting KitをインストールしてできるディレクトリのSolutionsの下)と、C#で実装された部分(Framework/Tools/Emulatorの下)があり、それぞれ()でくくったところに書いてある場所にあり、それらを自分の好みに修正すればよろし。

Porting Kitをインストールすると√ディレクトリに、”MicroFramework_V4_3というディレクトリが出来ます。前者のC++で実装されている部分のビルドは、マニュアルに書かれてある通りにやって、msbuild.exeを実行する前に、コマンドプロンプトを一個開いて、このディレクトリに移動して、

C:¥MicroFrameworkPK_v4_3> setenv_vs.cmd

と入力し、環境設定用のバッチファイルを実行しておきます。これやらないと全然ビルドできないので、やるように。ハードウェアをエミュレートするドライバなど追加してC++の部分はマニュアルに書かれている通りにビルドすればOK。で、C#で実装されている部分は、このバッチを実行した状態で、”Framework/Tools/Emulator"に移動して、

C:¥MicroFrameworkPK_v4_3¥Framework¥Tools¥Emulator>build /t:Build /p:Flavor=Debug

でビルド開始。終わったらDebugの部分をReleaseに変えて再度実行すれば、デバッグ用、リリース用両方ができあがる。出来上がったDLLは、C:¥MicroFrameworkPK_v4_3¥BuildOutput¥public¥[Release|Debug]¥Server¥dll に、C++のが、Microsoft.SPOT.Emulator.Interface.dll、C#のが、Microsoft.SPOT.Emulator.dllという名前で出来上がっています。

これが出来たら、Visual StudioのC#のプロジェクトテンプレートの”MicroFramework”カテゴリにある、”Device Emulator”を使ってエミュレータ用のプロジェクトを作る。この作り方は、https://msdn.microsoft.com/en-us/library/hh399820.aspx に書いてある。基本これに従って作業を進める。

カスタムのRuntimeを作った場合は、プロジェクトの参照の”Microsoft.SPOT.Emulator.dll”と”Microsoft.SPOT.Emulator.Interface.dll”を作成したものと置き換えてね。

が、しかし、…なんとWinFormなんですね、今時。

やっぱりWPFでやりたいよね今時…ということで、

先ず、参照設定に、PresentationCore、PresentationFramework、System.Xaml、WindowsBase、WindowsFormsIntegrationというアセンブリを追加する。

そして、エミュレータープロジェクトに、”ユーザーコントロール(WPF)”項目を追加する。名前は…そうだな…”EmulatorPad”としておこうか。するとUI用のXAMLファイルが出来上がるので、ちゃららら~んと、データバインディングとか駆使してUIを作る。

デフォルトで出来上がっている”MainForm.cs”を開いて、MainForm_Load(object sender, EventArgs e)メソッドに、

            wpfPageHost = new System.Windows.Forms.Integration.ElementHost();
            wpfPageHost.Dock = DockStyle.Fill;
            var wpfPage = new EmulatorPad();

            wpfPageHost.Child = wpfPage;

            this.Controls.Add(wpfPageHost);

 って記述を加えると、追加したWPFのユーザーコントロールがめでたく表示される。

I2CやGPIOなどのハードウェアの追加方法は、MSDNのドキュメントに記載されているので、そちらを参考にしてやってほしい。弄るファイルは、Emulator.configや、Program.csファイルのSetupComponent()メソッドあたり。

Visual StudioでEmulatorプロジェクトを作ると、自動的にその開発PCにそのEmulatorが登録されるので、NETMFプロジェクトを作れば、プロジェクトのプロパティの.NET Micro Frameworkタブで、作ったEmulatorを選択可能。

みんなにそれをばらまきたい場合は、VSIX等作るのがベスト。組込みの基本は、C:\Program Files (x86)に適当なフォルダーを作って(※32Bit OSの場合はProgram Files)、Emulatorプロジェクトをビルドして出来上がったEXEやDLL等一式をコピーして、以下のレジストリーにEmulatorのありかを登録する。

HKLM\Software[\Wow6432Node]\Microsoft\.NETMicroFramework\v4.3\Emulators\[Your_Emulator_Name]

登録する情報は、

Name -> 表示名

Path -> Exeファイルのフルパス名

これでVisual Studioから選択可能になる。

 

…まぁね….NET Micro Frameworkのカスタムエミュレータ作らなきゃいけない人なんて、日本に数人しかいないはずなので、見る人少ないかもしれないけど、とりあえずアップしておく