First Release

Dependencies:   USBDevice

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CFunc_Out_MD.cpp Source File

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