X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=device.c;fp=device.c;h=2dc830817df44c4eab739421a275b269e4a73a1b;hp=0000000000000000000000000000000000000000;hb=2be182e6437fb082aedca653fdc106d702518db0;hpb=b4584f8dc3b0e7209b7ff819de2991cb09f5a4af diff --git a/device.c b/device.c new file mode 100644 index 0000000..2dc8308 --- /dev/null +++ b/device.c @@ -0,0 +1,147 @@ +/* + * This file is part of the sigrok-cli project. + * + * Copyright (C) 2013 Bert Vermeulen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" +#include +#include +#include "sigrok-cli.h" + +extern struct sr_context *sr_ctx; +extern gchar *opt_drv; +extern gchar *opt_probe_group; + +/* Convert driver options hash to GSList of struct sr_config. */ +static GSList *hash_to_hwopt(GHashTable *hash) +{ + const struct sr_config_info *srci; + struct sr_config *src; + GList *gl, *keys; + GSList *opts; + char *key, *value; + + keys = g_hash_table_get_keys(hash); + opts = NULL; + for (gl = keys; gl; gl = gl->next) { + key = gl->data; + if (!(srci = sr_config_info_name_get(key))) { + g_critical("Unknown option %s", key); + return NULL; + } + src = g_try_malloc(sizeof(struct sr_config)); + src->key = srci->key; + value = g_hash_table_lookup(hash, key); + src->data = g_variant_new_string(value); + opts = g_slist_append(opts, src); + } + g_list_free(keys); + + return opts; +} + +static void free_drvopts(struct sr_config *src) +{ + g_variant_unref(src->data); + g_free(src); +} + +GSList *device_scan(void) +{ + struct sr_dev_driver **drivers, *driver; + GHashTable *drvargs; + GSList *drvopts, *devices, *tmpdevs, *l; + int i; + char *drvname; + + if (opt_drv) { + drvargs = parse_generic_arg(opt_drv, TRUE); + drvname = g_strdup(g_hash_table_lookup(drvargs, "sigrok_key")); + g_hash_table_remove(drvargs, "sigrok_key"); + driver = NULL; + drivers = sr_driver_list(); + for (i = 0; drivers[i]; i++) { + if (strcmp(drivers[i]->name, drvname)) + continue; + driver = drivers[i]; + } + if (!driver) { + g_critical("Driver %s not found.", drvname); + g_hash_table_destroy(drvargs); + g_free(drvname); + return NULL; + } + g_free(drvname); + if (sr_driver_init(sr_ctx, driver) != SR_OK) { + g_critical("Failed to initialize driver."); + g_hash_table_destroy(drvargs); + return NULL; + } + drvopts = NULL; + if (g_hash_table_size(drvargs) > 0) { + if (!(drvopts = hash_to_hwopt(drvargs))) { + /* Unknown options, already logged. */ + g_hash_table_destroy(drvargs); + return NULL; + } + } + g_hash_table_destroy(drvargs); + devices = sr_driver_scan(driver, drvopts); + g_slist_free_full(drvopts, (GDestroyNotify)free_drvopts); + } else { + /* No driver specified, let them all scan on their own. */ + devices = NULL; + drivers = sr_driver_list(); + for (i = 0; drivers[i]; i++) { + driver = drivers[i]; + if (sr_driver_init(sr_ctx, driver) != SR_OK) { + g_critical("Failed to initialize driver."); + return NULL; + } + tmpdevs = sr_driver_scan(driver, NULL); + for (l = tmpdevs; l; l = l->next) + devices = g_slist_append(devices, l->data); + g_slist_free(tmpdevs); + } + } + + return devices; +} + +struct sr_probe_group *select_probe_group(struct sr_dev_inst *sdi) +{ + struct sr_probe_group *pg; + GSList *l; + + if (!opt_probe_group) + return NULL; + + if (!sdi->probe_groups) { + g_critical("This device does not have any probe groups."); + return NULL; + } + + for (l = sdi->probe_groups; l; l = l->next) { + pg = l->data; + if (!strcasecmp(opt_probe_group, pg->name)) { + return pg; + } + } + + return NULL; +} +