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 "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