First Release

Dependencies:   USBDevice

Committer:
sankichi
Date:
Sat Jul 27 14:19:33 2013 +0000
Revision:
1:6c392ebcd4d4
Parent:
0:e1265f6b3565
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sankichi 0:e1265f6b3565 1 /** Class: Out_SSMulCon
sankichi 0:e1265f6b3565 2 *
sankichi 0:e1265f6b3565 3 * Output class for Sega Saturn's Sega Multi Controller
sankichi 0:e1265f6b3565 4 *
sankichi 0:e1265f6b3565 5 */
sankichi 0:e1265f6b3565 6
sankichi 0:e1265f6b3565 7 /*
sankichi 0:e1265f6b3565 8 注意書き・特殊操作
sankichi 0:e1265f6b3565 9
sankichi 0:e1265f6b3565 10 ・入力デバイス:サイバースティックアナログモードのとき
sankichi 0:e1265f6b3565 11 - サターンからはマルコンアナログモードに見える
sankichi 0:e1265f6b3565 12 - G(SELECT)を押しながら上下左右スティック・・・十字キー操作
sankichi 0:e1265f6b3565 13 - G(SELECT)を押しながらスロットル操作 ・・・LRキー操作
sankichi 0:e1265f6b3565 14
sankichi 0:e1265f6b3565 15 ・入力デバイス:サイバースティックデジタルモードのとき
sankichi 0:e1265f6b3565 16 - サターンからはマルコンデジタルモードに見える
sankichi 0:e1265f6b3565 17 - DボタンがStartキーになる
sankichi 0:e1265f6b3565 18
sankichi 0:e1265f6b3565 19 ・入力デバイス:ファイティングパッド6Bのとき
sankichi 0:e1265f6b3565 20 - サターンからはマルコンデジタルモードに見える
sankichi 0:e1265f6b3565 21 - modeキー押しながらトリガ・・・連射
sankichi 0:e1265f6b3565 22 - modeキー左右・・・LRキー操作
sankichi 0:e1265f6b3565 23
sankichi 0:e1265f6b3565 24 */
sankichi 0:e1265f6b3565 25
sankichi 0:e1265f6b3565 26 #include "mbed.h"
sankichi 0:e1265f6b3565 27 #include "InputStatus.h"
sankichi 0:e1265f6b3565 28
sankichi 0:e1265f6b3565 29 class Out_SSMulCon
sankichi 0:e1265f6b3565 30 {
sankichi 0:e1265f6b3565 31 public:
sankichi 0:e1265f6b3565 32 /** Constructor: Out_SSMulcon
sankichi 0:e1265f6b3565 33 *
sankichi 0:e1265f6b3565 34 * Parameters:
sankichi 0:e1265f6b3565 35 * pn_D0 - DigitalOut for D0 (SS pad connector's pin3)
sankichi 0:e1265f6b3565 36 * pn_D1 - DigitalOut for D1 (pin2)
sankichi 0:e1265f6b3565 37 * pn_D2 - DigitalOut for D2 (pin8)
sankichi 0:e1265f6b3565 38 * pn_D3 - DigitalOut for D3 (pin7)
sankichi 0:e1265f6b3565 39 * pn_TL - InterruptIn for TL - L=DataEnable (pin4)
sankichi 0:e1265f6b3565 40 * pn_TR - InterruptIn for TR - Clock (pin5)
sankichi 0:e1265f6b3565 41 * pn_TH - DigitalOut for TH (pin6)
sankichi 0:e1265f6b3565 42 * inputStatus - Input status
sankichi 0:e1265f6b3565 43 */
sankichi 0:e1265f6b3565 44
sankichi 0:e1265f6b3565 45 Out_SSMulCon(
sankichi 0:e1265f6b3565 46 PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3,
sankichi 0:e1265f6b3565 47 PinName pn_TL, PinName pn_TR, PinName pn_TH,
sankichi 0:e1265f6b3565 48 InputStatus *inputStatus
sankichi 0:e1265f6b3565 49 );
sankichi 0:e1265f6b3565 50
sankichi 0:e1265f6b3565 51 private:
sankichi 0:e1265f6b3565 52 // Private constants
sankichi 0:e1265f6b3565 53 static const char OUTPUTMODE_ANALOG = 0;
sankichi 0:e1265f6b3565 54 static const char OUTPUTMODE_DIGITAL = 1;
sankichi 0:e1265f6b3565 55 static const char OUTPUTMODE_6B = 2;
sankichi 0:e1265f6b3565 56
sankichi 0:e1265f6b3565 57 // mbed pins
sankichi 0:e1265f6b3565 58 DigitalOut _OUT_D0;
sankichi 0:e1265f6b3565 59 DigitalOut _OUT_D1;
sankichi 0:e1265f6b3565 60 DigitalOut _OUT_D2;
sankichi 0:e1265f6b3565 61 DigitalOut _OUT_D3;
sankichi 0:e1265f6b3565 62 InterruptIn _INTR_TL;
sankichi 0:e1265f6b3565 63 InterruptIn _INTR_TR;
sankichi 0:e1265f6b3565 64 DigitalOut _OUT_TH;
sankichi 0:e1265f6b3565 65
sankichi 0:e1265f6b3565 66 // Variable
sankichi 0:e1265f6b3565 67 InputStatus *_InputStatus;
sankichi 0:e1265f6b3565 68 char _OutputMode;
sankichi 0:e1265f6b3565 69 volatile char _NowWriting;
sankichi 0:e1265f6b3565 70 volatile char _PhaseCounter;
sankichi 0:e1265f6b3565 71 volatile char _RapidFireValue;
sankichi 0:e1265f6b3565 72
sankichi 0:e1265f6b3565 73
sankichi 0:e1265f6b3565 74 // Private Method
sankichi 0:e1265f6b3565 75 void Initialize(void);
sankichi 0:e1265f6b3565 76 void InitializePinStatus(void);
sankichi 0:e1265f6b3565 77 void SetPinStatus(void);
sankichi 0:e1265f6b3565 78 void SetD3D2D1D0(char d3, char d2, char d1, char d0);
sankichi 0:e1265f6b3565 79 void SetBus(char data);
sankichi 0:e1265f6b3565 80
sankichi 0:e1265f6b3565 81 void StrobeFallISR(void);
sankichi 0:e1265f6b3565 82 void StrobeRiseISR(void);
sankichi 0:e1265f6b3565 83 void ClockFallISR(void);
sankichi 0:e1265f6b3565 84 void ClockRiseISR(void);
sankichi 0:e1265f6b3565 85
sankichi 0:e1265f6b3565 86 void RenewOutputMode(void);
sankichi 0:e1265f6b3565 87
sankichi 0:e1265f6b3565 88
sankichi 0:e1265f6b3565 89
sankichi 0:e1265f6b3565 90 // for InputControll
sankichi 0:e1265f6b3565 91 public:
sankichi 0:e1265f6b3565 92 void SetupInputControll(void (*startInputFunction)(void), void (*stopInputFunction)(void));
sankichi 0:e1265f6b3565 93 class CDummy;
sankichi 0:e1265f6b3565 94 template<class T>
sankichi 0:e1265f6b3565 95 void SetupInputControll(T* inputInstance, void (T::*startInputMethod)(void), void (T::*stopInputMethod)(void))
sankichi 0:e1265f6b3565 96 {
sankichi 0:e1265f6b3565 97 _InputInstance = (CDummy*) inputInstance;
sankichi 0:e1265f6b3565 98 StartInputMethod = (void (CDummy::*)(void)) startInputMethod;
sankichi 0:e1265f6b3565 99 StopInputMethod = (void (CDummy::*)(void)) stopInputMethod;
sankichi 0:e1265f6b3565 100 }
sankichi 0:e1265f6b3565 101
sankichi 0:e1265f6b3565 102 private:
sankichi 0:e1265f6b3565 103 CDummy* _InputInstance;
sankichi 0:e1265f6b3565 104 void (CDummy::*StartInputMethod)(void);
sankichi 0:e1265f6b3565 105 void (CDummy::*StopInputMethod)(void);
sankichi 0:e1265f6b3565 106 void (*StartInputFunction)(void);
sankichi 0:e1265f6b3565 107 void (*StopInputFunction)(void);
sankichi 0:e1265f6b3565 108 void EnableInput(void);
sankichi 0:e1265f6b3565 109 void DisableInput(void);
sankichi 0:e1265f6b3565 110
sankichi 0:e1265f6b3565 111 };
sankichi 0:e1265f6b3565 112
sankichi 0:e1265f6b3565 113