]> mj.ucw.cz Git - home-hw.git/blob - rainbow/test/test.c
Iris: Typo
[home-hw.git] / rainbow / test / test.c
1 /* Testing Neopixel Rainbow */
2
3 #include <ucw/lib.h>
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <stdint.h>
8 #include <unistd.h>
9 #include <time.h>
10 #include <libusb-1.0/libusb.h>
11
12 #include "../firmware/interface.h"
13
14 struct libusb_context *usb_ctxt;
15 struct libusb_device_handle *devh;
16
17 static libusb_device *find_device(void)
18 {
19   libusb_device **devlist;
20   ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
21   if (devn < 0)
22     {
23       fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn);
24       exit(1);
25     }
26
27   for (ssize_t i=0; i<devn; i++)
28     {
29       struct libusb_device_descriptor desc;
30       libusb_device *dev = devlist[i];
31       if (!libusb_get_device_descriptor(dev, &desc))
32         {
33           if (desc.idVendor == NPIX_USB_VENDOR && desc.idProduct == NPIX_USB_PRODUCT)
34             {
35               printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
36               // FIXME: Free device list
37               return dev;
38             }
39         }
40     }
41
42   libusb_free_device_list(devlist, 1);
43   fprintf(stderr, "Device not found\n");
44   exit(1);
45 }
46
47 int main(int argc, char **argv)
48 {
49   byte packet[NPIX_NUM_LEDS*3] = { };
50   int len = 0;
51
52   if (argc > NPIX_NUM_LEDS*3 + 1)
53     die("Too many arguments!");
54
55   for (int i=1; i < argc; i++)
56     packet[len++] = atoi(argv[i]);
57
58   int err;
59   if (err = libusb_init(&usb_ctxt))
60     die("Cannot initialize libusb: error %d", err);
61
62   libusb_device *dev = find_device();
63
64   if (err = libusb_open(dev, &devh))
65     die("Cannot open device: error %d", err);
66   // libusb_reset_device(devh);
67   if (err = libusb_claim_interface(devh, 0))
68     die("Cannot claim interface: error %d", err);
69
70   int transferred;
71   if (err = libusb_bulk_transfer(devh, 0x01, packet, len, &transferred, 1000))
72     die("Transfer failed: error %d\n", err);
73   if (transferred != len)
74     die("Short transfer: %d out of %d bytes", transferred, len);
75
76   return 0;
77 }