.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のカスタムエミュレータ作らなきゃいけない人なんて、日本に数人しかいないはずなので、見る人少ないかもしれないけど、とりあえずアップしておく