OSDN Git Service

Merge branch 'feature/#36529_SlimDXからSharpDXへの移行' into develop
[dtxmania/dtxmania.git] / FDK17プロジェクト / コード / 02.入力 / CInputJoystick.cs
index 808fad0..80fcdbf 100644 (file)
@@ -2,8 +2,8 @@ using System;
 using System.Collections.Generic;\r
 using System.Text;\r
 using System.Diagnostics;\r
-using SlimDX;\r
-using SlimDX.DirectInput;\r
+using SharpDX;\r
+using SharpDX.DirectInput;\r
 \r
 namespace FDK\r
 {\r
@@ -23,7 +23,7 @@ namespace FDK
                                this.devJoystick.Properties.BufferSize = 32;\r
                                Trace.TraceInformation( this.devJoystick.Information.InstanceName + "を生成しました。" );\r
                        }\r
-                       catch( DirectInputException )\r
+                       catch\r
                        {\r
                                if( this.devJoystick != null )\r
                                {\r
@@ -35,10 +35,10 @@ namespace FDK
                        }\r
                        foreach( DeviceObjectInstance instance in this.devJoystick.GetObjects() )\r
                        {\r
-                               if( ( instance.ObjectType & ObjectDeviceType.Axis ) != ObjectDeviceType.All )\r
+                               if( ( instance.ObjectId.Flags & DeviceObjectTypeFlags.Axis ) != DeviceObjectTypeFlags.All )\r
                                {\r
-                                       this.devJoystick.GetObjectPropertiesById( (int) instance.ObjectType ).SetRange( -1000, 1000 );\r
-                                       this.devJoystick.GetObjectPropertiesById( (int) instance.ObjectType ).DeadZone = 5000;          // 50%をデッドゾーンに設定\r
+                                       this.devJoystick.GetObjectPropertiesById( instance.ObjectId ).Range = new InputRange( -1000, 1000 );\r
+                                       this.devJoystick.GetObjectPropertiesById( instance.ObjectId ).DeadZone = 5000;          // 50%をデッドゾーンに設定\r
                                                                                                                                                                                                                                // 軸をON/OFFの2値で使うならこれで十分\r
                                }\r
                        }\r
@@ -46,7 +46,7 @@ namespace FDK
                        {\r
                                this.devJoystick.Acquire();\r
                        }\r
-                       catch( DirectInputException )\r
+                       catch\r
                        {\r
                        }\r
 \r
@@ -101,8 +101,11 @@ namespace FDK
                        }\r
                        #endregion\r
 \r
-                       if ( ( bWindowがアクティブ中 && !this.devJoystick.Acquire().IsFailure ) && !this.devJoystick.Poll().IsFailure )\r
+                       if ( bWindowがアクティブ中 )\r
                        {\r
+                               this.devJoystick.Acquire();\r
+                               this.devJoystick.Poll();\r
+\r
                                // this.list入力イベント = new List<STInputEvent>( 32 );\r
                                this.list入力イベント.Clear();                                            // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();\r
 \r
@@ -112,9 +115,9 @@ namespace FDK
                                        #region [ a.バッファ入力 ]\r
                                        //-----------------------------\r
                                        var bufferedData = this.devJoystick.GetBufferedData();\r
-                                       if( Result.Last.IsSuccess && bufferedData != null )\r
+                                       //if( Result.Last.IsSuccess && bufferedData != null )\r
                                        {\r
-                                               foreach ( JoystickState data in bufferedData )\r
+                                               foreach ( JoystickUpdate data in bufferedData )\r
                                                {\r
 #if false\r
 //if ( 0 < data.X && data.X < 128 && 0 < data.Y && data.Y < 128 && 0 < data.Z && data.Z < 128 )\r
@@ -146,97 +149,83 @@ pp3 += ( data.IsReleased( ii ) ) ? "1" : "0";
 Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp, pp2, pp3 );\r
 }\r
 #endif\r
-                                                       switch ( data.JoystickDeviceType )\r
+                                                       switch ( data.Offset )\r
                                                        {\r
-                                                               case (int)JoystickDeviceType.X:\r
+                                                               case JoystickOffset.X:\r
                                                                        #region [ X軸- ]\r
                                                                        //-----------------------------\r
-                                                                       bButtonUpDown( data, data.X, 0, 1 );\r
+                                                                       bButtonUpDown( data, data.Value, 0, 1 );\r
                                                                        //-----------------------------\r
                                                                        #endregion\r
                                                                        #region [ X軸+ ]\r
                                                                        //-----------------------------\r
-                                                                       bButtonUpDown( data, data.X, 1, 0 );\r
+                                                                       bButtonUpDown( data, data.Value, 1, 0 );\r
                                                                        //-----------------------------\r
                                                                        #endregion\r
                                                                        break;\r
-                                                               case (int)JoystickDeviceType.Y:\r
+                                                               case JoystickOffset.Y:\r
                                                                        #region [ Y軸- ]\r
                                                                        //-----------------------------\r
-                                                                       bButtonUpDown( data, data.Y, 2, 3 );\r
+                                                                       bButtonUpDown( data, data.Value, 2, 3 );\r
                                                                        //-----------------------------\r
                                                                        #endregion\r
                                                                        #region [ Y軸+ ]\r
                                                                        //-----------------------------\r
-                                                                       bButtonUpDown( data, data.Y, 3, 2 );\r
+                                                                       bButtonUpDown( data, data.Value, 3, 2 );\r
+                                                                       //-----------------------------\r
                                                                        #endregion\r
                                                                        break;\r
-                                                               case (int)JoystickDeviceType.Z:\r
+                                                               case JoystickOffset.Z:\r
                                                                        #region [ Z軸- ]\r
                                                                        //-----------------------------\r
-                                                                       bButtonUpDown( data, data.Z, 4, 5 );\r
+                                                                       bButtonUpDown( data, data.Value, 4, 5 );\r
                                                                        //-----------------------------\r
                                                                        #endregion\r
                                                                        #region [ Z軸+ ]\r
                                                                        //-----------------------------\r
-                                                                       bButtonUpDown( data, data.Z, 5, 4 );\r
+                                                                       bButtonUpDown( data, data.Value, 5, 4 );\r
+                                                                       //-----------------------------\r
                                                                        #endregion\r
                                                                        break;\r
-                                                               case (int)JoystickDeviceType.POV0:\r
-                                                               case (int)JoystickDeviceType.POV1:\r
-                                                               case (int)JoystickDeviceType.POV2:\r
-                                                               case (int)JoystickDeviceType.POV3:\r
-                                                                       // #24341 2011.3.12 yyagi: POV support\r
-                                                                       // #26880 2011.12.6 yyagi: improve to support "pullup" of POV buttons\r
+                                                               // #24341 2011.3.12 yyagi: POV support\r
+                                                               // #26880 2011.12.6 yyagi: improve to support "pullup" of POV buttons\r
+                                                               case JoystickOffset.PointOfViewControllers0:\r
                                                                        #region [ POV HAT 4/8way ]\r
-                                                                       int[] povs = data.GetPointOfViewControllers();\r
-                                                                       if ( povs != null )\r
-                                                                       {\r
-                                                                               STInputEvent e = new STInputEvent();\r
-                                                                               int p = ( (int) data.JoystickDeviceType - (int) JoystickDeviceType.POV0 ) / ( (int) JoystickDeviceType.POV1 - (int) JoystickDeviceType.POV0 );  // p = 0,1,2,3\r
-                                                                                                                                                                       // #31030 2013.3.25 yyagi; p is not 0123 but 048.. Sop must be divided into 4 ( POV1 - POV0 == 4).\r
-                                                                               int nPovDegree = povs[ p ];\r
-                                                                               int nWay = ( nPovDegree + 2250 ) / 4500;\r
-                                                                               if ( nWay == 8 ) nWay = 0;\r
-                                                                       //Debug.WriteLine( "POVS:" + povs[ 0 ].ToString( CultureInfo.CurrentCulture ) + ", " +stevent.nKey );\r
-//Debug.WriteLine( "nPovDegree=" + nPovDegree );\r
-                                                                               if ( nPovDegree == -1 )\r
-                                                                               {\r
-                                                                                       e.nKey = 6 + 128 + this.nPovState[ p ];\r
-                                                                                       this.nPovState[ p ] = -1;\r
-//Debug.WriteLine( "POVS離された" + data.TimeStamp + " " + e.nKey );\r
-                                                                                       e.b押された = false;\r
-                                                                                       e.nVelocity = 0;\r
-                                                                                       this.bButtonState[ e.nKey ] = false;\r
-                                                                                       this.bButtonPullUp[ e.nKey ] = true;\r
-                                                                               } else {\r
-                                                                                       this.nPovState[ p ] = nWay;\r
-                                                                                       e.nKey = 6 + 128 + nWay;\r
-                                                                                       e.b押された = true;\r
-                                                                                       e.nVelocity = CInput管理.n通常音量;\r
-                                                                                       this.bButtonState[ e.nKey ] = true;\r
-                                                                                       this.bButtonPushDown[ e.nKey ] = true;\r
-//Debug.WriteLine( "POVS押された" + data.TimeStamp + " " + e.nKey );\r
-                                                                               }\r
-                                                                               //e.nTimeStamp = data.TimeStamp;\r
-                                                                               e.nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.TimeStamp );\r
-                                                                               this.list入力イベント.Add( e );\r
-                                                                       }\r
+                                                                       POVの処理( 0, data.Value );\r
+                                                                       #endregion\r
+                                                                       break;\r
+                                                               case JoystickOffset.PointOfViewControllers1:\r
+                                                                       #region [ POV HAT 4/8way ]\r
+                                                                       POVの処理( 1, data.Value );\r
+                                                                       #endregion\r
+                                                                       break;\r
+                                                               case JoystickOffset.PointOfViewControllers2:\r
+                                                                       #region [ POV HAT 4/8way ]\r
+                                                                       POVの処理( 2, data.Value );\r
+                                                                       #endregion\r
+                                                                       break;\r
+                                                               case JoystickOffset.PointOfViewControllers3:\r
+                                                                       #region [ POV HAT 4/8way ]\r
+                                                                       POVの処理( 3, data.Value );\r
                                                                        #endregion\r
                                                                        break;\r
                                                                default:\r
                                                                        #region [ ボタン ]\r
                                                                        //-----------------------------\r
-                                                                       for ( int i = 0; i < 32; i++ )\r
+\r
+                                                                       //for ( int i = 0; i < 32; i++ )\r
+                                                                       if( data.Offset >= JoystickOffset.Buttons0 && data.Offset <= JoystickOffset.Buttons31 )\r
                                                                        {\r
-                                                                               if ( data.IsPressed( i ) )\r
+                                                                               int i = data.Offset - JoystickOffset.Buttons0;\r
+\r
+                                                                               if ( ( data.Value & 0x80 ) != 0 )\r
                                                                                {\r
                                                                                        STInputEvent e = new STInputEvent()\r
                                                                                        {\r
                                                                                                nKey = 6 + i,\r
                                                                                                b押された = true,\r
                                                                                                b離された = false,\r
-                                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.TimeStamp ),\r
+                                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
                                                                                                nVelocity = CInput管理.n通常音量\r
                                                                                        };\r
                                                                                        this.list入力イベント.Add( e );\r
@@ -244,14 +233,14 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                                                                                        this.bButtonState[ 6 + i ] = true;\r
                                                                                        this.bButtonPushDown[ 6 + i ] = true;\r
                                                                                }\r
-                                                                               else if ( data.IsReleased( i ) )\r
+                                                                               else //if ( ( data.Value & 0x80 ) == 0 )\r
                                                                                {\r
                                                                                        var ev = new STInputEvent()\r
                                                                                        {\r
                                                                                                nKey = 6 + i,\r
                                                                                                b押された = false,\r
                                                                                                b離された = true,\r
-                                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.TimeStamp ),\r
+                                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
                                                                                                nVelocity = CInput管理.n通常音量,\r
                                                                                        };\r
                                                                                        this.list入力イベント.Add( ev );\r
@@ -264,6 +253,40 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                                                                        #endregion\r
                                                                        break;\r
                                                        }\r
+\r
+                                                       #region [ ローカル関数 ]\r
+                                                       void POVの処理( int p, int nPovDegree )\r
+                                                       {\r
+                                                               STInputEvent e = new STInputEvent();\r
+                                                               int nWay = ( nPovDegree + 2250 ) / 4500;\r
+                                                               if( nWay == 8 ) nWay = 0;\r
+                                                               //Debug.WriteLine( "POVS:" + povs[ 0 ].ToString( CultureInfo.CurrentCulture ) + ", " +stevent.nKey );\r
+                                                               //Debug.WriteLine( "nPovDegree=" + nPovDegree );\r
+                                                               if( nPovDegree == -1 )\r
+                                                               {\r
+                                                                       e.nKey = 6 + 128 + this.nPovState[ p ];\r
+                                                                       this.nPovState[ p ] = -1;\r
+                                                                       //Debug.WriteLine( "POVS離された" + data.TimeStamp + " " + e.nKey );\r
+                                                                       e.b押された = false;\r
+                                                                       e.nVelocity = 0;\r
+                                                                       this.bButtonState[ e.nKey ] = false;\r
+                                                                       this.bButtonPullUp[ e.nKey ] = true;\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       this.nPovState[ p ] = nWay;\r
+                                                                       e.nKey = 6 + 128 + nWay;\r
+                                                                       e.b押された = true;\r
+                                                                       e.nVelocity = CInput管理.n通常音量;\r
+                                                                       this.bButtonState[ e.nKey ] = true;\r
+                                                                       this.bButtonPushDown[ e.nKey ] = true;\r
+                                                                       //Debug.WriteLine( "POVS押された" + data.TimeStamp + " " + e.nKey );\r
+                                                               }\r
+                                                               //e.nTimeStamp = data.TimeStamp;\r
+                                                               e.nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp );\r
+                                                               this.list入力イベント.Add( e );\r
+                                                       }\r
+                                                       #endregion\r
                                                }\r
                                        }\r
                                        //-----------------------------\r
@@ -274,7 +297,7 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                                        #region [ b.状態入力 ]\r
                                        //-----------------------------\r
                                        JoystickState currentState = this.devJoystick.GetCurrentState();\r
-                                       if( Result.Last.IsSuccess && currentState != null )\r
+                                       //if( Result.Last.IsSuccess && currentState != null )\r
                                        {\r
                                                #region [ X軸- ]\r
                                                //-----------------------------\r
@@ -507,7 +530,7 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                                                #region [ ボタン ]\r
                                                //-----------------------------\r
                                                bool bIsButtonPressedReleased = false;\r
-                                               bool[] buttons = currentState.GetButtons();\r
+                                               bool[] buttons = currentState.Buttons;\r
                                                for( int j = 0; ( j < buttons.Length ) && ( j < 128 ); j++ )\r
                                                {\r
                                                        if( this.bButtonState[ 6 + j ] == false && buttons[ j ] )\r
@@ -545,7 +568,7 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                                                #endregion\r
                                                // #24341 2011.3.12 yyagi: POV support\r
                                                #region [ POV HAT 4/8way (only single POV switch is supported)]\r
-                                               int[] povs = currentState.GetPointOfViewControllers();\r
+                                               int[] povs = currentState.PointOfViewControllers;\r
                                                if ( povs != null )\r
                                                {\r
                                                        if ( povs[ 0 ] >= 0 )\r
@@ -663,7 +686,7 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                private Joystick devJoystick;\r
                //private CTimer timer;\r
 \r
-               private void bButtonUpDown( JoystickState data, int axisdata, int target, int contrary )        // #26871 2011.12.3 軸の反転に対応するためにリファクタ\r
+               private void bButtonUpDown( JoystickUpdate data, int axisdata, int target, int contrary )       // #26871 2011.12.3 軸の反転に対応するためにリファクタ\r
                {\r
                        int targetsign = ( target < contrary ) ? -1 : 1;\r
                        if ( Math.Abs( axisdata ) > 500 && ( targetsign == Math.Sign( axisdata ) ) )                    // 軸の最大値の半分を超えていて、かつ\r
@@ -699,7 +722,7 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                /// <param name="data"></param>\r
                /// <param name="currentMode">直前のボタン状態 true=押されていた</param>\r
                /// <returns>上げ下げイベント発生時true</returns>\r
-               private bool bDoUpDownCore( int target, JoystickState data, bool lastMode )\r
+               private bool bDoUpDownCore( int target, JoystickUpdate data, bool lastMode )\r
                {\r
                        if ( this.bButtonState[ target ] == lastMode )\r
                        {\r
@@ -707,7 +730,7 @@ Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp,
                                {\r
                                        nKey = target,\r
                                        b押された = !lastMode,\r
-                                       nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.TimeStamp ),\r
+                                       nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
                                        nVelocity = ( lastMode ) ? 0 : CInput管理.n通常音量\r
                                };\r
                                this.list入力イベント.Add( e );\r