/* * pcsensor.c by Juan Carlos Perez (c) 2011 (cray@isp-sl.com) * based on Temper.c by Robert Kavaler (c) 2009 (relavak.com) * All rights reserved. * * 2011/08/30 Thanks to EdorFaus: bugfix to support negative temperatures * * Temper driver for linux. This program can be compiled either as a library * or as a standalone program (-DUNIT_TEST). The driver will work with some * TEMPer usb devices from RDing (www.PCsensor.com). * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THIS SOFTWARE IS PROVIDED BY Juan Carlos Perez ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL Robert kavaler BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include #include #include #include #include #include #define VERSION "1.0.1a" #define VENDOR_ID 0x0c45 #define PRODUCT_ID 0x7401 #define INTERFACE1 0x00 #define INTERFACE2 0x01 const static int reqIntLen=8; const static int reqBulkLen=8; const static int endpoint_Int_in=0x82; /* endpoint 0x81 address for IN */ const static int endpoint_Int_out=0x00; /* endpoint 1 address for OUT */ const static int endpoint_Bulk_in=0x82; /* endpoint 0x81 address for IN */ const static int endpoint_Bulk_out=0x00; /* endpoint 1 address for OUT */ const static int timeout=5000; /* timeout in ms */ const static char uTemperatura[] = { 0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00 }; const static char uIni1[] = { 0x01, 0x82, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00 }; const static char uIni2[] = { 0x01, 0x86, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00 }; static int bsalir=1; static int debug=0; static int seconds=5; static int formato=0; static int mrtg=0; static int calibration=0; void bad(const char *why) { fprintf(stderr,"Fatal error> %s\n",why); exit(17); } libusb_context *ctx = NULL; libusb_device_handle *find_lvr_winusb(); void usb_detach(libusb_device_handle *lvr_winusb, int iInterface) { int ret; ret = libusb_detach_kernel_driver(lvr_winusb, iInterface); if(ret) { if(errno == ENODATA) { if(debug) { printf("Device already detached\n"); } } else { if(debug) { printf("Detach failed: %s[%d]\n", strerror(errno), errno); printf("Continuing anyway\n"); } } } else { if(debug) { printf("detach successful\n"); } } } libusb_device_handle* setup_libusb_access() { libusb_device_handle *lvr_winusb; libusb_init(&ctx); if(debug) { libusb_set_debug(ctx, 4); //LIBUSB_LOG_LEVEL_DEBUG } else { libusb_set_debug(ctx, 0); //LIBUSB_LOG_LEVEL_NONE } if(!(lvr_winusb = find_lvr_winusb())) { printf("Couldn't find the USB device, Exiting\n"); return NULL; } usb_detach(lvr_winusb, INTERFACE1); usb_detach(lvr_winusb, INTERFACE2); if (libusb_set_configuration(lvr_winusb, 0x01) < 0) { printf("Could not set configuration 1\n"); return NULL; } // Microdia tiene 2 interfaces int errno; if ( ( errno = libusb_claim_interface(lvr_winusb, INTERFACE1) ) != 0) { printf("Could not claim interface. Error:%d\n", errno); return NULL; } if ( ( errno = libusb_claim_interface(lvr_winusb, INTERFACE2) ) != 0) { printf("Could not claim interface. Error:%d\n", errno); return NULL; } return lvr_winusb; } libusb_device_handle *find_lvr_winusb() { libusb_device_handle *handle; handle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID); if (!handle) { printf("Could not open USB device\n"); return NULL; } return handle; } void ini_control_transfer(libusb_device_handle *dev) { int r,i; char question[] = { 0x01,0x01 }; r = libusb_control_transfer(dev, 0x21, 0x09, 0x0201, 0x00, (char *) question, 2, timeout); if( r < 0 ) { perror("USB control write"); bad("USB write failed"); } if(debug) { for (i=0;itm_hour, local->tm_min); printf("pcsensor\n"); } else { printf("%04d/%02d/%02d %02d:%02d:%02d\n", local->tm_year +1900, local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); if (formato==2) { printf("Temperature (internal) %.2fF\n", (9.0 / 5.0 * tempInC + 32.0)); printf("Temperature (external) %.2fF\n", (9.0 / 5.0 * tempOutC + 32.0)); } else if (formato==1) { printf("Temperature (internal) %.2fC\n", tempInC); printf("Temperature (external) %.2fC\n", tempOutC); } else { printf("Temperature (internal) %.2fF %.2fC\n", (9.0 / 5.0 * tempInC + 32.0), tempInC); printf("Temperature (external) %.2fF %.2fC\n", (9.0 / 5.0 * tempOutC + 32.0), tempOutC); } } if (!bsalir) sleep(seconds); } while (!bsalir); libusb_release_interface(lvr_winusb, INTERFACE1); libusb_release_interface(lvr_winusb, INTERFACE2); libusb_close(lvr_winusb); return 0; }