SideShowガジェット開発中〜


台風接近中だけど、SideSHowガジェットコンテストの締め切りも接近中じゃ!


VistaとVisualStudio2005を用意したところで力尽きていたのですが、夕方くらいからプログラムを始めましたよ。風の音をききながらのプログラミングもオツなものですね〜



● SideShowデバイスとかSideShowガジェットってなに? (おさらい)


 Windows Vistaから使えるようになった新機能です。
 「SideShowデバイス(サイドショーバイス)」ってのは、小型液晶といくつかのボタンを持った小さな装置で、普通はUSBでPCに接続します。
 「SideShowガジェット」は、その「SideShowデバイス」を制御するWindwos上のプログラムのこと。
 ガジェット側から文字やイメージをデバイスに転送すると、その内容がデバイスの液晶に表示されます。デバイス上のボタンが押されたらガジェット側でもわかります。
 この機能を応用していろいろプログラムを作ってみようというのが、今回のコンテストの趣旨です。主催のFreeScaleの製品「MXSDKV」を使って開発します。


 開発はC#.net frameworkを使うのが楽です。




● 開発環境の準備メモ (C#で開発)


基本的にFreeScaleのサイト(Sreescale Freak内)でダウンロードできるPDF読めばすべて書いてあります。
一応作用メモ


【開発環境のインストール】
Windows Vistaをインストールしよう (HOME BASICはダメ)
・SideShowデバイスをPCに接続、ドライバーをインストール(自動的にできてきたインストールのダイアログは閉じて、デバイスマネージャーから主導でドライバーを選択して入れる)(p.38-)
Visual Studio 2005をインストール(無償版のExpressでもOK)(p.24)
Microsoft Windows Software Development Kit for Windows Vista and NET Framework 3.0 Runtime Componentsをインストール (p.25)
.Windows SideShow NET Framework Components 1.0 (Beta)をインストール (p.30)


(SideShowデバイスの実機があれば、SideShowデバイスシミュレーターは不要)


【アプリの開発】
・アプリケーションID(GUID)をGuidGen.exeを使って生成する (p.49)
・生成した、アプリケーションIDやアプリ名をレジストリ(HKEY_CURRENT_USER\Software\Microsoft\SideShow\Gadget以下)に書き込む (p.50)
レジストリへの変更をコントロールパネルに反映させる (p.51)
Schtasks.exe /run /tn Microsoft\Windows\SideShow\GadgetManager
・コントロールパネルのSideShowで、さっき登録したアプリ名が一覧に載るのでチェックいれる
・Developer Studioで、C#のプロジェクトを作る(p.72)
・プロジェクトにSideShow関連の参照を追加(p.75)
・コード打つ(p.76)
・実行(p.78)




● とりあえず拡大鏡を作ってみた


習作をかねて拡大鏡を作ってみました。
マウスカーソル付近の画面イメージをSideShowガジェットに任意の拡大率(10%〜400%)で表示するというアプリです。
モニタが遠くて文字が見づらいときは、手元のSideShowガジェットでらくらく確認。
SideShow側のボタン操作で表示位置も移動できるよ。
というもの。
これは、いろいろ機能を追加いてコンテスト応募作の1つにしちゃおう。



大体3時間くらいでできました。
基本的にWindows上のアプリから、テキストやイメージをSideShowガジェットに送りつけるだけなので、サンプルをみながら作れば埋め込むのはすごく簡単。どっちかというと、初めてC#でプログラム組んだのでそっちのほうが手間取ったw
SideShowデバイス上のボタン入力はイベントとして取得できます。





さて、ひとつ作ってみていろいろわかってきました。

【レスポンス】
Windows側のアプリからデータを連続してデータを送ってどれくらいの周期で画面が書き変わるか調べてみました。


a) テキストを送る ・・・ 6.5FPS
b) あらかじめ転送済みの画像を切り替え表示 ・・・ 4.5FPS
c) 毎回画像(300x200)を転送して表示 ・・・ 2.5FPS


…計るまでもなく遅い〜
もっとも、そもそもの用途がそんなに頻繁に画面が更新されることを前提としてないからしかたないのですが・・・
せめて10FPSくらいは出るかな〜とおもってたけど、甘かったか。
Windows側でメインの処理&画像作成を全部やっちゃって、最後に画像をSideShowデバイスに送りつけることでアクションゲーム作ろうかと思ったけどこりゃ無理だねー。
最初、USB1.1のHUBを介して接続していましたが、USB2.0のポートに差し替えてみても結果はかわりませんでした。


SideShowデバイス上で動くプログラムを作ればかなりレスポンスのいいプログラム作れるとおもうけど、いまから.net Micro Frameworkいれて作るには時間無いよね。日本語の資料もないし。


あと、アプリが起動してからSideShowガジェットとの最初の通信をおこなうまで5秒くらいかかります。




【ボタン入力】
ボタン入力できるのは以下のもののみです。
・右 (Right)
・左 (Left)
・OK (Enter)
・バック (back)


実は、上(Up)、下(Down)は取れません。
はじめ、このボタン取れるように設定したら例外が発生するので悩みました。デバッガの例外ダイアログで原因を調べるを選んだら原因が表示された(これって、どうやってひっぱってきてるの?)。


上下左右の入力に使おうとおもっていたのにーーー
(上下は、SideShowデバイス上でのスクロールに使われているようです)



※ 使うボタンは、AddContentするあたり(ScfElement.contentのパラメーター)で設定しておかないとイベント発生しないから注意




【作ったアプリをVista以外で動かすと?】
SideSHowデバイスに対応していない、XPとかで動かすと起動時に.netのランタイムエラーが発生します。


System.IO.FileNotFoundException: ファイルまたはアセンブリ 'Microsoft.SideShow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
ファイル名 'Microsoft.SideShow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' です。
場所 loupe.frmLoupe.frmLoupe_Load(Object sender, EventArgs e)


ん?
これは例外キャッチしてるはずなんだけどなあ。
SideShow初期化のとこで、ちゃんと例外キャッチすれば動くかも。
→起動時にJITが例外だしているのでダメっぽい・・・。動的に参照する方法ないかなあ。






いま、こんな感じ。
いろいろ制約とかわかってきたので応募作のアイディア考えましょう。
あと1日あればいろいろ作れそうです。


今回のコンテストは応募どれくらいあるのかなあ。
最初50セット用意されてた開発キット(MXSDVK)がなくなって20個追加になったから、最大70人の応募者がいるはず。
でも、実際に応募するの何人だろ。MXSDVKで検索しても実際の応募者が書いてるページって、僕の日記しか見つからないんだけど・・・


SideShowの機能自体あんまり知られてないしね(Vista自体使ってる人まだ少ないかも)。僕は最近まで、SlideShowと間違って呼んでました(ぉ


とはいえ、ちっちゃな外部表示デバイスが使えるのはなかなか楽しいです。
.netで開発しているなら既存のアプリに、SideShowデバイスを利用する機能を追加するのは超簡単なので対応ソフトいっぱい増えるといいなあ。