First Release
Embed:
(wiki syntax)
Show/hide line numbers
CFunc_Out_MD.cpp
00001 #include "mbed.h" 00002 #include "CFunc_Out_MD.h" 00003 #include "Out_MD.h" 00004 00005 // mbed pins 00006 DigitalOut *_OUT_D0; 00007 DigitalOut *_OUT_D1; 00008 DigitalOut *_OUT_D2; 00009 DigitalOut *_OUT_D3; 00010 DigitalOut *_OUT_LH; 00011 InterruptIn *_INTR_REQ; 00012 DigitalOut *_OUT_ACK; 00013 00014 // File local variables 00015 static volatile int *_Buttons; 00016 static volatile char _flagSwapAC; 00017 // Static variables 00018 00019 // File local functions 00020 00021 00022 void Cfunc_Out_MD_Initialize( 00023 DigitalOut *out_D0, 00024 DigitalOut *out_D1, 00025 DigitalOut *out_D2, 00026 DigitalOut *out_D3, 00027 DigitalOut *out_LH, 00028 InterruptIn *intr_REQ, 00029 DigitalOut *out_ACK, 00030 volatile int *pButtons, 00031 char flagSwapAC 00032 ) 00033 { 00034 // 入出力pin 00035 _OUT_D0 = out_D0; 00036 _OUT_D1 = out_D1; 00037 _OUT_D2 = out_D2; 00038 _OUT_D3 = out_D3; 00039 _OUT_LH = out_LH; 00040 _INTR_REQ = intr_REQ; 00041 _OUT_ACK = out_ACK; 00042 00043 _flagSwapAC = flagSwapAC; 00044 00045 // InputStatus 00046 _Buttons = pButtons; 00047 } 00048 00049 void Cfunc_DigitalPeriodicPollingMethod(void) 00050 { 00051 volatile int counter; 00052 volatile int readCounter = 0; // REQ変化を検知してからのカウンタ値 00053 volatile int button = *_Buttons; // ポインタ経由でアクセスすると処理全体で1us以上かかってしまう 00054 char detectedREQ_L = 0; 00055 char detectedREQ_H = 0; 00056 00057 00058 counter = Out_MD::DIGITAL_PERIODICPOLLING_COUNTERMAX; 00059 00060 // カウンタ>0の間だけ、真剣にポーリングする 00061 while(counter--) 00062 { 00063 00064 if( _INTR_REQ->read() ) 00065 { 00066 detectedREQ_H = 1; 00067 00068 //RenewDigitalPadStatus(1); 00069 00070 // phase1出力 00071 00072 // MD C 00073 if(_flagSwapAC) 00074 { 00075 _OUT_ACK->write ( (button & 0x00200) ? 1 : 0 ); // Digital "A" 00076 } 00077 else 00078 { 00079 _OUT_ACK->write( (button & 0x00020) ? 1 : 0 ); // Digital "C" 00080 } 00081 // MD B 00082 _OUT_LH->write ( (button & 0x00100) ? 1 : 0 ); // Digital "B" 00083 // MD Right 00084 _OUT_D3->write ( (button & 0x00400) ? 1 : 0 ); // Digital "Right" 00085 // MD Left 00086 _OUT_D2->write ( (button & 0x00800) ? 1 : 0 ); // Digital "Left" 00087 // MD Down 00088 _OUT_D1->write ( (button & 0x01000) ? 1 : 0 ); // Digital "Down" 00089 // MD Up 00090 _OUT_D0->write ( (button & 0x02000) ? 1 : 0 ); // Digital "Up" 00091 } 00092 else 00093 { 00094 detectedREQ_L = 1; 00095 00096 //RenewDigitalPadStatus(0); 00097 00098 // phase0出力 00099 00100 00101 // サイバースティックのデジタルモードではStartボタンは読み取れない 00102 // (カブトガニは可能) 00103 // MD Start 00104 _OUT_ACK->write ( ((button & 0x00010)&&(button & 0x00002)) ? 1 : 0 ); // Digital "D" & "Start" 00105 00106 // MD A 00107 if(_flagSwapAC) 00108 { 00109 _OUT_LH->write( (button & 0x00020) ? 1 : 0 ); // Digital "C" 00110 } 00111 else 00112 { 00113 _OUT_LH->write ( (button & 0x00200) ? 1 : 0 ); // Digital "A" 00114 } 00115 00116 _OUT_D3->write ( 0 ); 00117 _OUT_D2->write ( 0 ); 00118 00119 // MD Down 00120 _OUT_D1->write ( (button & 0x01000) ? 1 : 0 ); // Digital "Down" 00121 // MD Up 00122 _OUT_D0->write ( (button & 0x02000) ? 1 : 0 ); // Digital "Up" 00123 00124 } 00125 00126 // ゲーム機からの読み取り要求開始から 00127 // 一定時間たったら、ループ終了 00128 if(detectedREQ_L && detectedREQ_H) 00129 { 00130 if(readCounter++ > 800) // だいたい1msのつもり 00131 { 00132 counter=0; 00133 break; 00134 } 00135 } 00136 00137 00138 } 00139 00140 } 00141 00142 00143
Generated on Thu Jul 14 2022 14:49:55 by 1.7.2