First Release

Dependencies:   USBDevice

Out_PCE/Out_PCE.h

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

File content as of revision 1:6c392ebcd4d4:

/** Class: Out_PCE
 *
 * Output class for PC-Engine Analog/Digital stick
 *
 */

// ゲームごとによって微妙なタイミングの差異があると思われる。
// XHE-3実機があればもっと調査できたかもしれない。

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

class Out_PCE
{
public:
    /** Constructor: Out_PCE
     *
     * Parameters:
     * pn_1Y        - DigitalOut for 1Y(Up/trigI)     (PCE pad connector's pin2)
     * pn_2Y        - DigitalOut for 2Y(Right/trigII) (pin3)
     * pn_3Y        - DigitalOut for 3Y(Down/Select)  (pin4)
     * pn_4Y        - DigitalOut for 4Y(Left/Run)     (pin5)
     * pn_DSEL      - InterruptIn for DATASEL         (pin6)
     * pn_ST        - InterruptIn for /STROBE         (pin7)
     * pn_POWDETECT - InterruptIn for PowerDetect     (pin1)
     * inputStatus  - Input status
     */

    Out_PCE(
        PinName pn_1Y, PinName pn_2Y, PinName pn_3Y, PinName pn_4Y, 
        PinName pn_DSEL, PinName pn_ST, PinName pn_POWDETECT, 
        InputStatus *inputStatus
    );
     
private:
    // Private constants
    // ---- Analog ----
    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 MODECHECKPERIOD__MICROSEC      = 5000;
    // ---- Digital ----
    static const int DIGITALPAD_PHASECOUNT_MAX              = 10;
    static const int DIGITALPAD_STATERENEWINTERVAL__MICROSEC= 5000;
    
    // mbed pins
    DigitalOut   _OUT_1Y;
    DigitalOut   _OUT_2Y;
    DigitalOut   _OUT_3Y;
    DigitalOut   _OUT_4Y;
    InterruptIn  _INTR_DSEL;
    InterruptIn  _INTR_ST;
    InterruptIn  _INTR_POWDETECT;

    // Variable
    volatile char   _OutputMode;
    InputStatus     *_InputStatus;
    volatile char   _NowWriting;
    volatile char   _DataSelectStatus;

    volatile char   _PhaseCounter;
    Ticker          _PhaseChangeTicker;
    int             _TransferSpeed;

    volatile char   _Buttons;
    volatile char   _Ch0;
    volatile char   _Ch1;
    volatile char   _Ch2;

    volatile char   _RapidFireValue;
    volatile char   _PhaseData[12];

    Ticker          _PCEPowerCheckTicker;
    volatile int    _PCEActiveCounter;  // 不要?

    Ticker          _DigitalPadPhase0SetTicker;
    
    Ticker          _ModeCheckTicker;
    
    // Private Method
    void Initialize(void);
    void InitializePowerChecker(void);
    void SetOutputPinsValue(char dat);
    void SetOutputPinsValue2(char dat);
    void RenewPins(void);
    
    void DSelFallISR(void);
    void DSelRiseISR(void);
    void StrobeFallISR(void);
    void StrobeRiseISR(void);
    
    void AttachTicker(void);
    void DetachTicker(void);
    void ChangePhase(void);

    void Enable_DigitalPadPhase0SetTicker(void);
    void Digital_TickerMethod(void);
    void Digital_SetDataOfPhase(char phaseCounter);
//    void InitInterruptPriority(void);
    void ModeChecker(void);

//
// for InputControll
//
public:
    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;
    }

private:
    CDummy*         _InputInstance;
    void (CDummy::*StartInputMethod)(void);
    void (CDummy::*StopInputMethod)(void);
    void (*StartInputFunction)(void);
    void (*StopInputFunction)(void);
    void EnableInput(void);
    void DisableInput(void);

};