First Release
Embed:
(wiki syntax)
Show/hide line numbers
Out_SSMulCon.cpp
00001 #include "NiseKabuto.h" 00002 00003 DigitalOut led1(LED1); 00004 00005 // 00006 // Constructor 00007 // 00008 Out_SSMulCon::Out_SSMulCon( 00009 PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3, 00010 PinName pn_TL, PinName pn_TR, PinName pn_TH, 00011 InputStatus *inputStatus) 00012 : _OUT_D0(pn_D0), _OUT_D1(pn_D1), _OUT_D2(pn_D2), _OUT_D3(pn_D3), 00013 _INTR_TL(pn_TL), _INTR_TR(pn_TR), _OUT_TH(pn_TH) 00014 { 00015 _InputStatus = inputStatus; 00016 Initialize(); 00017 } 00018 00019 // 00020 // Initialize 00021 // 00022 void Out_SSMulCon::Initialize() 00023 { 00024 00025 // Pin Setting 00026 _INTR_TL.mode(PullUp); 00027 _INTR_TR.mode(PullUp); 00028 00029 // Class Variable Setting 00030 RenewOutputMode();//_OutputMode = 0; 00031 _PhaseCounter = 0; 00032 _NowWriting = 0; 00033 _RapidFireValue = 1; 00034 00035 // Interrupt Setting 00036 _INTR_TL.fall(this, &Out_SSMulCon::StrobeFallISR); 00037 _INTR_TL.rise(this, &Out_SSMulCon::StrobeRiseISR); 00038 _INTR_TR.fall(this, &Out_SSMulCon::ClockFallISR); 00039 _INTR_TR.rise(this, &Out_SSMulCon::ClockRiseISR); 00040 00041 // Initialize pin status 00042 InitializePinStatus(); 00043 00044 } 00045 00046 // 00047 // Initialize pin status 00048 // 00049 void Out_SSMulCon::InitializePinStatus() 00050 { 00051 SetD3D2D1D0(0,0,0,1); 00052 00053 _OUT_TH = 1; 00054 00055 } 00056 00057 // 00058 // ISR for S0/Strobe=L 00059 // 00060 void Out_SSMulCon::StrobeFallISR(void) 00061 { 00062 if( _NowWriting != 1 ) 00063 { 00064 /* 00065 // デジタル出力・アナログ出力を_IN_CONFIGによって決める 00066 _OutputMode = _IN_CONFIG; 00067 led1 = _OutputMode; 00068 */ 00069 00070 // データフェーズカウンタ初期化 00071 _PhaseCounter = 0; 00072 00073 // ピン状態の設定(phase0向けデータ) 00074 //SetPinStatus(); 00075 InitializePinStatus(); 00076 SetPinStatus(); 00077 00078 // データ出力中 00079 _NowWriting = 1; 00080 00081 DisableInput(); 00082 } 00083 00084 RenewOutputMode(); 00085 } 00086 00087 // 00088 // ISR for S0/Strobe=H 00089 // 00090 void Out_SSMulCon::StrobeRiseISR(void) 00091 { 00092 led1 = 0; 00093 00094 // データフェーズカウンタ初期化 00095 _PhaseCounter = 0; 00096 00097 // データ出力終了 00098 _NowWriting = 0; 00099 00100 // ピン状態戻す 00101 InitializePinStatus(); 00102 00103 EnableInput(); 00104 00105 RenewOutputMode(); 00106 00107 _RapidFireValue=!_RapidFireValue; 00108 } 00109 00110 // 00111 // ISR for S1/Clock=L 00112 // 00113 void Out_SSMulCon::ClockFallISR(void) 00114 { 00115 // データ出力中の場合のみ処理する 00116 if(_NowWriting==1) 00117 { 00118 // アナログ出力モード 00119 if( _OutputMode==OUTPUTMODE_ANALOG ) 00120 { 00121 switch(_PhaseCounter) 00122 { 00123 case 0: 00124 case 2: 00125 case 4: 00126 case 6: 00127 case 8: 00128 case 10: 00129 case 12: 00130 case 14: 00131 _PhaseCounter++; 00132 break; 00133 } 00134 } 00135 // デジタル出力モード 00136 else 00137 { 00138 switch(_PhaseCounter) 00139 { 00140 case 0: 00141 case 2: 00142 case 4: 00143 case 6: 00144 _PhaseCounter++; 00145 break; 00146 } 00147 } 00148 SetPinStatus(); 00149 _OUT_TH = 0; 00150 } 00151 } 00152 00153 // 00154 // ISR for S1/Clock=H 00155 // 00156 void Out_SSMulCon::ClockRiseISR(void) 00157 { 00158 // データ出力中の場合のみ処理する 00159 if(_NowWriting==1) 00160 { 00161 // アナログ出力モード 00162 if( _OutputMode==OUTPUTMODE_ANALOG ) 00163 { 00164 switch(_PhaseCounter) 00165 { 00166 case 1: 00167 case 3: 00168 case 5: 00169 case 7: 00170 case 9: 00171 case 11: 00172 case 13: 00173 _PhaseCounter++; 00174 break; 00175 case 15: 00176 _PhaseCounter=0; 00177 break; 00178 } 00179 } 00180 // デジタル出力モード 00181 else 00182 { 00183 switch(_PhaseCounter) 00184 { 00185 case 1: 00186 case 3: 00187 case 5: 00188 _PhaseCounter++; 00189 break; 00190 case 7: 00191 _PhaseCounter=0; 00192 break; 00193 } 00194 } 00195 00196 SetPinStatus(); 00197 _OUT_TH = 1; 00198 } 00199 } 00200 00201 00202 // 00203 // Set Pin D3,D2,D1,D0 Status 00204 // 00205 void Out_SSMulCon::SetD3D2D1D0(char d3, char d2, char d1, char d0) 00206 { 00207 _OUT_D0 = d0; 00208 _OUT_D1 = d1; 00209 _OUT_D2 = d2; 00210 _OUT_D3 = d3; 00211 } 00212 00213 // 00214 // Set Pin D3,D2,D1,D0 Status (bus) 00215 // 00216 void Out_SSMulCon::SetBus(char data) 00217 { 00218 _OUT_D0 = data & 0x01; 00219 _OUT_D1 = (data>>1) & 0x01; 00220 _OUT_D2 = (data>>2) & 0x01; 00221 _OUT_D3 = (data>>3) & 0x01; 00222 } 00223 00224 00225 00226 // 00227 // Set Pin Status 00228 // 00229 void Out_SSMulCon::SetPinStatus(void) 00230 { 00231 // データ出力中の場合のみ処理する 00232 if(_NowWriting==1) 00233 { 00234 // Get InputStatus 00235 InputStatus *inp = _InputStatus; 00236 char chDat = 0; 00237 00238 int buttons = _InputStatus->Buttons; 00239 char ch0 = _InputStatus->Ch0; 00240 char ch1 = _InputStatus->Ch1; 00241 char ch2 = _InputStatus->Ch2; 00242 char ch3 = _InputStatus->Ch3; 00243 00244 char trigR; 00245 char trigL; 00246 00247 // サイバースティック アナログ出力モード 00248 if( _OutputMode==OUTPUTMODE_ANALOG ) 00249 { 00250 switch(_PhaseCounter) 00251 { 00252 case 0: 00253 case 1: 00254 SetD3D2D1D0(0,0,0,1); 00255 break; 00256 00257 case 2: 00258 SetD3D2D1D0(0,1,1,0); 00259 break; 00260 00261 case 3: 00262 if(!(buttons & 0x01)) // G(SELECT)ボタンが押されてたら、アナログスティックで十字キー操作 00263 { 00264 SetD3D2D1D0 00265 ( 00266 ch1>0xf0? 0:1, 00267 ch1<0x0f? 0:1, 00268 ch0>0xf0? 0:1, 00269 ch0<0x0f? 0:1 00270 ); 00271 } 00272 else 00273 { 00274 SetD3D2D1D0(1,1,1,1); 00275 } 00276 break; 00277 00278 case 4: 00279 SetD3D2D1D0( 00280 ((inp->Buttons) & 0x0002)?1:0, // Start 00281 ((inp->Buttons) & 0x0200)?1:0, // A 00282 ((inp->Buttons) & 0x0020)?1:0, // C 00283 ((inp->Buttons) & 0x0100)?1:0 // B 00284 ); 00285 break; 00286 00287 case 5: 00288 trigR = 1; 00289 if(!(buttons & 0x01)) // G(SELECT)ボタンが押されてたら、スロットルでRキー操作 00290 { 00291 trigR = ch2<0x0f? 0:1; //スロットル引く 00292 } 00293 00294 SetD3D2D1D0( 00295 trigR, // R-Trigger 00296 ((inp->Buttons) & 0x0010)?1:0, // D is X 00297 ((inp->Buttons) & 0x0008)?1:0, // E1 is Y 00298 ((inp->Buttons) & 0x0004)?1:0 // E2 is Z 00299 ); 00300 break; 00301 00302 case 6: 00303 trigL = 1; 00304 if(!(buttons & 0x01)) // G(SELECT)ボタンが押されてたら、スロットルでLキー操作 00305 { 00306 trigL = ch2>0xf0? 0:1; //スロットル押す 00307 } 00308 00309 SetD3D2D1D0( 00310 trigL, // L-Trigger 00311 1, // (H) 00312 1, // (H) 00313 1 // (H) 00314 ); 00315 break; 00316 00317 case 7: 00318 chDat = inp->Ch1; // Upper4bits of axis-X 00319 SetBus(chDat>>4); 00320 break; 00321 00322 case 8: 00323 chDat = inp->Ch1; // Lower4bits of axis-X 00324 SetBus(chDat); 00325 break; 00326 00327 case 9: 00328 chDat = inp->Ch0; // Upper4bits of axis-Y 00329 SetBus(chDat>>4); 00330 break; 00331 00332 case 10: 00333 chDat = inp->Ch0; // Lower4bits of axis-Y 00334 SetBus(chDat); 00335 break; 00336 00337 case 11: 00338 chDat = inp->Ch2; // Upper4bits of throttle 00339 SetBus(chDat>>4); 00340 break; 00341 00342 case 12: 00343 chDat = inp->Ch2; // Lower4bits of throttle 00344 SetBus(chDat); 00345 break; 00346 00347 case 13: 00348 SetD3D2D1D0(0,0,0,0); // L Trigger Upper 4bits 00349 break; 00350 00351 case 14: 00352 SetD3D2D1D0(0,0,0,0); // L Trigger Lower 4bits 00353 break; 00354 00355 case 15: 00356 SetD3D2D1D0(0,0,0,0); // final phase 00357 break; 00358 00359 } 00360 } 00361 // サイバースティック デジタル出力モード 00362 else if( _OutputMode==OUTPUTMODE_DIGITAL ) 00363 { 00364 switch(_PhaseCounter) 00365 { 00366 case 0: 00367 SetD3D2D1D0(0,0,0,1); 00368 break; 00369 00370 case 1: 00371 SetD3D2D1D0(0,0,0,0); 00372 break; 00373 00374 case 2: 00375 SetD3D2D1D0(0,0,1,0); 00376 break; 00377 00378 case 3: 00379 SetD3D2D1D0( 00380 ((inp->Buttons) & 0x0400)? 1 : 0, // Right 00381 ((inp->Buttons) & 0x0800)? 1 : 0, // Left 00382 ((inp->Buttons) & 0x1000)? 1 : 0, // Down 00383 ((inp->Buttons) & 0x2000)? 1 : 0 // Up 00384 ); 00385 00386 break; 00387 00388 case 4: 00389 // サイバースティックはStartボタンが無い縺ョで、Dで代用 00390 SetD3D2D1D0( 00391 (((inp->Buttons) & 0x0002)?1:0) & (((inp->Buttons) & 0x0010)?1:0), // Start & D 00392 ((inp->Buttons) & 0x0200)?1:0, // A 00393 ((inp->Buttons) & 0x0020)?1:0, // C 00394 ((inp->Buttons) & 0x0100)?1:0 // B 00395 ); 00396 break; 00397 00398 case 5: 00399 SetD3D2D1D0( 00400 ((inp->Buttons) & 0x8000)?1:0, // R-Trigger(=ThrotUp) 00401 ((inp->Buttons) & 0x0010)?1:0, // X 00402 ((inp->Buttons) & 0x0008)?1:0, // Y 00403 ((inp->Buttons) & 0x0004)?1:0 // Z 00404 ); 00405 break; 00406 00407 case 6: 00408 SetD3D2D1D0( 00409 ((inp->Buttons) & 0x4000)?1:0, // L-Trigger 00410 1, // (H) 00411 1, // (H) 00412 1 // (H) 00413 ); 00414 break; 00415 00416 case 7: 00417 SetD3D2D1D0(0,0,0,0); 00418 break; 00419 } 00420 } 00421 // 6B 00422 else if( _OutputMode==OUTPUTMODE_6B ) 00423 { 00424 switch(_PhaseCounter) 00425 { 00426 case 0: 00427 SetD3D2D1D0(0,0,0,1); 00428 break; 00429 00430 case 1: 00431 SetD3D2D1D0(0,0,0,0); 00432 break; 00433 00434 case 2: 00435 SetD3D2D1D0(0,0,1,0); 00436 break; 00437 00438 case 3: 00439 SetD3D2D1D0( 00440 ((inp->Buttons) & 0x0400)? 1 : 0, // Right 00441 ((inp->Buttons) & 0x0800)? 1 : 0, // Left 00442 ((inp->Buttons) & 0x1000)? 1 : 0, // Down 00443 ((inp->Buttons) & 0x2000)? 1 : 0 // Up 00444 ); 00445 00446 break; 00447 00448 case 4: 00449 // modeキーが押されてたら、_RapidFireValue値を有効に 00450 if( !((inp->Buttons) & 0x0001) ) 00451 { 00452 SetD3D2D1D0( 00453 ((inp->Buttons) & 0x0002)?1:0, // Start 00454 ((inp->Buttons) & 0x0200)?1:_RapidFireValue, // A 00455 ((inp->Buttons) & 0x0020)?1:_RapidFireValue, // C 00456 ((inp->Buttons) & 0x0100)?1:_RapidFireValue // B 00457 ); 00458 } 00459 else 00460 { 00461 SetD3D2D1D0( 00462 ((inp->Buttons) & 0x0002)?1:0, // Start 00463 ((inp->Buttons) & 0x0200)?1:0, // A 00464 ((inp->Buttons) & 0x0020)?1:0, // C 00465 ((inp->Buttons) & 0x0100)?1:0 // B 00466 ); 00467 } 00468 break; 00469 00470 case 5: 00471 // modeキーが押されてたら、_RapidFireValue値を有効に 00472 if( !((inp->Buttons) & 0x0001) ) 00473 { 00474 // Rトリガはmode+右 00475 SetD3D2D1D0( 00476 ((inp->Buttons) & 0x0401)?1:0, // R-Trigger 00477 ((inp->Buttons) & 0x0010)?1:_RapidFireValue, // X 00478 ((inp->Buttons) & 0x0008)?1:_RapidFireValue, // Y 00479 ((inp->Buttons) & 0x0004)?1:_RapidFireValue // Z 00480 ); 00481 } 00482 else 00483 { 00484 // Rトリガはmode+右 <-おかしい? 00485 SetD3D2D1D0( 00486 ((inp->Buttons) & 0x0401)?1:0, // R-Trigger 00487 ((inp->Buttons) & 0x0010)?1:0, // X 00488 ((inp->Buttons) & 0x0008)?1:0, // Y 00489 ((inp->Buttons) & 0x0004)?1:0 // Z 00490 ); 00491 } 00492 break; 00493 00494 case 6: 00495 // Lトリガはmode+左 00496 SetD3D2D1D0( 00497 ((inp->Buttons) & 0x0801)?1:0, // L-Trigger 00498 1, // (H) 00499 1, // (H) 00500 1 // (H) 00501 ); 00502 break; 00503 00504 case 7: 00505 SetD3D2D1D0(0,0,0,0); 00506 break; 00507 } 00508 } 00509 00510 } 00511 } 00512 00513 00514 // 00515 // Set output mode 00516 // 00517 void Out_SSMulCon::RenewOutputMode(void) 00518 { 00519 switch(_InputStatus->InputDeviceType) 00520 { 00521 // 00522 // Input: CyberStick ANALOG mode 00523 // 00524 case NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG: 00525 _OutputMode = OUTPUTMODE_ANALOG; 00526 break; 00527 00528 // 00529 // Input: CyberStick DIGITAL mode 00530 // 6B 00531 // 00532 case NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL: 00533 _OutputMode = OUTPUTMODE_DIGITAL; 00534 break; 00535 00536 case NiseKabuto::CONFIG_INMODE_MD6B: 00537 _OutputMode = OUTPUTMODE_6B; 00538 break; 00539 00540 default: 00541 _OutputMode = OUTPUTMODE_ANALOG; 00542 break; 00543 } 00544 } 00545 00546 00547 void Out_SSMulCon::SetupInputControll(void (*startInputFunction)(void), void (*stopInputFunction)(void)) 00548 { 00549 StartInputFunction = startInputFunction; 00550 StopInputFunction = stopInputFunction; 00551 } 00552 00553 void Out_SSMulCon::EnableInput(void) 00554 { 00555 if(_InputInstance && StartInputMethod) 00556 { 00557 (_InputInstance->*StartInputMethod)(); 00558 } 00559 else if(StartInputFunction) 00560 { 00561 StartInputFunction(); 00562 } 00563 } 00564 00565 void Out_SSMulCon::DisableInput(void) 00566 { 00567 if(_InputInstance && StopInputMethod) 00568 { 00569 (_InputInstance->*StopInputMethod)(); 00570 } 00571 else if(StopInputFunction) 00572 { 00573 StopInputFunction(); 00574 } 00575 } 00576 00577
Generated on Thu Jul 14 2022 14:49:55 by 1.7.2