From 32f9cb6c3c346ed8c09e8380a92bf52f7480f2bf Mon Sep 17 00:00:00 2001 From: Alan Ott Date: Mon, 5 Jul 2010 16:35:42 -0400 Subject: [PATCH] Added support for Set/Get Feature reports for Windows. --- hidapi/hid.cpp | 41 ++++++++++++++++++++++ hidapi/hidapi.def | 3 ++ hidapi/hidapi.h | 48 ++++++++++++++++++++++++-- hidapi/objfre_wxp_x86/i386/hidapi.dll | Bin 11264 -> 11264 bytes hidapi/objfre_wxp_x86/i386/hidapi.lib | Bin 4446 -> 4968 bytes hidtest/Debug/hidtest.exe | Bin 30208 -> 30720 bytes hidtest/Release/hidtest.exe | Bin 8704 -> 8704 bytes hidtest/hidtest.cpp | 30 +++++++++++++++- 8 files changed, 119 insertions(+), 3 deletions(-) diff --git a/hidapi/hid.cpp b/hidapi/hid.cpp index 6c78048..a7139ff 100644 --- a/hidapi/hid.cpp +++ b/hidapi/hid.cpp @@ -451,6 +451,47 @@ int HID_API_EXPORT hid_set_nonblocking(int device, int nonblock) return 0; /* Success */ } +int HID_API_EXPORT hid_send_feature_report(int device, const unsigned char *data, size_t length) +{ + Device *dev = NULL; + + // Get the handle + if (device < 0 || device >= MAX_DEVICES) + return -1; + if (devices[device].valid == 0) + return -1; + dev = &devices[device]; + + BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, length); + if (!res) { + register_error(dev, "HidD_SetFeature"); + return -1; + } + + return length; +} + + +int HID_API_EXPORT hid_get_feature_report(int device, unsigned char *data, size_t length) +{ + Device *dev = NULL; + + // Get the handle + if (device < 0 || device >= MAX_DEVICES) + return -1; + if (devices[device].valid == 0) + return -1; + dev = &devices[device]; + + BOOL res = HidD_GetFeature(dev->device_handle, data, length); + if (!res) { + register_error(dev, "HidD_GetFeature"); + return -1; + } + + return 0; /* Windows doesn't give us an actual length, unfortunately */ +} + void HID_API_EXPORT hid_close(int device) { Device *dev = NULL; diff --git a/hidapi/hidapi.def b/hidapi/hidapi.def index 088ff7c..05e35af 100644 --- a/hidapi/hidapi.def +++ b/hidapi/hidapi.def @@ -12,3 +12,6 @@ EXPORTS hid_set_nonblocking @10 hid_enumerate @11 hid_open_path @12 + hid_send_feature_report @13 + hid_get_feature_report @14 + \ No newline at end of file diff --git a/hidapi/hidapi.h b/hidapi/hidapi.h index bba30ca..04b2e5a 100644 --- a/hidapi/hidapi.h +++ b/hidapi/hidapi.h @@ -132,8 +132,9 @@ extern "C" { */ int HID_API_EXPORT HID_API_CALL hid_write(int device, const unsigned char *data, size_t length); - /** Read a report from a HID device. The first byte will contain the - Report number, if multiple reports are supported by the device. + /** 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. Params: device: A device handle returned from hid_open(). @@ -165,6 +166,49 @@ extern "C" { */ int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(int device, 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 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 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. + + Params: + device: A device handle returned from hid_open(). + data: The data to send, including the report number as + the first byte. + length: The length in bytes of the data to send, including + the report number. + + Return Value: + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_send_feature_report(int device, const unsigned char *data, size_t length); + + /** Get a feature report from a HID device. Make sure to 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[]. + + Params: + device: A device handle returned from hid_open(). + 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. + length: The number of bytes to read, including an extra byte + for the report ID. The buffer can be longer than the + actual report. + + Return Value: + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_get_feature_report(int device, unsigned char *data, size_t length); + /** Close a HID device. Params: diff --git a/hidapi/objfre_wxp_x86/i386/hidapi.dll b/hidapi/objfre_wxp_x86/i386/hidapi.dll index 112b3a4a303c41f6b3f4bfe938a0342acf927dd3..eef8adbb16ceaea652296a901aff6c3bea7e35bb 100644 GIT binary patch delta 2088 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 Hc|G$FM8OT5 delta 748 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 OFSZMIpK0|0=6?Z>xE&4v delta 5486 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 b2f0IBCwG+-IaEm@_^%wYFrm14AJP8{#6v(7 diff --git a/hidtest/Release/hidtest.exe b/hidtest/Release/hidtest.exe index 7de9df8c1b21bceb6fc3ae397e7283efb4ae6a92..e3d2dd838a8e0a80762c1270d029b58ee9cf0359 100644 GIT binary patch delta 2869 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