uni-t-dmm: Fix scanning, properly use new sr_usb_find().

This commit is contained in:
Uwe Hermann 2013-01-20 19:55:33 +01:00
parent 4ebd48b352
commit 388f9d3e25
1 changed files with 34 additions and 14 deletions

View File

@ -24,6 +24,8 @@
#include "libsigrok-internal.h" #include "libsigrok-internal.h"
#include "protocol.h" #include "protocol.h"
#define UNI_T_UT_D04_NEW "1a86.e008"
static const int hwcaps[] = { static const int hwcaps[] = {
SR_HWCAP_MULTIMETER, SR_HWCAP_MULTIMETER,
SR_HWCAP_LIMIT_SAMPLES, SR_HWCAP_LIMIT_SAMPLES,
@ -81,33 +83,49 @@ static int hw_init_vc820(struct sr_context *sr_ctx)
static GSList *hw_scan(GSList *options) static GSList *hw_scan(GSList *options)
{ {
GSList *devices, *l; GSList *usb_devices, *devices, *l;
struct sr_dev_inst *sdi; struct sr_dev_inst *sdi;
struct dev_context *devc; struct dev_context *devc;
struct drv_context *drvc; struct drv_context *drvc;
struct sr_usb_dev_inst *usb;
struct sr_hwopt *opt;
struct sr_probe *probe; struct sr_probe *probe;
struct libusb_device *ldev; const char *conn;
int i, devcnt;
(void)options; (void)options;
drvc = di->priv; drvc = di->priv;
/* USB scan is always authoritative. */
clear_instances();
conn = NULL;
for (l = options; l; l = l->next) {
opt = l->data;
switch (opt->hwopt) {
case SR_HWOPT_CONN:
conn = opt->value;
break;
}
}
if (!conn)
conn = UNI_T_UT_D04_NEW;
devices = NULL; devices = NULL;
if (!(usb_devices = sr_usb_find(drvc->sr_ctx->libusb_ctx, conn))) {
if (!(l = sr_usb_find(drvc->sr_ctx->libusb_ctx, "1a86.e008"))) g_slist_free_full(usb_devices, g_free);
return NULL; return NULL;
}
for (i = 0; i < (int)g_slist_length(l); i++) { for (l = usb_devices; l; l = l->next) {
ldev = (struct libusb_device *)l->data; usb = l->data;
if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) { if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) {
sr_err("Device context malloc failed."); sr_err("Device context malloc failed.");
return NULL; return NULL;
} }
devcnt = g_slist_length(drvc->instances); if (!(sdi = sr_dev_inst_new(0, SR_ST_INACTIVE,
if (!(sdi = sr_dev_inst_new(devcnt, SR_ST_INACTIVE,
di->longname, NULL, NULL))) { di->longname, NULL, NULL))) {
sr_err("sr_dev_inst_new returned NULL."); sr_err("sr_dev_inst_new returned NULL.");
return NULL; return NULL;
@ -117,10 +135,10 @@ static GSList *hw_scan(GSList *options)
if (!(probe = sr_probe_new(0, SR_PROBE_ANALOG, TRUE, "P1"))) if (!(probe = sr_probe_new(0, SR_PROBE_ANALOG, TRUE, "P1")))
return NULL; return NULL;
sdi->probes = g_slist_append(sdi->probes, probe); sdi->probes = g_slist_append(sdi->probes, probe);
devc->usb = sr_usb_dev_inst_new(
libusb_get_bus_number(ldev), devc->usb = usb;
libusb_get_device_address(ldev), NULL);
drvc->instances = g_slist_append(drvc->instances, l->data); drvc->instances = g_slist_append(drvc->instances, sdi);
devices = g_slist_append(devices, sdi); devices = g_slist_append(devices, sdi);
} }
@ -138,11 +156,13 @@ static GSList *hw_dev_list(void)
static int hw_dev_open(struct sr_dev_inst *sdi) static int hw_dev_open(struct sr_dev_inst *sdi)
{ {
struct drv_context *drvc;
struct dev_context *devc; struct dev_context *devc;
drvc = di->priv;
devc = sdi->priv; devc = sdi->priv;
return sr_usb_open(NULL, devc->usb); return sr_usb_open(drvc->sr_ctx->libusb_ctx, devc->usb);
} }
static int hw_dev_close(struct sr_dev_inst *sdi) static int hw_dev_close(struct sr_dev_inst *sdi)