First Release
Out_PCE/Out_PCE.h@1:6c392ebcd4d4, 2013-07-27 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
sankichi | 0:e1265f6b3565 | 1 | /** Class: Out_PCE |
sankichi | 0:e1265f6b3565 | 2 | * |
sankichi | 0:e1265f6b3565 | 3 | * Output class for PC-Engine Analog/Digital stick |
sankichi | 0:e1265f6b3565 | 4 | * |
sankichi | 0:e1265f6b3565 | 5 | */ |
sankichi | 0:e1265f6b3565 | 6 | |
sankichi | 0:e1265f6b3565 | 7 | // ゲームごとによって微妙なタイミングの差異があると思われる。 |
sankichi | 0:e1265f6b3565 | 8 | // XHE-3実機があればもっと調査できたかもしれない。 |
sankichi | 0:e1265f6b3565 | 9 | |
sankichi | 0:e1265f6b3565 | 10 | #include "mbed.h" |
sankichi | 0:e1265f6b3565 | 11 | #include "InputStatus.h" |
sankichi | 0:e1265f6b3565 | 12 | |
sankichi | 0:e1265f6b3565 | 13 | class Out_PCE |
sankichi | 0:e1265f6b3565 | 14 | { |
sankichi | 0:e1265f6b3565 | 15 | public: |
sankichi | 0:e1265f6b3565 | 16 | /** Constructor: Out_PCE |
sankichi | 0:e1265f6b3565 | 17 | * |
sankichi | 0:e1265f6b3565 | 18 | * Parameters: |
sankichi | 0:e1265f6b3565 | 19 | * pn_1Y - DigitalOut for 1Y(Up/trigI) (PCE pad connector's pin2) |
sankichi | 0:e1265f6b3565 | 20 | * pn_2Y - DigitalOut for 2Y(Right/trigII) (pin3) |
sankichi | 0:e1265f6b3565 | 21 | * pn_3Y - DigitalOut for 3Y(Down/Select) (pin4) |
sankichi | 0:e1265f6b3565 | 22 | * pn_4Y - DigitalOut for 4Y(Left/Run) (pin5) |
sankichi | 0:e1265f6b3565 | 23 | * pn_DSEL - InterruptIn for DATASEL (pin6) |
sankichi | 0:e1265f6b3565 | 24 | * pn_ST - InterruptIn for /STROBE (pin7) |
sankichi | 0:e1265f6b3565 | 25 | * pn_POWDETECT - InterruptIn for PowerDetect (pin1) |
sankichi | 0:e1265f6b3565 | 26 | * inputStatus - Input status |
sankichi | 0:e1265f6b3565 | 27 | */ |
sankichi | 0:e1265f6b3565 | 28 | |
sankichi | 0:e1265f6b3565 | 29 | Out_PCE( |
sankichi | 0:e1265f6b3565 | 30 | PinName pn_1Y, PinName pn_2Y, PinName pn_3Y, PinName pn_4Y, |
sankichi | 0:e1265f6b3565 | 31 | PinName pn_DSEL, PinName pn_ST, PinName pn_POWDETECT, |
sankichi | 0:e1265f6b3565 | 32 | InputStatus *inputStatus |
sankichi | 0:e1265f6b3565 | 33 | ); |
sankichi | 0:e1265f6b3565 | 34 | |
sankichi | 0:e1265f6b3565 | 35 | private: |
sankichi | 0:e1265f6b3565 | 36 | // Private constants |
sankichi | 0:e1265f6b3565 | 37 | // ---- Analog ---- |
sankichi | 0:e1265f6b3565 | 38 | static const int TRANSFERSPEED_MAX__MICROSEC = 50; // from AJOY_SUB.DOC |
sankichi | 0:e1265f6b3565 | 39 | static const int TRANSFERSPEED_1_2__MICROSEC = 96; |
sankichi | 0:e1265f6b3565 | 40 | static const int TRANSFERSPEED_1_3__MICROSEC = 144; |
sankichi | 0:e1265f6b3565 | 41 | static const int TRANSFERSPEED_1_4__MICROSEC = 192; |
sankichi | 0:e1265f6b3565 | 42 | static const int MODECHECKPERIOD__MICROSEC = 5000; |
sankichi | 0:e1265f6b3565 | 43 | // ---- Digital ---- |
sankichi | 0:e1265f6b3565 | 44 | static const int DIGITALPAD_PHASECOUNT_MAX = 10; |
sankichi | 0:e1265f6b3565 | 45 | static const int DIGITALPAD_STATERENEWINTERVAL__MICROSEC= 5000; |
sankichi | 0:e1265f6b3565 | 46 | |
sankichi | 0:e1265f6b3565 | 47 | // mbed pins |
sankichi | 0:e1265f6b3565 | 48 | DigitalOut _OUT_1Y; |
sankichi | 0:e1265f6b3565 | 49 | DigitalOut _OUT_2Y; |
sankichi | 0:e1265f6b3565 | 50 | DigitalOut _OUT_3Y; |
sankichi | 0:e1265f6b3565 | 51 | DigitalOut _OUT_4Y; |
sankichi | 0:e1265f6b3565 | 52 | InterruptIn _INTR_DSEL; |
sankichi | 0:e1265f6b3565 | 53 | InterruptIn _INTR_ST; |
sankichi | 0:e1265f6b3565 | 54 | InterruptIn _INTR_POWDETECT; |
sankichi | 0:e1265f6b3565 | 55 | |
sankichi | 0:e1265f6b3565 | 56 | // Variable |
sankichi | 0:e1265f6b3565 | 57 | volatile char _OutputMode; |
sankichi | 0:e1265f6b3565 | 58 | InputStatus *_InputStatus; |
sankichi | 0:e1265f6b3565 | 59 | volatile char _NowWriting; |
sankichi | 0:e1265f6b3565 | 60 | volatile char _DataSelectStatus; |
sankichi | 0:e1265f6b3565 | 61 | |
sankichi | 0:e1265f6b3565 | 62 | volatile char _PhaseCounter; |
sankichi | 0:e1265f6b3565 | 63 | Ticker _PhaseChangeTicker; |
sankichi | 0:e1265f6b3565 | 64 | int _TransferSpeed; |
sankichi | 0:e1265f6b3565 | 65 | |
sankichi | 0:e1265f6b3565 | 66 | volatile char _Buttons; |
sankichi | 0:e1265f6b3565 | 67 | volatile char _Ch0; |
sankichi | 0:e1265f6b3565 | 68 | volatile char _Ch1; |
sankichi | 0:e1265f6b3565 | 69 | volatile char _Ch2; |
sankichi | 0:e1265f6b3565 | 70 | |
sankichi | 0:e1265f6b3565 | 71 | volatile char _RapidFireValue; |
sankichi | 0:e1265f6b3565 | 72 | volatile char _PhaseData[12]; |
sankichi | 0:e1265f6b3565 | 73 | |
sankichi | 0:e1265f6b3565 | 74 | Ticker _PCEPowerCheckTicker; |
sankichi | 0:e1265f6b3565 | 75 | volatile int _PCEActiveCounter; // 不要? |
sankichi | 0:e1265f6b3565 | 76 | |
sankichi | 0:e1265f6b3565 | 77 | Ticker _DigitalPadPhase0SetTicker; |
sankichi | 0:e1265f6b3565 | 78 | |
sankichi | 0:e1265f6b3565 | 79 | Ticker _ModeCheckTicker; |
sankichi | 0:e1265f6b3565 | 80 | |
sankichi | 0:e1265f6b3565 | 81 | // Private Method |
sankichi | 0:e1265f6b3565 | 82 | void Initialize(void); |
sankichi | 0:e1265f6b3565 | 83 | void InitializePowerChecker(void); |
sankichi | 0:e1265f6b3565 | 84 | void SetOutputPinsValue(char dat); |
sankichi | 0:e1265f6b3565 | 85 | void SetOutputPinsValue2(char dat); |
sankichi | 0:e1265f6b3565 | 86 | void RenewPins(void); |
sankichi | 0:e1265f6b3565 | 87 | |
sankichi | 0:e1265f6b3565 | 88 | void DSelFallISR(void); |
sankichi | 0:e1265f6b3565 | 89 | void DSelRiseISR(void); |
sankichi | 0:e1265f6b3565 | 90 | void StrobeFallISR(void); |
sankichi | 0:e1265f6b3565 | 91 | void StrobeRiseISR(void); |
sankichi | 0:e1265f6b3565 | 92 | |
sankichi | 0:e1265f6b3565 | 93 | void AttachTicker(void); |
sankichi | 0:e1265f6b3565 | 94 | void DetachTicker(void); |
sankichi | 0:e1265f6b3565 | 95 | void ChangePhase(void); |
sankichi | 0:e1265f6b3565 | 96 | |
sankichi | 0:e1265f6b3565 | 97 | void Enable_DigitalPadPhase0SetTicker(void); |
sankichi | 0:e1265f6b3565 | 98 | void Digital_TickerMethod(void); |
sankichi | 0:e1265f6b3565 | 99 | void Digital_SetDataOfPhase(char phaseCounter); |
sankichi | 0:e1265f6b3565 | 100 | // void InitInterruptPriority(void); |
sankichi | 0:e1265f6b3565 | 101 | void ModeChecker(void); |
sankichi | 0:e1265f6b3565 | 102 | |
sankichi | 0:e1265f6b3565 | 103 | // |
sankichi | 0:e1265f6b3565 | 104 | // for InputControll |
sankichi | 0:e1265f6b3565 | 105 | // |
sankichi | 0:e1265f6b3565 | 106 | public: |
sankichi | 0:e1265f6b3565 | 107 | void SetupInputControll(void (*startInputFunction)(void), void (*stopInputFunction)(void)); |
sankichi | 0:e1265f6b3565 | 108 | class CDummy; |
sankichi | 0:e1265f6b3565 | 109 | template<class T> |
sankichi | 0:e1265f6b3565 | 110 | void SetupInputControll(T* inputInstance, void (T::*startInputMethod)(void), void (T::*stopInputMethod)(void)) |
sankichi | 0:e1265f6b3565 | 111 | { |
sankichi | 0:e1265f6b3565 | 112 | _InputInstance = (CDummy*) inputInstance; |
sankichi | 0:e1265f6b3565 | 113 | StartInputMethod = (void (CDummy::*)(void)) startInputMethod; |
sankichi | 0:e1265f6b3565 | 114 | StopInputMethod = (void (CDummy::*)(void)) stopInputMethod; |
sankichi | 0:e1265f6b3565 | 115 | } |
sankichi | 0:e1265f6b3565 | 116 | |
sankichi | 0:e1265f6b3565 | 117 | private: |
sankichi | 0:e1265f6b3565 | 118 | CDummy* _InputInstance; |
sankichi | 0:e1265f6b3565 | 119 | void (CDummy::*StartInputMethod)(void); |
sankichi | 0:e1265f6b3565 | 120 | void (CDummy::*StopInputMethod)(void); |
sankichi | 0:e1265f6b3565 | 121 | void (*StartInputFunction)(void); |
sankichi | 0:e1265f6b3565 | 122 | void (*StopInputFunction)(void); |
sankichi | 0:e1265f6b3565 | 123 | void EnableInput(void); |
sankichi | 0:e1265f6b3565 | 124 | void DisableInput(void); |
sankichi | 0:e1265f6b3565 | 125 | |
sankichi | 0:e1265f6b3565 | 126 | }; |
sankichi | 0:e1265f6b3565 | 127 | |
sankichi | 0:e1265f6b3565 | 128 |