| /* |
| Simple DirectMedia Layer |
| Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org> |
| |
| This software is provided 'as-is', without any express or implied |
| warranty. In no event will the authors be held liable for any damages |
| arising from the use of this software. |
| |
| Permission is granted to anyone to use this software for any purpose, |
| including commercial applications, and to alter it and redistribute it |
| freely, subject to the following restrictions: |
| |
| 1. The origin of this software must not be misrepresented; you must not |
| claim that you wrote the original software. If you use this software |
| in a product, an acknowledgment in the product documentation would be |
| appreciated but is not required. |
| 2. Altered source versions must be plainly marked as such, and must not be |
| misrepresented as being the original software. |
| 3. This notice may not be removed or altered from any source distribution. |
| */ |
| |
| /** |
| * \file SDL_hidapi.h |
| * |
| * \brief Header file for SDL HIDAPI functions. |
| * |
| * This is an adaptation of the original HIDAPI interface by Alan Ott, |
| * and includes source code licensed under the following BSD license: |
| * |
| Copyright (c) 2010, Alan Ott, Signal 11 Software |
| All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions are met: |
| |
| * Redistributions of source code must retain the above copyright notice, |
| this list of conditions and the following disclaimer. |
| * Redistributions in binary form must reproduce the above copyright |
| notice, this list of conditions and the following disclaimer in the |
| documentation and/or other materials provided with the distribution. |
| * Neither the name of Signal 11 Software nor the names of its |
| contributors may be used to endorse or promote products derived from |
| this software without specific prior written permission. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| POSSIBILITY OF SUCH DAMAGE. |
| * |
| * If you would like a version of SDL without this code, you can build SDL |
| * with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for example |
| * on iOS or tvOS to avoid a dependency on the CoreBluetooth framework. |
| */ |
| |
| #ifndef SDL_hidapi_h_ |
| #define SDL_hidapi_h_ |
| |
| #include <SDL3/SDL_stdinc.h> |
| |
| #include <SDL3/SDL_begin_code.h> |
| /* Set up for C function definitions, even when using C++ */ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * \brief A handle representing an open HID device |
| */ |
| struct SDL_hid_device_; |
| typedef struct SDL_hid_device_ SDL_hid_device; /**< opaque hidapi structure */ |
| |
| /** hidapi info structure */ |
| /** |
| * \brief Information about a connected HID device |
| */ |
| typedef struct SDL_hid_device_info |
| { |
| /** Platform-specific device path */ |
| char *path; |
| /** Device Vendor ID */ |
| unsigned short vendor_id; |
| /** Device Product ID */ |
| unsigned short product_id; |
| /** Serial Number */ |
| wchar_t *serial_number; |
| /** Device Release Number in binary-coded decimal, |
| also known as Device Version Number */ |
| unsigned short release_number; |
| /** Manufacturer String */ |
| wchar_t *manufacturer_string; |
| /** Product string */ |
| wchar_t *product_string; |
| /** Usage Page for this Device/Interface |
| (Windows/Mac only). */ |
| unsigned short usage_page; |
| /** Usage for this Device/Interface |
| (Windows/Mac only).*/ |
| unsigned short usage; |
| /** The USB interface which this logical device |
| represents. |
| |
| * Valid on both Linux implementations in all cases. |
| * Valid on the Windows implementation only if the device |
| contains more than one interface. */ |
| int interface_number; |
| |
| /** Additional information about the USB interface. |
| Valid on libusb and Android implementations. */ |
| int interface_class; |
| int interface_subclass; |
| int interface_protocol; |
| |
| /** Pointer to the next device */ |
| struct SDL_hid_device_info *next; |
| } SDL_hid_device_info; |
| |
| |
| /** |
| * Initialize the HIDAPI library. |
| * |
| * This function initializes the HIDAPI library. Calling it is not strictly |
| * necessary, as it will be called automatically by SDL_hid_enumerate() and |
| * any of the SDL_hid_open_*() functions if it is needed. This function should |
| * be called at the beginning of execution however, if there is a chance of |
| * HIDAPI handles being opened by different threads simultaneously. |
| * |
| * Each call to this function should have a matching call to SDL_hid_exit() |
| * |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| * |
| * \sa SDL_hid_exit |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_init(void); |
| |
| /** |
| * Finalize the HIDAPI library. |
| * |
| * This function frees all of the static data associated with HIDAPI. It |
| * should be called at the end of execution to avoid memory leaks. |
| * |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| * |
| * \sa SDL_hid_init |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_exit(void); |
| |
| /** |
| * Check to see if devices may have been added or removed. |
| * |
| * Enumerating the HID devices is an expensive operation, so you can call this |
| * to see if there have been any system device changes since the last call to |
| * this function. A change in the counter returned doesn't necessarily mean |
| * that anything has changed, but you can call SDL_hid_enumerate() to get an |
| * updated device list. |
| * |
| * Calling this function for the first time may cause a thread or other system |
| * resource to be allocated to track device change notifications. |
| * |
| * \returns a change counter that is incremented with each potential device |
| * change, or 0 if device change detection isn't available. |
| * |
| * \since This function is available since SDL 3.0.0. |
| * |
| * \sa SDL_hid_enumerate |
| */ |
| extern DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void); |
| |
| /** |
| * Enumerate the HID Devices. |
| * |
| * This function returns a linked list of all the HID devices attached to the |
| * system which match vendor_id and product_id. If `vendor_id` is set to 0 |
| * then any vendor matches. If `product_id` is set to 0 then any product |
| * matches. If `vendor_id` and `product_id` are both set to 0, then all HID |
| * devices will be returned. |
| * |
| * \param vendor_id The Vendor ID (VID) of the types of device to open. |
| * \param product_id The Product ID (PID) of the types of device to open. |
| * \returns a pointer to a linked list of type SDL_hid_device_info, containing |
| * information about the HID devices attached to the system, or NULL |
| * in the case of failure. Free this linked list by calling |
| * SDL_hid_free_enumeration(). |
| * |
| * \since This function is available since SDL 3.0.0. |
| * |
| * \sa SDL_hid_device_change_count |
| */ |
| extern DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id); |
| |
| /** |
| * Free an enumeration Linked List |
| * |
| * This function frees a linked list created by SDL_hid_enumerate(). |
| * |
| * \param devs Pointer to a list of struct_device returned from |
| * SDL_hid_enumerate(). |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs); |
| |
| /** |
| * Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally |
| * a serial number. |
| * |
| * If `serial_number` is NULL, the first device with the specified VID and PID |
| * is opened. |
| * |
| * \param vendor_id The Vendor ID (VID) of the device to open. |
| * \param product_id The Product ID (PID) of the device to open. |
| * \param serial_number The Serial Number of the device to open (Optionally |
| * NULL). |
| * \returns a pointer to a SDL_hid_device object on success or NULL on |
| * failure. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); |
| |
| /** |
| * Open a HID device by its path name. |
| * |
| * The path name be determined by calling SDL_hid_enumerate(), or a |
| * platform-specific path name can be used (eg: /dev/hidraw0 on Linux). |
| * |
| * \param path The path name of the device to open |
| * \param bExclusive Open device in exclusive mode (Windows only) |
| * \returns a pointer to a SDL_hid_device object on success or NULL on |
| * failure. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path, int bExclusive /* = false */); |
| |
| /** |
| * Write an Output report to a HID device. |
| * |
| * The first byte of `data` must contain the Report ID. For devices which only |
| * support a single report, this must be set to 0x0. The remaining bytes |
| * contain the report data. Since the Report ID is mandatory, calls to |
| * SDL_hid_write() will always contain one more byte than the report contains. |
| * For example, if a hid report is 16 bytes long, 17 bytes must be passed to |
| * SDL_hid_write(), the Report ID (or 0x0, for devices with a single report), |
| * followed by the report data (16 bytes). In this example, the length passed |
| * in would be 17. |
| * |
| * SDL_hid_write() will send the data on the first OUT endpoint, if one |
| * exists. If it does not, it will send the data through the Control Endpoint |
| * (Endpoint 0). |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param data The data to send, including the report number as the first |
| * byte. |
| * \param length The length in bytes of the data to send. |
| * \returns the actual number of bytes written and -1 on error. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length); |
| |
| /** |
| * Read an Input report from a HID device with timeout. |
| * |
| * Input reports are returned to the host through the INTERRUPT IN endpoint. |
| * The first byte will contain the Report number if the device uses numbered |
| * reports. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param data A buffer to put the read data into. |
| * \param length The number of bytes to read. For devices with multiple |
| * reports, make sure to read an extra byte for the report |
| * number. |
| * \param milliseconds timeout in milliseconds or -1 for blocking wait. |
| * \returns the actual number of bytes read and -1 on error. If no packet was |
| * available to be read within the timeout period, this function |
| * returns 0. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds); |
| |
| /** |
| * Read an Input report from a HID device. |
| * |
| * Input reports are returned to the host through the INTERRUPT IN endpoint. |
| * The first byte will contain the Report number if the device uses numbered |
| * reports. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param data A buffer to put the read data into. |
| * \param length The number of bytes to read. For devices with multiple |
| * reports, make sure to read an extra byte for the report |
| * number. |
| * \returns the actual number of bytes read and -1 on error. If no packet was |
| * available to be read and the handle is in non-blocking mode, this |
| * function returns 0. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length); |
| |
| /** |
| * Set the device handle to be non-blocking. |
| * |
| * In non-blocking mode calls to SDL_hid_read() will return immediately with a |
| * value of 0 if there is no data to be read. In blocking mode, SDL_hid_read() |
| * will wait (block) until there is data to read before returning. |
| * |
| * Nonblocking can be turned on and off at any time. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param nonblock enable or not the nonblocking reads - 1 to enable |
| * nonblocking - 0 to disable nonblocking. |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock); |
| |
| /** |
| * Send a Feature report to the device. |
| * |
| * Feature reports are sent over the Control endpoint as a Set_Report |
| * transfer. The first byte of `data` must contain the Report ID. For devices |
| * which only support a single report, this must be set to 0x0. The remaining |
| * bytes contain the report data. Since the Report ID is mandatory, calls to |
| * SDL_hid_send_feature_report() will always contain one more byte than the |
| * report contains. For example, if a hid report is 16 bytes long, 17 bytes |
| * must be passed to SDL_hid_send_feature_report(): the Report ID (or 0x0, for |
| * devices which do not use numbered reports), followed by the report data (16 |
| * bytes). In this example, the length passed in would be 17. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param data The data to send, including the report number as the first |
| * byte. |
| * \param length The length in bytes of the data to send, including the report |
| * number. |
| * \returns the actual number of bytes written and -1 on error. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length); |
| |
| /** |
| * Get a feature report from a HID device. |
| * |
| * Set the first byte of `data` to the Report ID of the report to be read. |
| * Make sure to allow space for this extra byte in `data`. Upon return, the |
| * first byte will still contain the Report ID, and the report data will start |
| * in data[1]. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param data A buffer to put the read data into, including the Report ID. |
| * Set the first byte of `data` to the Report ID of the report to |
| * be read, or set it to zero if your device does not use numbered |
| * reports. |
| * \param length The number of bytes to read, including an extra byte for the |
| * report ID. The buffer can be longer than the actual report. |
| * \returns the number of bytes read plus one for the report ID (which is |
| * still in the first byte), or -1 on error. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length); |
| |
| /** |
| * Close a HID device. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev); |
| |
| /** |
| * Get The Manufacturer String from a HID device. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param string A wide string buffer to put the data into. |
| * \param maxlen The length of the buffer in multiples of wchar_t. |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); |
| |
| /** |
| * Get The Product String from a HID device. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param string A wide string buffer to put the data into. |
| * \param maxlen The length of the buffer in multiples of wchar_t. |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); |
| |
| /** |
| * Get The Serial Number String from a HID device. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param string A wide string buffer to put the data into. |
| * \param maxlen The length of the buffer in multiples of wchar_t. |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); |
| |
| /** |
| * Get a string from a HID device, based on its string index. |
| * |
| * \param dev A device handle returned from SDL_hid_open(). |
| * \param string_index The index of the string to get. |
| * \param string A wide string buffer to put the data into. |
| * \param maxlen The length of the buffer in multiples of wchar_t. |
| * \returns 0 on success or a negative error code on failure; call |
| * SDL_GetError() for more information. |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen); |
| |
| /** |
| * Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers |
| * |
| * \param active SDL_TRUE to start the scan, SDL_FALSE to stop the scan |
| * |
| * \since This function is available since SDL 3.0.0. |
| */ |
| extern DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active); |
| |
| /* Ends C function definitions when using C++ */ |
| #ifdef __cplusplus |
| } |
| #endif |
| #include <SDL3/SDL_close_code.h> |
| |
| #endif /* SDL_hidapi_h_ */ |