First Release

Dependencies:   USBDevice

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Out_SSMulCon.cpp Source File

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