コード例 #1
0
ファイル: pcsensor.c プロジェクト: MacMarc/pcsensor
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;
}
コード例 #2
0
ファイル: pcsensor2.c プロジェクト: nonoo/pcsensor2
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;
}