Guest User

temp.c

a guest
Sep 28th, 2012
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netdb.h>
  6. #include "usb.h"
  7.  
  8. #define VENDOR_ID  0x0c45
  9. #define PRODUCT_ID 0x7401
  10.  
  11. usb_dev_handle* find_device()
  12. {
  13.     struct usb_bus *bus;
  14.     struct usb_device *dev;
  15.  
  16.     for (bus = usb_get_busses(); bus; bus = bus->next)
  17.     for (dev = bus->devices; dev; dev = dev->next)
  18.     {
  19.         if (dev->descriptor.idVendor == VENDOR_ID &&
  20.             dev->descriptor.idProduct == PRODUCT_ID)
  21.         {
  22.             usb_dev_handle *udev;
  23.             char s1[256];
  24.             char s2[256];
  25.            
  26.             if (!(udev = usb_open(dev)))
  27.                 return NULL;
  28.                
  29.             usb_get_string_simple(udev, dev->descriptor.iManufacturer, s1, 256);
  30.             usb_get_string_simple(udev, dev->descriptor.iProduct, s2, 256);
  31.  
  32.             printf("Device: %s - %s\n", s1, s2);
  33.                
  34.             return udev;
  35.         }
  36.     }
  37.     return NULL;
  38. }
  39.  
  40. usb_dev_handle* setup()
  41. {
  42.     usb_dev_handle *udev;
  43.  
  44.     usb_set_debug(0);  
  45.     usb_init();
  46.     usb_find_busses();
  47.     usb_find_devices();
  48.    
  49.     if (!(udev = find_device()))
  50.     {
  51.         printf("Device not found\n");
  52.         return NULL;
  53.     }
  54.    
  55.     usb_detach_kernel_driver_np(udev, 0);
  56.     usb_detach_kernel_driver_np(udev, 1);
  57.    
  58.     if (usb_set_configuration(udev, 1) < 0)
  59.     {
  60.         printf("usb_set_configuration failed\n");
  61.         usb_close(udev);
  62.         return NULL;
  63.     }
  64.    
  65.     if (usb_claim_interface(udev, 0) < 0)
  66.     {
  67.         printf("usb_claim_interface failed\n");
  68.         usb_close(udev);
  69.         return NULL;
  70.     }
  71.  
  72.     if (usb_claim_interface(udev, 1) < 0)
  73.     {
  74.         printf("usb_claim_interface failed\n");
  75.         usb_close(udev);
  76.         return NULL;
  77.     }
  78.    
  79.     return udev;
  80. }
  81.  
  82. int device_send_init(usb_dev_handle *udev)
  83. {
  84.     int r;
  85.     char q[] = {0x01, 0x01};
  86.    
  87.     r = usb_control_msg(udev, 0x21, 0x09, 0x0201, 0x00, (char *) q, 2, 5000);
  88.     if (r < 0)
  89.         printf("usb_control_msg failed\n");
  90.    
  91.     return r;
  92. }
  93.  
  94. int device_send_temp(usb_dev_handle *udev)
  95. {
  96.     int r;
  97.     char q[8] = {0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00};
  98.  
  99.     r = usb_control_msg(udev, 0x21, 0x09, 0x0200, 0x01, (char *) q, 8, 5000);
  100.     if (r < 0)
  101.         printf("usb_control_msg failed\n");
  102.        
  103.     return r;
  104. }
  105.  
  106. int device_get_temp(usb_dev_handle *udev, float *temp)
  107. {
  108.     int r;
  109.     char a[8];
  110.     bzero(a, 8);
  111.    
  112.     r = usb_interrupt_read(udev, 0x82, a, 8, 5000);
  113.     if (r != 8)
  114.     {
  115.         printf("usb_interrupt_read failed\n");
  116.         return -1;
  117.     }
  118.    
  119.     if (a[2] == 0 && a[3] == 0)
  120.     {
  121.         printf("get_temp failed\n");
  122.         return -1;
  123.     }
  124.        
  125.     int i;
  126.     printf("Raw: ");
  127.     for (i = 0; i < 8; ++i)
  128.         printf("%02x ", a[i] & 0xFF);
  129.     printf("\n");
  130.    
  131.     int t = (a[3] & 0xFF) + (a[2] << 8);
  132.     t += 208;
  133.     *temp = t * (125.0 / 32000.0) * 1.045;
  134.     printf("Temperature: %.1f C\n", *temp);
  135.  
  136.     return 0;
  137. }
  138.  
  139. void report_temp(float temp)
  140. {
  141.     struct sockaddr_in serv_addr;
  142.     struct hostent *server;
  143.  
  144.     int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  145.     if (sockfd < 0)
  146.     {
  147.         printf("socket failed\n");
  148.         return;
  149.     }
  150.    
  151.     const char myhost[] = "my.t-25.ru";
  152.     server = gethostbyname(myhost);
  153.     if (server == NULL)
  154.     {
  155.         printf("gethostbyname failed\n");
  156.         close(sockfd);     
  157.         return;
  158.     }
  159.    
  160.     bzero((char *) &serv_addr, sizeof(serv_addr));
  161.     serv_addr.sin_family = AF_INET;
  162.     bcopy((char *)server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
  163.     serv_addr.sin_port = htons(80);
  164.    
  165.     if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  166.     {
  167.         printf("connect failed\n");
  168.         close(sockfd);
  169.         return;
  170.     }
  171.    
  172.     char req[255];
  173.     sprintf(req, "GET /temp.pl?%0.1f HTTP/1.0\nUser-Agent: Temp-Report\nHost: %s\n\n", temp, myhost);
  174.  
  175.     int n = write(sockfd, req, strlen(req));
  176.     if (n < 0)
  177.     {
  178.         printf("write error\n");
  179.         close(sockfd);
  180.         return;
  181.     }
  182.    
  183.     printf("Reported\n");
  184.     close(sockfd);
  185. }
  186.  
  187. int main(int argc, char *argv[])
  188. {
  189.     usb_dev_handle *udev = setup();
  190.     if (!udev)
  191.         return 1;      
  192.  
  193.     float temp;
  194.            
  195.     if (device_send_init(udev) < 0 ||
  196.         device_send_temp(udev) < 0 ||
  197.         device_get_temp(udev, &temp) < 0) return 1;
  198.  
  199.     if (argc > 1)
  200.         report_temp(temp);
  201.    
  202.     usb_release_interface(udev, 0);
  203.     usb_release_interface(udev, 1);
  204.     usb_close(udev);
  205.  
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment