入力デバイスプラグイン制作講座
概要
入力デバイスプラグインを作るにはMackoy.Bvets.IInputDevice を継承して、5つのメソッドと3つのイベントを実装する。
サンプルプログラム:
TsmcInterface.cs が、BveTs とやりとりを行う部分です。
その他は、TS マスコンの設定を行うためのものです。
TsmcInterface クラスは Mackoy.Bvets.IInputDevice インタフェースを継承し、実装する。
code:TsmcInterface.cs
// 7行目
public class TsmcInterface : Mackoy.Bvets.IInputDevice
IInputDevice の詳細は、サンプルプログラムに同封の Mackoy.IInputDevice.dll に宣言されている。
(ソリューションエクスプローラ > 参照 > Mackoy.IInputDevice)
https://gyazo.com/8428dc0374bd6d262b3957ad7f4c8847
IInputDevice インタフェースには、4つの https://gyazo.com/8700a6f6f2ee71708bbf6b098601242aメソッドと3つの https://gyazo.com/6468925fdf32025f1a9ba9e12bcbebc4イベントがある。
また、継承元の IDisposable インタフェースには、 https://gyazo.com/8700a6f6f2ee71708bbf6b098601242aDispose メソッドがある。
入力デバイスプラグインを作るには、これらを実装する。
以下、個別の解説。
Configure メソッド
ここでプラグインの設定画面を表示する。
BVEの設定画面でプラグインのプロパティを押したとき呼ばれる。
https://gyazo.com/f02dd932b66f45e19e9307d63f2269a0
Load メソッド
BVEがプラグインを読み込んだときに呼ばれる。
第1引数で設定フォルダへのパスを受け取り、Load メソッド内で使える。
通常は C:\Users\ユーザー名\Documents\BveTs\Settings である。
サンプルプログラムではここでCOMポートを開き、エラーがあれば表示する。
https://gyazo.com/9dbf4df61cacf004cafb9b5df0c3980c
SetAxisRanges メソッド
BVEがプラグインを読み込んだときと、シナリオを読み込むたびに呼ばれる。
Tick メソッド
毎フレーム呼ばれる。
ここに重すぎる処理を書くとBVEのfpsが下がることになる。
サンプルプログラムではここでシリアル入力バッファを読み取り、
内容に応じてイベントを起こしている。
KeyDown イベント
キーを押したイベントを起こしてBVE側に処理させる。
KeyUp イベント
キーを離したイベントを起こしてBVE側に処理させる。
LeverMoved イベント
ハンドルを操作したイベントを起こしてBVE側に処理させる。
code:TsmcInterface.cs
// 217行目
LeverMoved(this, new InputEventArgs(axis, notch));
イベントに渡すaxisとvalueについて
IInputDevice インタフェースの3つのイベントはいずれも第2引数に InputEventArgs クラスのインスタンスを受け取る。
InputEventArgs クラスのコンストラクタは第1引数にaxis, 第2引数にvalueを受け取る。
axisとvalueの組み合わせをBve5.6に渡して調べた。
axisが0以上ならLeverMovedイベント、axisが0未満ならKeyDown・KeyUpイベントで渡す。
table:InputEventArgsのコンストラクタの引数
axis value 効果
3 1, 2, 3... ワンハンドルマスコン 1, 2, 3...
3 0 ワンハンドルノッチオフ
3 -1, -2, -3... ワンハンドルブレーキ 1, 2, 3...
2 1, 2, 3... ツーハンドルブレーキ 1, 2, 3...
2 0 ツーハンドルブレーキオフ
1 1, 2, 3... ツーハンドルマスコン 1, 2, 3...
1 0 ツーハンドルマスコンオフ
1 -1, -2, -3... ツーハンドルマスコン逆回し 1, 2, 3...
0 1, 0, -1 レバーサ前進, 中立, 後進
-1 0, 1, 2, 3 電笛, 空笛, 定速運転, 乗降促進
-2 0 ATS確認 (Spaceキー相当)
-2 1 ATSチャイム消し (Insertキー相当)
-2 2 EBリセット (Deleteキー相当)
-2 3 ATS復帰 (Homeキー相当)
-2 4 ATS-Pブレーキ開放 (Endキー相当)
-2 5 PageUpキー相当
-2 6 PageDownキー相当
-2 7~14 QWERTY側の数字2~9相当 (ATCなど)
-2 15 QWERTY側の数字0相当 (パネルライト)
-3 0, 1, 2, 3 視界移動 上, 下, 左, 右
-3 4 視点デフォルトに戻す
-3 5, 6 視界ズーム イン, アウト
-3 7 視点を切り替える (Vキー相当)
-3 8 時刻表表示切り替え
-3 9 シナリオ再読み込み
-3 10 F7
-3 11 F8
-3 12 P
ハンドルのvalueは大きすぎたら車両側のノッチ数まで丸められる。
たとえば new InputEventArgs(2, 99) とすれば、たいていの車両でツーハンドルの非常ブレーキを表現できる。
Dispose メソッド
BVEが終了するときに呼ばれる。
サンプルプログラムではここでCOMポートを閉じて、設定を保存している。
参考
TSマスコンのシリアル信号。末尾にCR(\r)が付く。サンプルプログラムを読む際の参考に。
table:Master Controller For Train Simulator
serial
ブレーキ9 TSB20
ブレーキ8 TSB30
ブレーキ7 TSB40
ブレーキ6 TSB99
ブレーキ5 TSA05
ブレーキ4 TSA15
ブレーキ3 TSA25
ブレーキ2 TSA35
ブレーキ1 TSA45
ノッチ切 TSA50
ノッチ1 TSA55
ノッチ2 TSA65
ノッチ3 TSA75
ノッチ4 TSA85
ノッチ5 TSA95
ノッチ6 TSB60
ノッチ7 TSB70
ノッチ8 TSB80
レバーサ前 TSG99
レバーサ切 TSG50
レバーサ後 TSG00
ボタンS押し TSK99
ボタンS離し TSK00
ボタンA押し TSX99
ボタンA離し TSX00
ボタンB押し TSY99
ボタンB離し TSY00
ボタンC押し TSZ99
ボタンC離し TSZ00