First Release

Dependencies:   USBDevice

Out_MD/Out_MD.h

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

File content as of revision 1:6c392ebcd4d4:

/** Class: Out_MD
 *
 * Used for writing to Megadrive analog joystick input mode
 *
 */

#include "mbed.h"
#include "InputStatus.h"

class Out_MD
{
public:
    /** Constructor: Out_MD
     *
     * Parameters:
     * pn_D0  - DigitalOut for Megadrive's D0 (D-Sub 9pin connector's pin1)
     * pn_D1  - DigitalOut for D1 (D-Sub9 pin2)
     * pn_D2  - DigitalOut for D2 (D-Sub9 pin3)
     * pn_D3  - DigitalOut for D3 (D-Sub9 pin4)
     * pn_LH  - DigitalOut for L/H (D-Sub9 pin6)
     * pn_REQ - InterruptIn for Req (D-Sub9 pin7)
     * pn_ACK - DigitalOut for Ack (D-Sub9 pin9)
     * inputStatus - The variable holds input status
     */

    Out_MD(
        PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3, 
        PinName pn_LH, PinName pn_REQ, PinName pn_ACK,
        InputStatus *inputStatus
    );
/*   
    void ShowReqInterval();
*/
    void SetupInputControll(void (*startInputFunction)(void), void (*stopInputFunction)(void));
    class CDummy;
    template<class T>
    void SetupInputControll(T* inputInstance, void (T::*startInputMethod)(void), void (T::*stopInputMethod)(void))
    {
        _InputInstance    = (CDummy*) inputInstance;
        StartInputMethod = (void (CDummy::*)(void)) startInputMethod;
        StopInputMethod  = (void (CDummy::*)(void)) stopInputMethod;
    }

    // Public constants
    static const int DIGITAL_PERIODICPOLLING_COUNTERMAX         = 12000;//7300; // 周期ポーリングカウンタ最大値
                                                                            // (ポーリングに使うカウンタ最大値)
    

private:
    // Private constants
    static const int REQUESTINTERVAL__MICROSEC      = 10000; // reading period 10msec
    static const int TRANSFERSPEED_MAX__MICROSEC    = 50;    // from AJOY_SUB.DOC
    static const int TRANSFERSPEED_1_2__MICROSEC    = 96;
    static const int TRANSFERSPEED_1_3__MICROSEC    = 144;
    static const int TRANSFERSPEED_1_4__MICROSEC    = 192;

    static const int DIGITAL_PERIODICPOLLING_INTERVAL__MICROSEC = 7000;//10000; // 周期ポーリングの間隔
                                                                            // (フレーム毎のゲーム機からのパッド読み取りの
                                                                            //   前後のみ、集中してポーリングを行う)

    static const int DIGITAL_STATE_RENEW_INTERVAL__MICROSEC     = 2000;     // 周期ポーリングの休みの間、デジタルパッド更新
    static const int MODECHECK_INTERVAL__MICROSEC   = 2000;                 // InputStatusのデジタルモード・アナログモード切替を見張る間隔

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

    // Variables
    InputStatus     *_InputStatus;
    volatile char   _InputMode;
    int             _TransferSpeed;
    Ticker          _DigitalStateRenewTicker;
    Ticker          _DigitalPeriodicPollingTicker;
    Ticker          _ModeChecker;
    volatile int    _ButtonStatus;
    char            _SwapAC;            // Aボタン-Cボタンをスワップする?(マスターシステム向け)
    char            _AnalogMUSHAMethod; // 武者アレスタ向けAnalog処理を使う?
    
    CDummy*         _InputInstance;

    
    // Private Method
    void Initialize(void);
//  void InitInterruptPriority(void);
    void ISR_Analog_ReqFall(void);
    void SetPinValue(int val);
    void SetData_Analog_PhaseOf(char phase);

    void DigitalStateRenewMethod(void);
    void EnableDigitalStateRenew(void);
    void DisableDigitalStateRenew(void);
    void RenewDigitalPadStatus(char phase);

    void RestartDigitalPeriodicPolling(void);
    void DigitalPeriodicPollingMethod(void);

    void EnableModeChecker(void);
    void DisableModeChecker(void);
    void ModeCheckerMethod(void);




    void (CDummy::*StartInputMethod)(void);
    void (CDummy::*StopInputMethod)(void);
    void (*StartInputFunction)(void);
    void (*StopInputFunction)(void);

    void EnableInput(void);
    void DisableInput(void);
};