]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
Add struct sr_context to the sr_init() and sr_exit() calls
[sigrok-cli.git] / sigrok-cli.c
index 1168745a6d9e01ab145b8e75145148d0267fbbad..a626636dd137644f3b07ce5115ce074dcd5798ec 100644 (file)
@@ -132,7 +132,6 @@ static GSList *hash_to_hwopt(GHashTable *hash)
                value = g_hash_table_lookup(hash, key);
                hwopt->value = g_strdup(value);
                opts = g_slist_append(opts, hwopt);
-               break;
        }
        g_list_free(keys);
 
@@ -245,6 +244,8 @@ static void show_version(void)
 
 static void print_dev_line(const struct sr_dev_inst *sdi)
 {
+       struct sr_probe *probe;
+       GSList *l;
 
        if (sdi->vendor && sdi->vendor[0])
                printf("%s ", sdi->vendor);
@@ -252,8 +253,18 @@ static void print_dev_line(const struct sr_dev_inst *sdi)
                printf("%s ", sdi->model);
        if (sdi->version && sdi->version[0])
                printf("%s ", sdi->version);
-       if (sdi->probes)
-               printf("with %d probes", g_slist_length(sdi->probes));
+       if (sdi->probes) {
+               if (g_slist_length(sdi->probes) == 1) {
+                       probe = sdi->probes->data;
+                       printf("with 1 probe: %s", probe->name);
+               } else {
+                       printf("with %d probes:", g_slist_length(sdi->probes));
+                       for (l = sdi->probes; l; l = l->next) {
+                               probe = l->data;
+                               printf(" %s", probe->name);
+                       }
+               }
+       }
        printf("\n");
 }
 
@@ -546,6 +557,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
        int num_enabled_probes, sample_size, ret, i;
        uint64_t output_len, filter_out_len;
        uint8_t *output_buf, *filter_out;
+       GString *out;
 
        /* If the first packet to come in isn't a header, don't even try. */
        if (packet->type != SR_DF_HEADER && o == NULL)
@@ -594,6 +606,9 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                               received_samples);
                if (outfile && outfile != stdout)
                        fclose(outfile);
+
+               if (o->format->cleanup)
+                       o->format->cleanup(o);
                g_free(o);
                o = NULL;
                break;
@@ -784,6 +799,14 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                g_message("received unknown packet type %d", packet->type);
        }
 
+       if (o && o->format->recv) {
+               out = o->format->recv(o, sdi, packet);
+               if (out && out->len) {
+                       fwrite(out->str, 1, out->len, outfile);
+                       fflush(outfile);
+               }
+       }
+
 }
 
 /* Register the given PDs for this session.
@@ -1039,31 +1062,23 @@ void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data)
 
 static int select_probes(struct sr_dev_inst *sdi)
 {
-       char **probelist;
-       int max_probes, i;
+       struct sr_probe *probe;
+       GSList *selected_probes, *l;
 
        if (!opt_probes)
                return SR_OK;
 
-       /*
-        * This only works because a device by default initializes
-        * and enables all its probes.
-        */
-       max_probes = g_slist_length(sdi->probes);
-       probelist = parse_probestring(max_probes, opt_probes);
-       if (!probelist) {
+       if (!(selected_probes = parse_probestring(sdi, opt_probes)))
                return SR_ERR;
-       }
 
-       for (i = 0; i < max_probes; i++) {
-               if (probelist[i]) {
-                       sr_dev_probe_name_set(sdi, i, probelist[i]);
-                       g_free(probelist[i]);
-               } else {
-                       sr_dev_probe_enable(sdi, i, FALSE);
-               }
+       for (l = sdi->probes; l; l = l->next) {
+               probe = l->data;
+               if (g_slist_find(selected_probes, probe))
+                       probe->enabled = TRUE;
+               else
+                       probe->enabled = FALSE;
        }
-       g_free(probelist);
+       g_slist_free(selected_probes);
 
        return SR_OK;
 }
@@ -1382,13 +1397,6 @@ static void run_session(void)
                g_free(triggerlist);
        }
 
-       if (sr_dev_config_set(sdi, SR_HWCAP_PROBECONFIG,
-                       (char *)sdi->probes) != SR_OK) {
-               g_critical("Failed to configure probes.");
-               sr_session_destroy();
-               return;
-       }
-
        if (opt_continuous) {
                if (!sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_CONTINUOUS)) {
                        g_critical("This device does not support continuous sampling.");
@@ -1467,8 +1475,10 @@ static void logger(const gchar *log_domain, GLogLevelFlags log_level,
 
 int main(int argc, char **argv)
 {
+       int ret = 1;
        GOptionContext *context;
        GError *error;
+       struct sr_context *sr_ctx = NULL;
 
        g_log_set_default_handler(logger, NULL);
 
@@ -1478,45 +1488,45 @@ int main(int argc, char **argv)
 
        if (!g_option_context_parse(context, &argc, &argv, &error)) {
                g_critical("%s", error->message);
-               return 1;
+               goto done;
        }
 
        /* Set the loglevel (amount of messages to output) for libsigrok. */
        if (sr_log_loglevel_set(opt_loglevel) != SR_OK)
-               return 1;
+               goto done;
 
        /* Set the loglevel (amount of messages to output) for libsigrokdecode. */
        if (srd_log_loglevel_set(opt_loglevel) != SRD_OK)
-               return 1;
+               goto done;
 
-       if (sr_init() != SR_OK)
-               return 1;
+       if (sr_init(&sr_ctx) != SR_OK)
+               goto done;
 
        if (opt_pds) {
                if (srd_init(NULL) != SRD_OK)
-                       return 1;
+                       goto done;
                if (register_pds(NULL, opt_pds) != 0)
-                       return 1;
+                       goto done;
                if (srd_pd_output_callback_add(SRD_OUTPUT_ANN,
                                show_pd_annotations, NULL) != SRD_OK)
-                       return 1;
+                       goto done;
                if (setup_pd_stack() != 0)
-                       return 1;
+                       goto done;
                if (setup_pd_annotations() != 0)
-                       return 1;
+                       goto done;
        }
 
        if (setup_output_format() != 0)
-               return 1;
+               goto done;
 
        if (opt_version)
                show_version();
        else if (opt_list_devs)
                show_dev_list();
+       else if (opt_pds && opt_show)
+               show_pd_detail();
        else if (opt_show)
                show_dev_detail();
-       else if (opt_pds)
-               show_pd_detail();
        else if (opt_input_file)
                load_input_file();
        else if (opt_samples || opt_time || opt_frames || opt_continuous)
@@ -1527,8 +1537,13 @@ int main(int argc, char **argv)
        if (opt_pds)
                srd_exit();
 
+       ret = 0;
+
+done:
+       if (sr_ctx)
+               sr_exit(sr_ctx);
+
        g_option_context_free(context);
-       sr_exit();
 
-       return 0;
+       return ret;
 }