]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
cli: use new generic arg parser API
[sigrok-cli.git] / sigrok-cli.c
index bcdeb3e9fb7151771f6376383b1329eb0b89116c..38ea352cc842228f80d29884c245ae16d56a1b69 100644 (file)
@@ -45,6 +45,7 @@ static struct sr_output_format *output_format = NULL;
 static int default_output_format = FALSE;
 static char *output_format_param = NULL;
 static GHashTable *pd_ann_visible = NULL;
+static struct sr_datastore *singleds = NULL;
 
 static gboolean opt_version = FALSE;
 static gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings per default. */
@@ -486,7 +487,7 @@ static void show_pd_detail(void)
        pdtokens = g_strsplit(opt_pds, ",", -1);
        for (pdtok = pdtokens; *pdtok; pdtok++) {
                if (!(dec = srd_decoder_get_by_id(*pdtok))) {
-                       printf("Protocol decoder %s not found.\n", *pdtok);
+                       g_critical("Protocol decoder %s not found.", *pdtok);
                        return;
                }
                printf("ID: %s\nName: %s\nLong name: %s\nDescription: %s\n",
@@ -536,7 +537,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                struct sr_datafeed_packet *packet)
 {
        static struct sr_output *o = NULL;
-       static int logic_probelist[SR_MAX_NUM_PROBES] = { 0 };
+       static int logic_probelist[SR_MAX_NUM_PROBES] = { -1 };
        static struct sr_probe *analog_probelist[SR_MAX_NUM_PROBES];
        static uint64_t received_samples = 0;
        static int unitsize = 0;
@@ -598,7 +599,6 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                if (opt_continuous)
                        g_warning("Device stopped after %" PRIu64 " samples.",
                               received_samples);
-               sr_session_stop();
                if (outfile && outfile != stdout)
                        fclose(outfile);
                g_free(o);
@@ -622,6 +622,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                        if (probe->enabled)
                                logic_probelist[num_enabled_probes++] = probe->index;
                }
+               logic_probelist[num_enabled_probes] = -1;
                /* How many bytes we need to store num_enabled_probes bits */
                unitsize = (num_enabled_probes + 7) / 8;
 
@@ -632,9 +633,9 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                                 * dump everything in the datastore as it comes in,
                                 * and save from there after the session. */
                                outfile = NULL;
-                               ret = sr_datastore_new(unitsize, &(dev->datastore));
+                               ret = sr_datastore_new(unitsize, &singleds);
                                if (ret != SR_OK) {
-                                       printf("Failed to create datastore.\n");
+                                       g_critical("Failed to create datastore.");
                                        exit(1);
                                }
                        } else {
@@ -663,8 +664,8 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                        break;
 
                ret = sr_filter_probes(sample_size, unitsize, logic_probelist,
-                                          logic->data, logic->length,
-                                          &filter_out, &filter_out_len);
+                               logic->data, logic->length,
+                               &filter_out, &filter_out_len);
                if (ret != SR_OK)
                        break;
 
@@ -677,9 +678,9 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                                limit_samples * sample_size))
                        filter_out_len = limit_samples * sample_size - received_samples;
 
-               if (dev->datastore)
-                       sr_datastore_put(dev->datastore, filter_out,
-                                        filter_out_len, sample_size, logic_probelist);
+               if (singleds)
+                       sr_datastore_put(singleds, filter_out,
+                                       filter_out_len, sample_size, logic_probelist);
 
                if (opt_output_file && default_output_format)
                        /* saving to a session file, don't need to do anything else
@@ -724,9 +725,9 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
                                 * dump everything in the datastore as it comes in,
                                 * and save from there after the session. */
                                outfile = NULL;
-                               ret = sr_datastore_new(unitsize, &(dev->datastore));
+                               ret = sr_datastore_new(unitsize, &singleds);
                                if (ret != SR_OK) {
-                                       printf("Failed to create datastore.\n");
+                                       g_critical("Failed to create datastore.");
                                        exit(1);
                                }
                        } else {
@@ -1142,7 +1143,7 @@ static void load_input_file_format(void)
        char *fmtspec = NULL;
 
        if (opt_input_format) {
-               fmtargs = parse_generic_arg(opt_input_format);
+               fmtargs = parse_generic_arg(opt_input_format, TRUE);
                fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key");
        }
 
@@ -1151,7 +1152,7 @@ static void load_input_file_format(void)
                /* The exact cause was already logged. */
                return;
        }
-;
+
        if (fmtargs)
                g_hash_table_remove(fmtargs, "sigrok_key");
 
@@ -1188,7 +1189,7 @@ static void load_input_file_format(void)
 
        input_format->loadfile(in, opt_input_file);
        if (opt_output_file && default_output_format) {
-               if (sr_session_save(opt_output_file) != SR_OK)
+               if (sr_session_save(opt_output_file, in->sdi, singleds) != SR_OK)
                        g_critical("Failed to save session.");
        }
        sr_session_destroy();
@@ -1340,73 +1341,74 @@ static int set_limit_time(const struct sr_dev_inst *sdi)
 
 static void run_session(void)
 {
-       GSList *devices, *l;
+       GSList *devices;
        GHashTable *devargs;
        struct sr_dev_inst *sdi;
        int max_probes, i;
-       char **probelist;
+       char **triggerlist;
+
+       devices = device_scan();
+       if (!devices) {
+               g_critical("No devices found.");
+               return;
+       }
+       if (g_slist_length(devices) > 1) {
+               g_critical("sigrok-cli only supports one device for capturing.");
+               return;
+       }
+       sdi = devices->data;
 
        sr_session_new();
        sr_session_datafeed_callback_add(datafeed_in);
 
-       devices = device_scan();
-       for (l = devices; l; l = l->next) {
-               sdi = l->data;
-               printf("found %s %s\n", sdi->vendor, sdi->model);
-
-               devargs = NULL;
-               if (opt_dev) {
-                       /* TODO: this applies the same options to every device */
-                       devargs = parse_generic_arg(opt_dev, FALSE);
-                       if (devargs) {
-                               if (set_dev_options(sdi, devargs) != SR_OK) {
-                                       return;
-                               }
-                               g_hash_table_destroy(devargs);
-                       }
+       if (opt_dev) {
+               if ((devargs = parse_generic_arg(opt_dev, FALSE))) {
+                       if (set_dev_options(sdi, devargs) != SR_OK)
+                               return;
+                       g_hash_table_destroy(devargs);
                }
+       }
 
-               if (sr_session_dev_add(sdi) != SR_OK) {
-                       g_critical("Failed to use device.");
+       if (sr_session_dev_add(sdi) != SR_OK) {
+               g_critical("Failed to use device.");
+               sr_session_destroy();
+               return;
+       }
+
+       if (select_probes(sdi) != SR_OK) {
+               g_critical("Failed to set probes.");
+               sr_session_destroy();
+               return;
+       }
+
+       if (opt_triggers) {
+               if (!(triggerlist = sr_parse_triggerstring(sdi, opt_triggers))) {
                        sr_session_destroy();
                        return;
                }
-
-               if (select_probes(sdi) != SR_OK)
-                       return;
-
-               if (opt_continuous) {
-                       if (!sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_CONTINUOUS)) {
-                               g_critical("This device does not support continuous sampling.");
-                               sr_session_destroy();
-                               return;
+               max_probes = g_slist_length(sdi->probes);
+               for (i = 0; i < max_probes; i++) {
+                       if (triggerlist[i]) {
+                               sr_dev_trigger_set(sdi, i, triggerlist[i]);
+                               g_free(triggerlist[i]);
                        }
                }
+               g_free(triggerlist);
+       }
 
-               if (opt_triggers) {
-                       probelist = sr_parse_triggerstring(sdi, opt_triggers);
-                       if (!probelist) {
-                               sr_session_destroy();
-                               return;
-                       }
-
-                       max_probes = g_slist_length(sdi->probes);
-                       for (i = 0; i < max_probes; i++) {
-                               if (probelist[i]) {
-                                       sr_dev_trigger_set(sdi, i, probelist[i]);
-                                       g_free(probelist[i]);
-                               }
-                       }
-                       g_free(probelist);
-               }
+       if (sdi->driver->dev_config_set(sdi, SR_HWCAP_PROBECONFIG,
+                       (char *)sdi->probes) != SR_OK) {
+               g_critical("Failed to configure probes.");
+               sr_session_destroy();
+               return;
+       }
 
-               if (sdi->driver->dev_config_set(sdi, SR_HWCAP_PROBECONFIG,
-                               (char *)sdi->probes) != SR_OK) {
-                       g_critical("Failed to configure probes.");
+       if (opt_continuous) {
+               if (!sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_CONTINUOUS)) {
+                       g_critical("This device does not support continuous sampling.");
                        sr_session_destroy();
                        return;
                }
-
        }
 
        if (opt_time) {
@@ -1430,7 +1432,7 @@ static void run_session(void)
                if ((sr_parse_sizestring(opt_frames, &limit_frames) != SR_OK)
                                || (sdi->driver->dev_config_set(sdi,
                            SR_HWCAP_LIMIT_FRAMES, &limit_frames) != SR_OK)) {
-                       printf("Failed to configure frame limit.\n");
+                       g_critical("Failed to configure frame limit.");
                        sr_session_destroy();
                        return;
                }
@@ -1451,7 +1453,7 @@ static void run_session(void)
                clear_anykey();
 
        if (opt_output_file && default_output_format) {
-               if (sr_session_save(opt_output_file) != SR_OK)
+               if (sr_session_save(opt_output_file, sdi, singleds) != SR_OK)
                        g_critical("Failed to save session.");
        }
        sr_session_destroy();