123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- /*
- Simple DirectMedia Layer
- Copyright (C) 1997-2024 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
- *
- * 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 "SDL_stdinc.h"
- #include "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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- *
- * \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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- *
- * \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 2.0.18.
- *
- * \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 2.0.18.
- *
- * \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 2.0.18.
- */
- 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 2.0.18.
- */
- 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
- * \returns a pointer to a SDL_hid_device object on success or NULL on
- * failure.
- *
- * \since This function is available since SDL 2.0.18.
- */
- 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 2.0.18.
- */
- 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 2.0.18.
- */
- 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 2.0.18.
- */
- 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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- */
- 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 2.0.18.
- */
- 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 2.0.18.
- */
- 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().
- *
- * \since This function is available since SDL 2.0.18.
- */
- extern DECLSPEC void 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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- */
- 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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- */
- 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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- */
- 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 and -1 on error.
- *
- * \since This function is available since SDL 2.0.18.
- */
- 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 2.0.18.
- */
- extern DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active);
- /* Ends C function definitions when using C++ */
- #ifdef __cplusplus
- }
- #endif
- #include "close_code.h"
- #endif /* SDL_hidapi_h_ */
- /* vi: set sts=4 ts=4 sw=4 expandtab: */
|