First Release
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Thu Jul 14 2022 14:49:55 by 1.7.2