diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2024-10-12 14:02:30 +0200 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2024-10-12 14:02:30 +0200 |
commit | dc3f0d6d050ed4f5dda1ab3a50647e9c5a04a2ff (patch) | |
tree | 7612021b9d7d0850aec906a06111f12b1bf39676 /elksmart-comm.c | |
parent | 9e91058ed926841d3152f888b8b87633b8ccc4f8 (diff) | |
download | desktop-tools-dc3f0d6d050ed4f5dda1ab3a50647e9c5a04a2ff.tar.gz desktop-tools-dc3f0d6d050ed4f5dda1ab3a50647e9c5a04a2ff.tar.xz desktop-tools-dc3f0d6d050ed4f5dda1ab3a50647e9c5a04a2ff.zip |
elksmart-comm: add support for EKX5S-T
This device seems to be very picky about USB ports,
but at least learning is reliable,
and it uses the same protocol as EKX4S.
Diffstat (limited to 'elksmart-comm.c')
-rw-r--r-- | elksmart-comm.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/elksmart-comm.c b/elksmart-comm.c index a16b2f4..98e100f 100644 --- a/elksmart-comm.c +++ b/elksmart-comm.c @@ -1,5 +1,5 @@ /* - * elksmart-comm.c: ELK Smart infrared dongle tool (for the 4th generation) + * elksmart-comm.c: ELK Smart infrared dongle tool (for EKX4S and EKX5S-T) * * Copyright (c) 2024, Přemysl Eric Janouch <p@janouch.name> * @@ -207,7 +207,8 @@ compress_value (unsigned value, struct str *encoded) static void compress_pulses (const struct pulse *pulses, size_t len, struct str *encoded) { - unsigned counts[len] = {}; + unsigned counts[len]; + memset (counts, 0, sizeof counts); for (size_t i = 0; i < len; i++) for (size_t k = 0; k < len; k++) if (pulse_equal (pulses[i], pulses[k])) @@ -222,7 +223,7 @@ compress_pulses (const struct pulse *pulses, size_t len, struct str *encoded) if (counts[i] < counts[top1] && counts[i] > counts[top2]) p2 = pulses[top2 = i]; - else if (counts[top2] == counts[top1]) + else if (counts[top2] == counts[top1]) p2 = pulses[top2 = i]; // Although I haven't really tried it, something tells me that @@ -259,8 +260,9 @@ enum // 0x134 (EKX5S ~ 5s, 5th generation remote) // 0x195 (EKX4S ~ 4s, 4th generation remote) - // 0x184 (international edition) - USB_PRODUCT_SMTCTL_SMART = 0x0195, + // 0x184 (EKX5S-T, international edition) + USB_PRODUCT_SMTCTL_SMART_EKX4S = 0x0195, + USB_PRODUCT_SMTCTL_SMART_EKX5S_T = 0x0184, // There should only ever be one interface. USB_INTERFACE = 0, @@ -551,7 +553,7 @@ send_identify (libusb_device_handle *device, struct error **e) return error_set (e, "device busy or not supported"); #if 0 - // My device does not respond to this request. + // The EKX4S does not respond to this request. static uint8_t c_serial[] = { -5, -5, -5, -5 }; if ((result = libusb_bulk_transfer (device, g.endpoint_out, c_serial, sizeof c_serial, &len, 100))) @@ -667,8 +669,14 @@ main (int argc, char *argv[]) if (result) exit_fatal ("libusb: %s", libusb_strerror (result)); - libusb_device_handle *device = - find_device (USB_VENDOR_SMTCTL, USB_PRODUCT_SMTCTL_SMART, &result); + libusb_device_handle *device = NULL; + if (!device && !result) + device = find_device (USB_VENDOR_SMTCTL, + USB_PRODUCT_SMTCTL_SMART_EKX4S, &result); + if (!device && !result) + device = find_device (USB_VENDOR_SMTCTL, + USB_PRODUCT_SMTCTL_SMART_EKX5S_T, &result); + if (result) exit_fatal ("couldn't open device: %s", libusb_strerror (result)); else if (!device) |