XInput_Scp/SCPController.h (46 lines of code) (raw):

#pragma once class CSCPController { protected: PTCHAR m_deviceId, m_devicePath; volatile BOOL m_bConnected, m_xConnected; PHID_DEVICE m_lpHidDevice; XINPUT_STATE m_padState; XINPUT_VIBRATION m_padVibration; OVERLAPPED m_Reader, m_Writer; DWORD m_dwIndex; DWORD m_dwReportSize; BYTE* m_Report; BOOL m_bReportEnabled; SCP_EXTN m_Extended; protected: CSCPController(); CSCPController(DWORD dwIndex, DWORD dwReportSize); static inline float ToPressure(BYTE Value) { return ((int) Value & 0xFF) / 255.0f; } static inline float ClampAxis(float Value) { if (Value > 1.0f) return 1.0f; else if (Value < -1.0f) return -1.0f; else return Value; } static inline float ToAxis (SHORT Value) { return ClampAxis(Value / 32767.0f); } public: virtual ~CSCPController(void); virtual BOOL Open(void); virtual BOOL Close(void); virtual DWORD GetState(DWORD dwUserIndex, XINPUT_STATE* pState); virtual DWORD SetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration); virtual DWORD GetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities); virtual DWORD GetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid); virtual DWORD GetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation); virtual DWORD GetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke); virtual DWORD GetExtended(DWORD dwUserIndex, SCP_EXTN* pPressure); // UNDOCUMENTED virtual DWORD GetStateEx(DWORD dwUserIndex, XINPUT_STATE *pState); virtual DWORD WaitForGuideButton(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid); virtual DWORD CancelGuideButtonWait(DWORD dwUserIndex); virtual DWORD PowerOffController(DWORD dwUserIndex); protected: virtual BOOL Reopen(void); virtual BOOL Read(void); static void ReadThread(void *lpController); virtual void Report(void); virtual void InitReport(void); virtual SHORT Scale(SHORT Value); virtual void FormatReport(void) { }; virtual void XInputMapState(void) { }; };