diff options
Diffstat (limited to 'src/input_common/gcadapter/gc_adapter.h')
| -rw-r--r-- | src/input_common/gcadapter/gc_adapter.h | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/src/input_common/gcadapter/gc_adapter.h b/src/input_common/gcadapter/gc_adapter.h deleted file mode 100644 index e5de5e94f..000000000 --- a/src/input_common/gcadapter/gc_adapter.h +++ /dev/null | |||
| @@ -1,168 +0,0 @@ | |||
| 1 | // Copyright 2014 Dolphin Emulator Project | ||
| 2 | // Licensed under GPLv2+ | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | #include <algorithm> | ||
| 7 | #include <functional> | ||
| 8 | #include <mutex> | ||
| 9 | #include <thread> | ||
| 10 | #include <unordered_map> | ||
| 11 | #include "common/common_types.h" | ||
| 12 | #include "common/threadsafe_queue.h" | ||
| 13 | #include "input_common/main.h" | ||
| 14 | |||
| 15 | struct libusb_context; | ||
| 16 | struct libusb_device; | ||
| 17 | struct libusb_device_handle; | ||
| 18 | |||
| 19 | namespace GCAdapter { | ||
| 20 | |||
| 21 | enum class PadButton { | ||
| 22 | Undefined = 0x0000, | ||
| 23 | ButtonLeft = 0x0001, | ||
| 24 | ButtonRight = 0x0002, | ||
| 25 | ButtonDown = 0x0004, | ||
| 26 | ButtonUp = 0x0008, | ||
| 27 | TriggerZ = 0x0010, | ||
| 28 | TriggerR = 0x0020, | ||
| 29 | TriggerL = 0x0040, | ||
| 30 | ButtonA = 0x0100, | ||
| 31 | ButtonB = 0x0200, | ||
| 32 | ButtonX = 0x0400, | ||
| 33 | ButtonY = 0x0800, | ||
| 34 | ButtonStart = 0x1000, | ||
| 35 | // Below is for compatibility with "AxisButton" type | ||
| 36 | Stick = 0x2000, | ||
| 37 | }; | ||
| 38 | |||
| 39 | enum class PadAxes : u8 { | ||
| 40 | StickX, | ||
| 41 | StickY, | ||
| 42 | SubstickX, | ||
| 43 | SubstickY, | ||
| 44 | TriggerLeft, | ||
| 45 | TriggerRight, | ||
| 46 | Undefined, | ||
| 47 | }; | ||
| 48 | |||
| 49 | enum class ControllerTypes { | ||
| 50 | None, | ||
| 51 | Wired, | ||
| 52 | Wireless, | ||
| 53 | }; | ||
| 54 | |||
| 55 | struct GCPadStatus { | ||
| 56 | std::size_t port{}; | ||
| 57 | |||
| 58 | PadButton button{PadButton::Undefined}; // Or-ed PAD_BUTTON_* and PAD_TRIGGER_* bits | ||
| 59 | |||
| 60 | PadAxes axis{PadAxes::Undefined}; | ||
| 61 | s16 axis_value{}; | ||
| 62 | u8 axis_threshold{50}; | ||
| 63 | }; | ||
| 64 | |||
| 65 | struct GCController { | ||
| 66 | ControllerTypes type{}; | ||
| 67 | bool enable_vibration{}; | ||
| 68 | u8 rumble_amplitude{}; | ||
| 69 | u16 buttons{}; | ||
| 70 | PadButton last_button{}; | ||
| 71 | std::array<s16, 6> axis_values{}; | ||
| 72 | std::array<u8, 6> axis_origin{}; | ||
| 73 | u8 reset_origin_counter{}; | ||
| 74 | }; | ||
| 75 | |||
| 76 | class Adapter { | ||
| 77 | public: | ||
| 78 | Adapter(); | ||
| 79 | ~Adapter(); | ||
| 80 | |||
| 81 | /// Request a vibration for a controller | ||
| 82 | bool RumblePlay(std::size_t port, u8 amplitude); | ||
| 83 | |||
| 84 | /// Used for polling | ||
| 85 | void BeginConfiguration(); | ||
| 86 | void EndConfiguration(); | ||
| 87 | |||
| 88 | Common::SPSCQueue<GCPadStatus>& GetPadQueue(); | ||
| 89 | const Common::SPSCQueue<GCPadStatus>& GetPadQueue() const; | ||
| 90 | |||
| 91 | GCController& GetPadState(std::size_t port); | ||
| 92 | const GCController& GetPadState(std::size_t port) const; | ||
| 93 | |||
| 94 | /// Returns true if there is a device connected to port | ||
| 95 | bool DeviceConnected(std::size_t port) const; | ||
| 96 | |||
| 97 | /// Used for automapping features | ||
| 98 | std::vector<Common::ParamPackage> GetInputDevices() const; | ||
| 99 | InputCommon::ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) const; | ||
| 100 | InputCommon::AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) const; | ||
| 101 | |||
| 102 | private: | ||
| 103 | using AdapterPayload = std::array<u8, 37>; | ||
| 104 | |||
| 105 | void UpdatePadType(std::size_t port, ControllerTypes pad_type); | ||
| 106 | void UpdateControllers(const AdapterPayload& adapter_payload); | ||
| 107 | void UpdateYuzuSettings(std::size_t port); | ||
| 108 | void UpdateStateButtons(std::size_t port, u8 b1, u8 b2); | ||
| 109 | void UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_payload); | ||
| 110 | void UpdateVibrations(); | ||
| 111 | |||
| 112 | void AdapterInputThread(); | ||
| 113 | |||
| 114 | void AdapterScanThread(); | ||
| 115 | |||
| 116 | bool IsPayloadCorrect(const AdapterPayload& adapter_payload, s32 payload_size); | ||
| 117 | |||
| 118 | // Updates vibration state of all controllers | ||
| 119 | void SendVibrations(); | ||
| 120 | |||
| 121 | /// For use in initialization, querying devices to find the adapter | ||
| 122 | void Setup(); | ||
| 123 | |||
| 124 | /// Resets status of all GC controller devices to a disconnected state | ||
| 125 | void ResetDevices(); | ||
| 126 | |||
| 127 | /// Resets status of device connected to a disconnected state | ||
| 128 | void ResetDevice(std::size_t port); | ||
| 129 | |||
| 130 | /// Returns true if we successfully gain access to GC Adapter | ||
| 131 | bool CheckDeviceAccess(); | ||
| 132 | |||
| 133 | /// Captures GC Adapter endpoint address | ||
| 134 | /// Returns true if the endpoint was set correctly | ||
| 135 | bool GetGCEndpoint(libusb_device* device); | ||
| 136 | |||
| 137 | /// For shutting down, clear all data, join all threads, release usb | ||
| 138 | void Reset(); | ||
| 139 | |||
| 140 | // Join all threads | ||
| 141 | void JoinThreads(); | ||
| 142 | |||
| 143 | // Release usb handles | ||
| 144 | void ClearLibusbHandle(); | ||
| 145 | |||
| 146 | libusb_device_handle* usb_adapter_handle = nullptr; | ||
| 147 | std::array<GCController, 4> pads; | ||
| 148 | Common::SPSCQueue<GCPadStatus> pad_queue; | ||
| 149 | |||
| 150 | std::thread adapter_input_thread; | ||
| 151 | std::thread adapter_scan_thread; | ||
| 152 | bool adapter_input_thread_running; | ||
| 153 | bool adapter_scan_thread_running; | ||
| 154 | bool restart_scan_thread; | ||
| 155 | |||
| 156 | libusb_context* libusb_ctx; | ||
| 157 | |||
| 158 | u8 input_endpoint{0}; | ||
| 159 | u8 output_endpoint{0}; | ||
| 160 | u8 input_error_counter{0}; | ||
| 161 | u8 output_error_counter{0}; | ||
| 162 | int vibration_counter{0}; | ||
| 163 | |||
| 164 | bool configuring{false}; | ||
| 165 | bool rumble_enabled{true}; | ||
| 166 | bool vibration_changed{true}; | ||
| 167 | }; | ||
| 168 | } // namespace GCAdapter | ||