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 "mbed.h"
sankichi 0:e1265f6b3565 2 #include "NiseKabuto.h" // InputDeviceType
sankichi 0:e1265f6b3565 3 #include "C_Out_FC.h"
sankichi 0:e1265f6b3565 4
sankichi 0:e1265f6b3565 5 // mbed pins
sankichi 0:e1265f6b3565 6 DigitalOut led2_FC(LED2);
sankichi 0:e1265f6b3565 7 DigitalOut led3_FC(LED3);
sankichi 0:e1265f6b3565 8 InterruptIn *_INTR_LATCH;
sankichi 0:e1265f6b3565 9 DigitalOut *_OUT_DATA;
sankichi 0:e1265f6b3565 10 InterruptIn *_INTR_CLOCK;
sankichi 0:e1265f6b3565 11 InterruptIn *_INTR_POWDETECT;
sankichi 0:e1265f6b3565 12
sankichi 0:e1265f6b3565 13 // File local variables
sankichi 0:e1265f6b3565 14 static volatile int *_pButtons; //PhaseData[12]
sankichi 0:e1265f6b3565 15 static volatile char *_pCh0;
sankichi 0:e1265f6b3565 16 static volatile char *_pCh1;
sankichi 0:e1265f6b3565 17 static volatile char *_pCh2;
sankichi 0:e1265f6b3565 18 static volatile char *_pInputDeviceType;
sankichi 0:e1265f6b3565 19 static volatile char _Flag_NowOutput;
sankichi 0:e1265f6b3565 20 static volatile char _PhaseCounter;
sankichi 0:e1265f6b3565 21 static volatile char _SpeedType;
sankichi 0:e1265f6b3565 22 static FunctionPointer *_fp_EnableInput;
sankichi 0:e1265f6b3565 23 static FunctionPointer *_fp_DisableInput;
sankichi 0:e1265f6b3565 24 static volatile char _RapidFireValue;
sankichi 0:e1265f6b3565 25 static Ticker _RapidStateTicker;
sankichi 0:e1265f6b3565 26
sankichi 0:e1265f6b3565 27 // Const variables
sankichi 0:e1265f6b3565 28 static const int DIGITALPAD_SPEED_STARFORCE = 120;
sankichi 0:e1265f6b3565 29 static const int DIGITALPAD_SPEED_RECCA = 75;
sankichi 0:e1265f6b3565 30 static const int RAPIDFIRE_PER_SEC = 15; // 高橋名人連射速度-1
sankichi 0:e1265f6b3565 31
sankichi 0:e1265f6b3565 32 // File local functions
sankichi 0:e1265f6b3565 33 static void ISR_Rise_LATCH_STARFORCE(void); // 遅い読み取りルーチン for スターフォース
sankichi 0:e1265f6b3565 34 static void ISR_Rise_LATCH(void); // フツー
sankichi 0:e1265f6b3565 35 static void ISR_Rise_LATCH_RECCA(void); // 速い読み取りルーチン for サマーカーニバル'92 烈火
sankichi 0:e1265f6b3565 36 //static void ISR_Rise_POWERDETECT(void);
sankichi 0:e1265f6b3565 37 static void RenewData(void);
sankichi 0:e1265f6b3565 38 static char CheckSpeedType(void);
sankichi 0:e1265f6b3565 39 static int CheckOneReadTime(void);
sankichi 0:e1265f6b3565 40 static void ConfigureSpeed(void);
sankichi 0:e1265f6b3565 41 static void RapidStateTickerMethod(void);
sankichi 0:e1265f6b3565 42
sankichi 0:e1265f6b3565 43 void C_Out_FC_Initialize(
sankichi 0:e1265f6b3565 44 InterruptIn *intr_LATCH,
sankichi 0:e1265f6b3565 45 DigitalOut *out_DATA,
sankichi 0:e1265f6b3565 46 InterruptIn *intr_CLOCK,
sankichi 0:e1265f6b3565 47 InterruptIn *intr_POWDETECT,
sankichi 0:e1265f6b3565 48 volatile int *pButtons,
sankichi 0:e1265f6b3565 49 volatile char *pCh0,
sankichi 0:e1265f6b3565 50 volatile char *pCh1,
sankichi 0:e1265f6b3565 51 volatile char *pCh2,
sankichi 0:e1265f6b3565 52 volatile char *pInputDeviceType,
sankichi 0:e1265f6b3565 53 FunctionPointer *pFunc_InputEnable,
sankichi 0:e1265f6b3565 54 FunctionPointer *pFunc_InputDisable
sankichi 0:e1265f6b3565 55 )
sankichi 0:e1265f6b3565 56 {
sankichi 0:e1265f6b3565 57 // 入出力pin
sankichi 0:e1265f6b3565 58 _INTR_LATCH = intr_LATCH;
sankichi 0:e1265f6b3565 59 _OUT_DATA = out_DATA;
sankichi 0:e1265f6b3565 60 _INTR_CLOCK = intr_CLOCK;
sankichi 0:e1265f6b3565 61 _INTR_POWDETECT = intr_POWDETECT;
sankichi 0:e1265f6b3565 62
sankichi 0:e1265f6b3565 63 // 割り込み設定
sankichi 0:e1265f6b3565 64 //_INTR_POWDETECT->rise(&ISR_Rise_POWERDETECT); // 電源ON/OFFでスピード切り替え判定を行う場合
sankichi 0:e1265f6b3565 65
sankichi 0:e1265f6b3565 66 led2_FC.write(0); // 初期:フツー
sankichi 0:e1265f6b3565 67 led3_FC.write(1); //
sankichi 0:e1265f6b3565 68 _INTR_LATCH->rise(&ISR_Rise_LATCH); //
sankichi 0:e1265f6b3565 69
sankichi 0:e1265f6b3565 70 // 出力速度設定
sankichi 0:e1265f6b3565 71 ConfigureSpeed();
sankichi 0:e1265f6b3565 72
sankichi 0:e1265f6b3565 73 // ポインタ
sankichi 0:e1265f6b3565 74 _pButtons = pButtons;
sankichi 0:e1265f6b3565 75 _pCh0 = pCh0;
sankichi 0:e1265f6b3565 76 _pCh1 = pCh1;
sankichi 0:e1265f6b3565 77 _pCh2 = pCh2;
sankichi 0:e1265f6b3565 78 _pInputDeviceType = pInputDeviceType;
sankichi 0:e1265f6b3565 79 _fp_EnableInput = pFunc_InputEnable;
sankichi 0:e1265f6b3565 80 _fp_DisableInput = pFunc_InputDisable;
sankichi 0:e1265f6b3565 81
sankichi 0:e1265f6b3565 82 _Flag_NowOutput = 0;
sankichi 0:e1265f6b3565 83 _RapidFireValue = 1;
sankichi 0:e1265f6b3565 84
sankichi 0:e1265f6b3565 85 //_pTemp = pTemp;
sankichi 0:e1265f6b3565 86
sankichi 0:e1265f6b3565 87 // 連射ステータス変更設定
sankichi 0:e1265f6b3565 88 _RapidStateTicker.attach_us(&RapidStateTickerMethod, (int)(1000000/(RAPIDFIRE_PER_SEC*2)));
sankichi 0:e1265f6b3565 89
sankichi 0:e1265f6b3565 90 // Initialize pin status
sankichi 0:e1265f6b3565 91 _PhaseCounter = 0;
sankichi 0:e1265f6b3565 92 RenewData();
sankichi 0:e1265f6b3565 93 }
sankichi 0:e1265f6b3565 94
sankichi 0:e1265f6b3565 95 void ISR_Rise_LATCH(void)
sankichi 0:e1265f6b3565 96 {
sankichi 0:e1265f6b3565 97 int loopCounter;
sankichi 0:e1265f6b3565 98
sankichi 0:e1265f6b3565 99 // 止める
sankichi 0:e1265f6b3565 100 if(
sankichi 0:e1265f6b3565 101 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG ||
sankichi 0:e1265f6b3565 102 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL
sankichi 0:e1265f6b3565 103 )
sankichi 0:e1265f6b3565 104 {
sankichi 0:e1265f6b3565 105 (*_fp_DisableInput).call();
sankichi 0:e1265f6b3565 106 }
sankichi 0:e1265f6b3565 107
sankichi 0:e1265f6b3565 108 // この関数開始時点で、phase0読み取り(DATAの立下り1回分)は
sankichi 0:e1265f6b3565 109 // 終了しているものと仮定する
sankichi 0:e1265f6b3565 110 // (mbedのピン割り込み時の反応速度は7usくらい)
sankichi 0:e1265f6b3565 111 //
sankichi 0:e1265f6b3565 112 // ただしMetalMaxでは。Latch立ち上がりから初回DATA立下りの間が
sankichi 0:e1265f6b3565 113 // 6.5-7.0usくらいで微妙なので、
sankichi 0:e1265f6b3565 114 // 絶対にphase0から開始することを保証するため、ちょっと待つ
sankichi 0:e1265f6b3565 115 wait_us(1);
sankichi 0:e1265f6b3565 116
sankichi 0:e1265f6b3565 117
sankichi 0:e1265f6b3565 118 // Phase1に移行
sankichi 0:e1265f6b3565 119 _PhaseCounter=1;
sankichi 0:e1265f6b3565 120 RenewData();
sankichi 0:e1265f6b3565 121
sankichi 0:e1265f6b3565 122 // Lの間待つ
sankichi 0:e1265f6b3565 123 while( !(_INTR_CLOCK->read()) )
sankichi 0:e1265f6b3565 124 {
sankichi 0:e1265f6b3565 125 loopCounter = 400;
sankichi 0:e1265f6b3565 126
sankichi 0:e1265f6b3565 127 loopCounter--;
sankichi 0:e1265f6b3565 128 if( !loopCounter )
sankichi 0:e1265f6b3565 129 {
sankichi 0:e1265f6b3565 130 break;
sankichi 0:e1265f6b3565 131 }
sankichi 0:e1265f6b3565 132 }
sankichi 0:e1265f6b3565 133
sankichi 0:e1265f6b3565 134 // 開始
sankichi 0:e1265f6b3565 135 for(int i=1; i<8; i++ )
sankichi 0:e1265f6b3565 136 {
sankichi 0:e1265f6b3565 137
sankichi 0:e1265f6b3565 138 // Hの間待つ
sankichi 0:e1265f6b3565 139 loopCounter = 5000;
sankichi 0:e1265f6b3565 140 while( _INTR_CLOCK->read() )
sankichi 0:e1265f6b3565 141 {
sankichi 0:e1265f6b3565 142 loopCounter--;
sankichi 0:e1265f6b3565 143 if( !loopCounter )
sankichi 0:e1265f6b3565 144 {
sankichi 0:e1265f6b3565 145 break;
sankichi 0:e1265f6b3565 146 }
sankichi 0:e1265f6b3565 147 }
sankichi 0:e1265f6b3565 148
sankichi 0:e1265f6b3565 149 // Set data for current phase
sankichi 0:e1265f6b3565 150 _PhaseCounter++;
sankichi 0:e1265f6b3565 151 RenewData();
sankichi 0:e1265f6b3565 152
sankichi 0:e1265f6b3565 153 // Lの間待つ
sankichi 0:e1265f6b3565 154 loopCounter = 200;
sankichi 0:e1265f6b3565 155 while( !(_INTR_CLOCK->read()) )
sankichi 0:e1265f6b3565 156 {
sankichi 0:e1265f6b3565 157 loopCounter--;
sankichi 0:e1265f6b3565 158 if( !loopCounter )
sankichi 0:e1265f6b3565 159 {
sankichi 0:e1265f6b3565 160 break;
sankichi 0:e1265f6b3565 161 }
sankichi 0:e1265f6b3565 162 }
sankichi 0:e1265f6b3565 163 }
sankichi 0:e1265f6b3565 164
sankichi 0:e1265f6b3565 165 _PhaseCounter = 0;
sankichi 0:e1265f6b3565 166 RenewData();
sankichi 0:e1265f6b3565 167
sankichi 0:e1265f6b3565 168 // 再開
sankichi 0:e1265f6b3565 169 if(
sankichi 0:e1265f6b3565 170 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG ||
sankichi 0:e1265f6b3565 171 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL
sankichi 0:e1265f6b3565 172 )
sankichi 0:e1265f6b3565 173 {
sankichi 0:e1265f6b3565 174 (*_fp_EnableInput).call();
sankichi 0:e1265f6b3565 175 }
sankichi 0:e1265f6b3565 176
sankichi 0:e1265f6b3565 177 }
sankichi 0:e1265f6b3565 178
sankichi 0:e1265f6b3565 179 void ISR_Rise_LATCH_RECCA(void)
sankichi 0:e1265f6b3565 180 {
sankichi 0:e1265f6b3565 181 // おまじない(Phase0を長引かせる)
sankichi 0:e1265f6b3565 182 wait_us(2);
sankichi 0:e1265f6b3565 183
sankichi 0:e1265f6b3565 184 // Phase1に移行
sankichi 0:e1265f6b3565 185 _PhaseCounter=1;
sankichi 0:e1265f6b3565 186 RenewData();
sankichi 0:e1265f6b3565 187
sankichi 0:e1265f6b3565 188 // 開始
sankichi 0:e1265f6b3565 189 for(int i=1; i<8; i++ )
sankichi 0:e1265f6b3565 190 {
sankichi 0:e1265f6b3565 191 wait_us(6);
sankichi 0:e1265f6b3565 192
sankichi 0:e1265f6b3565 193 // Set data for current phase
sankichi 0:e1265f6b3565 194 _PhaseCounter++;
sankichi 0:e1265f6b3565 195 RenewData();
sankichi 0:e1265f6b3565 196 }
sankichi 0:e1265f6b3565 197
sankichi 0:e1265f6b3565 198 _PhaseCounter = 0;
sankichi 0:e1265f6b3565 199 RenewData();
sankichi 0:e1265f6b3565 200
sankichi 0:e1265f6b3565 201 }
sankichi 0:e1265f6b3565 202
sankichi 0:e1265f6b3565 203 // 遅い読み取りルーチン
sankichi 0:e1265f6b3565 204 void ISR_Rise_LATCH_STARFORCE(void)
sankichi 0:e1265f6b3565 205 {
sankichi 0:e1265f6b3565 206 int loopCounter;
sankichi 0:e1265f6b3565 207
sankichi 0:e1265f6b3565 208 // 止める
sankichi 0:e1265f6b3565 209 if(
sankichi 0:e1265f6b3565 210 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG ||
sankichi 0:e1265f6b3565 211 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL
sankichi 0:e1265f6b3565 212 )
sankichi 0:e1265f6b3565 213 {
sankichi 0:e1265f6b3565 214 (*_fp_DisableInput).call();
sankichi 0:e1265f6b3565 215 }
sankichi 0:e1265f6b3565 216
sankichi 0:e1265f6b3565 217 // Hの間待つ
sankichi 0:e1265f6b3565 218 loopCounter = 5000;
sankichi 0:e1265f6b3565 219 while( _INTR_CLOCK->read() )
sankichi 0:e1265f6b3565 220 {
sankichi 0:e1265f6b3565 221 loopCounter--;
sankichi 0:e1265f6b3565 222 if( !loopCounter )
sankichi 0:e1265f6b3565 223 {
sankichi 0:e1265f6b3565 224 break;
sankichi 0:e1265f6b3565 225 }
sankichi 0:e1265f6b3565 226 }
sankichi 0:e1265f6b3565 227
sankichi 0:e1265f6b3565 228
sankichi 0:e1265f6b3565 229 // Phase1に移行
sankichi 0:e1265f6b3565 230 _PhaseCounter=1;
sankichi 0:e1265f6b3565 231 RenewData();
sankichi 0:e1265f6b3565 232
sankichi 0:e1265f6b3565 233 // Lの間待つ
sankichi 0:e1265f6b3565 234 while( !(_INTR_CLOCK->read()) )
sankichi 0:e1265f6b3565 235 {
sankichi 0:e1265f6b3565 236 loopCounter = 400;
sankichi 0:e1265f6b3565 237
sankichi 0:e1265f6b3565 238 loopCounter--;
sankichi 0:e1265f6b3565 239 if( !loopCounter )
sankichi 0:e1265f6b3565 240 {
sankichi 0:e1265f6b3565 241 break;
sankichi 0:e1265f6b3565 242 }
sankichi 0:e1265f6b3565 243 }
sankichi 0:e1265f6b3565 244
sankichi 0:e1265f6b3565 245 // 開始
sankichi 0:e1265f6b3565 246 for(int i=1; i<8; i++ )
sankichi 0:e1265f6b3565 247 {
sankichi 0:e1265f6b3565 248
sankichi 0:e1265f6b3565 249 // Hの間待つ
sankichi 0:e1265f6b3565 250 loopCounter = 5000;
sankichi 0:e1265f6b3565 251 while( _INTR_CLOCK->read() )
sankichi 0:e1265f6b3565 252 {
sankichi 0:e1265f6b3565 253 loopCounter--;
sankichi 0:e1265f6b3565 254 if( !loopCounter )
sankichi 0:e1265f6b3565 255 {
sankichi 0:e1265f6b3565 256 break;
sankichi 0:e1265f6b3565 257 }
sankichi 0:e1265f6b3565 258 }
sankichi 0:e1265f6b3565 259
sankichi 0:e1265f6b3565 260 // Set data for current phase
sankichi 0:e1265f6b3565 261 _PhaseCounter++;
sankichi 0:e1265f6b3565 262 RenewData();
sankichi 0:e1265f6b3565 263
sankichi 0:e1265f6b3565 264 // Lの間待つ
sankichi 0:e1265f6b3565 265 loopCounter = 200;
sankichi 0:e1265f6b3565 266 while( !(_INTR_CLOCK->read()) )
sankichi 0:e1265f6b3565 267 {
sankichi 0:e1265f6b3565 268 loopCounter--;
sankichi 0:e1265f6b3565 269 if( !loopCounter )
sankichi 0:e1265f6b3565 270 {
sankichi 0:e1265f6b3565 271 break;
sankichi 0:e1265f6b3565 272 }
sankichi 0:e1265f6b3565 273 }
sankichi 0:e1265f6b3565 274 }
sankichi 0:e1265f6b3565 275
sankichi 0:e1265f6b3565 276 _PhaseCounter = 0;
sankichi 0:e1265f6b3565 277 RenewData();
sankichi 0:e1265f6b3565 278
sankichi 0:e1265f6b3565 279 // 再開
sankichi 0:e1265f6b3565 280 if(
sankichi 0:e1265f6b3565 281 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG ||
sankichi 0:e1265f6b3565 282 (*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL
sankichi 0:e1265f6b3565 283 )
sankichi 0:e1265f6b3565 284 {
sankichi 0:e1265f6b3565 285 (*_fp_EnableInput).call();
sankichi 0:e1265f6b3565 286 }
sankichi 0:e1265f6b3565 287
sankichi 0:e1265f6b3565 288 }
sankichi 0:e1265f6b3565 289
sankichi 0:e1265f6b3565 290
sankichi 0:e1265f6b3565 291
sankichi 0:e1265f6b3565 292
sankichi 0:e1265f6b3565 293 void RenewData(void)
sankichi 0:e1265f6b3565 294 {
sankichi 0:e1265f6b3565 295 switch(_PhaseCounter)
sankichi 0:e1265f6b3565 296 {
sankichi 0:e1265f6b3565 297 case 0:
sankichi 0:e1265f6b3565 298 //
sankichi 0:e1265f6b3565 299 // A
sankichi 0:e1265f6b3565 300 //
sankichi 0:e1265f6b3565 301 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 302 {
sankichi 0:e1265f6b3565 303 _OUT_DATA->write(((*_pButtons) & 0x0100) ? 1 : 0); // Digital B
sankichi 0:e1265f6b3565 304 }
sankichi 0:e1265f6b3565 305 else if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_MD6B) //2:MD6B
sankichi 0:e1265f6b3565 306 {
sankichi 0:e1265f6b3565 307 // Zが押されてたら連射、押されてなかったらCの結果
sankichi 0:e1265f6b3565 308 if( ((*_pButtons) & 0x010000) ) // Z
sankichi 0:e1265f6b3565 309 {
sankichi 0:e1265f6b3565 310 // 真:押されてない
sankichi 0:e1265f6b3565 311 _OUT_DATA->write(((*_pButtons) & 0x0020) ? 1 : 0); // Digital C
sankichi 0:e1265f6b3565 312 }
sankichi 0:e1265f6b3565 313 else
sankichi 0:e1265f6b3565 314 {
sankichi 0:e1265f6b3565 315 // 偽:押されてる
sankichi 0:e1265f6b3565 316 _OUT_DATA->write(_RapidFireValue&1);
sankichi 0:e1265f6b3565 317 }
sankichi 0:e1265f6b3565 318 }
sankichi 0:e1265f6b3565 319 else
sankichi 0:e1265f6b3565 320 {
sankichi 0:e1265f6b3565 321 _OUT_DATA->write(((*_pButtons) & 0x0100) ? 1 : 0); // Digital B
sankichi 0:e1265f6b3565 322 }
sankichi 0:e1265f6b3565 323 break;
sankichi 0:e1265f6b3565 324
sankichi 0:e1265f6b3565 325 case 1:
sankichi 0:e1265f6b3565 326 //
sankichi 0:e1265f6b3565 327 // B
sankichi 0:e1265f6b3565 328 //
sankichi 0:e1265f6b3565 329 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 330 {
sankichi 0:e1265f6b3565 331 _OUT_DATA->write(((*_pButtons) & 0x0200) ? 1 : 0); // Digital A
sankichi 0:e1265f6b3565 332 }
sankichi 0:e1265f6b3565 333 else if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_MD6B) //2:MD6B
sankichi 0:e1265f6b3565 334 {
sankichi 0:e1265f6b3565 335 // Yが押されてたら連射、押されてなかったらBの結果
sankichi 0:e1265f6b3565 336 if( ((*_pButtons) & 0x020000) ) // Y
sankichi 0:e1265f6b3565 337 {
sankichi 0:e1265f6b3565 338 // 真:押されてない
sankichi 0:e1265f6b3565 339 _OUT_DATA->write(((*_pButtons) & 0x0100) ? 1 : 0); // Digital B
sankichi 0:e1265f6b3565 340 }
sankichi 0:e1265f6b3565 341 else
sankichi 0:e1265f6b3565 342 {
sankichi 0:e1265f6b3565 343 // 偽:押されてる
sankichi 0:e1265f6b3565 344 _OUT_DATA->write(_RapidFireValue&1);
sankichi 0:e1265f6b3565 345 }
sankichi 0:e1265f6b3565 346 }
sankichi 0:e1265f6b3565 347 else
sankichi 0:e1265f6b3565 348 {
sankichi 0:e1265f6b3565 349 _OUT_DATA->write(((*_pButtons) & 0x0200) ? 1 : 0); // Digital A
sankichi 0:e1265f6b3565 350 }
sankichi 0:e1265f6b3565 351 break;
sankichi 0:e1265f6b3565 352
sankichi 0:e1265f6b3565 353 case 2:
sankichi 0:e1265f6b3565 354 //
sankichi 0:e1265f6b3565 355 // Select
sankichi 0:e1265f6b3565 356 //
sankichi 0:e1265f6b3565 357 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 358 {
sankichi 0:e1265f6b3565 359 _OUT_DATA->write(((*_pButtons) & 0x0001) ? 1 : 0); // G(Sel,Mode)
sankichi 0:e1265f6b3565 360 }
sankichi 0:e1265f6b3565 361 else if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_MD6B) //2:MD6B
sankichi 0:e1265f6b3565 362 {
sankichi 0:e1265f6b3565 363 _OUT_DATA->write(((*_pButtons) & 0x0001) ? 1 : 0); // G(Sel,Mode)
sankichi 0:e1265f6b3565 364 }
sankichi 0:e1265f6b3565 365 else
sankichi 0:e1265f6b3565 366 {
sankichi 0:e1265f6b3565 367 _OUT_DATA->write(((*_pButtons) & 0x0020) ? 1 : 0); // Digital C
sankichi 0:e1265f6b3565 368 }
sankichi 0:e1265f6b3565 369 break;
sankichi 0:e1265f6b3565 370
sankichi 0:e1265f6b3565 371 case 3:
sankichi 0:e1265f6b3565 372 //
sankichi 0:e1265f6b3565 373 // Start
sankichi 0:e1265f6b3565 374 //
sankichi 0:e1265f6b3565 375 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 376 {
sankichi 0:e1265f6b3565 377 _OUT_DATA->write(
sankichi 0:e1265f6b3565 378 ( ((*_pButtons) & 0x0002) ? 1 : 0) & // F(Start)
sankichi 0:e1265f6b3565 379 ( (*_pCh2)>0xf0? 0:1 ) // スロットル引く
sankichi 0:e1265f6b3565 380
sankichi 0:e1265f6b3565 381 );
sankichi 0:e1265f6b3565 382 //_OUT_DATA->write( ((*_pButtons) & 0x0002) ? 1 : 0) );
sankichi 0:e1265f6b3565 383
sankichi 0:e1265f6b3565 384 }
sankichi 0:e1265f6b3565 385 else if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_MD6B) //2:MD6B
sankichi 0:e1265f6b3565 386 {
sankichi 0:e1265f6b3565 387 _OUT_DATA->write(((*_pButtons) & 0x0002) ? 1 : 0); // F(Start)
sankichi 0:e1265f6b3565 388 }
sankichi 0:e1265f6b3565 389 else
sankichi 0:e1265f6b3565 390 {
sankichi 0:e1265f6b3565 391 _OUT_DATA->write(((*_pButtons) & 0x0010) ? 1 : 0); // Digital C
sankichi 0:e1265f6b3565 392 }
sankichi 0:e1265f6b3565 393 break;
sankichi 0:e1265f6b3565 394
sankichi 0:e1265f6b3565 395 case 4:
sankichi 0:e1265f6b3565 396 //
sankichi 0:e1265f6b3565 397 // Up
sankichi 0:e1265f6b3565 398 //
sankichi 0:e1265f6b3565 399 // ch1>0xf0? 0:1, // 右
sankichi 0:e1265f6b3565 400 // ch1<0x0f? 0:1, // 左
sankichi 0:e1265f6b3565 401 // ch0>0xf0? 0:1, // 下
sankichi 0:e1265f6b3565 402 // ch0<0x0f? 0:1 // 上
sankichi 0:e1265f6b3565 403 // ch2>0xf0? 0:1, // スロットル引く
sankichi 0:e1265f6b3565 404
sankichi 0:e1265f6b3565 405 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 406 {
sankichi 0:e1265f6b3565 407 _OUT_DATA->write((*_pCh0)<0x40? 0:1);
sankichi 0:e1265f6b3565 408 }
sankichi 0:e1265f6b3565 409 else
sankichi 0:e1265f6b3565 410 {
sankichi 0:e1265f6b3565 411 _OUT_DATA->write(((*_pButtons) & 0x2000) ? 1 : 0);
sankichi 0:e1265f6b3565 412 }
sankichi 0:e1265f6b3565 413 break;
sankichi 0:e1265f6b3565 414
sankichi 0:e1265f6b3565 415 case 5:
sankichi 0:e1265f6b3565 416 //
sankichi 0:e1265f6b3565 417 // Down
sankichi 0:e1265f6b3565 418 //
sankichi 0:e1265f6b3565 419 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 420 {
sankichi 0:e1265f6b3565 421 _OUT_DATA->write((*_pCh0)>0xb0? 0:1);
sankichi 0:e1265f6b3565 422 }
sankichi 0:e1265f6b3565 423 else
sankichi 0:e1265f6b3565 424 {
sankichi 0:e1265f6b3565 425 _OUT_DATA->write(((*_pButtons) & 0x1000) ? 1 : 0);
sankichi 0:e1265f6b3565 426 }
sankichi 0:e1265f6b3565 427 break;
sankichi 0:e1265f6b3565 428
sankichi 0:e1265f6b3565 429 case 6:
sankichi 0:e1265f6b3565 430 //
sankichi 0:e1265f6b3565 431 // Left
sankichi 0:e1265f6b3565 432 //
sankichi 0:e1265f6b3565 433 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 434 {
sankichi 0:e1265f6b3565 435 _OUT_DATA->write((*_pCh1)<0x40? 0:1);
sankichi 0:e1265f6b3565 436 }
sankichi 0:e1265f6b3565 437 else
sankichi 0:e1265f6b3565 438 {
sankichi 0:e1265f6b3565 439 _OUT_DATA->write(((*_pButtons) & 0x0800) ? 1 : 0);
sankichi 0:e1265f6b3565 440 }
sankichi 0:e1265f6b3565 441 break;
sankichi 0:e1265f6b3565 442
sankichi 0:e1265f6b3565 443 case 7:
sankichi 0:e1265f6b3565 444 //
sankichi 0:e1265f6b3565 445 // Right
sankichi 0:e1265f6b3565 446 //
sankichi 0:e1265f6b3565 447 if((*_pInputDeviceType) == NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG) //サイバースティック(アナログ)
sankichi 0:e1265f6b3565 448 {
sankichi 0:e1265f6b3565 449 _OUT_DATA->write((*_pCh1)>0xb0? 0:1);
sankichi 0:e1265f6b3565 450 }
sankichi 0:e1265f6b3565 451 else
sankichi 0:e1265f6b3565 452 {
sankichi 0:e1265f6b3565 453 _OUT_DATA->write(((*_pButtons) & 0x0400) ? 1 : 0);
sankichi 0:e1265f6b3565 454 }
sankichi 0:e1265f6b3565 455 break;
sankichi 0:e1265f6b3565 456
sankichi 0:e1265f6b3565 457 default:
sankichi 0:e1265f6b3565 458 _OUT_DATA->write(1); // H
sankichi 0:e1265f6b3565 459 }
sankichi 0:e1265f6b3565 460 }
sankichi 0:e1265f6b3565 461
sankichi 0:e1265f6b3565 462 //
sankichi 0:e1265f6b3565 463 // ファミコンからの読み取り処理の長さを得る(1回分)
sankichi 0:e1265f6b3565 464 //
sankichi 0:e1265f6b3565 465 // return:
sankichi 0:e1265f6b3565 466 // 0 = 読み取りが行えない(烈火の可能性がある)
sankichi 0:e1265f6b3565 467 // 0以外 = 読み取り処理長さ[us]
sankichi 0:e1265f6b3565 468 int CheckOneReadTime(void)
sankichi 0:e1265f6b3565 469 {
sankichi 0:e1265f6b3565 470 int retVal = 0;
sankichi 0:e1265f6b3565 471 char stat = 1;
sankichi 0:e1265f6b3565 472 int intLoopCounter; // ZanacはGunnac&MMに比べて2倍
sankichi 0:e1265f6b3565 473 Timer t;
sankichi 0:e1265f6b3565 474
sankichi 0:e1265f6b3565 475 // Latch = Hまで待つ
sankichi 0:e1265f6b3565 476 intLoopCounter = 500000;
sankichi 0:e1265f6b3565 477 while( !(_INTR_LATCH->read()) )
sankichi 0:e1265f6b3565 478 {
sankichi 0:e1265f6b3565 479 intLoopCounter--;
sankichi 0:e1265f6b3565 480 if( !intLoopCounter )
sankichi 0:e1265f6b3565 481 {
sankichi 0:e1265f6b3565 482 stat = 0;
sankichi 0:e1265f6b3565 483 break;
sankichi 0:e1265f6b3565 484 }
sankichi 0:e1265f6b3565 485 }
sankichi 0:e1265f6b3565 486
sankichi 0:e1265f6b3565 487 if(stat)
sankichi 0:e1265f6b3565 488 {
sankichi 0:e1265f6b3565 489 // 時刻計測開始
sankichi 0:e1265f6b3565 490 t.start();
sankichi 0:e1265f6b3565 491
sankichi 0:e1265f6b3565 492 // Clockが8回Lになることを確認
sankichi 0:e1265f6b3565 493 for(int i=0; i<8; i++ )
sankichi 0:e1265f6b3565 494 {
sankichi 0:e1265f6b3565 495 intLoopCounter = 1000;
sankichi 0:e1265f6b3565 496 while( _INTR_CLOCK->read() )
sankichi 0:e1265f6b3565 497 {
sankichi 0:e1265f6b3565 498 intLoopCounter--;
sankichi 0:e1265f6b3565 499 if( !intLoopCounter )
sankichi 0:e1265f6b3565 500 {
sankichi 0:e1265f6b3565 501 stat = 0;
sankichi 0:e1265f6b3565 502 break;
sankichi 0:e1265f6b3565 503 }
sankichi 0:e1265f6b3565 504 }
sankichi 0:e1265f6b3565 505
sankichi 0:e1265f6b3565 506 intLoopCounter = 100;
sankichi 0:e1265f6b3565 507 while( !(_INTR_CLOCK->read()) )
sankichi 0:e1265f6b3565 508 {
sankichi 0:e1265f6b3565 509 intLoopCounter--;
sankichi 0:e1265f6b3565 510 if( !intLoopCounter )
sankichi 0:e1265f6b3565 511 {
sankichi 0:e1265f6b3565 512 break;
sankichi 0:e1265f6b3565 513 }
sankichi 0:e1265f6b3565 514 }
sankichi 0:e1265f6b3565 515 }
sankichi 0:e1265f6b3565 516 }
sankichi 0:e1265f6b3565 517
sankichi 0:e1265f6b3565 518 if(stat)
sankichi 0:e1265f6b3565 519 {
sankichi 0:e1265f6b3565 520 t.stop();
sankichi 0:e1265f6b3565 521 retVal = t.read_us();
sankichi 0:e1265f6b3565 522 }
sankichi 0:e1265f6b3565 523
sankichi 0:e1265f6b3565 524 return retVal;
sankichi 0:e1265f6b3565 525 }
sankichi 0:e1265f6b3565 526
sankichi 0:e1265f6b3565 527
sankichi 0:e1265f6b3565 528
sankichi 0:e1265f6b3565 529 //
sankichi 0:e1265f6b3565 530 // SpeedTypeを判定する
sankichi 0:e1265f6b3565 531 //
sankichi 0:e1265f6b3565 532 // return:
sankichi 0:e1265f6b3565 533 // 0 = 普通モード(普通のゲーム)
sankichi 0:e1265f6b3565 534 // 1 = 高速モード(烈火)
sankichi 0:e1265f6b3565 535 // 2 = 低速モード(スターフォース)
sankichi 0:e1265f6b3565 536 // よくわからないときは0を返す
sankichi 0:e1265f6b3565 537 char CheckSpeedType(void)
sankichi 0:e1265f6b3565 538 {
sankichi 0:e1265f6b3565 539 char retVal = 0;
sankichi 0:e1265f6b3565 540 int readTime[8];
sankichi 0:e1265f6b3565 541 char counter_recca = 0;
sankichi 0:e1265f6b3565 542 char counter_starforce = 0;
sankichi 0:e1265f6b3565 543
sankichi 0:e1265f6b3565 544 // Dataは常にH
sankichi 0:e1265f6b3565 545 _OUT_DATA->write(1);
sankichi 0:e1265f6b3565 546
sankichi 0:e1265f6b3565 547 // 8回くらいチェックする
sankichi 0:e1265f6b3565 548 for(int i=0; i<8; i++ )
sankichi 0:e1265f6b3565 549 {
sankichi 0:e1265f6b3565 550 readTime[i] = CheckOneReadTime();
sankichi 0:e1265f6b3565 551 printf("readTime[%d]: %d\r\n",i,readTime[i]);
sankichi 0:e1265f6b3565 552 }
sankichi 0:e1265f6b3565 553
sankichi 0:e1265f6b3565 554 // 個別の結果判定
sankichi 0:e1265f6b3565 555 for(int i=0; i<8; i++ )
sankichi 0:e1265f6b3565 556 {
sankichi 0:e1265f6b3565 557 if( readTime[i]>DIGITALPAD_SPEED_STARFORCE )
sankichi 0:e1265f6b3565 558 {
sankichi 0:e1265f6b3565 559 counter_starforce++;
sankichi 0:e1265f6b3565 560 }
sankichi 0:e1265f6b3565 561 else if( readTime[i]<DIGITALPAD_SPEED_RECCA )
sankichi 0:e1265f6b3565 562 {
sankichi 0:e1265f6b3565 563 counter_recca++;
sankichi 0:e1265f6b3565 564 }
sankichi 0:e1265f6b3565 565 else
sankichi 0:e1265f6b3565 566 {
sankichi 0:e1265f6b3565 567 }
sankichi 0:e1265f6b3565 568 }
sankichi 0:e1265f6b3565 569
sankichi 0:e1265f6b3565 570 // 判定
sankichi 0:e1265f6b3565 571 if(counter_starforce >= 4)
sankichi 0:e1265f6b3565 572 {
sankichi 0:e1265f6b3565 573 retVal = 2;
sankichi 0:e1265f6b3565 574 }
sankichi 0:e1265f6b3565 575 else if(counter_recca >= 4)
sankichi 0:e1265f6b3565 576 {
sankichi 0:e1265f6b3565 577 retVal = 1;
sankichi 0:e1265f6b3565 578 }
sankichi 0:e1265f6b3565 579
sankichi 0:e1265f6b3565 580 return retVal;
sankichi 0:e1265f6b3565 581 }
sankichi 0:e1265f6b3565 582
sankichi 0:e1265f6b3565 583 //
sankichi 0:e1265f6b3565 584 // Configure speed setting
sankichi 0:e1265f6b3565 585 //
sankichi 0:e1265f6b3565 586 void ConfigureSpeed(void)
sankichi 0:e1265f6b3565 587 {
sankichi 0:e1265f6b3565 588 char speed;
sankichi 0:e1265f6b3565 589
sankichi 0:e1265f6b3565 590 // ISR登録解除
sankichi 0:e1265f6b3565 591 _INTR_LATCH->rise(0);
sankichi 0:e1265f6b3565 592
sankichi 0:e1265f6b3565 593 // ちょっと待つ
sankichi 0:e1265f6b3565 594 wait_ms(500);
sankichi 0:e1265f6b3565 595
sankichi 0:e1265f6b3565 596 speed = CheckSpeedType();
sankichi 0:e1265f6b3565 597
sankichi 0:e1265f6b3565 598 // Interrupt Setting
sankichi 0:e1265f6b3565 599 if( speed==1 )
sankichi 0:e1265f6b3565 600 {
sankichi 0:e1265f6b3565 601 led2_FC.write(1);
sankichi 0:e1265f6b3565 602 led3_FC.write(1);
sankichi 0:e1265f6b3565 603 _INTR_LATCH->rise(&ISR_Rise_LATCH_RECCA);
sankichi 0:e1265f6b3565 604 }
sankichi 0:e1265f6b3565 605 else if( speed==2 )
sankichi 0:e1265f6b3565 606 {
sankichi 0:e1265f6b3565 607 led2_FC.write(0);
sankichi 0:e1265f6b3565 608 led3_FC.write(0);
sankichi 0:e1265f6b3565 609 _INTR_LATCH->rise(&ISR_Rise_LATCH_STARFORCE);
sankichi 0:e1265f6b3565 610 }
sankichi 0:e1265f6b3565 611 else
sankichi 0:e1265f6b3565 612 {
sankichi 0:e1265f6b3565 613 led2_FC.write(0);
sankichi 0:e1265f6b3565 614 led3_FC.write(1);
sankichi 0:e1265f6b3565 615 _INTR_LATCH->rise(&ISR_Rise_LATCH);
sankichi 0:e1265f6b3565 616 }
sankichi 0:e1265f6b3565 617
sankichi 0:e1265f6b3565 618 }
sankichi 0:e1265f6b3565 619
sankichi 0:e1265f6b3565 620 //
sankichi 0:e1265f6b3565 621 // ISR for POWERDETECT L->H
sankichi 0:e1265f6b3565 622 //
sankichi 0:e1265f6b3565 623 void ISR_Rise_POWERDETECT(void)
sankichi 0:e1265f6b3565 624 {
sankichi 0:e1265f6b3565 625 ConfigureSpeed();
sankichi 0:e1265f6b3565 626 }
sankichi 0:e1265f6b3565 627
sankichi 0:e1265f6b3565 628 void RapidStateTickerMethod(void)
sankichi 0:e1265f6b3565 629 {
sankichi 0:e1265f6b3565 630 _RapidFireValue = !_RapidFireValue;
sankichi 0:e1265f6b3565 631 }
sankichi 0:e1265f6b3565 632