diff --git a/Makefile b/Makefile index 8fa35c1..c282388 100644 --- a/Makefile +++ b/Makefile @@ -2,5 +2,11 @@ LD=-lusb-1.0 CC=gcc CFLAGS=-Os +usbscale: usbscale.c scales.h + $(CC) usbscale.c -o usbscale $(CFLAGS) $(LD) + +lsscale: lsscale.c scales.h + $(CC) lsscale.c -o lsscale $(CFLAGS) $(LD) + lsusb: lsusb.c $(CC) lsusb.c -o lsusb $(CFLAGS) $(LD) diff --git a/scales.h b/scales.h new file mode 100644 index 0000000..86157c6 --- /dev/null +++ b/scales.h @@ -0,0 +1,13 @@ +/* + * This file is a list of all currently-recognized scales, + * by their vendor and product IDs. + * + * For example, the USB product 1446:6173 becomes {0x1446, 0x6173} + */ + +// array length +int scalesc = 1; + +uint16_t scales[][] = { + {0x1446, 0x6173} // Stamps.com USB scale +} diff --git a/usbscale.c b/usbscale.c new file mode 100644 index 0000000..02addbf --- /dev/null +++ b/usbscale.c @@ -0,0 +1,74 @@ +#include +#include + +#include +#include "scales.h" + +#define DEBUG 1 + +static void print_devs(libusb_device **devs) +{ + + if(DEBUG) + libusb_set_debug(null, 3); + + libusb_device *dev; + int i = 0; + + while ((dev = devs[i++]) != NULL) { + struct libusb_device_descriptor desc; + int r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) { + fprintf(stderr, "failed to get device descriptor"); + return; + } + int i; + for (i = 0; i < scalesc; i++) { + if(desc.idVendor == scales[i][0] && + desc.idProduct == scales[i][1]) { + if(DEBUG) { + printf("Found scale %04x:%04x (bus %d, device %d)\n", + desc.idVendor, desc.idProduct, + libusb_get_bus_number(dev), libusb_get_device_address(dev)); + + printf("It has descriptors:\n\tmanufc: %d\n\tprodct: %d\n\tserial: %d\n", + desc.iManufacturer, + desc.iProduct, + desc.iSerialNumber); + } + unsigned char string[256]; + + libusb_device_handle* hand; + + libusb_open(dev, &hand); + + r = libusb_get_string_descriptor_ascii(hand, desc.iManufacturer, + string, 256); + printf("Manufacturer: %s\n", string); + break; + } + } + } +} + +int main(void) +{ + libusb_device **devs; + int r; + ssize_t cnt; + + r = libusb_init(NULL); + if (r < 0) + return r; + + cnt = libusb_get_device_list(NULL, &devs); + if (cnt < 0) + return (int) cnt; + + print_devs(devs); + libusb_free_device_list(devs, 1); + + libusb_exit(NULL); + return 0; +} +