First Release

Dependencies:   USBDevice

Revision:
0:e1265f6b3565
diff -r 000000000000 -r e1265f6b3565 InputDeviceDetector.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/InputDeviceDetector.h	Sat Jul 27 14:05:47 2013 +0000
@@ -0,0 +1,146 @@
+/** Class: InputDeviceDetector
+ *
+ * Detect input device
+ *
+ */
+
+#include "mbed.h"
+#include "NiseKabuto.h"
+
+class InputDeviceDetector
+{
+    private:
+        // constant
+        static const int SELSTATETIME__MICROSEC    = 2;     // Select信号の立ち上げ_立ち下げを行う長さ
+                                                            // 短すぎると6Bが反応しない?
+
+        // mbed pins
+        DigitalIn   _IN_D0;
+        DigitalIn   _IN_D1;
+        DigitalIn   _IN_D2;
+        DigitalIn   _IN_D3;
+        DigitalIn   _IN_D4;
+        DigitalIn   _IN_D5;
+        DigitalOut  _OUT_SEL;
+    
+        char        _InputType;
+        
+    public:
+        // Constructor
+        InputDeviceDetector(PinName inputPins[])
+            :_IN_D0(inputPins[0]), _IN_D1(inputPins[1]), 
+             _IN_D2(inputPins[2]), _IN_D3(inputPins[3]), 
+             _IN_D4(inputPins[4]), _IN_D5(inputPins[5]), 
+             _OUT_SEL(inputPins[6])
+        {
+            // Pin Setting
+            _IN_D0.mode(PullUp);
+            _IN_D1.mode(PullUp);
+            _IN_D2.mode(PullUp);
+            _IN_D3.mode(PullUp);
+            _IN_D4.mode(PullUp);
+            _IN_D5.mode(PullUp);
+            
+            // Initialize pin status
+            _OUT_SEL = 1;   // output SEL = H
+        }
+
+        // public: Return input device type
+        char GetInputType()
+        {
+            char retVal = NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG;
+            
+            if( Check_MD6B() )
+            {
+                retVal = NiseKabuto::CONFIG_INMODE_MD6B;
+            }
+            
+            return retVal;
+        }
+
+        // Check if MD6B is connected ?
+        //  return:
+        //      non-0: Connected
+        //          0: Not connected
+        char Check_MD6B()
+        {
+            char retVal = 0;
+            
+            char flag6B = 0;
+            int idx = 0;
+            char _PhaseData[8];
+
+            // Selを立ち下げ、データ読みを8回
+            idx = 0;
+            for(int i=0; i<4; i++)
+            {
+                _OUT_SEL = 0;
+                wait_us(SELSTATETIME__MICROSEC);
+                
+                _PhaseData[idx++] = ReadPinValue();
+                
+                _OUT_SEL = 1;
+                wait_us(SELSTATETIME__MICROSEC);
+
+                _PhaseData[idx++] = ReadPinValue();
+            }
+            
+            idx = 0;
+            while(1)
+            {
+                // D0-D3がLなものを探す
+                if( (_PhaseData[idx]&0x0f)==0 )
+                {
+                    // idx+2をチェック
+                    // ただし6を超えた場合はidx-6の位置をチェック
+                    if(idx < 6)
+                    {
+                        if( (_PhaseData[idx+2]&0x0f)==0x0f )
+                        {
+                            flag6B = 1;
+                            break;
+                        }
+                    }
+                    else
+                    {
+                        if( (_PhaseData[idx-6]&0x0f)==0x0f )
+                        {
+                            flag6B = 1;
+                            break;
+                        }
+                    }
+                }
+                
+                // このidxではなかった
+                idx++;
+                // 全部チェックしてしまった
+                if( idx == 8 )
+                {
+                    break;
+                }
+            }
+            
+            // この時点でflag6B==0の場合、6Bではない
+            if( flag6B != 1 )
+            {
+                retVal = 0;
+            }
+            else
+            {
+                retVal = 1;
+            }
+            
+            return retVal;
+        }
+        
+        // ReadPinValue
+        char ReadPinValue()
+        {
+            return ( 
+                (_IN_D5<<5) | (_IN_D4<<4) |
+                (_IN_D3<<3) | (_IN_D2<<2) | (_IN_D1<<1) |  _IN_D0
+            );
+        }
+
+        
+};