From 4ef120b93479a771ba2d03c06ea4c6bdcaf645ea Mon Sep 17 00:00:00 2001 From: Alexey Kopytko Date: Fri, 23 Oct 2015 17:59:59 +0900 Subject: [PATCH] Support for DYMO M25 Digital Postal Scale Dymo M25 Scale uses different endpoint from the default (LIBUSB_RECIPIENT_ENDPOINT instead of LIBUSB_RECIPIENT_INTERFACE), hence we need to find it in the device's configuration. --- scales.h | 6 ++++-- usbscale.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/scales.h b/scales.h index a6dc5ec..dc693bd 100644 --- a/scales.h +++ b/scales.h @@ -12,7 +12,7 @@ // // **NSCALES** should be kept updated with the length of the list. // -#define NSCALES 7 +#define NSCALES 8 // // What is the number of the weighing result to show, as the first result may be incorrect (from the previous weighing) @@ -37,5 +37,7 @@ uint16_t scales[NSCALES][2] = {\ // SANFORD Dymo 10 lb USB Postal Scale {0x6096, 0x0158}, // Fairbanks Scales SCB-R9000 - {0x0b67, 0x555e} + {0x0b67, 0x555e}, + // Dymo-CoStar Corp. M25 Digital Postal Scale + {0x0922, 0x8004} }; diff --git a/usbscale.c b/usbscale.c index 376e3e0..d052fd8 100644 --- a/usbscale.c +++ b/usbscale.c @@ -60,6 +60,12 @@ static libusb_device* find_scale(libusb_device**); // program should read again (i.e. continue looping). // static int print_scale_data(unsigned char*); + +// +// take device and fetch bEndpointAddress for the first endpoint +// +uint8_t get_first_endpoint_address(libusb_device* dev); + // // **UNITS** is an array of all the unit abbreviations as set forth by *HID // Point of Sale Usage Tables*, version 1.02, by the USB Implementers' Forum. @@ -197,8 +203,7 @@ int main(void) handle, //bmRequestType => direction: in, type: class, // recipient: interface - LIBUSB_ENDPOINT_IN | //LIBUSB_REQUEST_TYPE_CLASS | - LIBUSB_RECIPIENT_INTERFACE, + get_first_endpoint_address(dev), data, WEIGH_REPORT_SIZE, // length of data &len, @@ -414,3 +419,22 @@ static libusb_device* find_scale(libusb_device **devs) return NULL; } +uint8_t get_first_endpoint_address(libusb_device* dev) +{ + // default value + uint8_t endpoint_address = LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_INTERFACE; //| LIBUSB_RECIPIENT_ENDPOINT; + + struct libusb_config_descriptor *config; + int r = libusb_get_config_descriptor(dev, 0, &config); + if (r == 0) { + // assuming we have only one endpoint + endpoint_address = config->interface[0].altsetting[0].endpoint[0].bEndpointAddress; + libusb_free_config_descriptor(config); + } + + #ifdef DEBUG + printf("bEndpointAddress 0x%02x\n", endpoint_address); + #endif + + return endpoint_address; +}