#pragma once #include #include struct libevdev; struct ff_effect; class Emulator; class LinuxGameController { private: int _fd = -1; int _deviceID = -1; libevdev *_device = nullptr; bool _disconnected = false; std::thread _eventThread; std::atomic _stopFlag; Emulator* _emu = nullptr; unique_ptr _rumbleEffect; bool _enableForceFeedback = false; int _axisDefaultValue[0x100] = {}; LinuxGameController(Emulator* emu, int deviceID, int fileDescriptor, libevdev *device); bool CheckAxis(unsigned int code, bool forPositive); bool CheckButton(int btn); void Calibrate(); public: ~LinuxGameController(); static std::shared_ptr GetController(Emulator* emu, int deviceID, bool logInformation); bool IsDisconnected(); int GetDeviceID(); bool IsButtonPressed(int buttonNumber); optional GetAxisPosition(int axis); void SetForceFeedback(uint16_t rightMagnitude, uint16_t leftMagnitude); };