First Release
In_CyberStick/In_CyberStick.cpp@0:e1265f6b3565, 2013-07-27 (annotated)
- Committer:
- sankichi
- Date:
- Sat Jul 27 14:05:47 2013 +0000
- Revision:
- 0:e1265f6b3565
First Release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sankichi | 0:e1265f6b3565 | 1 | #include "In_CyberStick.h" |
sankichi | 0:e1265f6b3565 | 2 | #include "NiseKabuto.h" |
sankichi | 0:e1265f6b3565 | 3 | |
sankichi | 0:e1265f6b3565 | 4 | DigitalOut led11(LED1); |
sankichi | 0:e1265f6b3565 | 5 | DigitalOut led22(LED2); |
sankichi | 0:e1265f6b3565 | 6 | DigitalOut dbgPin(p8); |
sankichi | 0:e1265f6b3565 | 7 | |
sankichi | 0:e1265f6b3565 | 8 | // |
sankichi | 0:e1265f6b3565 | 9 | // Constructor |
sankichi | 0:e1265f6b3565 | 10 | // |
sankichi | 0:e1265f6b3565 | 11 | In_CyberStick::In_CyberStick( |
sankichi | 0:e1265f6b3565 | 12 | PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3, |
sankichi | 0:e1265f6b3565 | 13 | PinName pn_LH, PinName pn_ACK, PinName pn_REQ, |
sankichi | 0:e1265f6b3565 | 14 | InputStatus *inputStatus |
sankichi | 0:e1265f6b3565 | 15 | ) : _IN_D0(pn_D0), _IN_D1(pn_D1), _IN_D2(pn_D2), _IN_D3(pn_D3), _IN_LH(pn_LH), _IN_ACK(pn_ACK), _OUT_REQ(pn_REQ) |
sankichi | 0:e1265f6b3565 | 16 | { |
sankichi | 0:e1265f6b3565 | 17 | _InputStatus = inputStatus; |
sankichi | 0:e1265f6b3565 | 18 | _InputStatus->Reset(); // ボタンなどリセット |
sankichi | 0:e1265f6b3565 | 19 | _InputStatus->InputDeviceType = NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG; //とりあえずアナログにしておく |
sankichi | 0:e1265f6b3565 | 20 | |
sankichi | 0:e1265f6b3565 | 21 | _AnalogReadFailCounter = 0; |
sankichi | 0:e1265f6b3565 | 22 | |
sankichi | 0:e1265f6b3565 | 23 | Initialize(); |
sankichi | 0:e1265f6b3565 | 24 | } |
sankichi | 0:e1265f6b3565 | 25 | |
sankichi | 0:e1265f6b3565 | 26 | |
sankichi | 0:e1265f6b3565 | 27 | void In_CyberStick::StartReading(void) |
sankichi | 0:e1265f6b3565 | 28 | { |
sankichi | 0:e1265f6b3565 | 29 | //printf("In_CyberStick::StartReading()\r\n"); |
sankichi | 0:e1265f6b3565 | 30 | if(!_ReadEnable) |
sankichi | 0:e1265f6b3565 | 31 | { |
sankichi | 0:e1265f6b3565 | 32 | _ReadEnable = 1; |
sankichi | 0:e1265f6b3565 | 33 | Initialize(); |
sankichi | 0:e1265f6b3565 | 34 | } |
sankichi | 0:e1265f6b3565 | 35 | } |
sankichi | 0:e1265f6b3565 | 36 | void In_CyberStick::StopReading(void) |
sankichi | 0:e1265f6b3565 | 37 | { |
sankichi | 0:e1265f6b3565 | 38 | //printf("In_CyberStick::StopReading()\r\n"); |
sankichi | 0:e1265f6b3565 | 39 | if(_ReadEnable) |
sankichi | 0:e1265f6b3565 | 40 | { |
sankichi | 0:e1265f6b3565 | 41 | _ReadEnable = 0; |
sankichi | 0:e1265f6b3565 | 42 | DisablePolling(); |
sankichi | 0:e1265f6b3565 | 43 | } |
sankichi | 0:e1265f6b3565 | 44 | } |
sankichi | 0:e1265f6b3565 | 45 | |
sankichi | 0:e1265f6b3565 | 46 | |
sankichi | 0:e1265f6b3565 | 47 | |
sankichi | 0:e1265f6b3565 | 48 | // |
sankichi | 0:e1265f6b3565 | 49 | // Initialize |
sankichi | 0:e1265f6b3565 | 50 | // |
sankichi | 0:e1265f6b3565 | 51 | void In_CyberStick::Initialize() |
sankichi | 0:e1265f6b3565 | 52 | { |
sankichi | 0:e1265f6b3565 | 53 | // Pin Setting |
sankichi | 0:e1265f6b3565 | 54 | _IN_D0.mode(PullUp); |
sankichi | 0:e1265f6b3565 | 55 | _IN_D1.mode(PullUp); |
sankichi | 0:e1265f6b3565 | 56 | _IN_D2.mode(PullUp); |
sankichi | 0:e1265f6b3565 | 57 | _IN_D3.mode(PullUp); |
sankichi | 0:e1265f6b3565 | 58 | _IN_LH.mode(PullUp); |
sankichi | 0:e1265f6b3565 | 59 | _IN_ACK.mode(PullUp); |
sankichi | 0:e1265f6b3565 | 60 | |
sankichi | 0:e1265f6b3565 | 61 | // Class Variable Setting |
sankichi | 0:e1265f6b3565 | 62 | _ReadEnable = 1; |
sankichi | 0:e1265f6b3565 | 63 | |
sankichi | 0:e1265f6b3565 | 64 | // Interrupt Setting |
sankichi | 0:e1265f6b3565 | 65 | // Initialize pin status |
sankichi | 0:e1265f6b3565 | 66 | _OUT_REQ = 1; // output REQ = H |
sankichi | 0:e1265f6b3565 | 67 | |
sankichi | 0:e1265f6b3565 | 68 | // Ticker Setting |
sankichi | 0:e1265f6b3565 | 69 | EnablePolling(); |
sankichi | 0:e1265f6b3565 | 70 | } |
sankichi | 0:e1265f6b3565 | 71 | |
sankichi | 0:e1265f6b3565 | 72 | |
sankichi | 0:e1265f6b3565 | 73 | |
sankichi | 0:e1265f6b3565 | 74 | // |
sankichi | 0:e1265f6b3565 | 75 | // Enable polling |
sankichi | 0:e1265f6b3565 | 76 | // |
sankichi | 0:e1265f6b3565 | 77 | void In_CyberStick::EnablePolling(void) |
sankichi | 0:e1265f6b3565 | 78 | { |
sankichi | 0:e1265f6b3565 | 79 | _PollingTicker.attach_us(this, &In_CyberStick::PollingMethod, REQUESTINTERVAL__MICROSEC); |
sankichi | 0:e1265f6b3565 | 80 | |
sankichi | 0:e1265f6b3565 | 81 | // FCAB 入力乱れ対策 |
sankichi | 0:e1265f6b3565 | 82 | _ReadEnable = 1; |
sankichi | 0:e1265f6b3565 | 83 | _OUT_REQ = 1; |
sankichi | 0:e1265f6b3565 | 84 | } |
sankichi | 0:e1265f6b3565 | 85 | |
sankichi | 0:e1265f6b3565 | 86 | |
sankichi | 0:e1265f6b3565 | 87 | // |
sankichi | 0:e1265f6b3565 | 88 | // Polling method |
sankichi | 0:e1265f6b3565 | 89 | // |
sankichi | 0:e1265f6b3565 | 90 | void In_CyberStick::PollingMethod() |
sankichi | 0:e1265f6b3565 | 91 | { |
sankichi | 0:e1265f6b3565 | 92 | // デバッグ用:この関数が呼ばれるたび+1される |
sankichi | 0:e1265f6b3565 | 93 | (_InputStatus->Temp[0])++; |
sankichi | 0:e1265f6b3565 | 94 | |
sankichi | 0:e1265f6b3565 | 95 | if(_ReadEnable) |
sankichi | 0:e1265f6b3565 | 96 | { |
sankichi | 0:e1265f6b3565 | 97 | |
sankichi | 0:e1265f6b3565 | 98 | // 割り込み停止しない |
sankichi | 0:e1265f6b3565 | 99 | //__disable_irq(); |
sankichi | 0:e1265f6b3565 | 100 | |
sankichi | 0:e1265f6b3565 | 101 | int waitLoop = 8000; //8000;//11300;//22600; |
sankichi | 0:e1265f6b3565 | 102 | char state = 1; |
sankichi | 0:e1265f6b3565 | 103 | char phase = 0; |
sankichi | 0:e1265f6b3565 | 104 | char cycle = 0; |
sankichi | 0:e1265f6b3565 | 105 | |
sankichi | 0:e1265f6b3565 | 106 | // Req下げ |
sankichi | 0:e1265f6b3565 | 107 | _OUT_REQ = 0; |
sankichi | 0:e1265f6b3565 | 108 | //wait_us(2); |
sankichi | 0:e1265f6b3565 | 109 | //_OUT_REQ = 1; |
sankichi | 0:e1265f6b3565 | 110 | |
sankichi | 0:e1265f6b3565 | 111 | cycle = 0; |
sankichi | 0:e1265f6b3565 | 112 | while( cycle<6 ) |
sankichi | 0:e1265f6b3565 | 113 | { |
sankichi | 0:e1265f6b3565 | 114 | // LH=1の間待つ |
sankichi | 0:e1265f6b3565 | 115 | if(state) |
sankichi | 0:e1265f6b3565 | 116 | { |
sankichi | 0:e1265f6b3565 | 117 | while( _IN_LH ) |
sankichi | 0:e1265f6b3565 | 118 | { |
sankichi | 0:e1265f6b3565 | 119 | waitLoop--; |
sankichi | 0:e1265f6b3565 | 120 | if(!waitLoop) |
sankichi | 0:e1265f6b3565 | 121 | { |
sankichi | 0:e1265f6b3565 | 122 | // TimeOut ! |
sankichi | 0:e1265f6b3565 | 123 | state = 0; |
sankichi | 0:e1265f6b3565 | 124 | break; |
sankichi | 0:e1265f6b3565 | 125 | } |
sankichi | 0:e1265f6b3565 | 126 | } |
sankichi | 0:e1265f6b3565 | 127 | } |
sankichi | 0:e1265f6b3565 | 128 | |
sankichi | 0:e1265f6b3565 | 129 | // ACK=1の間待つ |
sankichi | 0:e1265f6b3565 | 130 | if(state) |
sankichi | 0:e1265f6b3565 | 131 | { |
sankichi | 0:e1265f6b3565 | 132 | while( _IN_ACK ) |
sankichi | 0:e1265f6b3565 | 133 | { |
sankichi | 0:e1265f6b3565 | 134 | waitLoop--; |
sankichi | 0:e1265f6b3565 | 135 | if(!waitLoop) |
sankichi | 0:e1265f6b3565 | 136 | { |
sankichi | 0:e1265f6b3565 | 137 | // TimeOut ! |
sankichi | 0:e1265f6b3565 | 138 | state = 0; |
sankichi | 0:e1265f6b3565 | 139 | break; |
sankichi | 0:e1265f6b3565 | 140 | } |
sankichi | 0:e1265f6b3565 | 141 | } |
sankichi | 0:e1265f6b3565 | 142 | |
sankichi | 0:e1265f6b3565 | 143 | } |
sankichi | 0:e1265f6b3565 | 144 | |
sankichi | 0:e1265f6b3565 | 145 | if(state) |
sankichi | 0:e1265f6b3565 | 146 | { |
sankichi | 0:e1265f6b3565 | 147 | // データ読み出し |
sankichi | 0:e1265f6b3565 | 148 | ReadPhase(phase++); |
sankichi | 0:e1265f6b3565 | 149 | } |
sankichi | 0:e1265f6b3565 | 150 | |
sankichi | 0:e1265f6b3565 | 151 | // LH=0の間待つ |
sankichi | 0:e1265f6b3565 | 152 | if(state) |
sankichi | 0:e1265f6b3565 | 153 | { |
sankichi | 0:e1265f6b3565 | 154 | while( !(_IN_LH) ) |
sankichi | 0:e1265f6b3565 | 155 | { |
sankichi | 0:e1265f6b3565 | 156 | waitLoop--; |
sankichi | 0:e1265f6b3565 | 157 | if(!waitLoop) |
sankichi | 0:e1265f6b3565 | 158 | { |
sankichi | 0:e1265f6b3565 | 159 | // TimeOut ! |
sankichi | 0:e1265f6b3565 | 160 | state = 0; |
sankichi | 0:e1265f6b3565 | 161 | break; |
sankichi | 0:e1265f6b3565 | 162 | } |
sankichi | 0:e1265f6b3565 | 163 | } |
sankichi | 0:e1265f6b3565 | 164 | } |
sankichi | 0:e1265f6b3565 | 165 | |
sankichi | 0:e1265f6b3565 | 166 | // ACK=1の間待つ |
sankichi | 0:e1265f6b3565 | 167 | if(state) |
sankichi | 0:e1265f6b3565 | 168 | { |
sankichi | 0:e1265f6b3565 | 169 | // REQ立ち上げ |
sankichi | 0:e1265f6b3565 | 170 | // (最速モードのため、2回目のAck立下りまでに行う。このあたり?) |
sankichi | 0:e1265f6b3565 | 171 | _OUT_REQ = 1; |
sankichi | 0:e1265f6b3565 | 172 | |
sankichi | 0:e1265f6b3565 | 173 | while( _IN_ACK ) |
sankichi | 0:e1265f6b3565 | 174 | { |
sankichi | 0:e1265f6b3565 | 175 | waitLoop--; |
sankichi | 0:e1265f6b3565 | 176 | if(!waitLoop) |
sankichi | 0:e1265f6b3565 | 177 | { |
sankichi | 0:e1265f6b3565 | 178 | // TimeOut ! |
sankichi | 0:e1265f6b3565 | 179 | state = 0; |
sankichi | 0:e1265f6b3565 | 180 | break; |
sankichi | 0:e1265f6b3565 | 181 | } |
sankichi | 0:e1265f6b3565 | 182 | } |
sankichi | 0:e1265f6b3565 | 183 | } |
sankichi | 0:e1265f6b3565 | 184 | |
sankichi | 0:e1265f6b3565 | 185 | if(state) |
sankichi | 0:e1265f6b3565 | 186 | { |
sankichi | 0:e1265f6b3565 | 187 | // データ読み出し |
sankichi | 0:e1265f6b3565 | 188 | ReadPhase(phase++); |
sankichi | 0:e1265f6b3565 | 189 | } |
sankichi | 0:e1265f6b3565 | 190 | |
sankichi | 0:e1265f6b3565 | 191 | if(!state) |
sankichi | 0:e1265f6b3565 | 192 | { |
sankichi | 0:e1265f6b3565 | 193 | break; |
sankichi | 0:e1265f6b3565 | 194 | } |
sankichi | 0:e1265f6b3565 | 195 | cycle++; |
sankichi | 0:e1265f6b3565 | 196 | } |
sankichi | 0:e1265f6b3565 | 197 | |
sankichi | 0:e1265f6b3565 | 198 | // 割り込み禁止しない |
sankichi | 0:e1265f6b3565 | 199 | //__enable_irq(); |
sankichi | 0:e1265f6b3565 | 200 | |
sankichi | 0:e1265f6b3565 | 201 | if(state) |
sankichi | 0:e1265f6b3565 | 202 | { |
sankichi | 0:e1265f6b3565 | 203 | // ここまでstate==1のままで終わったら、完全にアナログスティックといえる |
sankichi | 0:e1265f6b3565 | 204 | _InputStatus->InputDeviceType = NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG; |
sankichi | 0:e1265f6b3565 | 205 | led11 = 1; |
sankichi | 0:e1265f6b3565 | 206 | |
sankichi | 0:e1265f6b3565 | 207 | // Analog読み失敗カウンタリセット |
sankichi | 0:e1265f6b3565 | 208 | _AnalogReadFailCounter = 0; |
sankichi | 0:e1265f6b3565 | 209 | |
sankichi | 0:e1265f6b3565 | 210 | //データ確定 |
sankichi | 0:e1265f6b3565 | 211 | CommitAnalogData(); |
sankichi | 0:e1265f6b3565 | 212 | } |
sankichi | 0:e1265f6b3565 | 213 | else |
sankichi | 0:e1265f6b3565 | 214 | { |
sankichi | 0:e1265f6b3565 | 215 | // printf("_AnalogReadFailCounter: %d\r\n",_AnalogReadFailCounter); |
sankichi | 0:e1265f6b3565 | 216 | // 数回のAnalog読み失敗を許容 |
sankichi | 0:e1265f6b3565 | 217 | // |
sankichi | 0:e1265f6b3565 | 218 | // 出力処理側のISRなどに割り込まれ、失敗するケースもある |
sankichi | 0:e1265f6b3565 | 219 | // |
sankichi | 0:e1265f6b3565 | 220 | // |
sankichi | 0:e1265f6b3565 | 221 | _AnalogReadFailCounter++; |
sankichi | 0:e1265f6b3565 | 222 | |
sankichi | 0:e1265f6b3565 | 223 | // この値を大きくすると、一時的なデジタルスティック化は避けられるが |
sankichi | 0:e1265f6b3565 | 224 | // DIGITAL/ANALOG切り替えスイッチへの追従が遅れる |
sankichi | 0:e1265f6b3565 | 225 | if(_AnalogReadFailCounter > 10) |
sankichi | 0:e1265f6b3565 | 226 | { |
sankichi | 0:e1265f6b3565 | 227 | // この時点でstate==0なら、未接続/デジタルモード |
sankichi | 0:e1265f6b3565 | 228 | _InputStatus->InputDeviceType = NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL; |
sankichi | 0:e1265f6b3565 | 229 | led11 = 0; |
sankichi | 0:e1265f6b3565 | 230 | DigitalModeReader(); |
sankichi | 0:e1265f6b3565 | 231 | |
sankichi | 0:e1265f6b3565 | 232 | if(_AnalogReadFailCounter>1000) |
sankichi | 0:e1265f6b3565 | 233 | { |
sankichi | 0:e1265f6b3565 | 234 | _AnalogReadFailCounter = 10; |
sankichi | 0:e1265f6b3565 | 235 | } |
sankichi | 0:e1265f6b3565 | 236 | } |
sankichi | 0:e1265f6b3565 | 237 | } |
sankichi | 0:e1265f6b3565 | 238 | } |
sankichi | 0:e1265f6b3565 | 239 | } |
sankichi | 0:e1265f6b3565 | 240 | |
sankichi | 0:e1265f6b3565 | 241 | |
sankichi | 0:e1265f6b3565 | 242 | // |
sankichi | 0:e1265f6b3565 | 243 | // Disable polling |
sankichi | 0:e1265f6b3565 | 244 | // |
sankichi | 0:e1265f6b3565 | 245 | void In_CyberStick::DisablePolling(void) |
sankichi | 0:e1265f6b3565 | 246 | { |
sankichi | 0:e1265f6b3565 | 247 | _PollingTicker.detach(); |
sankichi | 0:e1265f6b3565 | 248 | |
sankichi | 0:e1265f6b3565 | 249 | //Enable/DisableInput()を頻繁に呼ぶと、デジアナモード判定が乱れる問題対策 |
sankichi | 0:e1265f6b3565 | 250 | if( _ReadEnable ) |
sankichi | 0:e1265f6b3565 | 251 | { |
sankichi | 0:e1265f6b3565 | 252 | } |
sankichi | 0:e1265f6b3565 | 253 | } |
sankichi | 0:e1265f6b3565 | 254 | |
sankichi | 0:e1265f6b3565 | 255 | |
sankichi | 0:e1265f6b3565 | 256 | |
sankichi | 0:e1265f6b3565 | 257 | // |
sankichi | 0:e1265f6b3565 | 258 | // デジタルモードでの読み取り処理 |
sankichi | 0:e1265f6b3565 | 259 | // |
sankichi | 0:e1265f6b3565 | 260 | void In_CyberStick::DigitalModeReader(void) |
sankichi | 0:e1265f6b3565 | 261 | { |
sankichi | 0:e1265f6b3565 | 262 | int btnData = _InputStatus->Buttons; |
sankichi | 0:e1265f6b3565 | 263 | |
sankichi | 0:e1265f6b3565 | 264 | // PC4=“0” |
sankichi | 0:e1265f6b3565 | 265 | _OUT_REQ = 0; |
sankichi | 0:e1265f6b3565 | 266 | wait_us(1); |
sankichi | 0:e1265f6b3565 | 267 | |
sankichi | 0:e1265f6b3565 | 268 | btnData = |
sankichi | 0:e1265f6b3565 | 269 | (_IN_D0? 0x02000 : 0) | // Up |
sankichi | 0:e1265f6b3565 | 270 | (_IN_D1? 0x01000 : 0) | // Down |
sankichi | 0:e1265f6b3565 | 271 | (_IN_D2? 0x00800 : 0) | // Left |
sankichi | 0:e1265f6b3565 | 272 | (_IN_D3? 0x00400 : 0) | // Right |
sankichi | 0:e1265f6b3565 | 273 | (_IN_LH? 0x00200 : 0) | // A |
sankichi | 0:e1265f6b3565 | 274 | (_IN_ACK? 0x00100 : 0) | // B |
sankichi | 0:e1265f6b3565 | 275 | ((_IN_D2==0 && _IN_D3==0)? 0 : 0x02) | // F(Start) |
sankichi | 0:e1265f6b3565 | 276 | ((_IN_D0==0 && _IN_D1==0)? 0 : 0x01) ; // G(Select) |
sankichi | 0:e1265f6b3565 | 277 | |
sankichi | 0:e1265f6b3565 | 278 | /* |
sankichi | 0:e1265f6b3565 | 279 | // デジタルモードのとき、サイバースティックは |
sankichi | 0:e1265f6b3565 | 280 | // Start,Selectの情報は得られない。 |
sankichi | 0:e1265f6b3565 | 281 | // カブトガニのF(Start),G(Select)については、 |
sankichi | 0:e1265f6b3565 | 282 | // F=LR同時押し、G=UD同時押しとして認識される。 |
sankichi | 0:e1265f6b3565 | 283 | */ |
sankichi | 0:e1265f6b3565 | 284 | |
sankichi | 0:e1265f6b3565 | 285 | // PC4=“1” |
sankichi | 0:e1265f6b3565 | 286 | _OUT_REQ = 1; |
sankichi | 0:e1265f6b3565 | 287 | wait_us(1); |
sankichi | 0:e1265f6b3565 | 288 | |
sankichi | 0:e1265f6b3565 | 289 | btnData = btnData | |
sankichi | 0:e1265f6b3565 | 290 | (_IN_D0? 0x08000 : 0) | // Throt Up |
sankichi | 0:e1265f6b3565 | 291 | (_IN_D1? 0x04000 : 0) | // Throt Down |
sankichi | 0:e1265f6b3565 | 292 | (_IN_D2? 0x00020 : 0) | // C |
sankichi | 0:e1265f6b3565 | 293 | (_IN_D3? 0x00010 : 0) | // D |
sankichi | 0:e1265f6b3565 | 294 | (_IN_LH? 0x00008 : 0) | // E1 |
sankichi | 0:e1265f6b3565 | 295 | (_IN_ACK? 0x00004 : 0) | // E2 |
sankichi | 0:e1265f6b3565 | 296 | 0xc0; //A'B'は常にOFF |
sankichi | 0:e1265f6b3565 | 297 | |
sankichi | 0:e1265f6b3565 | 298 | _InputStatus->Buttons = btnData; |
sankichi | 0:e1265f6b3565 | 299 | } |
sankichi | 0:e1265f6b3565 | 300 | |
sankichi | 0:e1265f6b3565 | 301 | // |
sankichi | 0:e1265f6b3565 | 302 | //ReadPinValue (Pin status -> Class value) |
sankichi | 0:e1265f6b3565 | 303 | // |
sankichi | 0:e1265f6b3565 | 304 | int In_CyberStick::ReadPinValue() |
sankichi | 0:e1265f6b3565 | 305 | { |
sankichi | 0:e1265f6b3565 | 306 | return ( _IN_D0 | (_IN_D1<<1) | (_IN_D2<<2) | (_IN_D3<<3) ); |
sankichi | 0:e1265f6b3565 | 307 | } |
sankichi | 0:e1265f6b3565 | 308 | |
sankichi | 0:e1265f6b3565 | 309 | |
sankichi | 0:e1265f6b3565 | 310 | |
sankichi | 0:e1265f6b3565 | 311 | |
sankichi | 0:e1265f6b3565 | 312 | |
sankichi | 0:e1265f6b3565 | 313 | |
sankichi | 0:e1265f6b3565 | 314 | |
sankichi | 0:e1265f6b3565 | 315 | // |
sankichi | 0:e1265f6b3565 | 316 | // あるデータフェーズのデータを読み取り、格納 |
sankichi | 0:e1265f6b3565 | 317 | // |
sankichi | 0:e1265f6b3565 | 318 | void In_CyberStick::ReadPhase(char phase) |
sankichi | 0:e1265f6b3565 | 319 | { |
sankichi | 0:e1265f6b3565 | 320 | int readVal = ReadPinValue(); |
sankichi | 0:e1265f6b3565 | 321 | |
sankichi | 0:e1265f6b3565 | 322 | switch(phase) |
sankichi | 0:e1265f6b3565 | 323 | { |
sankichi | 0:e1265f6b3565 | 324 | case 0: |
sankichi | 0:e1265f6b3565 | 325 | // Ack No.1 |
sankichi | 0:e1265f6b3565 | 326 | _Buttons = |
sankichi | 0:e1265f6b3565 | 327 | (_Buttons & 0xfffffccf) | // mask bit9,8,5,4 |
sankichi | 0:e1265f6b3565 | 328 | ((readVal & 0x0c)<<6) | // AB(bit3 & 2) |
sankichi | 0:e1265f6b3565 | 329 | ((readVal & 0x03)<<4) ; // CD(bit1 & 0) |
sankichi | 0:e1265f6b3565 | 330 | break; |
sankichi | 0:e1265f6b3565 | 331 | |
sankichi | 0:e1265f6b3565 | 332 | case 1: |
sankichi | 0:e1265f6b3565 | 333 | // Ack No.2 |
sankichi | 0:e1265f6b3565 | 334 | _Buttons = |
sankichi | 0:e1265f6b3565 | 335 | (_Buttons & 0xfffffff0) | // mask bit3,2,1,0 |
sankichi | 0:e1265f6b3565 | 336 | (readVal & 0x0f) ; // E1E2FG(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 337 | break; |
sankichi | 0:e1265f6b3565 | 338 | |
sankichi | 0:e1265f6b3565 | 339 | case 2: |
sankichi | 0:e1265f6b3565 | 340 | // Ack No.3 |
sankichi | 0:e1265f6b3565 | 341 | _Ch0 = |
sankichi | 0:e1265f6b3565 | 342 | (_Ch0 & 0x0f) | // mask upper 4 bits |
sankichi | 0:e1265f6b3565 | 343 | (readVal & 0x0f)<<4 ; // 1H(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 344 | break; |
sankichi | 0:e1265f6b3565 | 345 | |
sankichi | 0:e1265f6b3565 | 346 | case 3: |
sankichi | 0:e1265f6b3565 | 347 | // Ack No.4 |
sankichi | 0:e1265f6b3565 | 348 | _Ch1 = |
sankichi | 0:e1265f6b3565 | 349 | (_Ch1 & 0x0f) | // mask upper 4 bits |
sankichi | 0:e1265f6b3565 | 350 | (readVal & 0x0f)<<4 ; // 2H(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 351 | break; |
sankichi | 0:e1265f6b3565 | 352 | |
sankichi | 0:e1265f6b3565 | 353 | case 4: |
sankichi | 0:e1265f6b3565 | 354 | // Ack No.5 |
sankichi | 0:e1265f6b3565 | 355 | _Ch2 = |
sankichi | 0:e1265f6b3565 | 356 | (_Ch2 & 0x0f) | // mask upper 4 bits |
sankichi | 0:e1265f6b3565 | 357 | (readVal & 0x0f)<<4 ; // 3H(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 358 | break; |
sankichi | 0:e1265f6b3565 | 359 | |
sankichi | 0:e1265f6b3565 | 360 | case 5: |
sankichi | 0:e1265f6b3565 | 361 | // Ack No.6 |
sankichi | 0:e1265f6b3565 | 362 | _Ch3 = |
sankichi | 0:e1265f6b3565 | 363 | (_Ch3 & 0x0f) | // mask upper 4 bits |
sankichi | 0:e1265f6b3565 | 364 | (readVal & 0x0f)<<4 ; // 4H(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 365 | break; |
sankichi | 0:e1265f6b3565 | 366 | |
sankichi | 0:e1265f6b3565 | 367 | case 6: |
sankichi | 0:e1265f6b3565 | 368 | // Ack No.7 |
sankichi | 0:e1265f6b3565 | 369 | _Ch0 = |
sankichi | 0:e1265f6b3565 | 370 | (_Ch0 & 0xf0) | // mask lower 4 bits |
sankichi | 0:e1265f6b3565 | 371 | (readVal & 0x0f) ; // 1L(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 372 | break; |
sankichi | 0:e1265f6b3565 | 373 | |
sankichi | 0:e1265f6b3565 | 374 | case 7: |
sankichi | 0:e1265f6b3565 | 375 | // Ack No.8 |
sankichi | 0:e1265f6b3565 | 376 | _Ch1 = |
sankichi | 0:e1265f6b3565 | 377 | (_Ch1 & 0xf0) | // mask lower 4 bits |
sankichi | 0:e1265f6b3565 | 378 | (readVal & 0x0f) ; // 2L(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 379 | break; |
sankichi | 0:e1265f6b3565 | 380 | |
sankichi | 0:e1265f6b3565 | 381 | case 8: |
sankichi | 0:e1265f6b3565 | 382 | // Ack No.9 |
sankichi | 0:e1265f6b3565 | 383 | _Ch2 = |
sankichi | 0:e1265f6b3565 | 384 | (_Ch2 & 0xf0) | // mask lower 4 bits |
sankichi | 0:e1265f6b3565 | 385 | (readVal & 0x0f) ; // 3L(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 386 | break; |
sankichi | 0:e1265f6b3565 | 387 | |
sankichi | 0:e1265f6b3565 | 388 | case 9: |
sankichi | 0:e1265f6b3565 | 389 | // Ack No.10 |
sankichi | 0:e1265f6b3565 | 390 | _Ch3 = |
sankichi | 0:e1265f6b3565 | 391 | (_Ch3 & 0xf0) | // mask lower 4 bits |
sankichi | 0:e1265f6b3565 | 392 | (readVal & 0x0f) ; // 4L(bit3 & 2 & 1 & 0) |
sankichi | 0:e1265f6b3565 | 393 | break; |
sankichi | 0:e1265f6b3565 | 394 | |
sankichi | 0:e1265f6b3565 | 395 | case 10: |
sankichi | 0:e1265f6b3565 | 396 | // Ack No.11 |
sankichi | 0:e1265f6b3565 | 397 | _Buttons = |
sankichi | 0:e1265f6b3565 | 398 | (_Buttons & 0xffffff3f) | // mask bit7,6 |
sankichi | 0:e1265f6b3565 | 399 | ((readVal & 0x03)<<6) ; // A+A', B+B'(bit1 & 0) |
sankichi | 0:e1265f6b3565 | 400 | break; |
sankichi | 0:e1265f6b3565 | 401 | |
sankichi | 0:e1265f6b3565 | 402 | default: |
sankichi | 0:e1265f6b3565 | 403 | break; |
sankichi | 0:e1265f6b3565 | 404 | } |
sankichi | 0:e1265f6b3565 | 405 | } |
sankichi | 0:e1265f6b3565 | 406 | |
sankichi | 0:e1265f6b3565 | 407 | |
sankichi | 0:e1265f6b3565 | 408 | // |
sankichi | 0:e1265f6b3565 | 409 | // Analogスティック情報を確定 |
sankichi | 0:e1265f6b3565 | 410 | // |
sankichi | 0:e1265f6b3565 | 411 | void In_CyberStick::CommitAnalogData(void) |
sankichi | 0:e1265f6b3565 | 412 | { |
sankichi | 0:e1265f6b3565 | 413 | //サイバースティックアナログモードで使わないボタンをビット強制ON |
sankichi | 0:e1265f6b3565 | 414 | // ThrotUp |ThrotDw | Up | Dw || Lf | Rg |
sankichi | 0:e1265f6b3565 | 415 | _Buttons = (_Buttons) | 0x0000fc00; |
sankichi | 0:e1265f6b3565 | 416 | |
sankichi | 0:e1265f6b3565 | 417 | _InputStatus->Buttons = _Buttons; |
sankichi | 0:e1265f6b3565 | 418 | _InputStatus->Ch0 = _Ch0; |
sankichi | 0:e1265f6b3565 | 419 | _InputStatus->Ch1 = _Ch1; |
sankichi | 0:e1265f6b3565 | 420 | _InputStatus->Ch2 = _Ch2; |
sankichi | 0:e1265f6b3565 | 421 | _InputStatus->Ch3 = _Ch3; |
sankichi | 0:e1265f6b3565 | 422 | } |