First Release

Dependencies:   USBDevice

Committer:
sankichi
Date:
Sat Jul 27 14:05:47 2013 +0000
Revision:
0:e1265f6b3565
First Release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sankichi 0:e1265f6b3565 1 /** Class: InputDeviceDetector
sankichi 0:e1265f6b3565 2 *
sankichi 0:e1265f6b3565 3 * Detect input device
sankichi 0:e1265f6b3565 4 *
sankichi 0:e1265f6b3565 5 */
sankichi 0:e1265f6b3565 6
sankichi 0:e1265f6b3565 7 #include "mbed.h"
sankichi 0:e1265f6b3565 8 #include "NiseKabuto.h"
sankichi 0:e1265f6b3565 9
sankichi 0:e1265f6b3565 10 class InputDeviceDetector
sankichi 0:e1265f6b3565 11 {
sankichi 0:e1265f6b3565 12 private:
sankichi 0:e1265f6b3565 13 // constant
sankichi 0:e1265f6b3565 14 static const int SELSTATETIME__MICROSEC = 2; // Select信号の立ち上げ_立ち下げを行う長さ
sankichi 0:e1265f6b3565 15 // 短すぎると6Bが反応しない?
sankichi 0:e1265f6b3565 16
sankichi 0:e1265f6b3565 17 // mbed pins
sankichi 0:e1265f6b3565 18 DigitalIn _IN_D0;
sankichi 0:e1265f6b3565 19 DigitalIn _IN_D1;
sankichi 0:e1265f6b3565 20 DigitalIn _IN_D2;
sankichi 0:e1265f6b3565 21 DigitalIn _IN_D3;
sankichi 0:e1265f6b3565 22 DigitalIn _IN_D4;
sankichi 0:e1265f6b3565 23 DigitalIn _IN_D5;
sankichi 0:e1265f6b3565 24 DigitalOut _OUT_SEL;
sankichi 0:e1265f6b3565 25
sankichi 0:e1265f6b3565 26 char _InputType;
sankichi 0:e1265f6b3565 27
sankichi 0:e1265f6b3565 28 public:
sankichi 0:e1265f6b3565 29 // Constructor
sankichi 0:e1265f6b3565 30 InputDeviceDetector(PinName inputPins[])
sankichi 0:e1265f6b3565 31 :_IN_D0(inputPins[0]), _IN_D1(inputPins[1]),
sankichi 0:e1265f6b3565 32 _IN_D2(inputPins[2]), _IN_D3(inputPins[3]),
sankichi 0:e1265f6b3565 33 _IN_D4(inputPins[4]), _IN_D5(inputPins[5]),
sankichi 0:e1265f6b3565 34 _OUT_SEL(inputPins[6])
sankichi 0:e1265f6b3565 35 {
sankichi 0:e1265f6b3565 36 // Pin Setting
sankichi 0:e1265f6b3565 37 _IN_D0.mode(PullUp);
sankichi 0:e1265f6b3565 38 _IN_D1.mode(PullUp);
sankichi 0:e1265f6b3565 39 _IN_D2.mode(PullUp);
sankichi 0:e1265f6b3565 40 _IN_D3.mode(PullUp);
sankichi 0:e1265f6b3565 41 _IN_D4.mode(PullUp);
sankichi 0:e1265f6b3565 42 _IN_D5.mode(PullUp);
sankichi 0:e1265f6b3565 43
sankichi 0:e1265f6b3565 44 // Initialize pin status
sankichi 0:e1265f6b3565 45 _OUT_SEL = 1; // output SEL = H
sankichi 0:e1265f6b3565 46 }
sankichi 0:e1265f6b3565 47
sankichi 0:e1265f6b3565 48 // public: Return input device type
sankichi 0:e1265f6b3565 49 char GetInputType()
sankichi 0:e1265f6b3565 50 {
sankichi 0:e1265f6b3565 51 char retVal = NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG;
sankichi 0:e1265f6b3565 52
sankichi 0:e1265f6b3565 53 if( Check_MD6B() )
sankichi 0:e1265f6b3565 54 {
sankichi 0:e1265f6b3565 55 retVal = NiseKabuto::CONFIG_INMODE_MD6B;
sankichi 0:e1265f6b3565 56 }
sankichi 0:e1265f6b3565 57
sankichi 0:e1265f6b3565 58 return retVal;
sankichi 0:e1265f6b3565 59 }
sankichi 0:e1265f6b3565 60
sankichi 0:e1265f6b3565 61 // Check if MD6B is connected ?
sankichi 0:e1265f6b3565 62 // return:
sankichi 0:e1265f6b3565 63 // non-0: Connected
sankichi 0:e1265f6b3565 64 // 0: Not connected
sankichi 0:e1265f6b3565 65 char Check_MD6B()
sankichi 0:e1265f6b3565 66 {
sankichi 0:e1265f6b3565 67 char retVal = 0;
sankichi 0:e1265f6b3565 68
sankichi 0:e1265f6b3565 69 char flag6B = 0;
sankichi 0:e1265f6b3565 70 int idx = 0;
sankichi 0:e1265f6b3565 71 char _PhaseData[8];
sankichi 0:e1265f6b3565 72
sankichi 0:e1265f6b3565 73 // Selを立ち下げ、データ読みを8回
sankichi 0:e1265f6b3565 74 idx = 0;
sankichi 0:e1265f6b3565 75 for(int i=0; i<4; i++)
sankichi 0:e1265f6b3565 76 {
sankichi 0:e1265f6b3565 77 _OUT_SEL = 0;
sankichi 0:e1265f6b3565 78 wait_us(SELSTATETIME__MICROSEC);
sankichi 0:e1265f6b3565 79
sankichi 0:e1265f6b3565 80 _PhaseData[idx++] = ReadPinValue();
sankichi 0:e1265f6b3565 81
sankichi 0:e1265f6b3565 82 _OUT_SEL = 1;
sankichi 0:e1265f6b3565 83 wait_us(SELSTATETIME__MICROSEC);
sankichi 0:e1265f6b3565 84
sankichi 0:e1265f6b3565 85 _PhaseData[idx++] = ReadPinValue();
sankichi 0:e1265f6b3565 86 }
sankichi 0:e1265f6b3565 87
sankichi 0:e1265f6b3565 88 idx = 0;
sankichi 0:e1265f6b3565 89 while(1)
sankichi 0:e1265f6b3565 90 {
sankichi 0:e1265f6b3565 91 // D0-D3がLなものを探す
sankichi 0:e1265f6b3565 92 if( (_PhaseData[idx]&0x0f)==0 )
sankichi 0:e1265f6b3565 93 {
sankichi 0:e1265f6b3565 94 // idx+2をチェック
sankichi 0:e1265f6b3565 95 // ただし6を超えた場合はidx-6の位置をチェック
sankichi 0:e1265f6b3565 96 if(idx < 6)
sankichi 0:e1265f6b3565 97 {
sankichi 0:e1265f6b3565 98 if( (_PhaseData[idx+2]&0x0f)==0x0f )
sankichi 0:e1265f6b3565 99 {
sankichi 0:e1265f6b3565 100 flag6B = 1;
sankichi 0:e1265f6b3565 101 break;
sankichi 0:e1265f6b3565 102 }
sankichi 0:e1265f6b3565 103 }
sankichi 0:e1265f6b3565 104 else
sankichi 0:e1265f6b3565 105 {
sankichi 0:e1265f6b3565 106 if( (_PhaseData[idx-6]&0x0f)==0x0f )
sankichi 0:e1265f6b3565 107 {
sankichi 0:e1265f6b3565 108 flag6B = 1;
sankichi 0:e1265f6b3565 109 break;
sankichi 0:e1265f6b3565 110 }
sankichi 0:e1265f6b3565 111 }
sankichi 0:e1265f6b3565 112 }
sankichi 0:e1265f6b3565 113
sankichi 0:e1265f6b3565 114 // このidxではなかった
sankichi 0:e1265f6b3565 115 idx++;
sankichi 0:e1265f6b3565 116 // 全部チェックしてしまった
sankichi 0:e1265f6b3565 117 if( idx == 8 )
sankichi 0:e1265f6b3565 118 {
sankichi 0:e1265f6b3565 119 break;
sankichi 0:e1265f6b3565 120 }
sankichi 0:e1265f6b3565 121 }
sankichi 0:e1265f6b3565 122
sankichi 0:e1265f6b3565 123 // この時点でflag6B==0の場合、6Bではない
sankichi 0:e1265f6b3565 124 if( flag6B != 1 )
sankichi 0:e1265f6b3565 125 {
sankichi 0:e1265f6b3565 126 retVal = 0;
sankichi 0:e1265f6b3565 127 }
sankichi 0:e1265f6b3565 128 else
sankichi 0:e1265f6b3565 129 {
sankichi 0:e1265f6b3565 130 retVal = 1;
sankichi 0:e1265f6b3565 131 }
sankichi 0:e1265f6b3565 132
sankichi 0:e1265f6b3565 133 return retVal;
sankichi 0:e1265f6b3565 134 }
sankichi 0:e1265f6b3565 135
sankichi 0:e1265f6b3565 136 // ReadPinValue
sankichi 0:e1265f6b3565 137 char ReadPinValue()
sankichi 0:e1265f6b3565 138 {
sankichi 0:e1265f6b3565 139 return (
sankichi 0:e1265f6b3565 140 (_IN_D5<<5) | (_IN_D4<<4) |
sankichi 0:e1265f6b3565 141 (_IN_D3<<3) | (_IN_D2<<2) | (_IN_D1<<1) | _IN_D0
sankichi 0:e1265f6b3565 142 );
sankichi 0:e1265f6b3565 143 }
sankichi 0:e1265f6b3565 144
sankichi 0:e1265f6b3565 145
sankichi 0:e1265f6b3565 146 };