ロボファイトなど、同時に多数の無線を使用する場合、無線の使用制限が行われます。
場合によっては整備中でも使用できないことが多々あることや、競技によっては割り当てできずに有線コントロールを推奨される場合があります。
本ソフトウェアは、モーションプロセッサの高速シリアルを利用した、PCによるコントロールを可能にします。
特にKRT-2を使用している方にお勧めです。
マウス操作はできません。キーボードかジョイスティック操作になります。
ジョイスティックの判定は起動時に行いますので、接続後に起動してください。
終了は、右上のクローズボックスを使用してください。
モーションプロセッサの無線コントロールは、通常低速シリアルを利用します。
低速シリアル値は、V12およびV13に自動的に取り込まれるので、これを判定に使用します。
一方、高速シリアルはスクリプト実行中のパケット取り込みが可能なので、これを使用してコントロールします。
パケットデータの内、V14は高速シリアル判定用に0x11を送っています。PC側はOFFLINEにするときに0x00を送るので、これで低速シリアルの切り替え判定ができます。
V15,V16はKRT-2互換のデータで、V17-V22は今後の拡張用です。
以下は、LEVEL3プログラムのサンプルです。
;コントロール信号 ---------------- JumpIf(V14,=,17,InputCheckNx) ;高速シリアル未使用ならProboデータで上書き V15 = V12 V16 = V13 ;操作判定 ------------------------ :InputCheckNx ;入力チェック(プロボ SW1=B) V01 = V15 AND 1 JumpIf(V01,#,0,L_SW1_B) ★[SW1]をBに切り替えた場合の処理へ ;入力チェック(プロボ ↑a) V01 = V16 AND 1 JumpIf(V01,#,0,L_FORWORD) ★[↑]ボタン押下の処理へ ;入力チェック(プロボ 1) V01 = V16 AND 16 JumpIf(V01,#,0,L_1) ★[1]ボタン押下の処理へ
制御部分のソースです。 こんな感じで動かしています。(2006-08-05公開)
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Threading; using Microsoft.DirectX.DirectInput; using DInput = Microsoft.DirectX.DirectInput; namespace MPJOYPAD { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { ///DirectInputキーボードデバイス Device DInDevKBD; //DirectInputキーボードデバイスの生成 DInDevKBD = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard); ///DirectInputジョイスティックデバイス Device DInDevJOY = null; //DirectInputジョイスティックデバイスの生成 foreach ( DeviceInstance di in Manager.GetDevices( DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly)) { DInDevJOY = new Device(di.InstanceGuid); break; } ///画面 Form1 Mainform = new Form1(); //画面表示 Mainform.Show(); ///キーボードデバイス状態 KeyboardState DKeyState; ///ジョイスティックデバイス状態 JoystickState DJoyState; //キーボード入力制御開始 DInDevKBD.Acquire(); //ジョイスティック入力制御を開始 if (DInDevJOY == null) { Mainform.lblSEND.Text = "◆ジョイスティックが接続されていません◆"; } else { DInDevJOY.Acquire(); } ///インターバル値 double nexttime = (double)System.Environment.TickCount; float wait = 1000f / 30f; ///ONLINEフラグ bool online = false; ///ON/OFFフラグ bool onoff = false; ///COMポート名 Mainform.lblCOM.Text = "COM4"; ///送信データ int olddat = 0xffff; String SENDDATA = ""; while (Mainform.Created) { //メインループ if ((double)System.Environment.TickCount >= nexttime) { //入力チェックループ ///入力データ合成値 int indat = 0; //キーボードの状態を取得 DKeyState = DInDevKBD.GetCurrentKeyboardState(); ///ジョイスティックの状態 int joyY = 0; int joyX = 0; byte[] joybtn; //ジョイスティックの状態を取得 if (DInDevJOY != null) { DJoyState = DInDevJOY.CurrentJoystickState; if (DJoyState.Y < 0x1000) joyY = 1; if (DJoyState.Y > 0xF000) joyY = 2; if (DJoyState.X < 0x1000) joyX = 3; if (DJoyState.X > 0xF000) joyX = 4; joybtn = DJoyState.GetButtons(); } else { joybtn = new byte[8]; } //キーボード「A」の判定 indat = (indat | KeyCheck(Mainform.lblL2, 0x0200, DKeyState[DInput.Key.A] | (joybtn[6] != 0),true)); //キーボード「S」の判定 indat = (indat | KeyCheck(Mainform.lblL1, 0x0100, DKeyState[DInput.Key.S] | (joybtn[4] != 0),true)); //キーボード「]」の判定 indat = (indat | KeyCheck(Mainform.lblR2, 0x0400, DKeyState[DInput.Key.RightBracket] | (joybtn[7] != 0),true)); //キーボード「:」の判定 indat = (indat | KeyCheck(Mainform.lblR1, 0x0800, DKeyState[DInput.Key.Colon] | (joybtn[5] != 0),true)); //キーボード「D」の判定 indat = (indat | KeyCheck(Mainform.lblFORWORD, 0x0001, DKeyState[DInput.Key.D] | (joyY == 1))); //キーボード「Z」の判定 indat = (indat | KeyCheck(Mainform.lblLEFT, 0x0008, DKeyState[DInput.Key.Z] | (joyX == 3))); //キーボード「X」の判定 indat = (indat | KeyCheck(Mainform.lblBACK, 0x0002, DKeyState[DInput.Key.X] | (joyY == 2))); //キーボード「C」の判定 indat = (indat | KeyCheck(Mainform.lblRIGHT, 0x0004, DKeyState[DInput.Key.C] | (joyX == 4))); //キーボード「;」の判定 indat = (indat | KeyCheck(Mainform.lbl1, 0x0010, DKeyState[DInput.Key.SemiColon] | (joybtn[1] != 0))); //キーボード「.」の判定 indat = (indat | KeyCheck(Mainform.lbl3, 0x0080, DKeyState[DInput.Key.Period] | (joybtn[0] != 0))); //キーボード「/」の判定 indat = (indat | KeyCheck(Mainform.lbl2, 0x0020, DKeyState[DInput.Key.Slash] | (joybtn[2] != 0))); //キーボード「\」の判定 indat = (indat | KeyCheck(Mainform.lbl4, 0x0040, DKeyState[DInput.Key.BackSlash] | (joybtn[3] != 0))); //キーボード「1-8」の判定 if (online==false) { if (DKeyState[DInput.Key.D1]) Mainform.lblCOM.Text = "COM1"; if (DKeyState[DInput.Key.D2]) Mainform.lblCOM.Text = "COM2"; if (DKeyState[DInput.Key.D3]) Mainform.lblCOM.Text = "COM3"; if (DKeyState[DInput.Key.D4]) Mainform.lblCOM.Text = "COM4"; if (DKeyState[DInput.Key.D5]) Mainform.lblCOM.Text = "COM5"; if (DKeyState[DInput.Key.D6]) Mainform.lblCOM.Text = "COM6"; if (DKeyState[DInput.Key.D7]) Mainform.lblCOM.Text = "COM7"; if (DKeyState[DInput.Key.D8]) Mainform.lblCOM.Text = "COM8"; } //キーボード「SPACE」の判定 if (DKeyState[DInput.Key.Space]) { onoff = true; } else { if (onoff == true) { onoff = false; if (online) { //高速シリアル判定無効化コマンド表示 SENDDATA = "#001100000000000000<CR><LF>"; Mainform.lblSEND.Text = SENDDATA; Application.DoEvents(); //高速シリアル判定無効化コマンド送信 byte[] buf = new byte[21]; buf[0] = (byte)'#'; for (int i = 1; i <= 18; i++) buf[i] = (byte)'0'; buf[3] = (byte)'1'; buf[4] = (byte)'1'; buf[19] = 0x0d; buf[20] = 0x0a; try { Mainform.serialPort1.Write(buf,0,21); } catch { } //回線切断 Mainform.serialPort1.Close(); Mainform.lblONLINE.BackColor = System.Drawing.Color.White; Mainform.lblONLINE.ForeColor = System.Drawing.Color.Black; online = false; } else { //回線接続 Mainform.lblONLINE.BackColor = System.Drawing.Color.Black; Mainform.lblONLINE.ForeColor = System.Drawing.Color.White; Application.DoEvents(); online = true; try { Mainform.serialPort1.Close(); } catch { } try { Mainform.serialPort1.PortName = Mainform.lblCOM.Text; Mainform.serialPort1.Open(); } catch { System.Threading.Thread.Sleep(100); Mainform.lblONLINE.BackColor = System.Drawing.Color.White; Mainform.lblONLINE.ForeColor = System.Drawing.Color.Black; Application.DoEvents(); online = false; } } } } //キーボード「ESC」の判定 if(KeyCheck(Mainform.lblESC, 1, DKeyState[DInput.Key.Escape]) ==1 ){ //スクリプト停止コマンド表示 SENDDATA = "#000000000000000000<CR><LF>"; Mainform.lblSEND.Text = SENDDATA; if (Mainform.serialPort1.IsOpen == true) { //スクリプト停止コマンド送信 byte[] buf = new byte[21]; buf[0] = (byte)'#'; for (int i = 1; i <= 18; i++) buf[i] = (byte)'0'; buf[19] = 0x0d; buf[20] = 0x0a; try { Mainform.serialPort1.Write(buf,0,21); } catch { } //OFFLINEに移行 onoff = true; } } else { //パケットコマンド表示 if (indat != olddat) { SENDDATA = "#11" + indat.ToString("X4") + "000000000000<CR><LF>"; Mainform.lblSEND.Text = SENDDATA; } if ((Mainform.serialPort1.IsOpen == true) && (indat != olddat)) { //パケットコマンド送信 byte[] buf = new byte[21]; buf[0] = (byte)'#'; for (int i = 1; i <= 18; i++) buf[i] = (byte)'0'; buf[1] = (byte)'1'; buf[2] = (byte)'1'; buf[3] += (byte)((indat & 0xf000) / 0x0fff); buf[4] += (byte)((indat & 0x0f00) / 0x00ff); buf[5] += (byte)((indat & 0x00f0) / 0x000f); buf[6] += (byte)(indat & 0x000f); buf[19] = 0x0d; buf[20] = 0x0a; try { Mainform.serialPort1.Write(buf, 0, 21); } catch { } olddat = indat; } } nexttime += wait; } Application.DoEvents(); } } /// <summary> /// キーボード入力をチェックし、ONの場合はON値を返す。 /// </summary> static int KeyCheck(Control lbl, int ondata, bool key) { return KeyCheck(lbl, ondata, key, false); } static int KeyCheck(Control lbl, int ondata, bool key, bool rev) { if (key) { lbl.BackColor = System.Drawing.Color.Black; lbl.ForeColor = System.Drawing.Color.White; if (rev) { return 0; } else { return ondata; } } else { lbl.BackColor = System.Drawing.Color.White; lbl.ForeColor = System.Drawing.Color.Black; if (rev) { return ondata; } else { return 0; } } } } }