X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=sigrok-cli.c;h=e58c51422a817ac37c8e0171c570caaa2bdbfeb2;hp=9938260cc2bd232675b876c364fdd02354c1d1b6;hb=2d73284ebd14c28579076312987694cbd35cfe42;hpb=74b9bf0c14d186ac8681b210322a022b0c42a474 diff --git a/sigrok-cli.c b/sigrok-cli.c index 9938260..e58c514 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -66,6 +66,7 @@ static gchar *opt_time = NULL; static gchar *opt_samples = NULL; static gchar *opt_frames = NULL; static gchar *opt_continuous = NULL; +static gchar *opt_set = NULL; static GOptionEntry optargs[] = { {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, @@ -108,6 +109,7 @@ static GOptionEntry optargs[] = { "Number of frames to acquire", NULL}, {"continuous", 0, 0, G_OPTION_ARG_NONE, &opt_continuous, "Sample continuously", NULL}, + {"set", 0, 0, G_OPTION_ARG_NONE, &opt_set, "Set device options only", NULL}, {NULL, 0, 0, 0, NULL, NULL, NULL} }; @@ -314,25 +316,15 @@ 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_info_get(sdi->driver, SR_DI_TRIGGER_TYPES, (const void **)&charopts, + if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_TYPE, (const void **)&charopts, sdi) == SR_OK && charopts) { printf("Supported triggers: "); while (*charopts) { @@ -342,7 +334,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++) { @@ -353,7 +345,7 @@ static void show_dev_detail(void) } title = "Supported device options:\n"; - if ((sr_info_get(sdi->driver, SR_DI_HWCAPS, (const void **)&hwcaps, + if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_OPTIONS, (const void **)&hwcaps, NULL) != SR_OK) || !hwcaps) /* Driver supports no device instance options. */ return; @@ -367,10 +359,10 @@ static void show_dev_detail(void) title = NULL; } - if (srci->key == SR_HWCAP_PATTERN_MODE) { + if (srci->key == SR_CONF_PATTERN_MODE) { /* Pattern generator modes */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_PATTERNS, + if (sr_config_list(sdi->driver, SR_CONF_PATTERN_MODE, (const void **)&stropts, sdi) == SR_OK) { printf(" - supported patterns:\n"); for (i = 0; stropts[i]; i++) @@ -379,10 +371,10 @@ static void show_dev_detail(void) printf("\n"); } - } else if (srci->key == SR_HWCAP_SAMPLERATE) { + } else if (srci->key == SR_CONF_SAMPLERATE) { /* Supported samplerates */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_SAMPLERATES, + if (sr_config_list(sdi->driver, SR_CONF_SAMPLERATE, (const void **)&samplerates, sdi) != SR_OK) { printf("\n"); continue; @@ -409,10 +401,10 @@ static void show_dev_detail(void) printf(" %s\n", sr_samplerate_string(samplerates->list[i])); } - } else if (srci->key == SR_HWCAP_BUFFERSIZE) { + } else if (srci->key == SR_CONF_BUFFERSIZE) { /* Supported buffer sizes */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_BUFFERSIZES, + if (sr_config_list(sdi->driver, SR_CONF_BUFFERSIZE, (const void **)&integers, sdi) != SR_OK) { printf("\n"); continue; @@ -421,10 +413,10 @@ static void show_dev_detail(void) for (i = 0; integers[i]; i++) printf(" %"PRIu64"\n", integers[i]); - } else if (srci->key == SR_HWCAP_TIMEBASE) { + } else if (srci->key == SR_CONF_TIMEBASE) { /* Supported time bases */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_TIMEBASES, + if (sr_config_list(sdi->driver, SR_CONF_TIMEBASE, (const void **)&rationals, sdi) != SR_OK) { printf("\n"); continue; @@ -434,10 +426,10 @@ static void show_dev_detail(void) printf(" %s\n", sr_period_string( rationals[i].p * rationals[i].q)); - } else if (srci->key == SR_HWCAP_TRIGGER_SOURCE) { + } else if (srci->key == SR_CONF_TRIGGER_SOURCE) { /* Supported trigger sources */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_TRIGGER_SOURCES, + if (sr_config_list(sdi->driver, SR_CONF_TRIGGER_SOURCE, (const void **)&stropts, sdi) != SR_OK) { printf("\n"); continue; @@ -446,10 +438,10 @@ static void show_dev_detail(void) for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); - } else if (srci->key == SR_HWCAP_FILTER) { + } else if (srci->key == SR_CONF_FILTER) { /* Supported filters */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_FILTERS, + if (sr_config_list(sdi->driver, SR_CONF_FILTER, (const void **)&stropts, sdi) != SR_OK) { printf("\n"); continue; @@ -458,10 +450,10 @@ static void show_dev_detail(void) for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); - } else if (srci->key == SR_HWCAP_VDIV) { + } else if (srci->key == SR_CONF_VDIV) { /* Supported volts/div values */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_VDIVS, + if (sr_config_list(sdi->driver, SR_CONF_VDIV, (const void **)&rationals, sdi) != SR_OK) { printf("\n"); continue; @@ -470,10 +462,10 @@ static void show_dev_detail(void) for (i = 0; rationals[i].p && rationals[i].q; i++) printf(" %s\n", sr_voltage_string( &rationals[i])); - } else if (srci->key == SR_HWCAP_COUPLING) { + } else if (srci->key == SR_CONF_COUPLING) { /* Supported coupling settings */ printf(" %s", srci->id); - if (sr_info_get(sdi->driver, SR_DI_COUPLING, + if (sr_config_list(sdi->driver, SR_CONF_COUPLING, (const void **)&stropts, sdi) != SR_OK) { printf("\n"); continue; @@ -629,7 +621,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_DI_CUR_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,52 +632,13 @@ 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; for (l = meta->config; l; l = l->next) { src = l->data; switch (src->key) { - case SR_HWCAP_SAMPLERATE: + case SR_CONF_SAMPLERATE: samplerate = (uint64_t *)src->value; g_debug("cli: got samplerate %"PRIu64, *samplerate); break; @@ -746,7 +699,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 +772,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 +1183,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 +1284,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; @@ -1300,6 +1294,40 @@ static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) return SR_OK; } +static void set_options(void) +{ + struct sr_dev_inst *sdi; + GSList *devices; + GHashTable *devargs; + + if (!opt_dev) { + g_critical("No setting specified."); + return; + } + + if (!(devargs = parse_generic_arg(opt_dev, FALSE))) + return; + + if (!(devices = device_scan())) { + g_critical("No devices found."); + return; + } + sdi = devices->data; + + sr_session_new(); + if (sr_session_dev_add(sdi) != SR_OK) { + g_critical("Failed to use device."); + return; + } + + set_dev_options(sdi, devargs); + + sr_session_destroy(); + g_slist_free(devices); + g_hash_table_destroy(devargs); + +} + static int set_limit_time(const struct sr_dev_inst *sdi) { uint64_t time_msec; @@ -1312,8 +1340,8 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_LIMIT_MSEC)) { - if (sr_dev_config_set(sdi, SR_HWCAP_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 +1352,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_HWCAP_SAMPLERATE)) { - sr_info_get(sdi->driver, SR_DI_CUR_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 +1363,7 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sr_dev_config_set(sdi, SR_HWCAP_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 +1432,7 @@ static void run_session(void) } if (opt_continuous) { - if (!sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_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 +1448,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_HWCAP_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 +1458,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_HWCAP_LIMIT_FRAMES, + || (sr_config_set(sdi, SR_CONF_LIMIT_FRAMES, &limit_frames) != SR_OK)) { g_critical("Failed to configure frame limit."); sr_session_destroy(); @@ -1529,6 +1557,8 @@ int main(int argc, char **argv) show_dev_detail(); else if (opt_input_file) load_input_file(); + else if (opt_set) + set_options(); else if (opt_samples || opt_time || opt_frames || opt_continuous) run_session(); else