First Release

Dependencies:   USBDevice

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers In_MD6B.cpp Source File

In_MD6B.cpp

00001 #include "In_MD6B.h"
00002 #include "NiseKabuto.h"
00003 
00004 //
00005 // Constructor
00006 //
00007 In_MD6B::In_MD6B(
00008     PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3, 
00009     PinName pn_D4, PinName pn_D5, PinName pn_SEL,
00010     InputStatus *inputStatus
00011 )  : _IN_D0(pn_D0), _IN_D1(pn_D1), _IN_D2(pn_D2), _IN_D3(pn_D3), 
00012      _IN_D4(pn_D4), _IN_D5(pn_D5), _OUT_SEL(pn_SEL)
00013 {
00014     _InputStatus = inputStatus;
00015     _InputStatus->Reset();  // ボタンなどリセット
00016     _InputStatus->InputDeviceType = NiseKabuto::CONFIG_INMODE_MD6B;
00017     
00018     Initialize();
00019 }
00020 
00021 
00022 void In_MD6B::StartReading(void)
00023 {
00024     //printf("In_MD6B::StartReading()!!!\r\n");
00025     if(!_ReadEnable)
00026     {
00027         _ReadEnable = 1;
00028         Initialize();
00029     }
00030 }
00031 void In_MD6B::StopReading(void)
00032 {
00033     //printf("In_MD6B::StopReading()!!!\r\n");
00034     if(_ReadEnable)
00035     {
00036         _ReadEnable = 0;
00037         DisablePolling();
00038     }
00039 }
00040 
00041 
00042 
00043 //
00044 // Initialize
00045 //
00046 void In_MD6B::Initialize()
00047 {
00048     // Pin Setting
00049     _IN_D0.mode(PullUp);
00050     _IN_D1.mode(PullUp);
00051     _IN_D2.mode(PullUp);
00052     _IN_D3.mode(PullUp);
00053     _IN_D4.mode(PullUp);
00054     _IN_D5.mode(PullUp);
00055     
00056     // Class Variable Setting
00057     _ReadEnable = 1;
00058     
00059     // Interrupt Setting
00060     /*
00061     _INTR_LH.rise(this, &In_MD6B::LHCounter);
00062     _INTR_ACK.fall(this, &In_MD6B::AckFallISR);
00063     */
00064     
00065     // Initialize pin status
00066     _OUT_SEL = 1;   // output SEL = H
00067 
00068     // Ticker Setting
00069     EnablePolling();
00070 }
00071 
00072 
00073 //
00074 // Enable polling
00075 //
00076 void In_MD6B::EnablePolling(void)
00077 {
00078     _PollingTicker.attach_us(this, &In_MD6B::PollingMethod, READINGINTERVAL__MICROSEC);
00079 }
00080 
00081 //
00082 // Disable polling
00083 //
00084 void In_MD6B::DisablePolling(void)
00085 {
00086 //  printf("In_MD6B::DisablePolling() called!!\r\n");
00087     _PollingTicker.detach();
00088 }
00089 
00090 
00091 //
00092 // Polling method
00093 //
00094 void In_MD6B::PollingMethod()
00095 {
00096     // デバッグ用:この関数が呼ばれるたび+1される
00097     (_InputStatus->Temp[0])++;
00098     
00099     if( _ReadEnable )
00100     {
00101         char flag6B = 0;
00102         int idxPhaseStart = 0;
00103         int idx = 0;
00104 
00105         // Selを立ち下げ、データ読みを8回
00106         idx = 0;
00107         for(int i=0; i<4; i++)
00108         {
00109             _OUT_SEL = 0;
00110             wait_us(SELSTATETIME__MICROSEC);
00111             
00112             _PhaseData[idx++] = ReadPinValue();
00113             
00114             _OUT_SEL = 1;
00115             wait_us(SELSTATETIME__MICROSEC);
00116 
00117             _PhaseData[idx++] = ReadPinValue();
00118         }
00119         
00120         idx = 0;
00121         while(1)
00122         {
00123             (_InputStatus->Temp[1])++;
00124             
00125             // D0-D3がLなものを探す
00126             if( (_PhaseData[idx]&0x0f)==0 )
00127             {
00128                 // idx+2をチェック
00129                 // ただし6を超えた場合はidx-6の位置をチェック
00130                 if(idx < 6)
00131                 {
00132                     if( (_PhaseData[idx+2]&0x0f)==0x0f )
00133                     {
00134                         flag6B = 1;
00135                         idxPhaseStart = idx; // 仮の値
00136                         break;
00137                     }
00138                 }
00139                 else
00140                 {
00141                     if( (_PhaseData[idx-6]&0x0f)==0x0f )
00142                     {
00143                         flag6B = 1;
00144                         idxPhaseStart = idx; // 仮の値
00145                         break;
00146                     }
00147                 }
00148             }
00149             
00150             // このidxではなかった
00151             idx++;
00152             
00153             // 全部チェックしてしまった
00154             if( idx >= 8 )  // 2013/05/02
00155             {
00156                 break;
00157             }
00158             
00159         }
00160         
00161         // この時点でflag6B==0の場合、6Bではない
00162         if( flag6B )
00163         {
00164             // ボタン情報が入る予定のビットをoff
00165             __disable_irq();
00166             int buttons = (_InputStatus->Buttons) & 0x0f8c0dc;
00167             //                                             f    8    c    0    d    c
00168             //                                          1111 1XYZ 11UD LRAB 11C1 11SM
00169             __enable_irq();
00170 
00171             // idxPhaseStart補正
00172             if(idx >= 4)
00173             {
00174                 idxPhaseStart = idxPhaseStart-4;
00175             }
00176             else
00177             {
00178                 idxPhaseStart = idxPhaseStart+4;
00179             }
00180             
00181             // InputStatus
00182             char data;
00183             
00184             //      Phase 0
00185             data = _PhaseData[idxPhaseStart++];
00186             if( idxPhaseStart == 8)
00187             {
00188                 idxPhaseStart = 0;
00189             }
00190             buttons = buttons |
00191                 ((data & 0x20) ? 0x000002 : 0) |    // ST
00192                 ((data & 0x10) ? 0x000200 : 0) |    // A
00193                 ((data & 0x02) ? 0x001000 : 0) |    // Dw
00194                 ((data & 0x01) ? 0x002000 : 0) ;    // Up
00195             
00196             
00197             //      Phase 1
00198             data = _PhaseData[idxPhaseStart++];
00199             if( idxPhaseStart == 8)
00200             {
00201                 idxPhaseStart = 0;
00202             }
00203             buttons = buttons |
00204                 ((data & 0x20) ? 0x000020 : 0) |    // C
00205                 ((data & 0x10) ? 0x000100 : 0) |    // B
00206                 ((data & 0x08) ? 0x000400 : 0) |    // Rg
00207                 ((data & 0x04) ? 0x000800 : 0) ;    // Lf
00208             
00209 
00210             //      Phase 2
00211             //          無視
00212             data = _PhaseData[idxPhaseStart++];
00213             if( idxPhaseStart == 8)
00214             {
00215                 idxPhaseStart = 0;
00216             }
00217             //      Phase 3
00218             //          無視
00219             data = _PhaseData[idxPhaseStart++];
00220             if( idxPhaseStart == 8)
00221             {
00222                 idxPhaseStart = 0;
00223             }
00224             //      Phase 4
00225             //          無視
00226             data = _PhaseData[idxPhaseStart++];
00227             if( idxPhaseStart == 8)
00228             {
00229                 idxPhaseStart = 0;
00230             }
00231 
00232             //      Phase 5
00233             data = _PhaseData[idxPhaseStart++];
00234             if( idxPhaseStart == 8)
00235             {
00236                 idxPhaseStart = 0;
00237             }
00238             buttons = buttons |
00239                 ((data & 0x08) ? 0x000001 : 0) |    // Mode
00240                 ((data & 0x04) ? 0x040000 : 0) |    // X
00241                 ((data & 0x02) ? 0x020000 : 0) |    // Y
00242                 ((data & 0x01) ? 0x010000 : 0) ;    // Z
00243             
00244             __disable_irq();
00245             _InputStatus->Buttons = buttons;
00246             __enable_irq();
00247         }
00248 
00249     }
00250 //  printf("E\r\n");
00251 }
00252 
00253 
00254 //
00255 //ReadPinValue (Pin status -> Class value)
00256 //
00257 int In_MD6B::ReadPinValue()
00258 {
00259     return ( 
00260         (_IN_D5<<5) | (_IN_D4<<4) |
00261         (_IN_D3<<3) | (_IN_D2<<2) | (_IN_D1<<1) |  _IN_D0
00262     );
00263 }
00264 
00265