X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=devselect.c;h=e1bb630f5ecbdc059fa4e41d665de30124086626;hb=ddb1e153f7428431a55c426e8a6549ee4a29e7ba;hp=450a172a51b937f7a9ed097ab14927d92cfd7fc7;hpb=1fdc17b46fb9a9387a9ddec2cc093039ac7dfd90;p=sigrok-gtk.git diff --git a/devselect.c b/devselect.c index 450a172..e1bb630 100644 --- a/devselect.c +++ b/devselect.c @@ -17,34 +17,45 @@ * along with this program. If not, see . */ -#include +#include #include #include "sigrok-gtk.h" static void dev_selected(GtkComboBox *devbox, GObject *parent) { GtkTreeModel *devlist = gtk_combo_box_get_model(devbox); + GtkEntry *timesamples = g_object_get_data(parent, "timesamples"); + GtkComboBox *timeunit = g_object_get_data(parent, "timeunit"); GtkTreeIter iter; const gchar *name; GtkCheckMenuItem *menuitem; - struct sr_dev *dev; + struct sr_dev_inst *sdi; if (!gtk_combo_box_get_active_iter(devbox, &iter)) { - g_object_set_data(parent, "dev", NULL); + g_object_set_data(parent, "sdi", NULL); return; } - gtk_tree_model_get(devlist, &iter, 0, &name, 1, &dev, + gtk_tree_model_get(devlist, &iter, 0, &name, 1, &sdi, 2, &menuitem, -1); gtk_check_menu_item_set_active(menuitem, TRUE); sr_session_dev_remove_all(); - if (sr_session_dev_add(dev) != SR_OK) { + if (sr_session_dev_add(sdi) != SR_OK) { g_critical("Failed to use device."); sr_session_destroy(); - dev = NULL; + sdi = NULL; } - g_object_set_data(parent, "dev", dev); + g_object_set_data(parent, "sdi", sdi); + + /* + * Grey out the time unless the device is valid, + * and it supports sample limiting + */ + const gboolean limit_samples = sdi && + sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_LIMIT_SAMPLES); + gtk_widget_set_sensitive((GtkWidget*)timesamples, limit_samples); + gtk_widget_set_sensitive((GtkWidget*)timeunit, limit_samples); } static void dev_menuitem_toggled(GtkMenuItem *item, GtkComboBox *combo) @@ -65,24 +76,22 @@ static void dev_menuitem_toggled(GtkMenuItem *item, GtkComboBox *combo) } while (gtk_tree_model_iter_next(model, &iter)); } -#define GET_DEV_INST(dev) \ - (dev)->driver->dev_info_get((dev)->driver_index, SR_DI_INST); - void dev_select_rescan(GtkAction *action, GtkWindow *parent) { GtkComboBox *devbox = g_object_get_data(G_OBJECT(parent), "devcombo"); g_return_if_fail(devbox != NULL); GtkListStore *devlist = GTK_LIST_STORE(gtk_combo_box_get_model(devbox)); GtkTreeIter iter; - struct sr_dev *dev; - struct sr_dev_inst *sdi; + const struct sr_dev_inst *sdi; gchar *sdevname = NULL; - GSList *devs, *l; GtkUIManager *ui = g_object_get_data(G_OBJECT(parent), "ui_manager"); GtkWidget *menuitem = gtk_ui_manager_get_widget(ui, "/menubar/DevMenu/DevSelectMenu"); GtkMenuShell *devmenu = GTK_MENU_SHELL(gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem))); GSList *radiolist = NULL; + struct sr_dev_driver **drivers; + GSList *l, *tmpdevs, *devices; + int num_devs, i; (void)action; @@ -90,9 +99,9 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent) * We wish to select the same device after the refresh if possible. */ if (gtk_combo_box_get_active_iter(devbox, &iter)) { - gtk_tree_model_get(GTK_TREE_MODEL(devlist), &iter, 1, &dev, -1); - /* FIXME: Use something other than dev->driver->name */ - sdevname = g_strdup(dev->driver->name); + gtk_tree_model_get(GTK_TREE_MODEL(devlist), &iter, 1, &sdi, -1); + /* FIXME: Use something other than sdi->driver->name */ + sdevname = g_strdup(sdi->driver->name); } /* Destroy the old menu items */ @@ -105,13 +114,28 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent) gtk_list_store_clear(devlist); /* Scan for new devices and update our list */ - /* TODO: Fix this in libsigrok first. */ - /*sr_dev_scan();*/ - devs = sr_dev_list(); - for (l = devs; l; l = l->next) { - dev = l->data; - sdi = GET_DEV_INST(dev); - gchar *name = sdi->model ? sdi->model : sdi->vendor; +#if 0 + if (devices) { + /* TODO: tell drivers to clean up all instances */ + g_free(devices); + } +#endif + devices = NULL; + + /* Scan all drivers for all devices. */ + drivers = sr_driver_list(); + for (i = 0; drivers[i]; i++) { + tmpdevs = sr_driver_scan(drivers[i], NULL); + for (l = tmpdevs; l; l = l->next) + devices = g_slist_append(devices, l->data); + g_slist_free(tmpdevs); + } + num_devs = g_slist_length(devices); + + for (i = 0; i < num_devs; ++i) { + sdi = (struct sr_dev_inst *)g_slist_nth_data(devices, i); + + gchar *name = sdi->driver->name; if (!name) name = "(unknown)"; @@ -127,11 +151,11 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent) gtk_list_store_append(devlist, &iter); gtk_list_store_set(devlist, &iter, 0, name, - 1, dev, + 1, sdi, 2, menuitem, -1); - if (sdevname && g_str_equal(sdevname, dev->driver->name)) + if (sdevname && g_str_equal(sdevname, sdi->driver->name)) gtk_combo_box_set_active_iter(devbox, &iter); } if (sdevname)