X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=devselect.c;h=e1bb630f5ecbdc059fa4e41d665de30124086626;hb=ddb1e153f7428431a55c426e8a6549ee4a29e7ba;hp=3a6771c41abdeb577217542bd994b556916efcc6;hpb=91a22b68c7e8334de0e3d248a327c5a020f53e3c;p=sigrok-gtk.git diff --git a/devselect.c b/devselect.c index 3a6771c..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 *dev, GObject *parent) +static void dev_selected(GtkComboBox *devbox, GObject *parent) { - GtkTreeModel *devlist = gtk_combo_box_get_model(dev); + 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_device *device; + struct sr_dev_inst *sdi; - if (!gtk_combo_box_get_active_iter(dev, &iter)) { - g_object_set_data(parent, "device", NULL); + if (!gtk_combo_box_get_active_iter(devbox, &iter)) { + g_object_set_data(parent, "sdi", NULL); return; } - gtk_tree_model_get(devlist, &iter, 0, &name, 1, &device, + gtk_tree_model_get(devlist, &iter, 0, &name, 1, &sdi, 2, &menuitem, -1); gtk_check_menu_item_set_active(menuitem, TRUE); - sr_session_device_clear(); - if (sr_session_device_add(device) != SR_OK) { + sr_session_dev_remove_all(); + if (sr_session_dev_add(sdi) != SR_OK) { g_critical("Failed to use device."); sr_session_destroy(); - device = NULL; + sdi = NULL; } - g_object_set_data(parent, "device", device); + 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,35 +76,32 @@ static void dev_menuitem_toggled(GtkMenuItem *item, GtkComboBox *combo) } while (gtk_tree_model_iter_next(model, &iter)); } -#define GET_DEVICE_INSTANCE(device) \ - (device)->plugin->get_device_info((device)->plugin_index, \ - SR_DI_INSTANCE); - void dev_select_rescan(GtkAction *action, GtkWindow *parent) { - GtkComboBox *dev = g_object_get_data(G_OBJECT(parent), "devcombo"); - g_return_if_fail(dev != NULL); - GtkListStore *devlist = GTK_LIST_STORE(gtk_combo_box_get_model(dev)); + 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_device *device; - struct sr_device_instance *sdi; + const struct sr_dev_inst *sdi; gchar *sdevname = NULL; - GSList *devices, *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; /* Make a copy of the selected device's short name for comparison. * We wish to select the same device after the refresh if possible. */ - if (gtk_combo_box_get_active_iter(dev, &iter)) { - gtk_tree_model_get(GTK_TREE_MODEL(devlist), &iter, 1, &device, -1); - /* FIXME: Use something other than device->plugin->name */ - sdevname = g_strdup(device->plugin->name); + if (gtk_combo_box_get_active_iter(devbox, &iter)) { + 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 */ @@ -106,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();*/ - devices = sr_dev_list(); - for (l = devices; l; l = l->next) { - device = l->data; - sdi = GET_DEVICE_INSTANCE(device); - 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)"; @@ -122,51 +145,51 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent) radiolist = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(menuitem)); g_signal_connect(menuitem, "toggled", - G_CALLBACK(dev_menuitem_toggled), dev); + G_CALLBACK(dev_menuitem_toggled), devbox); gtk_menu_shell_prepend(devmenu, menuitem); gtk_list_store_append(devlist, &iter); gtk_list_store_set(devlist, &iter, 0, name, - 1, device, + 1, sdi, 2, menuitem, -1); - if (sdevname && g_str_equal(sdevname, device->plugin->name)) - gtk_combo_box_set_active_iter(dev, &iter); + if (sdevname && g_str_equal(sdevname, sdi->driver->name)) + gtk_combo_box_set_active_iter(devbox, &iter); } if (sdevname) g_free(sdevname); /* Select a default if nothing selected */ - if (!gtk_combo_box_get_active_iter(dev, &iter)) { + if (!gtk_combo_box_get_active_iter(devbox, &iter)) { if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(devlist), &iter)) return; /* Skip demo if there's another available */ GtkTreeIter first = iter; if (gtk_tree_model_iter_next(GTK_TREE_MODEL(devlist), &iter)) - gtk_combo_box_set_active_iter(dev, &iter); + gtk_combo_box_set_active_iter(devbox, &iter); else - gtk_combo_box_set_active_iter(dev, &first); + gtk_combo_box_set_active_iter(devbox, &first); } } GtkWidget *dev_select_combo_box_new(GtkWindow *parent) { - GtkWidget *dev = gtk_combo_box_new(); + GtkWidget *devbox = gtk_combo_box_new(); /* Populate device list */ GtkListStore *devlist = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_POINTER, GTK_TYPE_CHECK_MENU_ITEM); GtkCellRenderer *cel = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dev), cel, TRUE); - gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(dev), cel, "text", 0); - gtk_combo_box_set_model(GTK_COMBO_BOX(dev), GTK_TREE_MODEL(devlist)); - g_signal_connect(dev, "changed", G_CALLBACK(dev_selected), parent); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(devbox), cel, TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(devbox), cel, "text", 0); + gtk_combo_box_set_model(GTK_COMBO_BOX(devbox), GTK_TREE_MODEL(devlist)); + g_signal_connect(devbox, "changed", G_CALLBACK(dev_selected), parent); - g_object_set_data(G_OBJECT(parent), "devcombo", dev); + g_object_set_data(G_OBJECT(parent), "devcombo", devbox); dev_select_rescan(NULL, parent); - return dev; + return devbox; }