73 size_t read_buffer_size { 64 };
74 int poll_timeout_ms { 10 };
75 bool auto_reconnect {
true };
76 uint32_t reconnect_interval_ms { 1000 };
94 void start()
override;
96 void shutdown()
override;
98 [[nodiscard]]
bool is_initialized()
const override {
return m_initialized.load(); }
99 [[nodiscard]]
bool is_running()
const override {
return m_running.load(); }
101 [[nodiscard]] std::vector<InputDeviceInfo> get_devices()
const override;
102 size_t refresh_devices()
override;
104 bool open_device(uint32_t device_id)
override;
105 void close_device(uint32_t device_id)
override;
106 [[nodiscard]]
bool is_device_open(uint32_t device_id)
const override;
107 [[nodiscard]] std::vector<uint32_t> get_open_devices()
const override;
113 [[nodiscard]] std::string
get_name()
const override {
return "HID (HIDAPI)"; }
114 [[nodiscard]] std::string get_version()
const override;
131 void clear_device_filters();
138 [[nodiscard]] std::optional<HIDDeviceInfoExt> get_device_info_ext(uint32_t device_id)
const;
146 int send_feature_report(uint32_t device_id, std::span<const uint8_t> data);
155 int get_feature_report(uint32_t device_id, uint8_t report_id, std::span<uint8_t> buffer);
163 int write(uint32_t device_id, std::span<const uint8_t> data);
168 std::atomic<bool> m_initialized {
false };
169 std::atomic<bool> m_running {
false };
170 std::atomic<bool> m_stop_requested {
false };
175 uint32_t m_next_device_id { 1 };
182 void poll_thread_func();
185 bool matches_any_filter(uint16_t vid, uint16_t pid, uint16_t usage_page, uint16_t usage)
const;
186 uint32_t find_or_assign_device_id(
const std::string& path);
189 void notify_device_change(
const InputDeviceInfo& info,
bool connected);
191 InputValue parse_hid_report(uint32_t device_id, std::span<const uint8_t> report);
HIDBackend(const HIDBackend &)=delete
InputCallback m_input_callback
HIDBackend & operator=(const HIDBackend &)=delete
HIDBackend(HIDBackend &&)=delete
std::mutex m_callback_mutex
bool is_running() const override
Check if backend is actively listening.
bool is_initialized() const override
Check if backend is initialized.
std::thread m_poll_thread
std::mutex m_devices_mutex
HIDBackend & operator=(HIDBackend &&)=delete
DeviceCallback m_device_callback
std::unordered_map< uint32_t, HIDDeviceInfoExt > m_enumerated_devices
std::string get_name() const override
Get backend name/identifier string.
InputType get_type() const override
Get backend type.
std::unordered_map< uint32_t, std::shared_ptr< HIDDeviceState > > m_open_devices
HIDAPI-based HID input backend.
InputType
Input backend type enumeration.
std::function< void(const InputValue &)> InputCallback
Callback signature for input events.
std::function< void(const InputDeviceInfo &, bool connected)> DeviceCallback
Callback signature for device connection/disconnection events.
std::vector< HIDDeviceFilter > filters
Device filters (empty = all devices)
Configuration for HID backend.
Filter for HID device enumeration.
uint16_t release_number
Device release number.
uint16_t usage_page
HID usage page.
std::string path
Platform-specific device path.
int interface_number
USB interface number (-1 if unknown)
Extended HID device information.
std::vector< uint8_t > read_buffer
std::atomic< bool > active
Internal state for an open HID device.