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 = dev &&
- sr_driver_hwcap_exists(dev->driver,
- SR_HWCAP_LIMIT_SAMPLES);
+ 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);
}
} 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;
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;
* 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 */
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)";
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)
"gold", "darkgreen", "blue", "magenta",
};
-static void
-datafeed_in(struct sr_dev *dev, struct sr_datafeed_packet *packet)
+static void datafeed_in(const struct sr_dev_inst *sdi,
+ const struct sr_datafeed_packet *packet)
{
- static int logic_probelist[SR_MAX_NUM_PROBES + 1] = { 0 };
+ static int logic_probelist[SR_MAX_NUM_PROBES + 1] = { -1 };
static int unitsize = 0;
- struct sr_probe *probe;
- struct sr_datafeed_logic *logic = NULL;
- struct sr_datafeed_meta_logic *meta_logic;
+ const struct sr_probe *probe;
+ const struct sr_datafeed_logic *logic = NULL;
+ const struct sr_datafeed_meta_logic *meta_logic;
int num_enabled_probes, sample_size, i;
uint64_t filter_out_len;
uint8_t *filter_out;
break;
case SR_DF_META_LOGIC:
g_message("fe: received SR_DF_META_LOGIC");
- meta_logic = packet->payload;
+ meta_logic = (const struct sr_datafeed_meta_logic *)packet->payload;
num_enabled_probes = 0;
gtk_list_store_clear(siglist);
for (i = 0; i < meta_logic->num_probes; i++) {
- probe = g_slist_nth_data(dev->probes, i);
+ probe = (const struct sr_probe *)g_slist_nth_data(sdi->probes, i);
if (probe->enabled) {
GtkTreeIter iter;
logic_probelist[num_enabled_probes++] = probe->index;
-1);
}
}
+ logic_probelist[num_enabled_probes] = -1;
/* How many bytes we need to store num_enabled_probes bits */
unitsize = (num_enabled_probes + 7) / 8;
data = g_array_new(FALSE, FALSE, unitsize);
g_object_set_data(G_OBJECT(siglist), "sampledata", data);
break;
case SR_DF_LOGIC:
- logic = packet->payload;
+ logic = (const struct sr_datafeed_logic *)packet->payload;
sample_size = logic->unitsize;
g_message("fe: received SR_DF_LOGIC, %"PRIu64" bytes", logic->length);
{
GtkWindow *window;
GtkWidget *vbox, *vpaned, *log;
+ struct sr_context *sr_ctx;
+ struct sr_dev_driver **drivers, **driver;
+
gtk_init(&argc, &argv);
icons_register();
- sr_init();
+
+ sr_init(&sr_ctx);
+
+ /* Initialize all libsigrok drivers. */
+ drivers = sr_driver_list();
+ for (driver = drivers; *driver; driver++) {
+ if (sr_driver_init(sr_ctx, *driver) != SR_OK) {
+ g_error("Failed to initialize driver %s.",
+ (*driver)->name);
+ exit(1); // FIXME?
+ }
+ }
+
sr_session_new();
sr_session_datafeed_callback_add(datafeed_in);
{
(void)cel;
- struct sr_dev *dev = g_object_get_data(G_OBJECT(props), "dev");
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(props), "sdi");
GtkTreeIter iter;
int type, cap;
guint64 tmp_u64;
if (sr_parse_sizestring(text, &tmp_u64) != SR_OK)
return;
- ret = dev->driver->dev_config_set(dev->driver_index,
- cap, &tmp_u64);
+ ret = sr_dev_config_set(sdi, cap, &tmp_u64);
break;
case SR_T_CHAR:
- ret = dev->driver->dev_config_set(dev->driver_index, cap, text);
+ ret = sr_dev_config_set(sdi, cap, text);
break;
/* SR_T_BOOL will be handled by prop_toggled */
}
static void prop_toggled(GtkCellRendererToggle *cel, gchar *path,
GtkListStore *props)
{
- struct sr_dev *dev = g_object_get_data(G_OBJECT(props), "dev");
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(props), "sdi");
GtkTreeIter iter;
int type, cap;
int ret;
DEV_PROP_TYPE, &type, -1);
val = !gtk_cell_renderer_toggle_get_active(cel);
- ret = dev->driver->dev_config_set(dev->driver_index, cap,
- GINT_TO_POINTER(val));
+ ret = sr_dev_config_set(sdi, cap, GINT_TO_POINTER(val));
if (!ret)
gtk_list_store_set(props, &iter, DEV_PROP_BOOLVALUE, val, -1);
{
(void)action;
- struct sr_dev *dev = g_object_get_data(G_OBJECT(parent), "dev");
- if (!dev)
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(parent), "sdi");
+ if (!sdi)
return;
GtkWidget *dialog = gtk_dialog_new_with_buttons("Device Properties",
G_TYPE_BOOLEAN, G_TYPE_STRING,
G_TYPE_BOOLEAN);
gtk_tree_view_set_model(GTK_TREE_VIEW(tv), GTK_TREE_MODEL(props));
- const int *hwcaps = dev->driver->hwcap_get_all();
+ const int *hwcaps;
int cap;
+
+ /* TODO: Error handling. */
+ sr_info_get(sdi->driver, SR_DI_HWCAPS, (const void **)&hwcaps, sdi);
+
GtkTreeIter iter;
for (cap = 0; hwcaps[cap]; cap++) {
const struct sr_hwcap_option *hwo;
- if (!(hwo = sr_hw_hwcap_get(hwcaps[cap])))
+ if (!(hwo = sr_devopt_get(hwcaps[cap])))
continue;
gtk_list_store_append(props, &iter);
gtk_list_store_set(props, &iter,
/* Save device with list so that property can be set by edited
* handler. */
- g_object_set_data(G_OBJECT(props), "dev", dev);
+ g_object_set_data(G_OBJECT(props), "sdi", sdi);
/* Add columns to the tree view */
GtkTreeViewColumn *col;
static void probe_toggled(GtkCellRenderer *cel, gchar *path,
GtkTreeModel *probes)
{
- struct sr_dev *dev = g_object_get_data(G_OBJECT(probes), "dev");
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(probes), "sdi");
GtkTreeIter iter;
struct sr_probe *probe;
gint i;
gtk_tree_model_get_iter_from_string(probes, &iter, path);
gtk_tree_model_get(probes, &iter, PROBE_NUMBER, &i,
PROBE_ENABLED, &en, -1);
- probe = sr_dev_probe_find(dev, i);
- probe->enabled = !en;
+ sr_dev_probe_enable(sdi, i, FALSE);
gtk_list_store_set(GTK_LIST_STORE(probes), &iter,
PROBE_ENABLED, probe->enabled, -1);
}
static void probe_named(GtkCellRendererText *cel, gchar *path, gchar *text,
GtkTreeModel *probes)
{
- struct sr_dev *dev = g_object_get_data(G_OBJECT(probes), "dev");
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(probes), "sdi");
GtkTreeIter iter;
gint i;
gtk_tree_model_get_iter_from_string(probes, &iter, path);
gtk_tree_model_get(probes, &iter, PROBE_NUMBER, &i, -1);
- sr_dev_probe_name_set(dev, i, text);
+ sr_dev_probe_name_set(sdi, i, text);
gtk_list_store_set(GTK_LIST_STORE(probes), &iter, PROBE_NAME, text, -1);
}
static void probe_trigger_set(GtkCellRendererText *cel, gchar *path,
gchar *text, GtkTreeModel *probes)
{
- struct sr_dev *dev = g_object_get_data(G_OBJECT(probes), "dev");
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(probes), "sdi");
GtkTreeIter iter;
gint i;
gtk_tree_model_get_iter_from_string(probes, &iter, path);
gtk_tree_model_get(probes, &iter, PROBE_NUMBER, &i, -1);
- sr_dev_trigger_set(dev, i, text);
+ sr_dev_trigger_set(sdi, i, text);
gtk_list_store_set(GTK_LIST_STORE(probes), &iter,
PROBE_TRIGGER, text, -1);
}
{
(void)action;
- struct sr_dev *dev = g_object_get_data(G_OBJECT(parent), "dev");
- if (!dev)
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(parent), "sdi");
+ if (!sdi)
return;
GtkWidget *dialog = gtk_dialog_new_with_buttons("Configure Probes",
GtkTreeIter iter;
GSList *p;
int i;
- for (p = dev->probes, i = 1; p; p = g_slist_next(p), i++) {
+ for (p = sdi->probes, i = 1; p; p = g_slist_next(p), i++) {
struct sr_probe *probe = p->data;
gtk_list_store_append(probes, &iter);
gtk_list_store_set(probes, &iter, PROBE_NUMBER, i,
/* Save device with list so that property can be set by edited
* handler. */
- g_object_set_data(G_OBJECT(probes), "dev", dev);
+ g_object_set_data(G_OBJECT(probes), "sdi", sdi);
/* Add columns to the tree view */
GtkTreeViewColumn *col;
{
(void)action;
- struct sr_dev *dev = g_object_get_data(G_OBJECT(parent), "dev");
+ struct sr_dev_inst *sdi = g_object_get_data(G_OBJECT(parent), "sdi");
GtkEntry *timesamples = g_object_get_data(parent, "timesamples");
GtkComboBox *timeunit = g_object_get_data(parent, "timeunit");
gint i = gtk_combo_box_get_active(timeunit);
}
if (time_msec) {
- if (sr_driver_hwcap_exists(dev->driver, SR_HWCAP_LIMIT_MSEC)) {
- if (dev->driver->dev_config_set(dev->driver_index,
- SR_HWCAP_LIMIT_MSEC,
+ if (sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_LIMIT_MSEC)) {
+ if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_MSEC,
&time_msec) != SR_OK) {
g_critical("Failed to configure time limit.");
sr_session_destroy();
* convert to samples based on the samplerate.
*/
limit_samples = 0;
- if (sr_dev_has_hwcap(dev, SR_HWCAP_SAMPLERATE)) {
+ if (sr_dev_has_hwcap(sdi, SR_HWCAP_SAMPLERATE)) {
guint64 tmp_u64;
- tmp_u64 = *((uint64_t *)dev->driver->dev_info_get(
- dev->driver_index,
- SR_DI_CUR_SAMPLERATE));
+ sr_info_get(sdi->driver, SR_DI_CUR_SAMPLERATE,
+ (const void **)&tmp_u64, sdi);
limit_samples = tmp_u64 * time_msec / (uint64_t) 1000;
}
if (limit_samples == 0) {
return;
}
- if (dev->driver->dev_config_set(dev->driver_index,
- SR_HWCAP_LIMIT_SAMPLES,
+ if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES,
&limit_samples) != SR_OK) {
g_critical("Failed to configure time-based sample limit.");
return;
}
}
if (limit_samples) {
- if (dev->driver->dev_config_set(dev->driver_index,
- SR_HWCAP_LIMIT_SAMPLES,
- &limit_samples) != SR_OK) {
+ if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES,
+ &limit_samples) != SR_OK) {
g_critical("Failed to configure sample limit.");
return;
}
}
- if (dev->driver->dev_config_set(dev->driver_index,
- SR_HWCAP_PROBECONFIG, (char *)dev->probes) != SR_OK) {
+#if 0
+ if (sr_dev_config_set(sdi,
+ SR_HWCAP_PROBECONFIG, (char *)sdi->probes) != SR_OK) {
printf("Failed to configure probes.\n");
sr_session_destroy();
return;
}
+#endif
if (sr_session_start() != SR_OK) {
g_critical("Failed to start session.");