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 "In_MD6B.h"
sankichi 0:e1265f6b3565 2 #include "NiseKabuto.h"
sankichi 0:e1265f6b3565 3
sankichi 0:e1265f6b3565 4 //
sankichi 0:e1265f6b3565 5 // Constructor
sankichi 0:e1265f6b3565 6 //
sankichi 0:e1265f6b3565 7 In_MD6B::In_MD6B(
sankichi 0:e1265f6b3565 8 PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3,
sankichi 0:e1265f6b3565 9 PinName pn_D4, PinName pn_D5, PinName pn_SEL,
sankichi 0:e1265f6b3565 10 InputStatus *inputStatus
sankichi 0:e1265f6b3565 11 ) : _IN_D0(pn_D0), _IN_D1(pn_D1), _IN_D2(pn_D2), _IN_D3(pn_D3),
sankichi 0:e1265f6b3565 12 _IN_D4(pn_D4), _IN_D5(pn_D5), _OUT_SEL(pn_SEL)
sankichi 0:e1265f6b3565 13 {
sankichi 0:e1265f6b3565 14 _InputStatus = inputStatus;
sankichi 0:e1265f6b3565 15 _InputStatus->Reset(); // ボタンなどリセット
sankichi 0:e1265f6b3565 16 _InputStatus->InputDeviceType = NiseKabuto::CONFIG_INMODE_MD6B;
sankichi 0:e1265f6b3565 17
sankichi 0:e1265f6b3565 18 Initialize();
sankichi 0:e1265f6b3565 19 }
sankichi 0:e1265f6b3565 20
sankichi 0:e1265f6b3565 21
sankichi 0:e1265f6b3565 22 void In_MD6B::StartReading(void)
sankichi 0:e1265f6b3565 23 {
sankichi 0:e1265f6b3565 24 //printf("In_MD6B::StartReading()!!!\r\n");
sankichi 0:e1265f6b3565 25 if(!_ReadEnable)
sankichi 0:e1265f6b3565 26 {
sankichi 0:e1265f6b3565 27 _ReadEnable = 1;
sankichi 0:e1265f6b3565 28 Initialize();
sankichi 0:e1265f6b3565 29 }
sankichi 0:e1265f6b3565 30 }
sankichi 0:e1265f6b3565 31 void In_MD6B::StopReading(void)
sankichi 0:e1265f6b3565 32 {
sankichi 0:e1265f6b3565 33 //printf("In_MD6B::StopReading()!!!\r\n");
sankichi 0:e1265f6b3565 34 if(_ReadEnable)
sankichi 0:e1265f6b3565 35 {
sankichi 0:e1265f6b3565 36 _ReadEnable = 0;
sankichi 0:e1265f6b3565 37 DisablePolling();
sankichi 0:e1265f6b3565 38 }
sankichi 0:e1265f6b3565 39 }
sankichi 0:e1265f6b3565 40
sankichi 0:e1265f6b3565 41
sankichi 0:e1265f6b3565 42
sankichi 0:e1265f6b3565 43 //
sankichi 0:e1265f6b3565 44 // Initialize
sankichi 0:e1265f6b3565 45 //
sankichi 0:e1265f6b3565 46 void In_MD6B::Initialize()
sankichi 0:e1265f6b3565 47 {
sankichi 0:e1265f6b3565 48 // Pin Setting
sankichi 0:e1265f6b3565 49 _IN_D0.mode(PullUp);
sankichi 0:e1265f6b3565 50 _IN_D1.mode(PullUp);
sankichi 0:e1265f6b3565 51 _IN_D2.mode(PullUp);
sankichi 0:e1265f6b3565 52 _IN_D3.mode(PullUp);
sankichi 0:e1265f6b3565 53 _IN_D4.mode(PullUp);
sankichi 0:e1265f6b3565 54 _IN_D5.mode(PullUp);
sankichi 0:e1265f6b3565 55
sankichi 0:e1265f6b3565 56 // Class Variable Setting
sankichi 0:e1265f6b3565 57 _ReadEnable = 1;
sankichi 0:e1265f6b3565 58
sankichi 0:e1265f6b3565 59 // Interrupt Setting
sankichi 0:e1265f6b3565 60 /*
sankichi 0:e1265f6b3565 61 _INTR_LH.rise(this, &In_MD6B::LHCounter);
sankichi 0:e1265f6b3565 62 _INTR_ACK.fall(this, &In_MD6B::AckFallISR);
sankichi 0:e1265f6b3565 63 */
sankichi 0:e1265f6b3565 64
sankichi 0:e1265f6b3565 65 // Initialize pin status
sankichi 0:e1265f6b3565 66 _OUT_SEL = 1; // output SEL = H
sankichi 0:e1265f6b3565 67
sankichi 0:e1265f6b3565 68 // Ticker Setting
sankichi 0:e1265f6b3565 69 EnablePolling();
sankichi 0:e1265f6b3565 70 }
sankichi 0:e1265f6b3565 71
sankichi 0:e1265f6b3565 72
sankichi 0:e1265f6b3565 73 //
sankichi 0:e1265f6b3565 74 // Enable polling
sankichi 0:e1265f6b3565 75 //
sankichi 0:e1265f6b3565 76 void In_MD6B::EnablePolling(void)
sankichi 0:e1265f6b3565 77 {
sankichi 0:e1265f6b3565 78 _PollingTicker.attach_us(this, &In_MD6B::PollingMethod, READINGINTERVAL__MICROSEC);
sankichi 0:e1265f6b3565 79 }
sankichi 0:e1265f6b3565 80
sankichi 0:e1265f6b3565 81 //
sankichi 0:e1265f6b3565 82 // Disable polling
sankichi 0:e1265f6b3565 83 //
sankichi 0:e1265f6b3565 84 void In_MD6B::DisablePolling(void)
sankichi 0:e1265f6b3565 85 {
sankichi 0:e1265f6b3565 86 // printf("In_MD6B::DisablePolling() called!!\r\n");
sankichi 0:e1265f6b3565 87 _PollingTicker.detach();
sankichi 0:e1265f6b3565 88 }
sankichi 0:e1265f6b3565 89
sankichi 0:e1265f6b3565 90
sankichi 0:e1265f6b3565 91 //
sankichi 0:e1265f6b3565 92 // Polling method
sankichi 0:e1265f6b3565 93 //
sankichi 0:e1265f6b3565 94 void In_MD6B::PollingMethod()
sankichi 0:e1265f6b3565 95 {
sankichi 0:e1265f6b3565 96 // デバッグ用:この関数が呼ばれるたび+1される
sankichi 0:e1265f6b3565 97 (_InputStatus->Temp[0])++;
sankichi 0:e1265f6b3565 98
sankichi 0:e1265f6b3565 99 if( _ReadEnable )
sankichi 0:e1265f6b3565 100 {
sankichi 0:e1265f6b3565 101 char flag6B = 0;
sankichi 0:e1265f6b3565 102 int idxPhaseStart = 0;
sankichi 0:e1265f6b3565 103 int idx = 0;
sankichi 0:e1265f6b3565 104
sankichi 0:e1265f6b3565 105 // Selを立ち下げ、データ読みを8回
sankichi 0:e1265f6b3565 106 idx = 0;
sankichi 0:e1265f6b3565 107 for(int i=0; i<4; i++)
sankichi 0:e1265f6b3565 108 {
sankichi 0:e1265f6b3565 109 _OUT_SEL = 0;
sankichi 0:e1265f6b3565 110 wait_us(SELSTATETIME__MICROSEC);
sankichi 0:e1265f6b3565 111
sankichi 0:e1265f6b3565 112 _PhaseData[idx++] = ReadPinValue();
sankichi 0:e1265f6b3565 113
sankichi 0:e1265f6b3565 114 _OUT_SEL = 1;
sankichi 0:e1265f6b3565 115 wait_us(SELSTATETIME__MICROSEC);
sankichi 0:e1265f6b3565 116
sankichi 0:e1265f6b3565 117 _PhaseData[idx++] = ReadPinValue();
sankichi 0:e1265f6b3565 118 }
sankichi 0:e1265f6b3565 119
sankichi 0:e1265f6b3565 120 idx = 0;
sankichi 0:e1265f6b3565 121 while(1)
sankichi 0:e1265f6b3565 122 {
sankichi 0:e1265f6b3565 123 (_InputStatus->Temp[1])++;
sankichi 0:e1265f6b3565 124
sankichi 0:e1265f6b3565 125 // D0-D3がLなものを探す
sankichi 0:e1265f6b3565 126 if( (_PhaseData[idx]&0x0f)==0 )
sankichi 0:e1265f6b3565 127 {
sankichi 0:e1265f6b3565 128 // idx+2をチェック
sankichi 0:e1265f6b3565 129 // ただし6を超えた場合はidx-6の位置をチェック
sankichi 0:e1265f6b3565 130 if(idx < 6)
sankichi 0:e1265f6b3565 131 {
sankichi 0:e1265f6b3565 132 if( (_PhaseData[idx+2]&0x0f)==0x0f )
sankichi 0:e1265f6b3565 133 {
sankichi 0:e1265f6b3565 134 flag6B = 1;
sankichi 0:e1265f6b3565 135 idxPhaseStart = idx; // 仮の値
sankichi 0:e1265f6b3565 136 break;
sankichi 0:e1265f6b3565 137 }
sankichi 0:e1265f6b3565 138 }
sankichi 0:e1265f6b3565 139 else
sankichi 0:e1265f6b3565 140 {
sankichi 0:e1265f6b3565 141 if( (_PhaseData[idx-6]&0x0f)==0x0f )
sankichi 0:e1265f6b3565 142 {
sankichi 0:e1265f6b3565 143 flag6B = 1;
sankichi 0:e1265f6b3565 144 idxPhaseStart = idx; // 仮の値
sankichi 0:e1265f6b3565 145 break;
sankichi 0:e1265f6b3565 146 }
sankichi 0:e1265f6b3565 147 }
sankichi 0:e1265f6b3565 148 }
sankichi 0:e1265f6b3565 149
sankichi 0:e1265f6b3565 150 // このidxではなかった
sankichi 0:e1265f6b3565 151 idx++;
sankichi 0:e1265f6b3565 152
sankichi 0:e1265f6b3565 153 // 全部チェックしてしまった
sankichi 0:e1265f6b3565 154 if( idx >= 8 ) // 2013/05/02
sankichi 0:e1265f6b3565 155 {
sankichi 0:e1265f6b3565 156 break;
sankichi 0:e1265f6b3565 157 }
sankichi 0:e1265f6b3565 158
sankichi 0:e1265f6b3565 159 }
sankichi 0:e1265f6b3565 160
sankichi 0:e1265f6b3565 161 // この時点でflag6B==0の場合、6Bではない
sankichi 0:e1265f6b3565 162 if( flag6B )
sankichi 0:e1265f6b3565 163 {
sankichi 0:e1265f6b3565 164 // ボタン情報が入る予定のビットをoff
sankichi 0:e1265f6b3565 165 __disable_irq();
sankichi 0:e1265f6b3565 166 int buttons = (_InputStatus->Buttons) & 0x0f8c0dc;
sankichi 0:e1265f6b3565 167 // f 8 c 0 d c
sankichi 0:e1265f6b3565 168 // 1111 1XYZ 11UD LRAB 11C1 11SM
sankichi 0:e1265f6b3565 169 __enable_irq();
sankichi 0:e1265f6b3565 170
sankichi 0:e1265f6b3565 171 // idxPhaseStart補正
sankichi 0:e1265f6b3565 172 if(idx >= 4)
sankichi 0:e1265f6b3565 173 {
sankichi 0:e1265f6b3565 174 idxPhaseStart = idxPhaseStart-4;
sankichi 0:e1265f6b3565 175 }
sankichi 0:e1265f6b3565 176 else
sankichi 0:e1265f6b3565 177 {
sankichi 0:e1265f6b3565 178 idxPhaseStart = idxPhaseStart+4;
sankichi 0:e1265f6b3565 179 }
sankichi 0:e1265f6b3565 180
sankichi 0:e1265f6b3565 181 // InputStatus
sankichi 0:e1265f6b3565 182 char data;
sankichi 0:e1265f6b3565 183
sankichi 0:e1265f6b3565 184 // Phase 0
sankichi 0:e1265f6b3565 185 data = _PhaseData[idxPhaseStart++];
sankichi 0:e1265f6b3565 186 if( idxPhaseStart == 8)
sankichi 0:e1265f6b3565 187 {
sankichi 0:e1265f6b3565 188 idxPhaseStart = 0;
sankichi 0:e1265f6b3565 189 }
sankichi 0:e1265f6b3565 190 buttons = buttons |
sankichi 0:e1265f6b3565 191 ((data & 0x20) ? 0x000002 : 0) | // ST
sankichi 0:e1265f6b3565 192 ((data & 0x10) ? 0x000200 : 0) | // A
sankichi 0:e1265f6b3565 193 ((data & 0x02) ? 0x001000 : 0) | // Dw
sankichi 0:e1265f6b3565 194 ((data & 0x01) ? 0x002000 : 0) ; // Up
sankichi 0:e1265f6b3565 195
sankichi 0:e1265f6b3565 196
sankichi 0:e1265f6b3565 197 // Phase 1
sankichi 0:e1265f6b3565 198 data = _PhaseData[idxPhaseStart++];
sankichi 0:e1265f6b3565 199 if( idxPhaseStart == 8)
sankichi 0:e1265f6b3565 200 {
sankichi 0:e1265f6b3565 201 idxPhaseStart = 0;
sankichi 0:e1265f6b3565 202 }
sankichi 0:e1265f6b3565 203 buttons = buttons |
sankichi 0:e1265f6b3565 204 ((data & 0x20) ? 0x000020 : 0) | // C
sankichi 0:e1265f6b3565 205 ((data & 0x10) ? 0x000100 : 0) | // B
sankichi 0:e1265f6b3565 206 ((data & 0x08) ? 0x000400 : 0) | // Rg
sankichi 0:e1265f6b3565 207 ((data & 0x04) ? 0x000800 : 0) ; // Lf
sankichi 0:e1265f6b3565 208
sankichi 0:e1265f6b3565 209
sankichi 0:e1265f6b3565 210 // Phase 2
sankichi 0:e1265f6b3565 211 // 無視
sankichi 0:e1265f6b3565 212 data = _PhaseData[idxPhaseStart++];
sankichi 0:e1265f6b3565 213 if( idxPhaseStart == 8)
sankichi 0:e1265f6b3565 214 {
sankichi 0:e1265f6b3565 215 idxPhaseStart = 0;
sankichi 0:e1265f6b3565 216 }
sankichi 0:e1265f6b3565 217 // Phase 3
sankichi 0:e1265f6b3565 218 // 無視
sankichi 0:e1265f6b3565 219 data = _PhaseData[idxPhaseStart++];
sankichi 0:e1265f6b3565 220 if( idxPhaseStart == 8)
sankichi 0:e1265f6b3565 221 {
sankichi 0:e1265f6b3565 222 idxPhaseStart = 0;
sankichi 0:e1265f6b3565 223 }
sankichi 0:e1265f6b3565 224 // Phase 4
sankichi 0:e1265f6b3565 225 // 無視
sankichi 0:e1265f6b3565 226 data = _PhaseData[idxPhaseStart++];
sankichi 0:e1265f6b3565 227 if( idxPhaseStart == 8)
sankichi 0:e1265f6b3565 228 {
sankichi 0:e1265f6b3565 229 idxPhaseStart = 0;
sankichi 0:e1265f6b3565 230 }
sankichi 0:e1265f6b3565 231
sankichi 0:e1265f6b3565 232 // Phase 5
sankichi 0:e1265f6b3565 233 data = _PhaseData[idxPhaseStart++];
sankichi 0:e1265f6b3565 234 if( idxPhaseStart == 8)
sankichi 0:e1265f6b3565 235 {
sankichi 0:e1265f6b3565 236 idxPhaseStart = 0;
sankichi 0:e1265f6b3565 237 }
sankichi 0:e1265f6b3565 238 buttons = buttons |
sankichi 0:e1265f6b3565 239 ((data & 0x08) ? 0x000001 : 0) | // Mode
sankichi 0:e1265f6b3565 240 ((data & 0x04) ? 0x040000 : 0) | // X
sankichi 0:e1265f6b3565 241 ((data & 0x02) ? 0x020000 : 0) | // Y
sankichi 0:e1265f6b3565 242 ((data & 0x01) ? 0x010000 : 0) ; // Z
sankichi 0:e1265f6b3565 243
sankichi 0:e1265f6b3565 244 __disable_irq();
sankichi 0:e1265f6b3565 245 _InputStatus->Buttons = buttons;
sankichi 0:e1265f6b3565 246 __enable_irq();
sankichi 0:e1265f6b3565 247 }
sankichi 0:e1265f6b3565 248
sankichi 0:e1265f6b3565 249 }
sankichi 0:e1265f6b3565 250 // printf("E\r\n");
sankichi 0:e1265f6b3565 251 }
sankichi 0:e1265f6b3565 252
sankichi 0:e1265f6b3565 253
sankichi 0:e1265f6b3565 254 //
sankichi 0:e1265f6b3565 255 //ReadPinValue (Pin status -> Class value)
sankichi 0:e1265f6b3565 256 //
sankichi 0:e1265f6b3565 257 int In_MD6B::ReadPinValue()
sankichi 0:e1265f6b3565 258 {
sankichi 0:e1265f6b3565 259 return (
sankichi 0:e1265f6b3565 260 (_IN_D5<<5) | (_IN_D4<<4) |
sankichi 0:e1265f6b3565 261 (_IN_D3<<3) | (_IN_D2<<2) | (_IN_D1<<1) | _IN_D0
sankichi 0:e1265f6b3565 262 );
sankichi 0:e1265f6b3565 263 }
sankichi 0:e1265f6b3565 264
sankichi 0:e1265f6b3565 265