* モーションプロセッサ用PCコントローラ(V0.11) [#z30bf064]

#contents
----
**概要 [#k336f1b9]
ロボファイトなど、同時に多数の無線を使用する場合、無線の使用制限が行われます。~
場合によっては整備中でも使用できないことが多々あることや、競技によっては割り当てできずに有線コントロールを推奨される場合があります。~
本ソフトウェアは、モーションプロセッサの高速シリアルを利用した、PCによるコントロールを可能にします。~
特にKRT-2を使用している方にお勧めです。

**操作方法 [#yba99ef4]
#ref(MPJOYPAD01.png)
マウス操作はできません。キーボードかジョイスティック操作になります。~
ジョイスティックの判定は起動時に行いますので、接続後に起動してください。~
終了は、右上のクローズボックスを使用してください。~
-[1-8] COMポートを切り替えます。OFFLINE中のみ反応します。テンキーは使用できません。
-[SPACE] ONLINE/OFFLINEを切り替えます。ONLINE中は表示が反転します。HeartToHeart2でLEVEL3スクリプトを実行させてからONLINEにしてください。ONLINE状態以外はHeartToHeart2と共存できます。
-[ESC] LEVEL3スクリプトを停止して、OFFLINEになります。
-[他のキー] 表示されているボタンを押したことにしてデータを送信します。キーボードの場合のみ同時押し数に制限があります。

**ダウンロード [#m24524fd]
-Norton AntiVirus2005(ウィルス定義2006/04/26)でチェック済みです。
-動作するには.NET Framework 2.0が必要です。
#ref(MPJOYPAD01.ZIP)

-こちらはSW1-4の論理が逆転しています。(A=ON, B=OFFです)~
表示以外は変化ありません。~
Proboの配線を見た感じではSW3-4についてはA=ON, B=OFFになっているようです。
#ref(MPJOYPAD02.ZIP)

**制限事項など [#afacf28f]
-高速シリアルのパケット受信を使用するので、V14-V22が他の用途に使用できません。
-キーの割り当ては固定です。
-他の環境で確認していませんので、動くかどうかは不明です。
-実行したままサスペンドすると、サスペンドできなかったりアプリケーションエラーになる場合があります。

**モーションプロセッサのLEVEL3プログラムでの使用方法 [#o151d4b7]
モーションプロセッサの無線コントロールは、通常低速シリアルを利用します。~
低速シリアル値は、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]ボタン押下の処理へ

**ソースの一部 [#v6a02c31]
制御部分のソースです。
こんな感じで動かしています。(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;
                 }
             }
         }
     }
 }
----

 #comment
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS