2016年6月10日金曜日

FSXのメーターパネル




とりあえず、練習も兼ねてスロットルとかフラップとかの位置を表示するアプリを作ってみました。まぁあんまり意味は無いですが。

元がC++向けのためか、Managedの方もかなり冗長になっています。結構ソースコード書くのが面倒で、かと言ってコピペするとthrow投げられたりしてデバッグに一苦労とか、結局全部手打ちしたほうが確実というおかしなことに(オートコンプリートがあるので特に)。

FSXのSim Variablesを見るとSettable trueはあまり多くなく、基本的な操作しか行えないようです。ただしエンジン周りは例外で、エンジン/燃料系はかなり細やかな設定ができるようです。たぶん航空機関士席を作ることも可能でしょう。まぁFSX付属の機体にFEが必要な機体って無いと思うんですが。。。

スポイラーARMDにしたければ、スポイラーを30%くらいにするとARMDになるので、スポイラーの操作は可能です。スロットルも前述のように作ることが可能です。スラストリバースはスラストを-25%あたりにすると可能で、これはハードウェア側ではVRを2個使って1セットのスラスト操作を行い、PC側、あるいはマイコン側で-25%から100%の範囲を動くようにすれば可能だと思います。スラストが0%以外の場所ではリバースに入らないようにするのが面倒ですが、これも機械可動部で作ったり、ソレノイドでロックしたり、いろいろやりようは有ると思います。1つ問題なのはフラップの扱いです。MSDNによるとFlaps handle percentのSettableはNoになっており、ハンドル位置を指定することができません。TRAILING EDGE/LEADING EDGEのPercent/AngleはSettable Yesですが、Handle Posに対するLead/Trailのミキシングは各機により異なるため、クライアント側で処理するのは結構面倒な気がします。予めHandleとPercentのテーブルを作っておけばなんとかなるかもしれませんが、どちらにしろ面倒です。

当初の目的は3軸の加速度を取り出すことでしたが、ここまで来るといろいろ操作できるようにしたくなってきました。オートパイロットのノブとか市販品があるけど、あれってどうやってるんだろう。SimConnect以外のSDKを使うとできるのかな?


追記:2016/06/15
存在しないパラメータを読んだ時の挙動について。
スポイラーがついてない機体でスポイラーを読むと-2147483648が読み出される。uint_32とすると0x80000000になる。SIMCONNECT_DATATYPE.FLOAT64を指定しているがこの値が来ている。float32だとこの精度はないはずなので別の値が来るのかもしれないが、自分の環境では64bitを使ってるので不明。必要なら各自の環境で確認すること。

追記:2016/08/02
オートパイロット等の操作を行う方法について。
MapClientEventToSimEventでイベントを追加し、TransmitClientEventによってイベントを送信することができる。イベントを追加する際はイベント名の文字列を渡すが、例えばAP_ALT_VAR_INCを送信した場合はオートパイロットの高度をインクリメントすることができる。AUTOPILOT_ONを送信すればオートパイロットがONになるし、AUTOPILOT_OFFを送信すればオートパイロットをオフにすることができる。
オートパイロットパネルを作りたい場合、ON/OFFスイッチはモーメンタリスイッチでイベントを送信し、AP状態を獲得してLED等に表示すればいい。高度設定ノブなどを作りたい場合はロータリーエンコーダのInc/Decに応じてInc/Decイベントを送信し、現在の設定値を7セグLEDやLCDに表示すればいい、ということになるようだ。
ノブ等はInc/Decしかできないから、テンキーで数字を入力するといった事は難しいかもしれない。ただInc1個での変化値はイベント前後でわかるから、現在値と入力値の差からInc1個分で割った商の回数だけイベントを送る、といったことで可能かもしれない。

0 件のコメント:

コメントを投稿