/*
- * 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)
} 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 */
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)";
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;
}