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