From 4a9be44afde08ff61f2c19869e8c9bb94169ff34 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sun, 20 Aug 2023 21:50:59 +0200 Subject: [PATCH] Use separate data structures for USB and USB HID Using separate data structures for the filtering allows to keep the USB and USB HID backends completely independent from each other. --- include/libdivecomputer/usb.h | 8 ++++++++ include/libdivecomputer/usbhid.h | 8 ++++++++ src/descriptor-private.h | 5 ----- src/descriptor.c | 20 ++++++++++++++++---- src/usbhid.c | 4 ++-- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/include/libdivecomputer/usb.h b/include/libdivecomputer/usb.h index 6d13813..82e5881 100644 --- a/include/libdivecomputer/usb.h +++ b/include/libdivecomputer/usb.h @@ -86,6 +86,14 @@ typedef enum dc_usb_recipient_t { DC_USB_RECIPIENT_OTHER = 0x03, } dc_usb_recipient_t; +/** + * USB device descriptor. + */ +typedef struct dc_usb_desc_t { + unsigned short vid; + unsigned short pid; +} dc_usb_desc_t; + /** * Opaque object representing a USB device. */ diff --git a/include/libdivecomputer/usbhid.h b/include/libdivecomputer/usbhid.h index f1c542a..245adf0 100644 --- a/include/libdivecomputer/usbhid.h +++ b/include/libdivecomputer/usbhid.h @@ -32,6 +32,14 @@ extern "C" { #endif /* __cplusplus */ +/** + * USB HID device descriptor. + */ +typedef struct dc_usbhid_desc_t { + unsigned short vid; + unsigned short pid; +} dc_usbhid_desc_t; + /** * Opaque object representing a USB HID device. */ diff --git a/src/descriptor-private.h b/src/descriptor-private.h index 06c2980..77bdbb6 100644 --- a/src/descriptor-private.h +++ b/src/descriptor-private.h @@ -28,11 +28,6 @@ extern "C" { #endif /* __cplusplus */ -typedef struct dc_usb_desc_t { - unsigned short vid; - unsigned short pid; -} dc_usb_desc_t; - int dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata); diff --git a/src/descriptor.c b/src/descriptor.c index d90b54e..79c2d7c 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -23,6 +23,9 @@ #include #include +#include +#include + #include "descriptor-private.h" #include "iterator-private.h" #include "platform.h" @@ -496,6 +499,15 @@ dc_match_usb (const void *key, const void *value) return k->vid == v->vid && k->pid == v->pid; } +static int +dc_match_usbhid (const void *key, const void *value) +{ + const dc_usbhid_desc_t *k = (const dc_usbhid_desc_t *) key; + const dc_usbhid_desc_t *v = (const dc_usbhid_desc_t *) value; + + return k->vid == v->vid && k->pid == v->pid; +} + static int dc_match_number_with_prefix (const void *key, const void *value) { @@ -569,7 +581,7 @@ dc_filter_uwatec (dc_descriptor_t *descriptor, dc_transport_t transport, const v "UWATEC Galileo", "UWATEC Galileo Sol", }; - static const dc_usb_desc_t usbhid[] = { + static const dc_usbhid_desc_t usbhid[] = { {0x2e6c, 0x3201}, // G2, G2 TEK {0x2e6c, 0x3211}, // G2 Console {0x2e6c, 0x4201}, // G2 HUD @@ -587,7 +599,7 @@ dc_filter_uwatec (dc_descriptor_t *descriptor, dc_transport_t transport, const v if (transport == DC_TRANSPORT_IRDA) { return DC_FILTER_INTERNAL (userdata, irda, 0, dc_match_name); } else if (transport == DC_TRANSPORT_USBHID) { - return DC_FILTER_INTERNAL (userdata, usbhid, 0, dc_match_usb); + return DC_FILTER_INTERNAL (userdata, usbhid, 0, dc_match_usbhid); } else if (transport == DC_TRANSPORT_BLE) { return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_name); } @@ -598,7 +610,7 @@ dc_filter_uwatec (dc_descriptor_t *descriptor, dc_transport_t transport, const v static int dc_filter_suunto (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata) { - static const dc_usb_desc_t usbhid[] = { + static const dc_usbhid_desc_t usbhid[] = { {0x1493, 0x0030}, // Eon Steel {0x1493, 0x0033}, // Eon Core {0x1493, 0x0035}, // D5 @@ -612,7 +624,7 @@ dc_filter_suunto (dc_descriptor_t *descriptor, dc_transport_t transport, const v }; if (transport == DC_TRANSPORT_USBHID) { - return DC_FILTER_INTERNAL (userdata, usbhid, 0, dc_match_usb); + return DC_FILTER_INTERNAL (userdata, usbhid, 0, dc_match_usbhid); } else if (transport == DC_TRANSPORT_BLE) { return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_prefix); } diff --git a/src/usbhid.c b/src/usbhid.c index 3ed94d7..04e35d9 100644 --- a/src/usbhid.c +++ b/src/usbhid.c @@ -438,7 +438,7 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out) return syserror (rc); } - dc_usb_desc_t usb = {dev.idVendor, dev.idProduct}; + dc_usbhid_desc_t usb = {dev.idVendor, dev.idProduct}; if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) { continue; } @@ -522,7 +522,7 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out) struct hid_device_info *current = iterator->current; iterator->current = current->next; - dc_usb_desc_t usb = {current->vendor_id, current->product_id}; + dc_usbhid_desc_t usb = {current->vendor_id, current->product_id}; if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) { continue; }