From a5eb4ba1296c6279e5535bf3bcc1f1796707f6c6 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Thu, 5 Jul 2012 16:53:55 +0200 Subject: Initial import --- src/lshidpp.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/lshidpp.c (limited to 'src/lshidpp.c') diff --git a/src/lshidpp.c b/src/lshidpp.c new file mode 100644 index 0000000..cbbaa5a --- /dev/null +++ b/src/lshidpp.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012 + * Lars-Dominik Braun + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* getopt() */ +#define _POSIX_C_SOURCE 2 + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "device.h" +#include "usb.h" +#include "battery.h" +#include "reprogrammable.h" + +#define HIDPP_USB_VENDOR 0x46d +/* unifying receiver */ +#define HIDPP_USB_PRODUCT 0xc52b + +int main (int argc, char **argv) { + libusb_context *ctx; + int ret; + ssize_t devicesCount; + libusb_device **devices; + hidppModule_t modules[] = {moduleBattery, moduleReprogrammable}; + + int opt; + while ((opt = getopt (argc, argv, "s:")) != -1) { + switch (opt) { + /* bus:device, same flag as `lsusb` */ + case 's': + break; + + default: /* '?' */ + exit (EXIT_FAILURE); + break; + } + } + + ret = libusb_init (&ctx); + if (ret != LIBUSB_SUCCESS) { + return ret; + } + + libusb_set_debug (ctx, 3); + + devicesCount = libusb_get_device_list (ctx, &devices); + for (size_t i = 0; i < devicesCount; i++) { + struct libusb_device_descriptor desc; + int r = libusb_get_device_descriptor(devices[i], &desc); + if (r < 0) { + fprintf(stderr, "failed to get device descriptor"); + continue; + } + printf ("device bus=%x, address=%x, vendor=%x, product=%x\n", + libusb_get_bus_number (devices[i]), + libusb_get_device_address (devices[i]), + desc.idVendor, desc.idProduct); + if (desc.idVendor == HIDPP_USB_VENDOR && desc.idProduct == HIDPP_USB_PRODUCT) { + hidppDevice_t d; + libusb_device_handle *h; + + hidppUsbDeviceOpen (devices[i], &h); + hidppDeviceInit (&d, h, 0x01); + hidppDevicePrint (&d); + + for (size_t j = 0; j < sizeof (modules)/sizeof (*modules); j++) { + hidppModule_t *m = &modules[j]; + void *data; + assert (m->available != NULL); + if (m->read != NULL && m->available (&d)) { + assert (m->print != NULL); + m->read (&d, &data); + m->print (data); + free (data); + } + } + + hidppDeviceDestroy (&d); + hidppUsbDeviceClose (h); + } + } + libusb_free_device_list (devices, devicesCount); + + libusb_exit (ctx); + + return 0; +} + -- cgit v1.2.3