416 lines
16 KiB
C
416 lines
16 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 1997-2021 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_
|
|
|
|
/**
|
|
* \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.
|
|
*
|
|
* \returns 0 on success and -1 on error.
|
|
*
|
|
* \since This function is available since SDL 2.0.18.
|
|
*/
|
|
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.
|
|
*/
|
|
extern DECLSPEC int SDLCALL SDL_hid_exit(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.
|
|
*/
|
|
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().
|
|
*/
|
|
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.
|
|
*/
|
|
SDL_hid_device * 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.
|
|
*/
|
|
SDL_hid_device * 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().
|
|
*/
|
|
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);
|
|
|
|
#endif /* SDL_hidapi_h_ */
|
|
|
|
/* vi: set sts=4 ts=4 sw=4 expandtab: */
|