First Release

Dependencies:   USBDevice

Out_MD/CFunc_Out_MD.cpp

Committer:
sankichi
Date:
2013-07-27
Revision:
1:6c392ebcd4d4
Parent:
0:e1265f6b3565

File content as of revision 1:6c392ebcd4d4:

#include "mbed.h"
#include "CFunc_Out_MD.h"
#include "Out_MD.h"

// mbed pins
DigitalOut   *_OUT_D0;
DigitalOut   *_OUT_D1;
DigitalOut   *_OUT_D2;
DigitalOut   *_OUT_D3;
DigitalOut   *_OUT_LH;
InterruptIn  *_INTR_REQ;
DigitalOut   *_OUT_ACK;

// File local variables
static volatile int *_Buttons;
static volatile char _flagSwapAC;
// Static variables

// File local functions


void Cfunc_Out_MD_Initialize(
    DigitalOut  *out_D0,
    DigitalOut  *out_D1,
    DigitalOut  *out_D2,
    DigitalOut  *out_D3,
    DigitalOut  *out_LH,
    InterruptIn *intr_REQ,
    DigitalOut  *out_ACK,
    volatile int *pButtons,
    char        flagSwapAC
)
{
    // 入出力pin
    _OUT_D0   = out_D0;
    _OUT_D1   = out_D1;
    _OUT_D2   = out_D2;
    _OUT_D3   = out_D3;
    _OUT_LH   = out_LH;
    _INTR_REQ = intr_REQ;
    _OUT_ACK  = out_ACK;

    _flagSwapAC = flagSwapAC;

    // InputStatus
    _Buttons = pButtons;
}

void Cfunc_DigitalPeriodicPollingMethod(void)
{
    volatile int counter;
    volatile int readCounter = 0;   // REQ変化を検知してからのカウンタ値
    volatile int button = *_Buttons;    // ポインタ経由でアクセスすると処理全体で1us以上かかってしまう
    char detectedREQ_L = 0;
    char detectedREQ_H = 0;
    
    
    counter = Out_MD::DIGITAL_PERIODICPOLLING_COUNTERMAX;
    
    // カウンタ>0の間だけ、真剣にポーリングする
    while(counter--)
    {
                
        if( _INTR_REQ->read() )
        {
            detectedREQ_H = 1;
            
            //RenewDigitalPadStatus(1);

            // phase1出力
            
            // MD C
            if(_flagSwapAC)
            {
                _OUT_ACK->write ( (button & 0x00200) ? 1 : 0 ); // Digital "A"
            }
            else
            {
                _OUT_ACK->write( (button & 0x00020) ? 1 : 0 ); // Digital "C"
            }
            // MD B
            _OUT_LH->write ( (button & 0x00100) ? 1 : 0 ); // Digital "B"
            // MD Right
            _OUT_D3->write ( (button & 0x00400) ? 1 : 0 ); // Digital "Right"
            // MD Left
            _OUT_D2->write ( (button & 0x00800) ? 1 : 0 ); // Digital "Left"
            // MD Down
            _OUT_D1->write ( (button & 0x01000) ? 1 : 0 ); // Digital "Down"
            // MD Up
            _OUT_D0->write ( (button & 0x02000) ? 1 : 0 ); // Digital "Up"
        }
        else
        {
            detectedREQ_L = 1;
            
            //RenewDigitalPadStatus(0);

            // phase0出力

            
            // サイバースティックのデジタルモードではStartボタンは読み取れない
            // (カブトガニは可能)
            // MD Start
            _OUT_ACK->write ( ((button & 0x00010)&&(button & 0x00002)) ? 1 : 0 ); // Digital "D" & "Start"

            // MD A
            if(_flagSwapAC)
            {
                _OUT_LH->write( (button & 0x00020) ? 1 : 0 ); // Digital "C"
            }
            else
            {
                _OUT_LH->write ( (button & 0x00200) ? 1 : 0 ); // Digital "A"
            }

            _OUT_D3->write ( 0 );
            _OUT_D2->write ( 0 );

            // MD Down
            _OUT_D1->write ( (button & 0x01000) ? 1 : 0 ); // Digital "Down"
            // MD Up
            _OUT_D0->write ( (button & 0x02000) ? 1 : 0 ); // Digital "Up"
            
        }

        // ゲーム機からの読み取り要求開始から
        // 一定時間たったら、ループ終了
        if(detectedREQ_L && detectedREQ_H)
        {
            if(readCounter++ > 800) // だいたい1msのつもり
            {
                counter=0;
                break;
            }
        }


    }

}