From: Uwe Hermann Date: Tue, 30 Oct 2012 13:23:05 +0000 (+0100) Subject: uni-t-dmm: Simplify subdriver setup. X-Git-Tag: dsupstream~614 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=6ac5f8922e63d1f584a69969190af0389a88d812 uni-t-dmm: Simplify subdriver setup. So far, it seems we can make this work with just hw_init() needing to be subdriver-specific (it will point 'di' to the respective per-subdriver entry), the rest of the API functions can then use a strcmp() on di->name to learn which subdriver they belong to. --- diff --git a/hardware/uni-t-dmm/api.c b/hardware/uni-t-dmm/api.c index 25d3d02f..aa01656b 100644 --- a/hardware/uni-t-dmm/api.c +++ b/hardware/uni-t-dmm/api.c @@ -24,12 +24,6 @@ #include "libsigrok-internal.h" #include "protocol.h" -/* Note: The order here must match the DMM/device enum in protocol.h. */ -static const char *dev_names[] = { - "UNI-T UT61D", - "Voltcraft VC-820", -}; - static const int hwcaps[] = { SR_HWCAP_MULTIMETER, SR_HWCAP_LIMIT_SAMPLES, @@ -44,11 +38,14 @@ static const char *probe_names[] = { }; SR_PRIV struct sr_dev_driver uni_t_ut61d_driver_info; -static struct sr_dev_driver *di_ut61d = &uni_t_ut61d_driver_info; - SR_PRIV struct sr_dev_driver voltcraft_vc820_driver_info; + +static struct sr_dev_driver *di_ut61d = &uni_t_ut61d_driver_info; static struct sr_dev_driver *di_vc820 = &voltcraft_vc820_driver_info; +/* After hw_init() this will point to a device-specific entry (see above). */ +static struct sr_dev_driver *di = NULL; + static int open_usb(struct sr_dev_inst *sdi) { libusb_device **devlist; @@ -91,7 +88,7 @@ static int open_usb(struct sr_dev_inst *sdi) return ret; } -static GSList *connect_usb(const char *conn, int dmm) +static GSList *connect_usb(const char *conn) { struct sr_dev_inst *sdi; struct drv_context *drvc; @@ -106,10 +103,7 @@ static GSList *connect_usb(const char *conn, int dmm) /* TODO: Use common code later, refactor. */ - if (dmm == UNI_T_UT61D) - drvc = di_ut61d->priv; - else if (dmm == VOLTCRAFT_VC820) - drvc = di_vc820->priv; + drvc = di->priv; /* Hardcoded for now. */ vid = UT_D04_CABLE_USB_VID; @@ -133,7 +127,7 @@ static GSList *connect_usb(const char *conn, int dmm) devcnt = g_slist_length(drvc->instances); if (!(sdi = sr_dev_inst_new(devcnt, SR_ST_INACTIVE, - dev_names[dmm], NULL, NULL))) { + di->longname, NULL, NULL))) { sr_err("sr_dev_inst_new returned NULL."); return NULL; } @@ -175,9 +169,12 @@ static int hw_init(int dmm) } if (dmm == UNI_T_UT61D) - di_ut61d->priv = drvc; + di = di_ut61d; else if (dmm == VOLTCRAFT_VC820) - di_vc820->priv = drvc; + di = di_vc820; + sr_dbg("Selected '%s' driver.", di->name); + + di->priv = drvc; return SR_OK; } @@ -192,7 +189,7 @@ static int hw_init_vc820(void) return hw_init(VOLTCRAFT_VC820); } -static GSList *hw_scan(GSList *options, int dmm) +static GSList *hw_scan(GSList *options) { GSList *l, *devices; struct sr_dev_inst *sdi; @@ -200,60 +197,29 @@ static GSList *hw_scan(GSList *options, int dmm) (void)options; - if (dmm == UNI_T_UT61D) - drvc = di_ut61d->priv; - else if (dmm == VOLTCRAFT_VC820) - drvc = di_vc820->priv; + drvc = di->priv; - if (!(devices = connect_usb(NULL, dmm))) + if (!(devices = connect_usb(NULL))) return NULL; for (l = devices; l; l = l->next) { sdi = l->data; - - if (dmm == UNI_T_UT61D) - sdi->driver = di_ut61d; - else if (dmm == VOLTCRAFT_VC820) - sdi->driver = di_vc820; - + sdi->driver = di; drvc->instances = g_slist_append(drvc->instances, l->data); } return devices; } -static GSList *hw_scan_ut61d(GSList *options) -{ - return hw_scan(options, UNI_T_UT61D); -} - -static GSList *hw_scan_vc820(GSList *options) -{ - return hw_scan(options, VOLTCRAFT_VC820); -} - -static GSList *hw_dev_list(int dmm) +static GSList *hw_dev_list(void) { struct drv_context *drvc; - if (dmm == UNI_T_UT61D) - drvc = di_ut61d->priv; - else if (dmm == VOLTCRAFT_VC820) - drvc = di_vc820->priv; + drvc = di->priv; return drvc->instances; } -static GSList *hw_dev_list_ut61d(void) -{ - return hw_dev_list(UNI_T_UT61D); -} - -static GSList *hw_dev_list_vc820(void) -{ - return hw_dev_list(VOLTCRAFT_VC820); -} - static int hw_dev_open(struct sr_dev_inst *sdi) { return open_usb(sdi); @@ -355,7 +321,7 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap, } static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, - int dmm, void *cb_data) + void *cb_data) { struct sr_datafeed_packet packet; struct sr_datafeed_header header; @@ -383,10 +349,10 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, meta.num_probes = 1; sr_session_send(devc->cb_data, &packet); - if (dmm == UNI_T_UT61D) { + if (!strcmp(di->name, "uni-t-ut61d")) { sr_source_add(0, 0, 10 /* poll_timeout */, uni_t_ut61d_receive_data, (void *)sdi); - } else if (dmm == VOLTCRAFT_VC820) { + } else if (!strcmp(di->name, "voltcraft-vc820")) { sr_source_add(0, 0, 10 /* poll_timeout */, voltcraft_vc820_receive_data, (void *)sdi); } @@ -394,18 +360,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, return SR_OK; } -static int hw_dev_acquisition_start_ut61d(const struct sr_dev_inst *sdi, - void *cb_data) -{ - return hw_dev_acquisition_start(sdi, UNI_T_UT61D, cb_data); -} - -static int hw_dev_acquisition_start_vc820(const struct sr_dev_inst *sdi, - void *cb_data) -{ - return hw_dev_acquisition_start(sdi, VOLTCRAFT_VC820, cb_data); -} - static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, void *cb_data) { @@ -432,14 +386,14 @@ SR_PRIV struct sr_dev_driver uni_t_ut61d_driver_info = { .api_version = 1, .init = hw_init_ut61d, .cleanup = hw_cleanup, - .scan = hw_scan_ut61d, - .dev_list = hw_dev_list_ut61d, + .scan = hw_scan, + .dev_list = hw_dev_list, .dev_clear = clear_instances, .dev_open = hw_dev_open, .dev_close = hw_dev_close, .info_get = hw_info_get, .dev_config_set = hw_dev_config_set, - .dev_acquisition_start = hw_dev_acquisition_start_ut61d, + .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop, .priv = NULL, }; @@ -450,14 +404,14 @@ SR_PRIV struct sr_dev_driver voltcraft_vc820_driver_info = { .api_version = 1, .init = hw_init_vc820, .cleanup = hw_cleanup, - .scan = hw_scan_vc820, - .dev_list = hw_dev_list_vc820, + .scan = hw_scan, + .dev_list = hw_dev_list, .dev_clear = clear_instances, .dev_open = hw_dev_open, .dev_close = hw_dev_close, .info_get = hw_info_get, .dev_config_set = hw_dev_config_set, - .dev_acquisition_start = hw_dev_acquisition_start_vc820, + .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop, .priv = NULL, }; diff --git a/hardware/uni-t-dmm/protocol.h b/hardware/uni-t-dmm/protocol.h index 9d688e55..f3f0d333 100644 --- a/hardware/uni-t-dmm/protocol.h +++ b/hardware/uni-t-dmm/protocol.h @@ -36,7 +36,6 @@ #define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args) #define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args) -/* Note: The order here must match dev_names[] in api.c. */ enum { UNI_T_UT61D, VOLTCRAFT_VC820,