Merge branch 'filter-function'
This commit is contained in:
commit
37421a1b9a
@ -331,7 +331,6 @@
|
|||||||
<ClInclude Include="..\..\src\cressi_leonardo.h" />
|
<ClInclude Include="..\..\src\cressi_leonardo.h" />
|
||||||
<ClInclude Include="..\..\src\deepblu_cosmiq.h" />
|
<ClInclude Include="..\..\src\deepblu_cosmiq.h" />
|
||||||
<ClInclude Include="..\..\src\deepsix_excursion.h" />
|
<ClInclude Include="..\..\src\deepsix_excursion.h" />
|
||||||
<ClInclude Include="..\..\src\descriptor-private.h" />
|
|
||||||
<ClInclude Include="..\..\src\device-private.h" />
|
<ClInclude Include="..\..\src\device-private.h" />
|
||||||
<ClInclude Include="..\..\src\diverite_nitekq.h" />
|
<ClInclude Include="..\..\src\diverite_nitekq.h" />
|
||||||
<ClInclude Include="..\..\src\divesoft_freedom.h" />
|
<ClInclude Include="..\..\src\divesoft_freedom.h" />
|
||||||
|
|||||||
@ -29,29 +29,96 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque object representing a supported dive computer.
|
||||||
|
*/
|
||||||
typedef struct dc_descriptor_t dc_descriptor_t;
|
typedef struct dc_descriptor_t dc_descriptor_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an iterator to enumerate the supported dive computers.
|
||||||
|
*
|
||||||
|
* @param[out] iterator A location to store the iterator.
|
||||||
|
* @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
dc_status_t
|
dc_status_t
|
||||||
dc_descriptor_iterator (dc_iterator_t **iterator);
|
dc_descriptor_iterator (dc_iterator_t **iterator);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the device descriptor.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
dc_descriptor_free (dc_descriptor_t *descriptor);
|
dc_descriptor_free (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the vendor name of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The vendor name of the dive computer on success, or NULL on failure.
|
||||||
|
*/
|
||||||
const char *
|
const char *
|
||||||
dc_descriptor_get_vendor (dc_descriptor_t *descriptor);
|
dc_descriptor_get_vendor (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the product name of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The product name of the dive computer on success, or NULL on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
const char *
|
const char *
|
||||||
dc_descriptor_get_product (dc_descriptor_t *descriptor);
|
dc_descriptor_get_product (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the family type of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The family type of the dive computer on success, or DC_FAMILY_NULL
|
||||||
|
* on failure.
|
||||||
|
*/
|
||||||
dc_family_t
|
dc_family_t
|
||||||
dc_descriptor_get_type (dc_descriptor_t *descriptor);
|
dc_descriptor_get_type (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the model number of the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns The model number of the dive computer on success, or zero on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
unsigned int
|
unsigned int
|
||||||
dc_descriptor_get_model (dc_descriptor_t *descriptor);
|
dc_descriptor_get_model (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all transports supported by the dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @returns A bitmask with all the transports supported by the dive computer on
|
||||||
|
* success, or DC_TRANSPORT_NONE on failure.
|
||||||
|
*/
|
||||||
unsigned int
|
unsigned int
|
||||||
dc_descriptor_get_transports (dc_descriptor_t *descriptor);
|
dc_descriptor_get_transports (dc_descriptor_t *descriptor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a low-level I/O device matches a supported dive computer.
|
||||||
|
*
|
||||||
|
* @param[in] descriptor A valid device descriptor.
|
||||||
|
* @param[in] transport The transport type of the I/O device.
|
||||||
|
* @param[in] userdata A pointer to a transport specific data structure:
|
||||||
|
* - DC_TRANSPORT_SERIAL: Name of the device node (string)
|
||||||
|
* - DC_TRANSPORT_USB: USB VID/PID (#dc_usb_desc_t)
|
||||||
|
* - DC_TRANSPORT_USBHID: USB VID/PID (#dc_usbhid_desc_t)
|
||||||
|
* - DC_TRANSPORT_IRDA: IrDA device name (string)
|
||||||
|
* - DC_TRANSPORT_BLUETOOTH: Bluetooth device name (string)
|
||||||
|
* - DC_TRANSPORT_BLE: Bluetooth device name (string)
|
||||||
|
* @returns Non-zero if the device matches a supported dive computer, or zero if
|
||||||
|
* there is no match.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|||||||
@ -86,6 +86,14 @@ typedef enum dc_usb_recipient_t {
|
|||||||
DC_USB_RECIPIENT_OTHER = 0x03,
|
DC_USB_RECIPIENT_OTHER = 0x03,
|
||||||
} dc_usb_recipient_t;
|
} 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.
|
* Opaque object representing a USB device.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -32,6 +32,14 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#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.
|
* Opaque object representing a USB HID device.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -16,7 +16,7 @@ endif
|
|||||||
|
|
||||||
libdivecomputer_la_SOURCES = \
|
libdivecomputer_la_SOURCES = \
|
||||||
version.c \
|
version.c \
|
||||||
descriptor-private.h descriptor.c \
|
descriptor.c \
|
||||||
iostream-private.h iostream.c \
|
iostream-private.h iostream.c \
|
||||||
iterator-private.h iterator.c \
|
iterator-private.h iterator.c \
|
||||||
common-private.h common.c \
|
common-private.h common.c \
|
||||||
|
|||||||
@ -51,7 +51,6 @@
|
|||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "descriptor-private.h"
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -455,7 +454,7 @@ dc_bluetooth_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s",
|
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s",
|
||||||
address, name ? name : "");
|
address, name ? name : "");
|
||||||
|
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_BLUETOOTH, name, NULL)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_BLUETOOTH, name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* libdivecomputer
|
|
||||||
*
|
|
||||||
* Copyright (C) 2017 Jef Driesen
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
* MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef DC_DESCRIPTOR_PRIVATE_H
|
|
||||||
#define DC_DESCRIPTOR_PRIVATE_H
|
|
||||||
|
|
||||||
#include <libdivecomputer/descriptor.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
typedef struct dc_usb_desc_t {
|
|
||||||
unsigned short vid;
|
|
||||||
unsigned short pid;
|
|
||||||
} dc_usb_desc_t;
|
|
||||||
|
|
||||||
typedef struct dc_usb_params_t {
|
|
||||||
unsigned int interface;
|
|
||||||
unsigned char endpoint_in;
|
|
||||||
unsigned char endpoint_out;
|
|
||||||
} dc_usb_params_t;
|
|
||||||
|
|
||||||
int
|
|
||||||
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata, void *params);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
#endif /* DC_DESCRIPTOR_PRIVATE_H */
|
|
||||||
121
src/descriptor.c
121
src/descriptor.c
@ -23,7 +23,10 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "descriptor-private.h"
|
#include <libdivecomputer/descriptor.h>
|
||||||
|
#include <libdivecomputer/usbhid.h>
|
||||||
|
#include <libdivecomputer/usb.h>
|
||||||
|
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
@ -36,36 +39,26 @@
|
|||||||
values, \
|
values, \
|
||||||
C_ARRAY_SIZE(values) - isnullterminated, \
|
C_ARRAY_SIZE(values) - isnullterminated, \
|
||||||
C_ARRAY_ITEMSIZE(values), \
|
C_ARRAY_ITEMSIZE(values), \
|
||||||
match, \
|
match)
|
||||||
NULL, NULL, 0)
|
|
||||||
|
|
||||||
#define DC_FILTER_INTERNAL_WITH_PARAMS(key, values, isnullterminated, match, params_dst, params_src) \
|
|
||||||
dc_filter_internal( \
|
|
||||||
key, \
|
|
||||||
values, \
|
|
||||||
C_ARRAY_SIZE(values) - isnullterminated, \
|
|
||||||
C_ARRAY_ITEMSIZE(values), \
|
|
||||||
match, \
|
|
||||||
params_dst, params_src, sizeof *(params_src))
|
|
||||||
|
|
||||||
typedef int (*dc_match_t)(const void *, const void *);
|
typedef int (*dc_match_t)(const void *, const void *);
|
||||||
|
|
||||||
typedef int (*dc_filter_t) (dc_transport_t transport, const void *userdata, void *params);
|
typedef int (*dc_filter_t) (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
|
|
||||||
static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_uwatec (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_suunto (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_suunto (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_shearwater (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_shearwater (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_hw (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_hw (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_tecdiving (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_mares (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_mares (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_divesystem (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_divesystem (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_oceanic (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_mclean (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_mclean (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_atomic (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_atomic (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_deepsix (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_deepsix (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_deepblu (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_deepblu (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_oceans (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_oceans (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
static int dc_filter_divesoft (dc_transport_t transport, const void *userdata, void *params);
|
static int dc_filter_divesoft (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
||||||
|
|
||||||
static dc_status_t dc_descriptor_iterator_next (dc_iterator_t *iterator, void *item);
|
static dc_status_t dc_descriptor_iterator_next (dc_iterator_t *iterator, void *item);
|
||||||
|
|
||||||
@ -506,6 +499,15 @@ dc_match_usb (const void *key, const void *value)
|
|||||||
return k->vid == v->vid && k->pid == v->pid;
|
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
|
static int
|
||||||
dc_match_number_with_prefix (const void *key, const void *value)
|
dc_match_number_with_prefix (const void *key, const void *value)
|
||||||
{
|
{
|
||||||
@ -546,16 +548,13 @@ dc_match_oceanic (const void *key, const void *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dc_filter_internal (const void *key, const void *values, size_t count, size_t size, dc_match_t match, void *params_dst, const void *params_src, size_t params_size)
|
dc_filter_internal (const void *key, const void *values, size_t count, size_t size, dc_match_t match)
|
||||||
{
|
{
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for (size_t i = 0; i < count; ++i) {
|
for (size_t i = 0; i < count; ++i) {
|
||||||
if (match (key, (const unsigned char *) values + i * size)) {
|
if (match (key, (const unsigned char *) values + i * size)) {
|
||||||
if (params_src && params_dst) {
|
|
||||||
memcpy (params_dst, params_src, params_size);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -570,7 +569,8 @@ static const char * const rfcomm[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_uwatec (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const irda[] = {
|
static const char * const irda[] = {
|
||||||
"Aladin Smart Com",
|
"Aladin Smart Com",
|
||||||
@ -581,7 +581,7 @@ static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, voi
|
|||||||
"UWATEC Galileo",
|
"UWATEC Galileo",
|
||||||
"UWATEC Galileo Sol",
|
"UWATEC Galileo Sol",
|
||||||
};
|
};
|
||||||
static const dc_usb_desc_t usbhid[] = {
|
static const dc_usbhid_desc_t usbhid[] = {
|
||||||
{0x2e6c, 0x3201}, // G2, G2 TEK
|
{0x2e6c, 0x3201}, // G2, G2 TEK
|
||||||
{0x2e6c, 0x3211}, // G2 Console
|
{0x2e6c, 0x3211}, // G2 Console
|
||||||
{0x2e6c, 0x4201}, // G2 HUD
|
{0x2e6c, 0x4201}, // G2 HUD
|
||||||
@ -599,7 +599,7 @@ static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, voi
|
|||||||
if (transport == DC_TRANSPORT_IRDA) {
|
if (transport == DC_TRANSPORT_IRDA) {
|
||||||
return DC_FILTER_INTERNAL (userdata, irda, 0, dc_match_name);
|
return DC_FILTER_INTERNAL (userdata, irda, 0, dc_match_name);
|
||||||
} else if (transport == DC_TRANSPORT_USBHID) {
|
} 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) {
|
} else if (transport == DC_TRANSPORT_BLE) {
|
||||||
return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_name);
|
return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_name);
|
||||||
}
|
}
|
||||||
@ -607,9 +607,10 @@ static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, voi
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_suunto (dc_transport_t transport, const void *userdata, void *params)
|
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, 0x0030}, // Eon Steel
|
||||||
{0x1493, 0x0033}, // Eon Core
|
{0x1493, 0x0033}, // Eon Core
|
||||||
{0x1493, 0x0035}, // D5
|
{0x1493, 0x0035}, // D5
|
||||||
@ -623,7 +624,7 @@ static int dc_filter_suunto (dc_transport_t transport, const void *userdata, voi
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (transport == DC_TRANSPORT_USBHID) {
|
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) {
|
} else if (transport == DC_TRANSPORT_BLE) {
|
||||||
return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_prefix);
|
return DC_FILTER_INTERNAL (userdata, bluetooth, 0, dc_match_prefix);
|
||||||
}
|
}
|
||||||
@ -631,7 +632,8 @@ static int dc_filter_suunto (dc_transport_t transport, const void *userdata, voi
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_hw (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_hw (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"OSTC",
|
"OSTC",
|
||||||
@ -647,7 +649,8 @@ static int dc_filter_hw (dc_transport_t transport, const void *userdata, void *p
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_shearwater (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_shearwater (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"Predator",
|
"Predator",
|
||||||
@ -670,7 +673,8 @@ static int dc_filter_shearwater (dc_transport_t transport, const void *userdata,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_tecdiving (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"DiveComputer",
|
"DiveComputer",
|
||||||
@ -685,7 +689,8 @@ static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_mares (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_mares (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"Mares bluelink pro",
|
"Mares bluelink pro",
|
||||||
@ -699,7 +704,8 @@ static int dc_filter_mares (dc_transport_t transport, const void *userdata, void
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_divesystem (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_divesystem (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"DS",
|
"DS",
|
||||||
@ -714,7 +720,8 @@ static int dc_filter_divesystem (dc_transport_t transport, const void *userdata,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_oceanic (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const unsigned int model[] = {
|
static const unsigned int model[] = {
|
||||||
0x4552, // Oceanic Pro Plus X
|
0x4552, // Oceanic Pro Plus X
|
||||||
@ -741,7 +748,8 @@ static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, vo
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_mclean(dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_mclean(dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"McLean Extreme",
|
"McLean Extreme",
|
||||||
@ -756,24 +764,22 @@ static int dc_filter_mclean(dc_transport_t transport, const void *userdata, void
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_atomic (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_atomic (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const dc_usb_desc_t usb[] = {
|
static const dc_usb_desc_t usb[] = {
|
||||||
{0x0471, 0x0888}, // Atomic Aquatics Cobalt
|
{0x0471, 0x0888}, // Atomic Aquatics Cobalt
|
||||||
};
|
};
|
||||||
|
|
||||||
static const dc_usb_params_t usb_params = {
|
|
||||||
0, 0x82, 0x02
|
|
||||||
};
|
|
||||||
|
|
||||||
if (transport == DC_TRANSPORT_USB) {
|
if (transport == DC_TRANSPORT_USB) {
|
||||||
return DC_FILTER_INTERNAL_WITH_PARAMS (userdata, usb, 0, dc_match_usb, params, &usb_params);
|
return DC_FILTER_INTERNAL (userdata, usb, 0, dc_match_usb);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_deepsix (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_deepsix (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"EXCURSION",
|
"EXCURSION",
|
||||||
@ -789,7 +795,8 @@ static int dc_filter_deepsix (dc_transport_t transport, const void *userdata, vo
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_deepblu (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_deepblu (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"COSMIQ",
|
"COSMIQ",
|
||||||
@ -802,7 +809,8 @@ static int dc_filter_deepblu (dc_transport_t transport, const void *userdata, vo
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_oceans (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_oceans (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"S1",
|
"S1",
|
||||||
@ -815,7 +823,8 @@ static int dc_filter_oceans (dc_transport_t transport, const void *userdata, voi
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_divesoft (dc_transport_t transport, const void *userdata, void *params)
|
static int
|
||||||
|
dc_filter_divesoft (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"Freedom",
|
"Freedom",
|
||||||
@ -921,10 +930,10 @@ dc_descriptor_get_transports (dc_descriptor_t *descriptor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata, void *params)
|
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
||||||
{
|
{
|
||||||
if (descriptor == NULL || descriptor->filter == NULL || userdata == NULL)
|
if (descriptor == NULL || descriptor->filter == NULL || userdata == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return descriptor->filter (transport, userdata, params);
|
return descriptor->filter (descriptor, transport, userdata);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,7 +47,6 @@
|
|||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "descriptor-private.h"
|
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
@ -226,7 +225,7 @@ dc_irda_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descriptor_
|
|||||||
INFO (context, "Discover: address=%08x, name=%s, charset=%02x, hints=%04x",
|
INFO (context, "Discover: address=%08x, name=%s, charset=%02x, hints=%04x",
|
||||||
address, name, charset, hints);
|
address, name, charset, hints);
|
||||||
|
|
||||||
if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name, NULL)) {
|
if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -34,6 +34,7 @@ dc_descriptor_get_product
|
|||||||
dc_descriptor_get_type
|
dc_descriptor_get_type
|
||||||
dc_descriptor_get_model
|
dc_descriptor_get_model
|
||||||
dc_descriptor_get_transports
|
dc_descriptor_get_transports
|
||||||
|
dc_descriptor_filter
|
||||||
|
|
||||||
dc_iostream_get_transport
|
dc_iostream_get_transport
|
||||||
dc_iostream_set_timeout
|
dc_iostream_set_timeout
|
||||||
|
|||||||
@ -57,7 +57,6 @@
|
|||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "descriptor-private.h"
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
@ -230,7 +229,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
return DC_STATUS_NOMEMORY;
|
return DC_STATUS_NOMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, filename, NULL)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, filename)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -31,7 +31,6 @@
|
|||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "descriptor-private.h"
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
static dc_status_t dc_serial_iterator_next (dc_iterator_t *iterator, void *item);
|
static dc_status_t dc_serial_iterator_next (dc_iterator_t *iterator, void *item);
|
||||||
@ -228,7 +227,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
// Null terminate the string.
|
// Null terminate the string.
|
||||||
data[data_len] = 0;
|
data[data_len] = 0;
|
||||||
|
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, data, NULL)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, data)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
46
src/usb.c
46
src/usb.c
@ -39,12 +39,23 @@
|
|||||||
#include "common-private.h"
|
#include "common-private.h"
|
||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
#include "descriptor-private.h"
|
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
#include "array.h"
|
||||||
|
|
||||||
#define ISINSTANCE(device) dc_iostream_isinstance((device), &dc_usb_vtable)
|
#define ISINSTANCE(device) dc_iostream_isinstance((device), &dc_usb_vtable)
|
||||||
|
|
||||||
|
typedef struct dc_usb_params_t {
|
||||||
|
unsigned int interface;
|
||||||
|
unsigned char endpoint_in;
|
||||||
|
unsigned char endpoint_out;
|
||||||
|
} dc_usb_params_t;
|
||||||
|
|
||||||
|
typedef struct dc_usb_config_t {
|
||||||
|
dc_usb_desc_t desc;
|
||||||
|
dc_usb_params_t params;
|
||||||
|
} dc_usb_config_t;
|
||||||
|
|
||||||
typedef struct dc_usb_session_t {
|
typedef struct dc_usb_session_t {
|
||||||
size_t refcount;
|
size_t refcount;
|
||||||
#ifdef HAVE_LIBUSB
|
#ifdef HAVE_LIBUSB
|
||||||
@ -120,6 +131,26 @@ static const dc_iostream_vtable_t dc_usb_vtable = {
|
|||||||
dc_usb_close, /* close */
|
dc_usb_close, /* close */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const dc_usb_config_t g_usb_config[] = {
|
||||||
|
// Atomic Aquatics Cobalt
|
||||||
|
{{0x0471, 0x0888}, {0, 0x82, 0x02}},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const dc_usb_params_t *
|
||||||
|
dc_usb_params_find (const dc_usb_desc_t *desc)
|
||||||
|
{
|
||||||
|
if (desc == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < C_ARRAY_SIZE(g_usb_config); ++i) {
|
||||||
|
if (g_usb_config[i].desc.vid == desc->vid &&
|
||||||
|
g_usb_config[i].desc.pid == desc->pid)
|
||||||
|
return &g_usb_config[i].params;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
syserror(int errcode)
|
syserror(int errcode)
|
||||||
{
|
{
|
||||||
@ -305,11 +336,13 @@ dc_usb_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dc_usb_desc_t usb = {dev.idVendor, dev.idProduct};
|
dc_usb_desc_t usb = {dev.idVendor, dev.idProduct};
|
||||||
dc_usb_params_t params = {0, 0, 0};
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USB, &usb)) {
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USB, &usb, ¶ms)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for known USB parameters.
|
||||||
|
const dc_usb_params_t *params = dc_usb_params_find (&usb);
|
||||||
|
|
||||||
// Get the active configuration descriptor.
|
// Get the active configuration descriptor.
|
||||||
struct libusb_config_descriptor *config = NULL;
|
struct libusb_config_descriptor *config = NULL;
|
||||||
rc = libusb_get_active_config_descriptor (current, &config);
|
rc = libusb_get_active_config_descriptor (current, &config);
|
||||||
@ -325,7 +358,8 @@ dc_usb_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
const struct libusb_interface *iface = &config->interface[i];
|
const struct libusb_interface *iface = &config->interface[i];
|
||||||
for (int j = 0; j < iface->num_altsetting; j++) {
|
for (int j = 0; j < iface->num_altsetting; j++) {
|
||||||
const struct libusb_interface_descriptor *desc = &iface->altsetting[j];
|
const struct libusb_interface_descriptor *desc = &iface->altsetting[j];
|
||||||
if (interface == NULL && desc->bInterfaceNumber == params.interface) {
|
if (interface == NULL &&
|
||||||
|
(params == NULL || params->interface == desc->bInterfaceNumber)) {
|
||||||
interface = desc;
|
interface = desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -349,12 +383,12 @@ dc_usb_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ep_in == NULL && direction == LIBUSB_ENDPOINT_IN &&
|
if (ep_in == NULL && direction == LIBUSB_ENDPOINT_IN &&
|
||||||
(params.endpoint_in == 0 || params.endpoint_in == desc->bEndpointAddress)) {
|
(params == NULL || params->endpoint_in == desc->bEndpointAddress)) {
|
||||||
ep_in = desc;
|
ep_in = desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ep_out == NULL && direction == LIBUSB_ENDPOINT_OUT &&
|
if (ep_out == NULL && direction == LIBUSB_ENDPOINT_OUT &&
|
||||||
(params.endpoint_out == 0 || params.endpoint_out == desc->bEndpointAddress)) {
|
(params == NULL || params->endpoint_out == desc->bEndpointAddress)) {
|
||||||
ep_out = desc;
|
ep_out = desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,7 +57,6 @@
|
|||||||
#include "common-private.h"
|
#include "common-private.h"
|
||||||
#include "context-private.h"
|
#include "context-private.h"
|
||||||
#include "iostream-private.h"
|
#include "iostream-private.h"
|
||||||
#include "descriptor-private.h"
|
|
||||||
#include "iterator-private.h"
|
#include "iterator-private.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
@ -438,8 +437,8 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
return syserror (rc);
|
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, NULL)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -522,8 +521,8 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
struct hid_device_info *current = iterator->current;
|
struct hid_device_info *current = iterator->current;
|
||||||
iterator->current = current->next;
|
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, NULL)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user