First Release
Out_MD/CFunc_Out_MD.cpp@1:6c392ebcd4d4, 2013-07-27 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
sankichi | 0:e1265f6b3565 | 1 | #include "mbed.h" |
sankichi | 0:e1265f6b3565 | 2 | #include "CFunc_Out_MD.h" |
sankichi | 0:e1265f6b3565 | 3 | #include "Out_MD.h" |
sankichi | 0:e1265f6b3565 | 4 | |
sankichi | 0:e1265f6b3565 | 5 | // mbed pins |
sankichi | 0:e1265f6b3565 | 6 | DigitalOut *_OUT_D0; |
sankichi | 0:e1265f6b3565 | 7 | DigitalOut *_OUT_D1; |
sankichi | 0:e1265f6b3565 | 8 | DigitalOut *_OUT_D2; |
sankichi | 0:e1265f6b3565 | 9 | DigitalOut *_OUT_D3; |
sankichi | 0:e1265f6b3565 | 10 | DigitalOut *_OUT_LH; |
sankichi | 0:e1265f6b3565 | 11 | InterruptIn *_INTR_REQ; |
sankichi | 0:e1265f6b3565 | 12 | DigitalOut *_OUT_ACK; |
sankichi | 0:e1265f6b3565 | 13 | |
sankichi | 0:e1265f6b3565 | 14 | // File local variables |
sankichi | 0:e1265f6b3565 | 15 | static volatile int *_Buttons; |
sankichi | 0:e1265f6b3565 | 16 | static volatile char _flagSwapAC; |
sankichi | 0:e1265f6b3565 | 17 | // Static variables |
sankichi | 0:e1265f6b3565 | 18 | |
sankichi | 0:e1265f6b3565 | 19 | // File local functions |
sankichi | 0:e1265f6b3565 | 20 | |
sankichi | 0:e1265f6b3565 | 21 | |
sankichi | 0:e1265f6b3565 | 22 | void Cfunc_Out_MD_Initialize( |
sankichi | 0:e1265f6b3565 | 23 | DigitalOut *out_D0, |
sankichi | 0:e1265f6b3565 | 24 | DigitalOut *out_D1, |
sankichi | 0:e1265f6b3565 | 25 | DigitalOut *out_D2, |
sankichi | 0:e1265f6b3565 | 26 | DigitalOut *out_D3, |
sankichi | 0:e1265f6b3565 | 27 | DigitalOut *out_LH, |
sankichi | 0:e1265f6b3565 | 28 | InterruptIn *intr_REQ, |
sankichi | 0:e1265f6b3565 | 29 | DigitalOut *out_ACK, |
sankichi | 0:e1265f6b3565 | 30 | volatile int *pButtons, |
sankichi | 0:e1265f6b3565 | 31 | char flagSwapAC |
sankichi | 0:e1265f6b3565 | 32 | ) |
sankichi | 0:e1265f6b3565 | 33 | { |
sankichi | 0:e1265f6b3565 | 34 | // 入出力pin |
sankichi | 0:e1265f6b3565 | 35 | _OUT_D0 = out_D0; |
sankichi | 0:e1265f6b3565 | 36 | _OUT_D1 = out_D1; |
sankichi | 0:e1265f6b3565 | 37 | _OUT_D2 = out_D2; |
sankichi | 0:e1265f6b3565 | 38 | _OUT_D3 = out_D3; |
sankichi | 0:e1265f6b3565 | 39 | _OUT_LH = out_LH; |
sankichi | 0:e1265f6b3565 | 40 | _INTR_REQ = intr_REQ; |
sankichi | 0:e1265f6b3565 | 41 | _OUT_ACK = out_ACK; |
sankichi | 0:e1265f6b3565 | 42 | |
sankichi | 0:e1265f6b3565 | 43 | _flagSwapAC = flagSwapAC; |
sankichi | 0:e1265f6b3565 | 44 | |
sankichi | 0:e1265f6b3565 | 45 | // InputStatus |
sankichi | 0:e1265f6b3565 | 46 | _Buttons = pButtons; |
sankichi | 0:e1265f6b3565 | 47 | } |
sankichi | 0:e1265f6b3565 | 48 | |
sankichi | 0:e1265f6b3565 | 49 | void Cfunc_DigitalPeriodicPollingMethod(void) |
sankichi | 0:e1265f6b3565 | 50 | { |
sankichi | 0:e1265f6b3565 | 51 | volatile int counter; |
sankichi | 0:e1265f6b3565 | 52 | volatile int readCounter = 0; // REQ変化を検知してからのカウンタ値 |
sankichi | 0:e1265f6b3565 | 53 | volatile int button = *_Buttons; // ポインタ経由でアクセスすると処理全体で1us以上かかってしまう |
sankichi | 0:e1265f6b3565 | 54 | char detectedREQ_L = 0; |
sankichi | 0:e1265f6b3565 | 55 | char detectedREQ_H = 0; |
sankichi | 0:e1265f6b3565 | 56 | |
sankichi | 0:e1265f6b3565 | 57 | |
sankichi | 0:e1265f6b3565 | 58 | counter = Out_MD::DIGITAL_PERIODICPOLLING_COUNTERMAX; |
sankichi | 0:e1265f6b3565 | 59 | |
sankichi | 0:e1265f6b3565 | 60 | // カウンタ>0の間だけ、真剣にポーリングする |
sankichi | 0:e1265f6b3565 | 61 | while(counter--) |
sankichi | 0:e1265f6b3565 | 62 | { |
sankichi | 0:e1265f6b3565 | 63 | |
sankichi | 0:e1265f6b3565 | 64 | if( _INTR_REQ->read() ) |
sankichi | 0:e1265f6b3565 | 65 | { |
sankichi | 0:e1265f6b3565 | 66 | detectedREQ_H = 1; |
sankichi | 0:e1265f6b3565 | 67 | |
sankichi | 0:e1265f6b3565 | 68 | //RenewDigitalPadStatus(1); |
sankichi | 0:e1265f6b3565 | 69 | |
sankichi | 0:e1265f6b3565 | 70 | // phase1出力 |
sankichi | 0:e1265f6b3565 | 71 | |
sankichi | 0:e1265f6b3565 | 72 | // MD C |
sankichi | 0:e1265f6b3565 | 73 | if(_flagSwapAC) |
sankichi | 0:e1265f6b3565 | 74 | { |
sankichi | 0:e1265f6b3565 | 75 | _OUT_ACK->write ( (button & 0x00200) ? 1 : 0 ); // Digital "A" |
sankichi | 0:e1265f6b3565 | 76 | } |
sankichi | 0:e1265f6b3565 | 77 | else |
sankichi | 0:e1265f6b3565 | 78 | { |
sankichi | 0:e1265f6b3565 | 79 | _OUT_ACK->write( (button & 0x00020) ? 1 : 0 ); // Digital "C" |
sankichi | 0:e1265f6b3565 | 80 | } |
sankichi | 0:e1265f6b3565 | 81 | // MD B |
sankichi | 0:e1265f6b3565 | 82 | _OUT_LH->write ( (button & 0x00100) ? 1 : 0 ); // Digital "B" |
sankichi | 0:e1265f6b3565 | 83 | // MD Right |
sankichi | 0:e1265f6b3565 | 84 | _OUT_D3->write ( (button & 0x00400) ? 1 : 0 ); // Digital "Right" |
sankichi | 0:e1265f6b3565 | 85 | // MD Left |
sankichi | 0:e1265f6b3565 | 86 | _OUT_D2->write ( (button & 0x00800) ? 1 : 0 ); // Digital "Left" |
sankichi | 0:e1265f6b3565 | 87 | // MD Down |
sankichi | 0:e1265f6b3565 | 88 | _OUT_D1->write ( (button & 0x01000) ? 1 : 0 ); // Digital "Down" |
sankichi | 0:e1265f6b3565 | 89 | // MD Up |
sankichi | 0:e1265f6b3565 | 90 | _OUT_D0->write ( (button & 0x02000) ? 1 : 0 ); // Digital "Up" |
sankichi | 0:e1265f6b3565 | 91 | } |
sankichi | 0:e1265f6b3565 | 92 | else |
sankichi | 0:e1265f6b3565 | 93 | { |
sankichi | 0:e1265f6b3565 | 94 | detectedREQ_L = 1; |
sankichi | 0:e1265f6b3565 | 95 | |
sankichi | 0:e1265f6b3565 | 96 | //RenewDigitalPadStatus(0); |
sankichi | 0:e1265f6b3565 | 97 | |
sankichi | 0:e1265f6b3565 | 98 | // phase0出力 |
sankichi | 0:e1265f6b3565 | 99 | |
sankichi | 0:e1265f6b3565 | 100 | |
sankichi | 0:e1265f6b3565 | 101 | // サイバースティックのデジタルモードではStartボタンは読み取れない |
sankichi | 0:e1265f6b3565 | 102 | // (カブトガニは可能) |
sankichi | 0:e1265f6b3565 | 103 | // MD Start |
sankichi | 0:e1265f6b3565 | 104 | _OUT_ACK->write ( ((button & 0x00010)&&(button & 0x00002)) ? 1 : 0 ); // Digital "D" & "Start" |
sankichi | 0:e1265f6b3565 | 105 | |
sankichi | 0:e1265f6b3565 | 106 | // MD A |
sankichi | 0:e1265f6b3565 | 107 | if(_flagSwapAC) |
sankichi | 0:e1265f6b3565 | 108 | { |
sankichi | 0:e1265f6b3565 | 109 | _OUT_LH->write( (button & 0x00020) ? 1 : 0 ); // Digital "C" |
sankichi | 0:e1265f6b3565 | 110 | } |
sankichi | 0:e1265f6b3565 | 111 | else |
sankichi | 0:e1265f6b3565 | 112 | { |
sankichi | 0:e1265f6b3565 | 113 | _OUT_LH->write ( (button & 0x00200) ? 1 : 0 ); // Digital "A" |
sankichi | 0:e1265f6b3565 | 114 | } |
sankichi | 0:e1265f6b3565 | 115 | |
sankichi | 0:e1265f6b3565 | 116 | _OUT_D3->write ( 0 ); |
sankichi | 0:e1265f6b3565 | 117 | _OUT_D2->write ( 0 ); |
sankichi | 0:e1265f6b3565 | 118 | |
sankichi | 0:e1265f6b3565 | 119 | // MD Down |
sankichi | 0:e1265f6b3565 | 120 | _OUT_D1->write ( (button & 0x01000) ? 1 : 0 ); // Digital "Down" |
sankichi | 0:e1265f6b3565 | 121 | // MD Up |
sankichi | 0:e1265f6b3565 | 122 | _OUT_D0->write ( (button & 0x02000) ? 1 : 0 ); // Digital "Up" |
sankichi | 0:e1265f6b3565 | 123 | |
sankichi | 0:e1265f6b3565 | 124 | } |
sankichi | 0:e1265f6b3565 | 125 | |
sankichi | 0:e1265f6b3565 | 126 | // ゲーム機からの読み取り要求開始から |
sankichi | 0:e1265f6b3565 | 127 | // 一定時間たったら、ループ終了 |
sankichi | 0:e1265f6b3565 | 128 | if(detectedREQ_L && detectedREQ_H) |
sankichi | 0:e1265f6b3565 | 129 | { |
sankichi | 0:e1265f6b3565 | 130 | if(readCounter++ > 800) // だいたい1msのつもり |
sankichi | 0:e1265f6b3565 | 131 | { |
sankichi | 0:e1265f6b3565 | 132 | counter=0; |
sankichi | 0:e1265f6b3565 | 133 | break; |
sankichi | 0:e1265f6b3565 | 134 | } |
sankichi | 0:e1265f6b3565 | 135 | } |
sankichi | 0:e1265f6b3565 | 136 | |
sankichi | 0:e1265f6b3565 | 137 | |
sankichi | 0:e1265f6b3565 | 138 | } |
sankichi | 0:e1265f6b3565 | 139 | |
sankichi | 0:e1265f6b3565 | 140 | } |
sankichi | 0:e1265f6b3565 | 141 | |
sankichi | 0:e1265f6b3565 | 142 | |
sankichi | 0:e1265f6b3565 | 143 |