First Release

Dependencies:   USBDevice

Out_SSMulCon/Out_SSMulCon.h

Committer:
sankichi
Date:
2013-07-27
Revision:
0:e1265f6b3565

File content as of revision 0:e1265f6b3565:

/** Class: Out_SSMulCon
 *
 * Output class for Sega Saturn's Sega Multi Controller
 *
 */

/*
注意書き・特殊操作

・入力デバイス:サイバースティックアナログモードのとき
  - サターンからはマルコンアナログモードに見える
  - G(SELECT)を押しながら上下左右スティック・・・十字キー操作
  - G(SELECT)を押しながらスロットル操作    ・・・LRキー操作

・入力デバイス:サイバースティックデジタルモードのとき
  - サターンからはマルコンデジタルモードに見える
  - DボタンがStartキーになる

・入力デバイス:ファイティングパッド6Bのとき
  - サターンからはマルコンデジタルモードに見える
  - modeキー押しながらトリガ・・・連射
  - modeキー左右・・・LRキー操作

*/

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

class Out_SSMulCon
{
public:
    /** Constructor: Out_SSMulcon
     *
     * Parameters:
     * pn_D0        - DigitalOut for D0 (SS pad connector's pin3)
     * pn_D1        - DigitalOut for D1 (pin2)
     * pn_D2        - DigitalOut for D2 (pin8)
     * pn_D3        - DigitalOut for D3 (pin7)
     * pn_TL        - InterruptIn for TL - L=DataEnable (pin4)
     * pn_TR        - InterruptIn for TR - Clock (pin5)
     * pn_TH        - DigitalOut for TH (pin6)
     * inputStatus  - Input status
     */

    Out_SSMulCon(
        PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3, 
        PinName pn_TL, PinName pn_TR, PinName pn_TH, 
        InputStatus *inputStatus
    );
     
private:
    // Private constants
    static const char OUTPUTMODE_ANALOG  = 0;
    static const char OUTPUTMODE_DIGITAL = 1;
    static const char OUTPUTMODE_6B      = 2;
    
    // mbed pins
    DigitalOut   _OUT_D0;
    DigitalOut   _OUT_D1;
    DigitalOut   _OUT_D2;
    DigitalOut   _OUT_D3;
    InterruptIn  _INTR_TL;
    InterruptIn  _INTR_TR;
    DigitalOut   _OUT_TH;

    // Variable
    InputStatus     *_InputStatus;
    char            _OutputMode;
    volatile char   _NowWriting;
    volatile char   _PhaseCounter;
    volatile char   _RapidFireValue;
    
    
    // Private Method
    void Initialize(void);
    void InitializePinStatus(void);
    void SetPinStatus(void);
    void SetD3D2D1D0(char d3, char d2, char d1, char d0);
    void SetBus(char data);

    void StrobeFallISR(void);
    void StrobeRiseISR(void);
    void ClockFallISR(void);
    void ClockRiseISR(void);
    
    void RenewOutputMode(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);

};