X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=sigrok-cli.c;h=a6db4f5ddc3cba15e47d933dd2964aa10c073497;hb=41d7fb2343dc765fa34ffa661ee19c20c93eff9a;hp=6feabd4df3838e281dda077a76007537f2976a7f;hpb=1cf6a109935a29127f6df954da2defdc73bdedaf;p=sigrok-cli.git diff --git a/sigrok-cli.c b/sigrok-cli.c index 6feabd4..a6db4f5 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -314,22 +314,12 @@ static void show_dev_detail(void) num_devices = g_slist_length(devices); if (num_devices > 1) { - if (!opt_dev) { - g_critical("%d devices found. Use --list-devices to show them, " - "and --device to select one.", num_devices); - return; - } - /* opt_dev is NULL if not specified, which is fine. */ - n = strtol(opt_dev, NULL, 10); - if (n >= num_devices) { - g_critical("%d devices found, numbered starting from 0.", - num_devices); - return; - } - sdi = g_slist_nth_data(devices, n); - } else - sdi = g_slist_nth_data(devices, 0); + g_critical("%d devices found. Use --list-devices to show them, " + "and --device to select one.", num_devices); + return; + } + sdi = devices->data; print_dev_line(sdi); if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_TYPE, (const void **)&charopts, @@ -342,7 +332,7 @@ static void show_dev_detail(void) printf("\n"); } - if ((sr_info_get(sdi->driver, SR_DI_HWOPTS, (const void **)&hwopts, + if ((sr_config_list(sdi->driver, SR_CONF_SCAN_OPTIONS, (const void **)&hwopts, NULL) == SR_OK) && hwopts) { printf("Supported driver options:\n"); for (i = 0; hwopts[i]; i++) { @@ -629,7 +619,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi, unitsize = (logic_probelist->len + 7) / 8; if (opt_pds && logic_probelist->len) { - if (sr_info_get(sdi->driver, SR_CONF_SAMPLERATE, + if (sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, (const void **)&samplerate, sdi) != SR_OK) { g_critical("Unable to initialize protocol " "decoders: no samplerate found."); @@ -640,45 +630,6 @@ static void datafeed_in(const struct sr_dev_inst *sdi, } break; - case SR_DF_END: - g_debug("cli: Received SR_DF_END"); - if (!o) { - g_debug("cli: double end!"); - break; - } - if (o->format->event) { - o->format->event(o, SR_DF_END, &output_buf, &output_len); - if (output_buf) { - if (outfile) - fwrite(output_buf, 1, output_len, outfile); - g_free(output_buf); - output_len = 0; - } - } - if (limit_samples && received_samples < limit_samples) - g_warning("Device only sent %" PRIu64 " samples.", - received_samples); - if (opt_continuous) - g_warning("Device stopped after %" PRIu64 " samples.", - received_samples); - - if (outfile && outfile != stdout) - fclose(outfile); - - if (opt_output_file && default_output_format) { - if (sr_session_save(opt_output_file, sdi, savebuf->data, - unitsize, savebuf->len / unitsize) != SR_OK) - g_critical("Failed to save session."); - g_byte_array_free(savebuf, FALSE); - } - - g_array_free(logic_probelist, TRUE); - if (o->format->cleanup) - o->format->cleanup(o); - g_free(o); - o = NULL; - break; - case SR_DF_META: g_debug("cli: received SR_DF_META"); meta = packet->payload; @@ -746,7 +697,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi, if (o->format->data && packet->type == o->format->df_type) o->format->data(o, filter_out, filter_out_len, &output_buf, &output_len); - if (output_buf) { + if (output_len) { fwrite(output_buf, 1, output_len, outfile); fflush(outfile); g_free(output_buf); @@ -819,6 +770,47 @@ static void datafeed_in(const struct sr_dev_inst *sdi, } } + /* SR_DF_END needs to be handled after the output module's recv() + * is called, so it can properly clean up that module etc. */ + if (packet->type == SR_DF_END) { + g_debug("cli: Received SR_DF_END"); + + if (o->format->event) { + o->format->event(o, SR_DF_END, &output_buf, &output_len); + if (output_buf) { + if (outfile) + fwrite(output_buf, 1, output_len, outfile); + g_free(output_buf); + output_len = 0; + } + } + + if (limit_samples && received_samples < limit_samples) + g_warning("Device only sent %" PRIu64 " samples.", + received_samples); + + if (opt_continuous) + g_warning("Device stopped after %" PRIu64 " samples.", + received_samples); + + g_array_free(logic_probelist, TRUE); + + if (o->format->cleanup) + o->format->cleanup(o); + g_free(o); + o = NULL; + + if (outfile && outfile != stdout) + fclose(outfile); + + if (opt_output_file && default_output_format) { + if (sr_session_save(opt_output_file, sdi, savebuf->data, + unitsize, savebuf->len / unitsize) != SR_OK) + g_critical("Failed to save session."); + g_byte_array_free(savebuf, FALSE); + } + } + } /* Register the given PDs for this session. @@ -1189,7 +1181,7 @@ static void load_input_file_format(void) in->format = input_format; in->param = fmtargs; if (in->format->init) { - if (in->format->init(in) != SR_OK) { + if (in->format->init(in, opt_input_file) != SR_OK) { g_critical("Input format init failed."); exit(1); } @@ -1290,7 +1282,7 @@ static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) ret = SR_ERR; } if (val) - ret = sr_dev_config_set(sdi, srci->key, val); + ret = sr_config_set(sdi, srci->key, val); if (ret != SR_OK) { g_critical("Failed to set device option '%s'.", (char *)key); return ret; @@ -1312,8 +1304,8 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sr_driver_hwcap_exists(sdi->driver, SR_CONF_LIMIT_MSEC)) { - if (sr_dev_config_set(sdi, SR_CONF_LIMIT_MSEC, &time_msec) != SR_OK) { + if (sr_dev_has_option(sdi, SR_CONF_LIMIT_MSEC)) { + if (sr_config_set(sdi, SR_CONF_LIMIT_MSEC, &time_msec) != SR_OK) { g_critical("Failed to configure time limit."); sr_session_destroy(); return SR_ERR; @@ -1324,8 +1316,8 @@ static int set_limit_time(const struct sr_dev_inst *sdi) * convert to samples based on the samplerate. */ limit_samples = 0; - if (sr_dev_has_hwcap(sdi, SR_CONF_SAMPLERATE)) { - sr_info_get(sdi->driver, SR_CONF_SAMPLERATE, + if (sr_dev_has_option(sdi, SR_CONF_SAMPLERATE)) { + sr_config_get(sdi->driver, SR_CONF_SAMPLERATE, (const void **)&samplerate, sdi); limit_samples = (*samplerate) * time_msec / (uint64_t)1000; } @@ -1335,7 +1327,7 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sr_dev_config_set(sdi, SR_CONF_LIMIT_SAMPLES, + if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, &limit_samples) != SR_OK) { g_critical("Failed to configure time-based sample limit."); sr_session_destroy(); @@ -1404,7 +1396,7 @@ static void run_session(void) } if (opt_continuous) { - if (!sr_driver_hwcap_exists(sdi->driver, SR_CONF_CONTINUOUS)) { + if (!sr_dev_has_option(sdi, SR_CONF_CONTINUOUS)) { g_critical("This device does not support continuous sampling."); sr_session_destroy(); return; @@ -1420,7 +1412,7 @@ static void run_session(void) if (opt_samples) { if ((sr_parse_sizestring(opt_samples, &limit_samples) != SR_OK) - || (sr_dev_config_set(sdi, SR_CONF_LIMIT_SAMPLES, + || (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, &limit_samples) != SR_OK)) { g_critical("Failed to configure sample limit."); sr_session_destroy(); @@ -1430,7 +1422,7 @@ static void run_session(void) if (opt_frames) { if ((sr_parse_sizestring(opt_frames, &limit_frames) != SR_OK) - || (sr_dev_config_set(sdi, SR_CONF_LIMIT_FRAMES, + || (sr_config_set(sdi, SR_CONF_LIMIT_FRAMES, &limit_frames) != SR_OK)) { g_critical("Failed to configure frame limit."); sr_session_destroy();