int main( int argc, char **argv) { usb_dev_handle *lvr_winusb = NULL; float tempInC; float tempOutC; int c; struct tm *local; time_t t; while ((c = getopt (argc, argv, "mfcvhl::a:")) != -1) switch (c) { case 'v': debug = 1; break; case 'c': formato=1; //Celsius break; case 'f': formato=2; //Fahrenheit break; case 'm': mrtg=1; break; case 'l': if (optarg!=NULL){ if (!sscanf(optarg,"%i",&seconds)==1) { fprintf (stderr, "Error: '%s' is not numeric.\n", optarg); exit(EXIT_FAILURE); } else { bsalir = 0; break; } } else { bsalir = 0; seconds = 5; break; } case 'a': if (!sscanf(optarg,"%i",&calibration)==1) { fprintf (stderr, "Error: '%s' is not numeric.\n", optarg); exit(EXIT_FAILURE); } else { break; } case '?': case 'h': printf("pcsensor version %s\n",VERSION); printf(" Aviable options:\n"); printf(" -h help\n"); printf(" -v verbose\n"); printf(" -l[n] loop every 'n' seconds, default value is 5s\n"); printf(" -c output only in Celsius\n"); printf(" -f output only in Fahrenheit\n"); printf(" -a[n] increase or decrease temperature in 'n' degrees for device calibration\n"); printf(" -m output for mrtg integration\n"); exit(EXIT_FAILURE); default: if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); exit(EXIT_FAILURE); } if (optind < argc) { fprintf(stderr, "Non-option ARGV-elements, try -h for help.\n"); exit(EXIT_FAILURE); } if ((lvr_winusb = setup_libusb_access()) == NULL) { exit(EXIT_FAILURE); } (void) signal(SIGINT, ex_program); ini_control_transfer(lvr_winusb); control_transfer(lvr_winusb, uTemperatura ); interrupt_read(lvr_winusb); control_transfer(lvr_winusb, uIni1 ); interrupt_read(lvr_winusb); control_transfer(lvr_winusb, uIni2 ); interrupt_read(lvr_winusb); interrupt_read(lvr_winusb); do { control_transfer(lvr_winusb, uTemperatura ); interrupt_read_temperatura(lvr_winusb, &tempInC, &tempOutC); t = time(NULL); local = localtime(&t); if (mrtg) { if (formato==2) { printf("%.2f\n", (9.0 / 5.0 * tempInC + 32.0)); printf("%.2f\n", (9.0 / 5.0 * tempInC + 32.0)); } else { printf("%.2f\n", tempInC); printf("%.2f\n", tempInC); } printf("%02d:%02d\n", local->tm_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); usb_release_interface(lvr_winusb, INTERFACE1); usb_release_interface(lvr_winusb, INTERFACE2); usb_close(lvr_winusb); return 0; }
static int readtemp(float *temp) { int r; uint8_t question1[] = { 0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00 }; uint8_t question2[] = { 0x01, 0x82, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00 }; uint8_t question3[] = { 0x01, 0x86, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00 }; uint8_t response[8]; if (debug) printf("sending init control transfer\n"); r = init_control_transfer(); if (r < 0) return r; if (debug) printf("sending control transfer question1\n"); r = control_transfer(question1, sizeof(question1)); if (r < 0) return r; if (debug) printf("reading interrupt response\n"); r = interrupt_read(response, sizeof(response)); if (r < 0) return r; if (debug) printf("sending control transfer question2\n"); r = control_transfer(question2, sizeof(question2)); if (r < 0) return r; if (debug) printf("reading interrupt response\n"); r = interrupt_read(response, sizeof(response)); if (r < 0) return r; if (debug) printf("sending control transfer question3\n"); r = control_transfer(question3, sizeof(question3)); if (r < 0) return r; if (debug) printf("reading interrupt response\n"); r = interrupt_read(response, sizeof(response)); if (r < 0) return r; if (debug) printf("reading interrupt response\n"); r = interrupt_read(response, sizeof(response)); if (r < 0) return r; if (debug) printf("sending control transfer question1\n"); r = control_transfer(question1, sizeof(question1)); if (r < 0) return r; if (debug) printf("reading temperature interrupt response\n"); r = interrupt_read(response, sizeof(response)); if (r < 0) return r; *temp = (response[3] & 0xFF) + (response[2] << 8); *temp = *temp * (125.0 / 32000.0); return 0; }