Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include "usb.h"
- #define VENDOR_ID 0x0c45
- #define PRODUCT_ID 0x7401
- usb_dev_handle* find_device()
- {
- struct usb_bus *bus;
- struct usb_device *dev;
- for (bus = usb_get_busses(); bus; bus = bus->next)
- for (dev = bus->devices; dev; dev = dev->next)
- {
- if (dev->descriptor.idVendor == VENDOR_ID &&
- dev->descriptor.idProduct == PRODUCT_ID)
- {
- usb_dev_handle *udev;
- char s1[256];
- char s2[256];
- if (!(udev = usb_open(dev)))
- return NULL;
- usb_get_string_simple(udev, dev->descriptor.iManufacturer, s1, 256);
- usb_get_string_simple(udev, dev->descriptor.iProduct, s2, 256);
- printf("Device: %s - %s\n", s1, s2);
- return udev;
- }
- }
- return NULL;
- }
- usb_dev_handle* setup()
- {
- usb_dev_handle *udev;
- usb_set_debug(0);
- usb_init();
- usb_find_busses();
- usb_find_devices();
- if (!(udev = find_device()))
- {
- printf("Device not found\n");
- return NULL;
- }
- usb_detach_kernel_driver_np(udev, 0);
- usb_detach_kernel_driver_np(udev, 1);
- if (usb_set_configuration(udev, 1) < 0)
- {
- printf("usb_set_configuration failed\n");
- usb_close(udev);
- return NULL;
- }
- if (usb_claim_interface(udev, 0) < 0)
- {
- printf("usb_claim_interface failed\n");
- usb_close(udev);
- return NULL;
- }
- if (usb_claim_interface(udev, 1) < 0)
- {
- printf("usb_claim_interface failed\n");
- usb_close(udev);
- return NULL;
- }
- return udev;
- }
- int device_send_init(usb_dev_handle *udev)
- {
- int r;
- char q[] = {0x01, 0x01};
- r = usb_control_msg(udev, 0x21, 0x09, 0x0201, 0x00, (char *) q, 2, 5000);
- if (r < 0)
- printf("usb_control_msg failed\n");
- return r;
- }
- int device_send_temp(usb_dev_handle *udev)
- {
- int r;
- char q[8] = {0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00};
- r = usb_control_msg(udev, 0x21, 0x09, 0x0200, 0x01, (char *) q, 8, 5000);
- if (r < 0)
- printf("usb_control_msg failed\n");
- return r;
- }
- int device_get_temp(usb_dev_handle *udev, float *temp)
- {
- int r;
- char a[8];
- bzero(a, 8);
- r = usb_interrupt_read(udev, 0x82, a, 8, 5000);
- if (r != 8)
- {
- printf("usb_interrupt_read failed\n");
- return -1;
- }
- if (a[2] == 0 && a[3] == 0)
- {
- printf("get_temp failed\n");
- return -1;
- }
- int i;
- printf("Raw: ");
- for (i = 0; i < 8; ++i)
- printf("%02x ", a[i] & 0xFF);
- printf("\n");
- int t = (a[3] & 0xFF) + (a[2] << 8);
- t += 208;
- *temp = t * (125.0 / 32000.0) * 1.045;
- printf("Temperature: %.1f C\n", *temp);
- return 0;
- }
- void report_temp(float temp)
- {
- struct sockaddr_in serv_addr;
- struct hostent *server;
- int sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd < 0)
- {
- printf("socket failed\n");
- return;
- }
- const char myhost[] = "my.t-25.ru";
- server = gethostbyname(myhost);
- if (server == NULL)
- {
- printf("gethostbyname failed\n");
- close(sockfd);
- return;
- }
- bzero((char *) &serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- bcopy((char *)server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
- serv_addr.sin_port = htons(80);
- if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
- {
- printf("connect failed\n");
- close(sockfd);
- return;
- }
- char req[255];
- sprintf(req, "GET /temp.pl?%0.1f HTTP/1.0\nUser-Agent: Temp-Report\nHost: %s\n\n", temp, myhost);
- int n = write(sockfd, req, strlen(req));
- if (n < 0)
- {
- printf("write error\n");
- close(sockfd);
- return;
- }
- printf("Reported\n");
- close(sockfd);
- }
- int main(int argc, char *argv[])
- {
- usb_dev_handle *udev = setup();
- if (!udev)
- return 1;
- float temp;
- if (device_send_init(udev) < 0 ||
- device_send_temp(udev) < 0 ||
- device_get_temp(udev, &temp) < 0) return 1;
- if (argc > 1)
- report_temp(temp);
- usb_release_interface(udev, 0);
- usb_release_interface(udev, 1);
- usb_close(udev);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment