]> mj.ucw.cz Git - home-hw.git/blob - ssr/test/test.c
Auto: Meditation mode turned off
[home-hw.git] / ssr / test / 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 == 0x0002)
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 static byte req[64], resp[64];
45
46 static int transaction(uint req_len, uint resp_len)
47 {
48   int err, transferred;
49   if (err = libusb_bulk_transfer(devh, 0x01, req, req_len, &transferred, 2000))
50     die("Transfer failed: error %d\n", err);
51   // printf("Transferred %d bytes\n", transferred);
52
53   int received;
54   if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000))
55     die("Receive failed: error %d\n", err);
56   // printf("Received %d bytes\n", received);
57
58   if ((uint) received < resp_len)
59     die("Received short packet (%u out of %u bytes)", received, resp_len);
60
61   if (received >= 4)
62     {
63       uint status = get_u32_be(resp);
64       if (status)
65         die("Received error status %08x", status);
66     }
67
68   return received;
69 }
70
71 int main(void)
72 {
73   int err;
74   if (err = libusb_init(&usb_ctxt))
75     {
76       fprintf(stderr, "Cannot initialize libusb: error %d\n", err);
77       exit(1);
78     }
79   libusb_set_debug(usb_ctxt, 3);
80
81   libusb_device *dev = find_device();
82
83   if (err = libusb_open(dev, &devh))
84     {
85       fprintf(stderr, "Cannot open device: error %d\n", err);
86       exit(1);
87     }
88   libusb_reset_device(devh);
89   if (err = libusb_claim_interface(devh, 0))
90     {
91       fprintf(stderr, "Cannot claim interface: error %d\n", err);
92       exit(1);
93     }
94
95 #if 1
96   put_u32_be(req, 2);
97   transaction(8, 8);
98   int t = get_u32_be(resp+4);
99   printf("Temp: %d\n", t);
100 #endif
101
102   int x = 0;
103   scanf("%d", &x);
104
105   put_u32_be(req, 1);
106   put_u32_be(req+4, x);
107   transaction(8, 4);
108
109   return 0;
110 }