2 * Control utility for the Solid State Relay module
4 * (c) 2018 Martin Mares <mj@ucw.cz>
8 #include <ucw/unaligned.h>
18 #include <libusb-1.0/libusb.h>
20 struct libusb_context *usb_ctxt;
21 struct libusb_device_handle *devh;
23 void open_device(void)
26 libusb_device **devlist;
27 ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
29 die("Cannot enumerate USB devices: error %d", (int) devn);
31 for (ssize_t i=0; i<devn; i++) {
32 struct libusb_device_descriptor desc;
33 libusb_device *dev = devlist[i];
34 if (!libusb_get_device_descriptor(dev, &desc)) {
35 if (desc.idVendor == 0x4242 && desc.idProduct == 0x0002) {
36 printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
38 if (err = libusb_open(dev, &devh))
39 die("Cannot open device: error %d", err);
40 libusb_reset_device(devh);
41 if (err = libusb_claim_interface(devh, 0))
42 die("Cannot claim interface: error %d", err);
44 libusb_free_device_list(devlist, 1);
50 libusb_free_device_list(devlist, 1);
51 die("Device not found");
54 static byte req[64], resp[64];
56 static int transaction(uint req_len, uint resp_len)
59 if (err = libusb_bulk_transfer(devh, 0x01, req, req_len, &transferred, 2000))
60 die("Transfer failed: error %d\n", err);
61 // printf("Transferred %d bytes\n", transferred);
64 if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000))
65 die("Receive failed: error %d\n", err);
66 // printf("Received %d bytes\n", received);
68 if ((uint) received < resp_len)
69 die("Received short packet (%u out of %u bytes)", received, resp_len);
72 uint status = get_u32_be(resp);
74 die("Received error status %08x", status);
80 static void usage(void)
82 fprintf(stderr, "Usage: ssr-control [-t] [-s <mask>]\n");
86 int main(int argc, char **argv)
92 while ((opt = getopt(argc, argv, "ts:")) >= 0) {
98 set_relays = atoi(optarg);
108 if (err = libusb_init(&usb_ctxt))
109 die("Cannot initialize libusb: error %d", err);
110 libusb_set_debug(usb_ctxt, 3);
116 int t = get_u32_be(resp+4);
117 printf("Temp: %d\n", t);
120 if (set_relays >= 0) {
122 put_u32_be(req+4, set_relays);