]> sigrok.org Git - sigrok-gtk.git/blobdiff - main.c
Update .gitignore file.
[sigrok-gtk.git] / main.c
diff --git a/main.c b/main.c
index 7095a11d4c3073af2b113c855827ae00c2d27a7d..9bd2a0a5d1eefe3732d9a6b52a1b35dee816968d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -17,7 +17,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sigrok.h>
+#include <libsigrok/libsigrok.h>
 #include <gtk/gtk.h>
 
 #include <errno.h>
@@ -33,30 +33,41 @@ static const char *colours[8] = {
        "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 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(dev->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,41 +76,36 @@ datafeed_in(struct sr_dev *dev, 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;
-       }
 
-       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)
@@ -125,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);