First Release
InputDeviceDetector.h@1:6c392ebcd4d4, 2013-07-27 (annotated)
- Committer:
- sankichi
- Date:
- Sat Jul 27 14:19:33 2013 +0000
- Revision:
- 1:6c392ebcd4d4
- Parent:
- 0:e1265f6b3565
First release
Who changed what in which revision?
User | Revision | Line number | New 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 | }; |