#include #include #include #include #include #define VENDOR_ID 0x1130 #define PRODUCT_ID 0x660c /* commands */ #define TEMPER_CMD_TYPE 0x21 #define TEMPER_CMD_REQUEST 9 #define TEMPER_CMD 0x200 #define CMDLEN 32 char temper_init[CMDLEN] = "\x0a\x0b\x0c\x0d\x00\x00\x02\x00"; char temper_end[CMDLEN] = "\x0a\x0b\x0c\x0d\x00\x00\x01\x00"; char temper_measure[CMDLEN] = "\x54\x00\x00\x00\x00\x00\x00\x00"; char temper_nvram[CMDLEN] = "\x52\x00\x00\x00\x00\x00\x00\x00"; char temper_highprec[CMDLEN] = "\x43\x00\x00\x00\x00\x00\x00\x00"; char temper_null[CMDLEN] = { 0 }; /* read */ #define TEMPER_READ_TYPE 0xa1 #define TEMPER_READ_REQUEST 1 #define TEMPER_READ 0x300 #define DATALEN 256 struct usb_device * find_usb_device_by_id(struct usb_bus *busses, int vendor, int product) { struct usb_bus *bus; struct usb_device *dev; for (bus = busses; bus; bus = bus -> next) { for (dev = bus -> devices; dev; dev = dev -> next) { if (dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product) return dev; } } return NULL; } int main(int argc, char **argv) { struct usb_bus *busses; struct usb_device *dev; usb_dev_handle *handle; int interface; int timeout = 1000; int i, ret; char data[DATALEN]; double temperature; int testcmd = 0; if (argc>1) testcmd = atoi(argv[1]); usb_set_debug(0); usb_init(); usb_find_busses(); usb_find_devices(); busses = usb_get_busses(); if (!(dev = find_usb_device_by_id(busses, VENDOR_ID, PRODUCT_ID))) { fprintf(stderr, "TEMPer device not found\n"); exit(EXIT_FAILURE); } // printf("TEMPer found, device %d\n", dev->devnum); if (!(handle = usb_open(dev))) { perror("usb_open"); exit(EXIT_FAILURE); } for (interface=0; interface<=1; interface++) if (usb_detach_kernel_driver_np(handle, interface) < 0) { if (errno==ENODATA) { // fprintf(stderr, "interface %d already detached\n", interface); } else { perror("usb_detach_kernel_driver_np"); fprintf(stderr, "detach %d failed, continuing anyway\n", interface); } } interface = dev->config->interface->altsetting->bInterfaceNumber; // fprintf(stderr, "interface %d\n", interface); if (usb_claim_interface(handle,interface) < 0) { usb_close(handle); fprintf(stderr, "Failed to claim interface\n"); exit(EXIT_FAILURE); } if ((usb_control_msg(handle, TEMPER_CMD_TYPE, TEMPER_CMD_REQUEST, TEMPER_CMD, 1, temper_init, CMDLEN, timeout)) != CMDLEN) { perror("usb_control_msg(init)"); exit(EXIT_FAILURE); } #ifdef HIGHPREC if ((usb_control_msg(handle, TEMPER_CMD_TYPE, TEMPER_CMD_REQUEST, TEMPER_CMD, 1, temper_highprec, CMDLEN, timeout)) != CMDLEN) { perror("usb_control_msg(init)"); exit(EXIT_FAILURE); } #endif if ((usb_control_msg(handle, TEMPER_CMD_TYPE, TEMPER_CMD_REQUEST, TEMPER_CMD, 1, temper_measure, CMDLEN, timeout)) != CMDLEN) { perror("usb_control_msg(measure)"); exit(EXIT_FAILURE); } for (i=7; i--;) if ((usb_control_msg(handle, TEMPER_CMD_TYPE, TEMPER_CMD_REQUEST, TEMPER_CMD, 1, temper_null, CMDLEN, timeout)) != CMDLEN) { perror("usb_control_msg(null)"); exit(EXIT_FAILURE); } if ((usb_control_msg(handle, TEMPER_CMD_TYPE, TEMPER_CMD_REQUEST, TEMPER_CMD, 1, temper_end, CMDLEN, timeout)) != CMDLEN) { perror("usb_control_msg(end)"); exit(EXIT_FAILURE); } usleep(500000); if ((ret=usb_control_msg(handle, TEMPER_READ_TYPE, TEMPER_READ_REQUEST, TEMPER_READ, 1, data, DATALEN, timeout)) < 2) { perror("usb_control_msg(read)"); exit(EXIT_FAILURE); } printf("Raw data: 0x%02x:%02x = %d %d\n", data[0], (unsigned char)data[1], (unsigned char)data[0], (unsigned char)data[1]); temperature = data[0] + ((unsigned char)data[1])/256.0; printf("%.2f degrees Celcius\n", temperature); usb_release_interface(handle,interface); usb_close(handle); exit(EXIT_SUCCESS); }