]> mj.ucw.cz Git - home-hw.git/blob - ssr/host/test.c
2d94a98ec8c9e31cba8341c7a8149a7b8fcf5415
[home-hw.git] / ssr / host / test.c
1 #include <ucw/lib.h>
2 #include <ucw/unaligned.h>
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdint.h>
7 #include <unistd.h>
8 #include <time.h>
9 #include <libusb-1.0/libusb.h>
10
11 struct libusb_context *usb_ctxt;
12 struct libusb_device_handle *devh;
13
14 static libusb_device *find_device(void)
15 {
16   libusb_device **devlist;
17   ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
18   if (devn < 0)
19     {
20       fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn);
21       exit(1);
22     }
23
24   for (ssize_t i=0; i<devn; i++)
25     {
26       struct libusb_device_descriptor desc;
27       libusb_device *dev = devlist[i];
28       if (!libusb_get_device_descriptor(dev, &desc))
29         {
30           if (desc.idVendor == 0x4242 && desc.idProduct == 0x0001)
31             {
32               printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
33               // FIXME: Free device list
34               return dev;
35             }
36         }
37     }
38
39   libusb_free_device_list(devlist, 1);
40   fprintf(stderr, "Device not found\n");
41   exit(1);
42 }
43
44 int main(void)
45 {
46   int err;
47   if (err = libusb_init(&usb_ctxt))
48     {
49       fprintf(stderr, "Cannot initialize libusb: error %d\n", err);
50       exit(1);
51     }
52   libusb_set_debug(usb_ctxt, 3);
53
54   libusb_device *dev = find_device();
55
56   if (err = libusb_open(dev, &devh))
57     {
58       fprintf(stderr, "Cannot open device: error %d\n", err);
59       exit(1);
60     }
61   libusb_reset_device(devh);
62   if (err = libusb_claim_interface(devh, 0))
63     {
64       fprintf(stderr, "Cannot claim interface: error %d\n", err);
65       exit(1);
66     }
67
68   for (;;)
69     {
70       time_t t = time(NULL);
71       struct tm *tm = localtime(&t);
72
73       unsigned char req[8] = {
74         tm->tm_hour / 10,
75         tm->tm_hour % 10,
76         (tm->tm_sec % 2 ? 10 : 0xff),
77         tm->tm_min / 10,
78         tm->tm_min % 10,
79       };
80       int transferred;
81       if (err = libusb_bulk_transfer(devh, 0x01, req, 8, &transferred, 2000))
82         die("Transfer failed: error %d\n", err);
83       // printf("Transferred %d bytes\n", transferred);
84
85       unsigned char resp[64];
86       int received;
87       if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000))
88         die("Receive failed: error %d\n", err);
89       // printf("Received %d bytes\n", received);
90       if (received >= 12)
91         {
92           int t = get_u32_be(resp);
93           int p = get_u32_be(resp + 4);
94           uint cnt = get_u32_be(resp + 8);
95           msg(L_INFO, "Temperature %d ddegC, pressure %d Pa, cnt %u", t, p, cnt);
96         }
97
98       sleep(1);
99     }
100
101   return 0;
102 }