]> sigrok.org Git - sigrok-gtk.git/blobdiff - devselect.c
README: Add "Copyright and license" section.
[sigrok-gtk.git] / devselect.c
index 3a6771c41abdeb577217542bd994b556916efcc6..728d81e2a764694a6102f8143b9c7cd671633f65 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * This file is part of the sigrok project.
+ * This file is part of the sigrok-gtk project.
  *
  * Copyright (C) 2011 Gareth McMullin <gareth@blacksphere.co.nz>
  *
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sigrok.h>
+#include <libsigrok/libsigrok.h>
 #include <gtk/gtk.h>
 #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;
 }