First Release

Dependencies:   USBDevice

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?

UserRevisionLine numberNew 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 }