X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=main.c;h=e3d2aebb494677fdbb42563accdfe142a23e9707;hb=1fe3e6cc2add04d9a4b7fd314cf75b619594b127;hp=5e0e004ef4d6d5e6f47115c6898edae66155297a;hpb=faff5357e11f49194fd08c1e6aac0751e9da4dce;p=sigrok-gtk.git diff --git a/main.c b/main.c index 5e0e004..e3d2aeb 100644 --- a/main.c +++ b/main.c @@ -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 * @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include +#include #include #include @@ -33,30 +33,41 @@ static const char *colours[8] = { "gold", "darkgreen", "blue", "magenta", }; -static void -datafeed_in(struct sr_device *device, struct sr_datafeed_packet *packet) +static void datafeed_in(const struct sr_dev_inst *sdi, + const struct sr_datafeed_packet *packet) { - static int probelist[65] = { 0 }; + static int logic_probelist[SR_MAX_NUM_PROBES + 1] = { -1 }; static int unitsize = 0; - struct sr_probe *probe; - struct sr_datafeed_header *header; - struct sr_datafeed_logic *logic = NULL; + 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; - char *filter_out; + uint8_t *filter_out; GArray *data; switch (packet->type) { case SR_DF_HEADER: g_message("fe: Received SR_DF_HEADER"); - header = packet->payload; + break; + case SR_DF_END: + sigview_zoom(sigview, 1, 0); + g_message("fe: Received SR_DF_END"); + sr_session_stop(); + break; + case SR_DF_TRIGGER: + g_message("fe: received SR_DF_TRIGGER"); + break; + case SR_DF_META_LOGIC: + g_message("fe: received SR_DF_META_LOGIC"); + meta_logic = (const struct sr_datafeed_meta_logic *)packet->payload; num_enabled_probes = 0; gtk_list_store_clear(siglist); - for (i = 0; i < header->num_logic_probes; i++) { - probe = g_slist_nth_data(device->probes, i); + for (i = 0; i < meta_logic->num_probes; i++) { + probe = (const struct sr_probe *)g_slist_nth_data(sdi->probes, i); if (probe->enabled) { GtkTreeIter iter; - probelist[num_enabled_probes++] = probe->index; + logic_probelist[num_enabled_probes++] = probe->index; gtk_list_store_append(siglist, &iter); gtk_list_store_set(siglist, &iter, 0, probe->name, @@ -65,43 +76,36 @@ datafeed_in(struct sr_device *device, struct sr_datafeed_packet *packet) -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_END: - sigview_zoom(sigview, 1, 0); - g_message("fe: Received SR_DF_END"); - sr_session_halt(); - break; - case SR_DF_TRIGGER: - g_message("fe: received SR_DF_TRIGGER"); 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); - break; - case SR_DF_ANALOG: - break; - } - if (!logic) - return; + if (!logic) + break; - if (sr_filter_probes(sample_size, unitsize, probelist, - logic->data, logic->length, - &filter_out, &filter_out_len) != SR_OK) - return; + if (sr_filter_probes(sample_size, unitsize, logic_probelist, + logic->data, logic->length, + &filter_out, &filter_out_len) != SR_OK) + break; - data = g_object_get_data(G_OBJECT(siglist), "sampledata"); - g_return_if_fail(data != NULL); + data = g_object_get_data(G_OBJECT(siglist), "sampledata"); + g_return_if_fail(data != NULL); - g_array_append_vals(data, filter_out, filter_out_len/unitsize); + g_array_append_vals(data, filter_out, filter_out_len/unitsize); - g_free(filter_out); + g_free(filter_out); + break; + default: + g_message("fw: received unknown packet type %d", packet->type); + break; + } } void load_input_file(GtkWindow *parent, const gchar *file) @@ -127,15 +131,30 @@ int main(int argc, char **argv) { 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); window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); gtk_window_set_icon_name(window, "sigrok-logo"); - gtk_window_set_title(window, "Sigrok-GTK"); + gtk_window_set_title(window, "sigrok-gtk"); gtk_window_set_default_size(window, 600, 400); g_signal_connect(window, "destroy", gtk_main_quit, NULL); @@ -156,7 +175,7 @@ int main(int argc, char **argv) gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show_all(GTK_WIDGET(window)); - sr_set_loglevel(1); + sr_log_loglevel_set(SR_LOG_ERR); gtk_main();