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_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