From c0f3c1ea055a4e28997f7ec1b326a39c4d1760d0 Mon Sep 17 00:00:00 2001 From: Alexey Kopytko Date: Fri, 23 Oct 2015 15:46:55 +0900 Subject: [PATCH 1/3] scales.h: correct number of known scales --- scales.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scales.h b/scales.h index 1435f2f..a6dc5ec 100644 --- a/scales.h +++ b/scales.h @@ -12,7 +12,7 @@ // // **NSCALES** should be kept updated with the length of the list. // -#define NSCALES 6 +#define NSCALES 7 // // What is the number of the weighing result to show, as the first result may be incorrect (from the previous weighing) From d2f0d6ea615c11a5b21d95c1e68c0e4fdd216fbe Mon Sep 17 00:00:00 2001 From: Alexey Kopytko Date: Fri, 23 Oct 2015 17:01:02 +0900 Subject: [PATCH 2/3] print_scale_data: correctly apply exponent --- usbscale.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/usbscale.c b/usbscale.c index 8099449..376e3e0 100644 --- a/usbscale.c +++ b/usbscale.c @@ -276,16 +276,12 @@ static int print_scale_data(unsigned char* dat) { uint8_t report = dat[0]; uint8_t status = dat[1]; uint8_t unit = dat[2]; - uint8_t expt = dat[3]; - double weight = (double)(dat[4] + (dat[5] << 8)) / 10; - - if(expt != 255 && expt != 0) { - if (expt > 127) { - weight = weight * pow(10, expt-255); - } else { - weight = pow(weight, expt); - } - } + // Accoring to the docs, scaling applied to the data as a base ten exponent + int8_t expt = dat[3]; + // convert to machine order at all times + double weight = (double) le16toh(dat[5] << 8 | dat[4]); + // since the expt is signed, we do not need no trickery + weight = weight * pow(10, expt); // // The scale's first byte, its "report", is always 3. From 4ef120b93479a771ba2d03c06ea4c6bdcaf645ea Mon Sep 17 00:00:00 2001 From: Alexey Kopytko Date: Fri, 23 Oct 2015 17:59:59 +0900 Subject: [PATCH 3/3] 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; +}