From 4363dd6ab46be0348778e4f15e4497a24e8923eb Mon Sep 17 00:00:00 2001 From: glsatz Date: Mon, 13 Feb 2012 04:25:59 +0000 Subject: [PATCH] hidapi update to version 2011-09-10 --- cpp/hidapi/README.txt | 81 ++- cpp/hidapi/hidapi/hidapi.h | 53 +- cpp/hidapi/hidtest/hidtest.cpp | 5 + cpp/hidapi/linux/Makefile | 24 +- cpp/hidapi/linux/hid-libusb.c | 129 ++++- cpp/hidapi/linux/hid.c | 89 ++- cpp/hidapi/mac/hid.c | 511 ++++++++++++++---- cpp/hidapi/testgui/Makefile.mac | 13 +- cpp/hidapi/testgui/README.txt | 27 - .../TestGUI.app/Contents/MacOS/testgui | Bin 63132 -> 72776 bytes cpp/hidapi/testgui/mac_support.h | 6 +- cpp/hidapi/testgui/test.cpp | 3 + cpp/hidapi/testgui/testgui.exe | Bin 539648 -> 540160 bytes cpp/hidapi/testgui/testgui.vcproj | 2 +- cpp/hidapi/udev/99-hid.rules | 29 + cpp/hidapi/windows/Makefile | 14 + cpp/hidapi/windows/Makefile.mingw | 32 ++ cpp/hidapi/windows/hid.cpp | 267 ++++++--- cpp/hidapi/windows/hidapi.vcproj | 2 +- cpp/src/platform/HidController.cpp | 17 +- cpp/src/platform/unix/EventImpl.cpp | 8 +- 21 files changed, 1020 insertions(+), 292 deletions(-) delete mode 100644 cpp/hidapi/testgui/README.txt create mode 100644 cpp/hidapi/udev/99-hid.rules create mode 100644 cpp/hidapi/windows/Makefile create mode 100644 cpp/hidapi/windows/Makefile.mingw diff --git a/cpp/hidapi/README.txt b/cpp/hidapi/README.txt index 1f0614da..2d14317d 100644 --- a/cpp/hidapi/README.txt +++ b/cpp/hidapi/README.txt @@ -3,11 +3,42 @@ HID API for Windows, Linux, and Mac OS X About ------ -HIDAPI is a multi-platform library which allows an application to interface with USB and Bluetooth HID-Class devices on Windows, Linux, and Mac OS X. On Windows, a DLL is built. On other platforms (and optionally on Windows), the single source file can simply be dropped into a target application. +HIDAPI is a multi-platform library which allows an application to interface +with USB and Bluetooth HID-Class devices on Windows, Linux, and Mac OS X. +On Windows, a DLL is built. On other platforms (and optionally on Windows), +the single source file can simply be dropped into a target application. + +HIDAPI has four back-ends: + * Windows (using hid.dll) + * Linux/hidraw (using the Kernel's hidraw driver) + * Linux/libusb (using libusb-1.0) + * Mac (using IOHidManager) + +On Linux, either the hidraw or the libusb back-end can be used. There are +tradeoffs, and the functionality supported is slightly different. + +Linux/hidraw (linux/hid.c): +This back-end uses the hidraw interface in the Linux kernel. While this +back-end will support both USB and Bluetooth, it has some limitations on +kernels prior to 2.6.39, including the inability to send or receive feature +reports. In addition, it will only communicate with devices which have +hidraw nodes associated with them. Keyboards, mice, and some other devices +which are blacklisted from having hidraw nodes will not work. Fortunately, +for nearly all the uses of hidraw, this is not a problem. + +Linux/libusb (linux/hid-libusb.c): +This back-end uses libusb-1.0 to communicate directly to a USB device. This +back-end will of course not work with Bluetooth devices. What Does the API Look Like? ----------------------------- -The API wraps the functionality of the most commonly used of the hid.dll functions. The sample program, which communicates with the USB Generic HID sample which is part of the Microchip Application Library (in folder "Microchip Solutions\USB Device - HID - Custom Demos\Generic HID - Firmware" when the Microchip Application Framework is installed), looks like this (with error checking removed for simplicity): +The API provides the the most commonly used HID functions including sending +and receiving of input, output, and feature reports. The sample program, +which communicates with a heavily modified version the USB Generic HID +sample which is part of the Microchip Application Library (in folder +"Microchip Solutions\USB Device - HID - Custom Demos\Generic HID - Firmware" +when the Microchip Application Framework is installed), looks like this +(with error checking removed for simplicity): #include #include @@ -66,7 +97,7 @@ int main(int argc, char* argv[]) License -------- -HIDAPI may be used by anyone for any reason so long as the coypright header in the source code remains intact. +HIDAPI may be used by one of three licenses as outlined in LICENSE.txt. Download --------- @@ -75,26 +106,48 @@ It can be downloaded from github Build Instructions ------------------- -Windows: - Build the .sln file in the windows/ directory. -Linux: - cd to the linux/ directory and run make. -Mac OS X: - cd to the mac/ directory and run make. +To build the console test program: + Windows: + Build the .sln file in the windows/ directory. + Linux: + cd to the linux/ directory and run make. + Mac OS X: + cd to the mac/ directory and run make. To build the Test GUI: - On Windows, build the .sln file in the hidtest/ directory. - On Linux and Mac, run make from the hidtest/ directory. + The test GUI uses Fox toolkit, available from www.fox-toolkit.org. + On Debian-based systems such as Ubuntu, install Fox using the following: + sudo apt-get install libfox-1.6-dev + On Mac OSX, install Fox from ports: + sudo port install fox + On Windows, download the hidapi-externals.zip file from the main download + site and extract it just outside of hidapi, so that hidapi-externals and + hidapi are on the same level, as shown: + + Parent_Folder + | + +hidapi + +hidapi-externals + + Then to build: + On Windows, build the .sln file in the testgui/ directory. + On Linux and Mac, run make from the testgui/ directory. To build using the DDK (old method): 1. Install the Windows Driver Kit (WDK) from Microsoft. - 2. From the Start menu, in the Windows Driver Kits folder, select Build Environments, then your operating system, then the x86 Free Build Environment (or one that is appropriate for your system). - 3. From the console, change directory to the windows/ddk_build/ directory, which is part of the HIDAPI distribution. + 2. From the Start menu, in the Windows Driver Kits folder, select Build + Environments, then your operating system, then the x86 Free Build + Environment (or one that is appropriate for your system). + 3. From the console, change directory to the windows/ddk_build/ directory, + which is part of the HIDAPI distribution. 4. Type build. - 5. You can find the output files (DLL and LIB) in a subdirectory created by the build system which is appropriate for your environment. On Windows XP, this directory is objfre_wxp_x86/i386. + 5. You can find the output files (DLL and LIB) in a subdirectory created + by the build system which is appropriate for your environment. On + Windows XP, this directory is objfre_wxp_x86/i386. -------------------------------- Signal 11 Software - 2010-04-11 2010-07-28 + 2011-09-10 diff --git a/cpp/hidapi/hidapi/hidapi.h b/cpp/hidapi/hidapi/hidapi.h index c7ab32cb..6c8c4839 100644 --- a/cpp/hidapi/hidapi/hidapi.h +++ b/cpp/hidapi/hidapi/hidapi.h @@ -69,7 +69,9 @@ extern "C" { (Windows/Mac only).*/ unsigned short usage; /** The USB interface which this logical device - represents (Linux/libusb implementation only). */ + represents. Valid on both Linux implementations + in all cases, and valid on the Windows implementation + only if the device contains more than one interface. */ int interface_number; /** Pointer to the next device */ @@ -77,6 +79,35 @@ extern "C" { }; + /** @brief Initialize the HIDAPI library. + + This function initializes the HIDAPI library. Calling it is not + strictly necessary, as it will be called automatically by + hid_enumerate() and any of the 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. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_init(void); + + /** @brief 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. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_exit(void); + /** @brief Enumerate the HID Devices. This function returns a linked list of all the HID devices @@ -169,6 +200,26 @@ extern "C" { */ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); + /** @brief 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. + + @ingroup API + @param device A device handle returned from 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 + This function returns the actual number of bytes read and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); + /** @brief Read an Input report from a HID device. Input reports are returned diff --git a/cpp/hidapi/hidtest/hidtest.cpp b/cpp/hidapi/hidtest/hidtest.cpp index e1dddd46..cb4fa559 100644 --- a/cpp/hidapi/hidtest/hidtest.cpp +++ b/cpp/hidapi/hidtest/hidtest.cpp @@ -178,6 +178,11 @@ int main(int argc, char* argv[]) printf("%02hhx ", buf[i]); printf("\n"); + hid_close(handle); + + /* Free static HIDAPI objects. */ + hid_exit(); + #ifdef WIN32 system("pause"); #endif diff --git a/cpp/hidapi/linux/Makefile b/cpp/hidapi/linux/Makefile index a1249928..338bbd31 100644 --- a/cpp/hidapi/linux/Makefile +++ b/cpp/hidapi/linux/Makefile @@ -8,23 +8,27 @@ all: hidtest -CC=gcc -CXX=g++ -COBJS=hid-libusb.o -CPPOBJS=../hidtest/hidtest.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS+=-I../hidapi -Wall -g -c `pkg-config libusb-1.0 --cflags` -LIBS=`pkg-config libusb-1.0 libudev --libs` +CC ?= gcc +CFLAGS ?= -Wall -g + +CXX ?= g++ +CXXFLAGS ?= -Wall -g + +COBJS = hid-libusb.o +CPPOBJS = ../hidtest/hidtest.o +OBJS = $(COBJS) $(CPPOBJS) +LIBS = `pkg-config libusb-1.0 libudev --libs` +INCLUDES ?= -I../hidapi `pkg-config libusb-1.0 --cflags` hidtest: $(OBJS) - g++ -Wall -g $^ $(LIBS) -o hidtest + $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ $(LIBS) -o hidtest $(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ + $(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@ $(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ + $(CXX) $(CXXFLAGS) -c $(INCLUDES) $< -o $@ clean: rm -f $(OBJS) hidtest diff --git a/cpp/hidapi/linux/hid-libusb.c b/cpp/hidapi/linux/hid-libusb.c index 1baf2c4c..9ec3cbc2 100644 --- a/cpp/hidapi/linux/hid-libusb.c +++ b/cpp/hidapi/linux/hid-libusb.c @@ -22,6 +22,8 @@ http://github.com/signal11/hidapi . ********************************************************/ +#define _GNU_SOURCE // needed for wcsdup() before glibc 2.10 + /* C */ #include #include @@ -38,6 +40,7 @@ #include #include #include +#include /* GNU / LibUSB */ #include "libusb.h" @@ -103,7 +106,7 @@ struct hid_device_ { struct input_report *input_reports; }; -static int initialized = 0; +static libusb_context *usb_context = NULL; uint16_t get_usb_code_for_current_locale(void); static int return_data(hid_device *dev, unsigned char *data, size_t length); @@ -244,7 +247,7 @@ static int get_usage(uint8_t *report_descriptor, size_t size, if (usage_page_found && usage_found) return 0; /* success */ - /* Skip over this key and its associated data */ + /* Skip over this key and it's associated data */ i += data_len + key_size; } @@ -378,6 +381,27 @@ static char *make_path(libusb_device *dev, int interface_number) return strdup(str); } + +int HID_API_EXPORT hid_init(void) +{ + if (!usb_context) { + if (libusb_init(&usb_context)) + return -1; + } + + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + if (usb_context) { + libusb_exit(usb_context); + usb_context = NULL; + } + + return 0; +} + struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) { libusb_device **devs; @@ -391,12 +415,9 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, setlocale(LC_ALL,""); - if (!initialized) { - libusb_init(NULL); - initialized = 1; - } - - num_devs = libusb_get_device_list(NULL, &devs); + hid_init(); + + num_devs = libusb_get_device_list(usb_context, &devs); if (num_devs < 0) return NULL; while ((dev = devs[i++]) != NULL) { @@ -679,11 +700,7 @@ static void *read_thread(void *param) /* Handle all the events. */ while (!dev->shutdown_thread) { int res; - struct timeval tv; - - tv.tv_sec = 0; - tv.tv_usec = 100; //TODO: Fix this value. - res = libusb_handle_events_timeout(NULL, &tv); + res = libusb_handle_events(usb_context); if (res < 0) { /* There was an error. Break out of this loop. */ break; @@ -694,8 +711,17 @@ static void *read_thread(void *param) if no transfers are pending, but that's OK. */ if (libusb_cancel_transfer(dev->transfer) == 0) { /* The transfer was cancelled, so wait for its completion. */ - libusb_handle_events(NULL); + libusb_handle_events(usb_context); } + + /* Now that the read thread is stopping, Wake any threads which are + waiting on data (in hid_read_timeout()). Do this under a mutex to + make sure that a thread which is about to go to sleep waiting on + the condition acutally will go to sleep before the condition is + signaled. */ + pthread_mutex_lock(&dev->mutex); + pthread_cond_broadcast(&dev->condition); + pthread_mutex_unlock(&dev->mutex); /* The dev->transfer->buffer and dev->transfer objects are cleaned up in hid_close(). They are not cleaned up here because this thread @@ -724,12 +750,9 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) setlocale(LC_ALL,""); - if (!initialized) { - libusb_init(NULL); - initialized = 1; - } - - num_devs = libusb_get_device_list(NULL, &devs); + hid_init(); + + num_devs = libusb_get_device_list(usb_context, &devs); while ((usb_dev = devs[d++]) != NULL) { struct libusb_device_descriptor desc; struct libusb_config_descriptor *conf_desc = NULL; @@ -752,6 +775,7 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) res = libusb_open(usb_dev, &dev->device_handle); if (res < 0) { LOG("can't open device\n"); + free(dev_path); break; } good_open = 1; @@ -763,6 +787,7 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) if (res < 0) { libusb_close(dev->device_handle); LOG("Unable to detach Kernel Driver\n"); + free(dev_path); good_open = 0; break; } @@ -771,6 +796,7 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) res = libusb_claim_interface(dev->device_handle, intf_desc->bInterfaceNumber); if (res < 0) { LOG("can't claim interface %d: %d\n", intf_desc->bInterfaceNumber, res); + free(dev_path); libusb_close(dev->device_handle); good_open = 0; break; @@ -910,8 +936,14 @@ static int return_data(hid_device *dev, unsigned char *data, size_t length) return len; } +static void cleanup_mutex(void *param) +{ + hid_device *dev = param; + pthread_mutex_unlock(&dev->mutex); +} -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) { int bytes_read = -1; @@ -923,6 +955,7 @@ int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) #endif pthread_mutex_lock(&dev->mutex); + pthread_cleanup_push(&cleanup_mutex, dev); /* There's an input report queued up. Return it. */ if (dev->input_reports) { @@ -938,20 +971,68 @@ int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) goto ret; } - if (dev->blocking) { - pthread_cond_wait(&dev->condition, &dev->mutex); - bytes_read = return_data(dev, data, length); + if (milliseconds == -1) { + /* Blocking */ + while (!dev->input_reports && !dev->shutdown_thread) { + pthread_cond_wait(&dev->condition, &dev->mutex); + } + if (dev->input_reports) { + bytes_read = return_data(dev, data, length); + } + } + else if (milliseconds > 0) { + /* Non-blocking, but called with timeout. */ + int res; + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; + } + + while (!dev->input_reports && !dev->shutdown_thread) { + res = pthread_cond_timedwait(&dev->condition, &dev->mutex, &ts); + if (res == 0) { + if (dev->input_reports) { + bytes_read = return_data(dev, data, length); + break; + } + + /* If we're here, there was a spurious wake up + or the read thread was shutdown. Run the + loop again (ie: don't break). */ + } + else if (res == ETIMEDOUT) { + /* Timed out. */ + bytes_read = 0; + break; + } + else { + /* Error. */ + bytes_read = -1; + break; + } + } } else { + /* Purely non-blocking */ bytes_read = 0; } ret: pthread_mutex_unlock(&dev->mutex); + pthread_cleanup_pop(0); return bytes_read; } +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, dev->blocking ? -1 : 0); +} + int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) { dev->blocking = !nonblock; diff --git a/cpp/hidapi/linux/hid.c b/cpp/hidapi/linux/hid.c index cac6d0d6..f810683d 100644 --- a/cpp/hidapi/linux/hid.c +++ b/cpp/hidapi/linux/hid.c @@ -35,6 +35,7 @@ #include #include #include +#include /* Linux */ #include @@ -43,12 +44,12 @@ #include "hidapi.h" -/* - * Added here until linux/hidraw.h has them. These definitions require a version - * 2.6.39 based kernel as well. - */ +/* Definitions from linux/hidraw.h. Since these are new, some distros + may not have header files which contain them. */ #ifndef HIDIOCSFEATURE #define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) +#endif +#ifndef HIDIOCGFEATURE #define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) #endif @@ -71,6 +72,13 @@ hid_device *new_hid_device() return dev; } +#ifdef notdef +static void register_error(hid_device *device, const char *op) +{ + +} +#endif + /* Get an attribute value from a udev_device and return it as a whar_t string. The returned string must be freed with free() when done.*/ static wchar_t *copy_udev_string(struct udev_device *dev, const char *udev_name) @@ -143,7 +151,7 @@ static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { key_size = 1; } - /* Skip over this key and its associated data */ + /* Skip over this key and it's associated data */ i += data_len + key_size; } @@ -154,7 +162,7 @@ static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { static int get_device_string(hid_device *dev, const char *key, wchar_t *string, size_t maxlen) { struct udev *udev; - struct udev_device *udev_dev, *parent = NULL; + struct udev_device *udev_dev, *parent; struct stat s; int ret = -1; @@ -189,21 +197,31 @@ static int get_device_string(hid_device *dev, const char *key, wchar_t *string, } end: - udev_device_unref(parent); - // udev_dev doesn't need unref'd. Not sure why, but - // it'll throw "double free" errors. + udev_device_unref(udev_dev); + // parent doesn't need to be (and can't be) unref'd. + // I'm not sure why, but it'll throw double-free() errors. udev_unref(udev); return ret; } +int HID_API_EXPORT hid_init(void) +{ + /* Nothing to do for this in the Linux/hidraw implementation. */ + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + /* Nothing to do for this in the Linux/hidraw implementation. */ + return 0; +} struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) { struct udev *udev; struct udev_enumerate *enumerate; struct udev_list_entry *devices, *dev_list_entry; - struct udev_device *dev; struct hid_device_info *root = NULL; // return object struct hid_device_info *cur_dev = NULL; @@ -228,23 +246,26 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, const char *sysfs_path; const char *dev_path; const char *str; + struct udev_device *hid_dev; // The device's HID udev node. + struct udev_device *dev; // The actual hardware device. + struct udev_device *intf_dev; // The device's interface (in the USB sense). unsigned short dev_vid; unsigned short dev_pid; /* Get the filename of the /sys entry for the device and create a udev_device object (dev) representing it */ sysfs_path = udev_list_entry_get_name(dev_list_entry); - dev = udev_device_new_from_syspath(udev, sysfs_path); - dev_path = udev_device_get_devnode(dev); + hid_dev = udev_device_new_from_syspath(udev, sysfs_path); + dev_path = udev_device_get_devnode(hid_dev); - /* The device pointed to by dev contains information about + /* The device pointed to by hid_dev contains information about the hidraw device. In order to get information about the USB device, get the parent device with the subsystem/devtype pair of "usb"/"usb_device". This will be several levels up the tree, but the function will find it.*/ dev = udev_device_get_parent_with_subsystem_devtype( - dev, + hid_dev, "usb", "usb_device"); if (!dev) { @@ -304,15 +325,26 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, str = udev_device_get_sysattr_value(dev, "bcdDevice"); cur_dev->release_number = (str)? strtol(str, NULL, 16): 0x0; - /* Interface Number (Unsupported on Linux/hidraw) */ + /* Interface Number */ cur_dev->interface_number = -1; - + /* Get a handle to the interface's udev node. */ + intf_dev = udev_device_get_parent_with_subsystem_devtype( + hid_dev, + "usb", + "usb_interface"); + if (intf_dev) { + str = udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber"); + cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1; + } } else goto next; next: - udev_device_unref(dev); + udev_device_unref(hid_dev); + /* dev and intf_dev don't need to be (and can't be) + unref()d. It will cause a double-free() error. I'm not + sure why. */ } /* Free the enumerator and udev objects. */ udev_enumerate_unref(enumerate); @@ -441,10 +473,26 @@ int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t } -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) { int bytes_read; + if (milliseconds != 0) { + /* milliseconds is -1 or > 0. In both cases, we want to + call poll() and wait for data to arrive. -1 means + INFINITE. */ + int ret; + struct pollfd fds; + + fds.fd = dev->device_handle; + fds.events = POLLIN; + fds.revents = 0; + ret = poll(&fds, 1, milliseconds); + if (ret == -1 || ret == 0) + /* Error or timeout */ + return ret; + } + bytes_read = read(dev->device_handle, data, length); if (bytes_read < 0 && errno == EAGAIN) bytes_read = 0; @@ -460,6 +508,11 @@ int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) return bytes_read; } +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) { int flags, res; diff --git a/cpp/hidapi/mac/hid.c b/cpp/hidapi/mac/hid.c index 6ef86709..b7d738e9 100644 --- a/cpp/hidapi/mac/hid.c +++ b/cpp/hidapi/mac/hid.c @@ -20,15 +20,79 @@ http://github.com/signal11/hidapi . ********************************************************/ +/* See Apple Technical Note TN2187 for details on IOHidManager. */ #include #include +#include #include #include #include +#include +#include #include "hidapi.h" +/* Barrier implementation because Mac OSX doesn't have pthread_barrier. + It also doesn't have clock_gettime(). So much for POSIX and SUSv2. + This implementation came from Brent Priddy and was posted on + StackOverflow. It is used with his permission. */ +typedef int pthread_barrierattr_t; +typedef struct pthread_barrier { + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int trip_count; +} pthread_barrier_t; + +static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) { + errno = EINVAL; + return -1; + } + + if(pthread_mutex_init(&barrier->mutex, 0) < 0) { + return -1; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) { + pthread_mutex_destroy(&barrier->mutex); + return -1; + } + barrier->trip_count = count; + barrier->count = 0; + + return 0; +} + +static int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +static int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->trip_count) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return 1; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +static int return_data(hid_device *dev, unsigned char *data, size_t length); + /* Linked List of input reports received from the device. */ struct input_report { uint8_t *data; @@ -42,10 +106,18 @@ struct hid_device_ { int uses_numbered_reports; int disconnected; CFStringRef run_loop_mode; - CFRunLoopRef runloopref; + CFRunLoopRef run_loop; + CFRunLoopSourceRef source; uint8_t *input_report_buf; + CFIndex max_input_report_len; struct input_report *input_reports; - pthread_mutex_t mutex; + + pthread_t thread; + pthread_mutex_t mutex; /* Protects input_reports */ + pthread_cond_t condition; + pthread_barrier_t barrier; /* Ensures correct startup sequence */ + pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ + int shutdown_thread; hid_device *next; }; @@ -54,6 +126,7 @@ struct hid_device_ { disconnected, its hid_device structure can be marked as disconnected from hid_device_removal_callback(). */ static hid_device *device_list = NULL; +static pthread_mutex_t device_list_mutex = PTHREAD_MUTEX_INITIALIZER; static hid_device *new_hid_device(void) { @@ -63,13 +136,21 @@ static hid_device *new_hid_device(void) dev->uses_numbered_reports = 0; dev->disconnected = 0; dev->run_loop_mode = NULL; + dev->run_loop = NULL; + dev->source = NULL; dev->input_report_buf = NULL; dev->input_reports = NULL; + dev->shutdown_thread = 0; dev->next = NULL; + /* Thread objects */ pthread_mutex_init(&dev->mutex, NULL); + pthread_cond_init(&dev->condition, NULL); + pthread_barrier_init(&dev->barrier, NULL, 2); + pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); /* Add the new record to the device_list. */ + pthread_mutex_lock(&device_list_mutex); if (!device_list) device_list = dev; else { @@ -82,6 +163,7 @@ static hid_device *new_hid_device(void) d = d->next; } } + pthread_mutex_unlock(&device_list_mutex); return dev; } @@ -105,11 +187,18 @@ static void free_hid_device(hid_device *dev) free() and others do. */ if (dev->run_loop_mode) CFRelease(dev->run_loop_mode); + if (dev->source) + CFRelease(dev->source); free(dev->input_report_buf); + /* Clean up the thread objects */ + pthread_barrier_destroy(&dev->shutdown_barrier); + pthread_barrier_destroy(&dev->barrier); + pthread_cond_destroy(&dev->condition); pthread_mutex_destroy(&dev->mutex); /* Remove it from the device list. */ + pthread_mutex_lock(&device_list_mutex); hid_device *d = device_list; if (d == dev) { device_list = d->next; @@ -124,10 +213,10 @@ static void free_hid_device(hid_device *dev) d = d->next; } } + pthread_mutex_unlock(&device_list_mutex); /* Free the structure itself. */ free(dev); - } static IOHIDManagerRef hid_mgr = 0x0; @@ -174,16 +263,25 @@ static int32_t get_max_report_length(IOHIDDeviceRef device) static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) { - CFStringRef str = IOHIDDeviceGetProperty(device, prop); + CFStringRef str; + + if (!len) + return 0; - buf[0] = 0x0000; + str = IOHIDDeviceGetProperty(device, prop); + + buf[0] = 0; if (str) { + len --; + + CFIndex str_len = CFStringGetLength(str); CFRange range; range.location = 0; - range.length = len; + range.length = (str_len > len)? len: str_len; CFIndex used_buf_len; - CFStringGetBytes(str, + CFIndex chars_copied; + chars_copied = CFStringGetBytes(str, range, kCFStringEncodingUTF32LE, (char)'?', @@ -191,8 +289,9 @@ static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t (UInt8*)buf, len, &used_buf_len); - buf[len-1] = 0x00000000; - return used_buf_len; + + buf[chars_copied] = 0; + return chars_copied; } else return 0; @@ -201,16 +300,24 @@ static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t static int get_string_property_utf8(IOHIDDeviceRef device, CFStringRef prop, char *buf, size_t len) { - CFStringRef str = IOHIDDeviceGetProperty(device, prop); + CFStringRef str; + if (!len) + return 0; - buf[0] = 0x0000; + str = IOHIDDeviceGetProperty(device, prop); + + buf[0] = 0; if (str) { + len--; + + CFIndex str_len = CFStringGetLength(str); CFRange range; range.location = 0; - range.length = len; + range.length = (str_len > len)? len: str_len; CFIndex used_buf_len; - CFStringGetBytes(str, + CFIndex chars_copied; + chars_copied = CFStringGetBytes(str, range, kCFStringEncodingUTF8, (char)'?', @@ -218,12 +325,12 @@ static int get_string_property_utf8(IOHIDDeviceRef device, CFStringRef prop, cha (UInt8*)buf, len, &used_buf_len); - buf[len-1] = 0x00000000; + + buf[chars_copied] = 0; return used_buf_len; } else return 0; - } @@ -280,15 +387,53 @@ static int make_path(IOHIDDeviceRef device, char *buf, size_t len) return res+1; } -static void init_hid_manager(void) +/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ +static int init_hid_manager(void) { + IOReturn res; + /* Initialize all the HID Manager Objects */ hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - IOHIDManagerSetDeviceMatching(hid_mgr, NULL); - IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - IOHIDManagerOpen(hid_mgr, kIOHIDOptionsTypeNone); + if (hid_mgr) { + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + return 0; + } + + return -1; } +/* Initialize the IOHIDManager if necessary. This is the public function, and + it is safe to call this function repeatedly. Return 0 for success and -1 + for failure. */ +int HID_API_EXPORT hid_init(void) +{ + if (!hid_mgr) { + return init_hid_manager(); + } + + /* Already initialized. */ + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + if (hid_mgr) { + /* Close the HID manager. */ + IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); + CFRelease(hid_mgr); + hid_mgr = NULL; + } + + return 0; +} + +static void process_pending_events() { + SInt32 res; + do { + res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); + } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); +} struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) { @@ -300,9 +445,12 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, setlocale(LC_ALL,""); /* Set up the HID Manager if it hasn't been done */ - if (!hid_mgr) - init_hid_manager(); + if (hid_init() < 0) + return NULL; + /* give the IOHIDManager a chance to update itself */ + process_pending_events(); + /* Get a list of the Devices */ CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); @@ -321,6 +469,9 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, IOHIDDeviceRef dev = device_array[i]; + if (!dev) { + continue; + } dev_vid = get_vendor_id(dev); dev_pid = get_product_id(dev); @@ -431,14 +582,18 @@ hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short pr static void hid_device_removal_callback(void *context, IOReturn result, void *sender, IOHIDDeviceRef dev_ref) { + /* Stop the Run Loop for this device. */ + pthread_mutex_lock(&device_list_mutex); hid_device *d = device_list; while (d) { if (d->device_handle == dev_ref) { d->disconnected = 1; + CFRunLoopStop(d->run_loop); } d = d->next; } + pthread_mutex_unlock(&device_list_mutex); } /* The Run Loop calls this function for each input report received. @@ -450,13 +605,16 @@ static void hid_report_callback(void *context, IOReturn result, void *sender, { struct input_report *rpt; hid_device *dev = context; - + /* Make a new Input Report object */ rpt = calloc(1, sizeof(struct input_report)); rpt->data = calloc(1, report_length); memcpy(rpt->data, report, report_length); rpt->len = report_length; rpt->next = NULL; + + /* Lock this section */ + pthread_mutex_lock(&dev->mutex); /* Attach the new report object to the end of the list. */ if (dev->input_reports == NULL) { @@ -466,14 +624,99 @@ static void hid_report_callback(void *context, IOReturn result, void *sender, else { /* Find the end of the list and attach. */ struct input_report *cur = dev->input_reports; - while (cur->next != NULL) + int num_queued = 0; + while (cur->next != NULL) { cur = cur->next; + num_queued++; + } cur->next = rpt; + + /* Pop one off if we've reached 30 in the queue. This + way we don't grow forever if the user never reads + anything from the device. */ + if (num_queued > 30) { + return_data(dev, NULL, 0); + } } + + /* Signal a waiting thread that there is data. */ + pthread_cond_signal(&dev->condition); + + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + +} + +/* This gets called when the read_thred's run loop gets signaled by + hid_close(), and serves to stop the read_thread's run loop. */ +static void perform_signal_callback(void *context) +{ + hid_device *dev = context; + CFRunLoopStop(dev->run_loop); //TODO: CFRunLoopGetCurrent() +} + +static void *read_thread(void *param) +{ + hid_device *dev = param; - /* Stop the Run Loop. This is mostly used for when blocking is - enabled, but it doesn't hurt for non-blocking as well. */ - CFRunLoopStop(CFRunLoopGetCurrent()); + /* Move the device's run loop to this thread. */ + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); + + /* Create the RunLoopSource which is used to signal the + event loop to stop when hid_close() is called. */ + CFRunLoopSourceContext ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.version = 0; + ctx.info = dev; + ctx.perform = &perform_signal_callback; + dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); + CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); + + /* Store off the Run Loop so it can be stopped from hid_close() + and on device disconnection. */ + dev->run_loop = CFRunLoopGetCurrent(); + + /* Notify the main thread that the read thread is up and running. */ + pthread_barrier_wait(&dev->barrier); + + /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input + reports into the hid_report_callback(). */ + SInt32 code; + while (!dev->shutdown_thread && !dev->disconnected) { + code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); + /* Return if the device has been disconnected */ + if (code == kCFRunLoopRunFinished) { + dev->disconnected = 1; + break; + } + + + /* Break if The Run Loop returns Finished or Stopped. */ + if (code != kCFRunLoopRunTimedOut && + code != kCFRunLoopRunHandledSource) { + /* There was some kind of error. Setting + shutdown seems to make sense, but + there may be something else more appropriate */ + dev->shutdown_thread = 1; + break; + } + } + + /* Now that the read thread is stopping, Wake any threads which are + waiting on data (in hid_read_timeout()). Do this under a mutex to + make sure that a thread which is about to go to sleep waiting on + the condition acutally will go to sleep before the condition is + signaled. */ + pthread_mutex_lock(&dev->mutex); + pthread_cond_broadcast(&dev->condition); + pthread_mutex_unlock(&dev->mutex); + + /* Wait here until hid_close() is called and makes it past + the call to CFRunLoopWakeUp(). This thread still needs to + be valid when that function is called on the other thread. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + return NULL; } hid_device * HID_API_EXPORT hid_open_path(const char *path) @@ -485,8 +728,11 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) dev = new_hid_device(); /* Set up the HID Manager if it hasn't been done */ - if (!hid_mgr) - init_hid_manager(); + if (hid_init() < 0) + return NULL; + + /* give the IOHIDManager a chance to update itself */ + process_pending_events(); CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); @@ -504,29 +750,32 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path) IOReturn ret = IOHIDDeviceOpen(os_dev, kIOHIDOptionsTypeNone); if (ret == kIOReturnSuccess) { char str[32]; - CFIndex max_input_report_len; free(device_array); CFRelease(device_set); dev->device_handle = os_dev; /* Create the buffers for receiving data */ - max_input_report_len = (CFIndex) get_max_report_length(os_dev); - dev->input_report_buf = calloc(max_input_report_len, sizeof(uint8_t)); + dev->max_input_report_len = (CFIndex) get_max_report_length(os_dev); + dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t)); /* Create the Run Loop Mode for this device. printing the reference seems to work. */ - sprintf(str, "%p", os_dev); + sprintf(str, "HIDAPI_%p", os_dev); dev->run_loop_mode = CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); /* Attach the device to a Run Loop */ - IOHIDDeviceScheduleWithRunLoop(os_dev, CFRunLoopGetCurrent(), dev->run_loop_mode); IOHIDDeviceRegisterInputReportCallback( - os_dev, dev->input_report_buf, max_input_report_len, + os_dev, dev->input_report_buf, dev->max_input_report_len, &hid_report_callback, dev); IOHIDManagerRegisterDeviceRemovalCallback(hid_mgr, hid_device_removal_callback, NULL); + /* Start the read thread */ + pthread_create(&dev->thread, NULL, read_thread, dev); + + /* Wait here for the read thread to be initialized. */ + pthread_barrier_wait(&dev->barrier); return dev; } @@ -601,96 +850,124 @@ static int return_data(hid_device *dev, unsigned char *data, size_t length) return len; } -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) { - int ret_val = -1; + while (!dev->input_reports) { + int res = pthread_cond_wait(cond, mutex); + if (res != 0) + return res; - /* Lock this function */ + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; +} + +static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) +{ + while (!dev->input_reports) { + int res = pthread_cond_timedwait(cond, mutex, abstime); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; + +} + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read = -1; + + /* Lock the access to the report list. */ pthread_mutex_lock(&dev->mutex); /* There's an input report queued up. Return it. */ if (dev->input_reports) { /* Return the first one */ - ret_val = return_data(dev, data, length); + bytes_read = return_data(dev, data, length); goto ret; } /* Return if the device has been disconnected. */ - if (dev->disconnected) { - ret_val = -1; - goto ret; + if (dev->disconnected) { + bytes_read = -1; + goto ret; } - /* There are no input reports queued up. - Need to get some from the OS. */ + if (dev->shutdown_thread) { + /* This means the device has been closed (or there + has been an error. An error code of -1 should + be returned. */ + bytes_read = -1; + goto ret; + } - /* Move the device's run loop to this thread. */ - dev->runloopref = CFRunLoopGetCurrent(); - IOHIDDeviceScheduleWithRunLoop(dev->device_handle, dev->runloopref, dev->run_loop_mode); + /* There is no data. Go to sleep and wait for data. */ - if (dev->blocking) { - /* Run the Run Loop until it stops timing out. In other - words, until something happens. This is necessary because - there is no INFINITE timeout value. */ - SInt32 code; - while (1) { - code = CFRunLoopRunInMode(dev->run_loop_mode, 1000, TRUE); - - /* Return if the device has been disconnected */ - if (code == kCFRunLoopRunFinished) { - dev->disconnected = 1; - ret_val = -1; - goto ret; - } - - - /* Return if some data showed up. */ - if (dev->input_reports) - break; - - /* Break if The Run Loop returns Finished or Stopped. */ - if (code != kCFRunLoopRunTimedOut && - code != kCFRunLoopRunHandledSource) - break; + if (milliseconds == -1) { + /* Blocking */ + int res; + res = cond_wait(dev, &dev->condition, &dev->mutex); + if (res == 0) + bytes_read = return_data(dev, data, length); + else { + /* There was an error, or a device disconnection. */ + bytes_read = -1; + } + } + else if (milliseconds > 0) { + /* Non-blocking, but called with timeout. */ + int res; + struct timespec ts; + struct timeval tv; + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; } - /* See if the run loop and callback gave us any reports. */ - if (dev->input_reports) { - ret_val = return_data(dev, data, length); - goto ret; - } - else { - dev->disconnected = 1; - ret_val = -1; /* An error occured (maybe CTRL-C?). */ - goto ret; - } + res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); + if (res == 0) + bytes_read = return_data(dev, data, length); + else if (res == ETIMEDOUT) + bytes_read = 0; + else + bytes_read = -1; } else { - /* Non-blocking. See if the OS has any reports to give. */ - SInt32 code; - code = CFRunLoopRunInMode(dev->run_loop_mode, 0, TRUE); - if (code == kCFRunLoopRunFinished) { - /* The run loop is finished, indicating an error - or the device had been disconnected. */ - dev->disconnected = 1; - ret_val = -1; - goto ret; - } - if (dev->input_reports) { - /* Return the first one */ - ret_val = return_data(dev, data, length); - goto ret; - } - else { - ret_val = 0; /* No data*/ - goto ret; - } + /* Purely non-blocking */ + bytes_read = 0; } ret: /* Unlock */ pthread_mutex_unlock(&dev->mutex); - return ret_val; + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); } int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) @@ -730,8 +1007,29 @@ void HID_API_EXPORT hid_close(hid_device *dev) { if (!dev) return; + + /* Disconnect the report callback before close. */ + if (!dev->disconnected) { + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + NULL, dev); + IOHIDManagerRegisterDeviceRemovalCallback(hid_mgr, NULL, dev); + IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); + } - CFRunLoopStop(dev->runloopref); + /* Cause read_thread() to stop. */ + dev->shutdown_thread = 1; + + /* Wake up the run thread's event loop so that the thread can exit. */ + CFRunLoopSourceSignal(dev->source); + CFRunLoopWakeUp(dev->run_loop); + + /* Notify the read thread that it can shut down now. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + /* Wait for read_thread() to end. */ + pthread_join(dev->thread, NULL); /* Close the OS handle to the device, but only if it's not been unplugged. If it's been unplugged, then calling @@ -739,6 +1037,13 @@ void HID_API_EXPORT hid_close(hid_device *dev) if (!dev->disconnected) { IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone); } + + /* Clear out the queue of received reports. */ + pthread_mutex_lock(&dev->mutex); + while (dev->input_reports) { + return_data(dev, NULL, 0); + } + pthread_mutex_unlock(&dev->mutex); free_hid_device(dev); } @@ -774,6 +1079,10 @@ HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) } + + + + #if 0 static int32_t get_location_id(IOHIDDeviceRef device) { diff --git a/cpp/hidapi/testgui/Makefile.mac b/cpp/hidapi/testgui/Makefile.mac index a61d23fc..8acd1e1c 100644 --- a/cpp/hidapi/testgui/Makefile.mac +++ b/cpp/hidapi/testgui/Makefile.mac @@ -11,10 +11,11 @@ all: testgui CC=gcc CXX=g++ COBJS=../mac/hid.o -CPPOBJS=test.o mac_support.o -OBJS=$(COBJS) $(CPPOBJS) +CPPOBJS=test.o +OBJCOBJS=mac_support_cocoa.o +OBJS=$(COBJS) $(CPPOBJS) $(OBJCOBJS) CFLAGS=-I../hidapi -Wall -g -c `fox-config --cflags` -LIBS=`fox-config --libs` -framework IOKit -framework CoreFoundation -framework Carbon +LIBS=`fox-config --libs` -framework IOKit -framework CoreFoundation -framework Cocoa testgui: $(OBJS) @@ -29,7 +30,11 @@ $(COBJS): %.o: %.c $(CPPOBJS): %.o: %.cpp $(CXX) $(CFLAGS) $< -o $@ +$(OBJCOBJS): %.o: %.m + $(CXX) $(CFLAGS) -x objective-c++ $< -o $@ + + clean: - rm *.o testgui + rm $(OBJS) testgui .PHONY: clean diff --git a/cpp/hidapi/testgui/README.txt b/cpp/hidapi/testgui/README.txt deleted file mode 100644 index 6c5f99dc..00000000 --- a/cpp/hidapi/testgui/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -HIDAPI Test GUI - -This test GUI application uses Fox Toolkit. On Windows, it can be downloaded -as part of the hidapi-externals.zip file located on the GitHub project page -where HIDAPI is downloaded: - http://github.com/signal11/hidapi/downloads - -On Windows: - Copy ..\hidapi\objfre_wxp_x86\i386\hidapi.dll to this folder - -On Linux: - Install Fox-Toolkit from apt-get or yum: - On Debian or Ubuntu: - sudo apt-get install libfox-1.6-dev - On Red Hat or Fedora: - yum install libfox-1.6-devel - -On Mac: - Install Fox-Toolkit from ports: - sudo port install fox - -Once Fox-Toolkit is installed, Linux and Mac users can simply type 'make'. -On Windows, HIDAPI can be built from the .vcproj file in this directory. - -Alan Ott -Signal 11 Software -2010-07-22 diff --git a/cpp/hidapi/testgui/TestGUI.app/Contents/MacOS/testgui b/cpp/hidapi/testgui/TestGUI.app/Contents/MacOS/testgui index 8fbfda5bec76923415ded4174c41ba15ac5c3da0..a456634bbe165d6ac58f43e8594676b679245088 100644 GIT binary patch literal 72776 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

R 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 MEuYJ`yBz2L0vbuXN&o-= literal 63132 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 diff --git a/cpp/hidapi/testgui/mac_support.h b/cpp/hidapi/testgui/mac_support.h index d9330768..7d9ab493 100644 --- a/cpp/hidapi/testgui/mac_support.h +++ b/cpp/hidapi/testgui/mac_support.h @@ -9,7 +9,9 @@ #ifndef MAC_SUPPORT_H__ #define MAC_SUPPORT_H__ -void init_apple_message_system(); -void check_apple_events(); +extern "C" { + void init_apple_message_system(); + void check_apple_events(); +} #endif diff --git a/cpp/hidapi/testgui/test.cpp b/cpp/hidapi/testgui/test.cpp index 66a0a6bd..40ddfe11 100644 --- a/cpp/hidapi/testgui/test.cpp +++ b/cpp/hidapi/testgui/test.cpp @@ -180,6 +180,9 @@ MainWindow::MainWindow(FXApp *app) MainWindow::~MainWindow() { + if (connected_device) + hid_close(connected_device); + hid_exit(); delete title_font; } diff --git a/cpp/hidapi/testgui/testgui.exe b/cpp/hidapi/testgui/testgui.exe index c2dd66e68f3da06b1d4428b2af0ae986c65ec156..951b0ddd0f0ef79946021425e67cb1b12bc9b53b 100644 GIT binary patch delta 126537 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

u{Qo&EP69h+p}qQ31_QZb#&CjPT<4pHabV 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 nGoF3c&I8}C~Hux+xM7 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 Su`nh(8*ZZG+K}({D*q4bEv29U diff --git a/cpp/hidapi/testgui/testgui.vcproj b/cpp/hidapi/testgui/testgui.vcproj index 0d0db8dd..0f73a013 100644 --- a/cpp/hidapi/testgui/testgui.vcproj +++ b/cpp/hidapi/testgui/testgui.vcproj @@ -183,7 +183,7 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > +#ifndef _NTDEF_ +typedef LONG NTSTATUS; +#endif + #ifdef __MINGW32__ #include #include @@ -34,9 +38,11 @@ //#define HIDAPI_USE_DDK +#ifdef __cplusplus extern "C" { +#endif #include - #include "WinIoCTL.h" + #include #ifdef HIDAPI_USE_DDK #include #endif @@ -46,7 +52,10 @@ extern "C" { CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) -} +#ifdef __cplusplus +} // extern "C" +#endif + #include #include @@ -58,7 +67,9 @@ extern "C" { #pragma warning(disable:4996) #endif +#ifdef __cplusplus extern "C" { +#endif #ifndef HIDAPI_USE_DDK // Since we're not building with the DDK, and the HID header @@ -107,25 +118,35 @@ extern "C" { static HidD_FreePreparsedData_ HidD_FreePreparsedData; static HidP_GetCaps_ HidP_GetCaps; + static HMODULE lib_handle = NULL; static BOOLEAN initialized = FALSE; #endif // HIDAPI_USE_DDK struct hid_device_ { HANDLE device_handle; BOOL blocking; + USHORT output_report_length; size_t input_report_length; void *last_error_str; DWORD last_error_num; + BOOL read_pending; + char *read_buf; + OVERLAPPED ol; }; static hid_device *new_hid_device() { hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); dev->device_handle = INVALID_HANDLE_VALUE; - dev->blocking = true; + dev->blocking = TRUE; + dev->output_report_length = 0; dev->input_report_length = 0; dev->last_error_str = NULL; dev->last_error_num = 0; + dev->read_pending = FALSE; + dev->read_buf = NULL; + memset(&dev->ol, 0, sizeof(dev->ol)); + dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*inital state f=nonsignaled*/, NULL); return dev; } @@ -162,11 +183,11 @@ static void register_error(hid_device *device, const char *op) } #ifndef HIDAPI_USE_DDK -static void lookup_functions() +static int lookup_functions() { - HMODULE lib = LoadLibraryA("hid.dll"); - if (lib) { -#define RESOLVE(x) x = (x##_)GetProcAddress(lib, #x); + lib_handle = LoadLibraryA("hid.dll"); + if (lib_handle) { +#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; RESOLVE(HidD_GetAttributes); RESOLVE(HidD_GetSerialNumberString); RESOLVE(HidD_GetManufacturerString); @@ -177,44 +198,89 @@ static void lookup_functions() RESOLVE(HidD_GetPreparsedData); RESOLVE(HidD_FreePreparsedData); RESOLVE(HidP_GetCaps); - //FreeLibrary(lib); #undef RESOLVE } - initialized = true; + else + return -1; + + return 0; } #endif +static HANDLE open_device(const char *path, BOOL enumerate) +{ + HANDLE handle; + DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); + DWORD share_mode = (enumerate)? + FILE_SHARE_READ|FILE_SHARE_WRITE: + FILE_SHARE_READ; + + handle = CreateFileA(path, + desired_access, + share_mode, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL, + 0); + + return handle; +} + +int HID_API_EXPORT hid_init(void) +{ +#ifndef HIDAPI_USE_DDK + if (!initialized) { + if (lookup_functions() < 0) { + hid_exit(); + return -1; + } + initialized = TRUE; + } +#endif + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ +#ifndef HIDAPI_USE_DDK + if (lib_handle) + FreeLibrary(lib_handle); + lib_handle = NULL; + initialized = FALSE; +#endif + return 0; +} + struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) { BOOL res; struct hid_device_info *root = NULL; // return object struct hid_device_info *cur_dev = NULL; -#ifndef HIDAPI_USE_DDK - if (!initialized) - lookup_functions(); -#endif - // Windows objects for interacting with the driver. GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; SP_DEVINFO_DATA devinfo_data; SP_DEVICE_INTERFACE_DATA device_interface_data; SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; HDEVINFO device_info_set = INVALID_HANDLE_VALUE; + int device_index = 0; + + if (hid_init() < 0) + return NULL; // Initialize the Windows objects. devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - // Get information for all the devices belonging to the HID class. device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // Iterate over each device in the HID class, looking for the right one. - int device_index = 0; + for (;;) { HANDLE write_handle = INVALID_HANDLE_VALUE; DWORD required_size = 0; + HIDD_ATTRIBUTES attrib; res = SetupDiEnumDeviceInterfaces(device_info_set, NULL, @@ -261,13 +327,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); // Open a handle to the device - write_handle = CreateFileA(device_interface_detail_data->DevicePath, - GENERIC_WRITE |GENERIC_READ, - 0x0, /*share mode*/ - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL, - 0); + write_handle = open_device(device_interface_detail_data->DevicePath, TRUE); // Check validity of write_handle. if (write_handle == INVALID_HANDLE_VALUE) { @@ -278,7 +338,6 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor // Get the Vendor ID and Product ID for this device. - HIDD_ATTRIBUTES attrib; attrib.Size = sizeof(HIDD_ATTRIBUTES); HidD_GetAttributes(write_handle, &attrib); //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); @@ -299,7 +358,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor size_t len; /* VID/PID match. Create the record. */ - tmp = (hid_device_info*) calloc(1, sizeof(struct hid_device_info)); + tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); if (cur_dev) { cur_dev->next = tmp; } @@ -360,8 +419,24 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor /* Release Number */ cur_dev->release_number = attrib.VersionNumber; - /* Interface Number (Unsupported on Windows)*/ + /* Interface Number. It can sometimes be parsed out of the path + on Windows if a device has multiple interfaces. See + http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or + search for "Hardware IDs for HID Devices" at MSDN. If it's not + in the path, it's set to -1. */ cur_dev->interface_number = -1; + if (cur_dev->path) { + char *interface_component = strstr(cur_dev->path, "&mi_"); + if (interface_component) { + char *hex_str = interface_component + 4; + char *endptr = NULL; + cur_dev->interface_number = strtol(hex_str, &endptr, 16); + if (endptr == hex_str) { + /* The parsing failed. Set interface_number to -1. */ + cur_dev->interface_number = -1; + } + } + } } cont_close: @@ -441,21 +516,14 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) BOOLEAN res; NTSTATUS nt_res; -#ifndef HIDAPI_USE_DDK - if (!initialized) - lookup_functions(); -#endif + if (hid_init() < 0) { + return NULL; + } dev = new_hid_device(); // Open a handle to the device - dev->device_handle = CreateFileA(path, - GENERIC_WRITE |GENERIC_READ, - 0x0, /*share mode*/ - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL, - 0); + dev->device_handle = open_device(path, FALSE); // Check validity of write_handle. if (dev->device_handle == INVALID_HANDLE_VALUE) { @@ -475,9 +543,12 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) register_error(dev, "HidP_GetCaps"); goto err_pp_data; } + dev->output_report_length = caps.OutputReportByteLength; dev->input_report_length = caps.InputReportByteLength; HidD_FreePreparsedData(pp_data); + dev->read_buf = (char*) malloc(dev->input_report_length); + return dev; err_pp_data: @@ -494,15 +565,35 @@ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char * BOOL res; OVERLAPPED ol; + unsigned char *buf; memset(&ol, 0, sizeof(ol)); - res = WriteFile(dev->device_handle, data, length, NULL, &ol); + /* Make sure the right number of bytes are passed to WriteFile. Windows + expects the number of bytes which are in the _longest_ report (plus + one for the report number) bytes even if the data is a report + which is shorter than that. Windows gives us this value in + caps.OutputReportByteLength. If a user passes in fewer bytes than this, + create a temporary buffer which is the proper size. */ + if (length >= dev->output_report_length) { + /* The user passed the right number of bytes. Use the buffer as-is. */ + buf = (unsigned char *) data; + } else { + /* Create a temporary buffer and copy the user's data + into it, padding the rest with zeros. */ + buf = (unsigned char *) malloc(dev->output_report_length); + memcpy(buf, data, length); + memset(buf + length, 0, dev->output_report_length - length); + length = dev->output_report_length; + } + + res = WriteFile(dev->device_handle, buf, length, NULL, &ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { // WriteFile() failed. Return error. register_error(dev, "WriteFile"); - return -1; + bytes_written = -1; + goto end_of_function; } } @@ -512,49 +603,50 @@ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char * if (!res) { // The Write operation failed. register_error(dev, "WriteFile"); - return -1; + bytes_written = -1; + goto end_of_function; } +end_of_function: + if (buf != data) + free(buf); + return bytes_written; } -int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) +int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) { - DWORD bytes_read; + DWORD bytes_read = 0; BOOL res; - HANDLE ev; - ev = CreateEvent(NULL, FALSE, FALSE /*inital state f=nonsignaled*/, NULL); + // Copy the handle for convenience. + HANDLE ev = dev->ol.hEvent; - OVERLAPPED ol; - memset(&ol, 0, sizeof(ol)); - ol.hEvent = ev; - - // Limit the data to be returned. This ensures we get - // only one report returned per call to hid_read(). - length = (length < dev->input_report_length)? length: dev->input_report_length; - - res = ReadFile(dev->device_handle, data, length, &bytes_read, &ol); - - - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - // ReadFile() has failed. - // Clean up and return error. - CloseHandle(ev); - goto end_of_function; + if (!dev->read_pending) { + // Start an Overlapped I/O read. + dev->read_pending = TRUE; + memset(dev->read_buf, 0, dev->input_report_length); + ResetEvent(ev); + res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + // ReadFile() has failed. + // Clean up and return error. + CancelIo(dev->device_handle); + dev->read_pending = FALSE; + goto end_of_function; + } } } - if (!dev->blocking) { + if (milliseconds >= 0) { // See if there is any data yet. - res = WaitForSingleObject(ev, 0); - CloseHandle(ev); + res = WaitForSingleObject(ev, milliseconds); if (res != WAIT_OBJECT_0) { - // There was no data. Cancel this read and return. - CancelIo(dev->device_handle); - // Zero bytes available. + // There was no data this time. Return zero bytes available, + // but leave the Overlapped I/O running. return 0; } } @@ -562,26 +654,43 @@ int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, s // Either WaitForSingleObject() told us that ReadFile has completed, or // we are in non-blocking mode. Get the number of bytes read. The actual // data has been copied to the data[] array which was passed to ReadFile(). - res = GetOverlappedResult(dev->device_handle, &ol, &bytes_read, TRUE/*wait*/); + res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); + + // Set pending back to false, even if GetOverlappedResult() returned error. + dev->read_pending = FALSE; - if (bytes_read > 0 && data[0] == 0x0) { - /* If report numbers aren't being used, but Windows sticks a report - number (0x0) on the beginning of the report anyway. To make this - work like the other platforms, and to make it work more like the - HID spec, we'll skip over this byte. */ - bytes_read--; - memmove(data, data+1, bytes_read); + if (res && bytes_read > 0) { + if (dev->read_buf[0] == 0x0) { + /* If report numbers aren't being used, but Windows sticks a report + number (0x0) on the beginning of the report anyway. To make this + work like the other platforms, and to make it work more like the + HID spec, we'll skip over this byte. */ + size_t copy_len; + bytes_read--; + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf+1, copy_len); + } + else { + /* Copy the whole buffer, report number and all. */ + size_t copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf, copy_len); + } } end_of_function: if (!res) { - register_error(dev, "ReadFile"); + register_error(dev, "GetOverlappedResult"); return -1; } return bytes_read; } +int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) { dev->blocking = !nonblock; @@ -646,8 +755,11 @@ void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) { if (!dev) return; + CancelIo(dev->device_handle); + CloseHandle(dev->ol.hEvent); CloseHandle(dev->device_handle); LocalFree(dev->last_error_str); + free(dev->read_buf); free(dev); } @@ -776,5 +888,6 @@ int __cdecl main(int argc, char* argv[]) } #endif +#ifdef __cplusplus } // extern "C" - +#endif diff --git a/cpp/hidapi/windows/hidapi.vcproj b/cpp/hidapi/windows/hidapi.vcproj index 8e6f9914..ee9569c7 100644 --- a/cpp/hidapi/windows/hidapi.vcproj +++ b/cpp/hidapi/windows/hidapi.vcproj @@ -175,7 +175,7 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > diff --git a/cpp/src/platform/HidController.cpp b/cpp/src/platform/HidController.cpp index 49f00006..14a87178 100644 --- a/cpp/src/platform/HidController.cpp +++ b/cpp/src/platform/HidController.cpp @@ -166,6 +166,7 @@ bool HidController::Close } m_bOpen = false; + hid_exit(); return true; } @@ -246,7 +247,7 @@ bool HidController::Init int hidApiResult; const uint8 dataOutEnableZwave[3] = { 0x02, 0x01, 0x04 }; - Log::Write( "Open HID port %s", m_hidControllerName.c_str() ); + Log::Write( "Open HID port %s", m_hidControllerName.c_str() ); m_hHidController = hid_open(m_vendorId, m_productId, NULL); if (!m_hHidController) { @@ -343,17 +344,17 @@ bool HidController::Init hidApiResult = hid_set_nonblocking(m_hHidController, 0); CHECK_HIDAPI_RESULT(hidApiResult, HidOpenFailure); - // Open successful + // Open successful m_bOpen = true; - return true; + return true; HidOpenFailure: - Log::Write( "Failed to open HID port %s", m_hidControllerName.c_str() ); + Log::Write( "Failed to open HID port %s", m_hidControllerName.c_str() ); const wchar_t* errString = hid_error(m_hHidController); Log::Write("HIDAPI ERROR STRING (if any):\n%ls\n", errString); hid_close(m_hHidController); - m_hHidController = NULL; - return false; + m_hHidController = NULL; + return false; } //----------------------------------------------------------------------------- @@ -480,9 +481,9 @@ uint32 HidController::Write //----------------------------------------------------------------------------- int HidController::GetFeatureReport ( - uint32 _length, + uint32 _length, uint8 _reportId, - uint8* _buffer + uint8* _buffer ) { int result; diff --git a/cpp/src/platform/unix/EventImpl.cpp b/cpp/src/platform/unix/EventImpl.cpp index bc0e6042..4df5ee32 100644 --- a/cpp/src/platform/unix/EventImpl.cpp +++ b/cpp/src/platform/unix/EventImpl.cpp @@ -142,11 +142,11 @@ bool EventImpl::Wait else { ++m_waitingThreads; - if( _timeout == 0 ) + if( _timeout == 0 ) { - result = m_isSignaled; - } - else if( _timeout > 0 ) + result = m_isSignaled; + } + else if( _timeout > 0 ) { struct timeval now; struct timespec abstime;