X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=sigrok-cli.c;h=92ce7ea64aa961a8bd9c7fa77f8c281d8e0f3480;hp=a37b19d515890f4fd94b81d60e00ed4dba7dbd8a;hb=efdb6a22b4d357006d0fe6c4b88e1980dc805d9b;hpb=630293b49d7645f2525ac5addad37c1f9315d2ce diff --git a/sigrok-cli.c b/sigrok-cli.c index a37b19d..92ce7ea 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -19,7 +19,7 @@ #include "config.h" #ifdef HAVE_SRD -#include /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#include /* First, so we avoid a _POSIX_C_SOURCE warning. */ #endif #include #include @@ -52,12 +52,12 @@ static GByteArray *savebuf; static gboolean opt_version = FALSE; static gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings per default. */ -static gboolean opt_list_devs = FALSE; +static gboolean opt_scan_devs = FALSE; static gboolean opt_wait_trigger = FALSE; static gchar *opt_input_file = NULL; static gchar *opt_output_file = NULL; static gchar *opt_drv = NULL; -static gchar *opt_dev = NULL; +static gchar *opt_config = NULL; static gchar *opt_probes = NULL; static gchar *opt_triggers = NULL; static gchar *opt_pds = NULL; @@ -78,13 +78,11 @@ static GOptionEntry optargs[] = { {"version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, "Show version and support list", NULL}, {"loglevel", 'l', 0, G_OPTION_ARG_INT, &opt_loglevel, - "Set libsigrok/libsigrokdecode loglevel", NULL}, - {"list-devices", 'D', 0, G_OPTION_ARG_NONE, &opt_list_devs, - "Scan for devices", NULL}, - {"driver", 0, 0, G_OPTION_ARG_STRING, &opt_drv, - "Use only this driver", NULL}, - {"device", 'd', 0, G_OPTION_ARG_STRING, &opt_dev, - "Use specified device", NULL}, + "Set loglevel (5 is most verbose)", NULL}, + {"driver", 'd', 0, G_OPTION_ARG_STRING, &opt_drv, + "The driver to use", NULL}, + {"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config, + "Specify device configuration options", NULL}, {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, &opt_input_file, "Load input from file", NULL}, {"input-format", 'I', 0, G_OPTION_ARG_STRING, &opt_input_format, @@ -100,13 +98,15 @@ static GOptionEntry optargs[] = { {"wait-trigger", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_trigger, "Wait for trigger", NULL}, #ifdef HAVE_SRD - {"protocol-decoders", 'a', 0, G_OPTION_ARG_STRING, &opt_pds, + {"protocol-decoders", 'P', 0, G_OPTION_ARG_STRING, &opt_pds, "Protocol decoders to run", NULL}, - {"protocol-decoder-stack", 's', 0, G_OPTION_ARG_STRING, &opt_pd_stack, + {"protocol-decoder-stack", 'S', 0, G_OPTION_ARG_STRING, &opt_pd_stack, "Protocol decoder stack", NULL}, {"protocol-decoder-annotations", 'A', 0, G_OPTION_ARG_STRING, &opt_pd_annotations, "Protocol decoder annotation(s) to show", NULL}, #endif + {"scan", 0, 0, G_OPTION_ARG_NONE, &opt_scan_devs, + "Scan for devices", NULL}, {"show", 0, 0, G_OPTION_ARG_NONE, &opt_show, "Show device detail", NULL}, {"time", 0, 0, G_OPTION_ARG_STRING, &opt_time, @@ -344,18 +344,15 @@ static void show_dev_detail(void) num_devices = g_slist_length(devices); if (num_devices > 1) { g_critical("%d devices found. Use --list-devices to show them, " - "and --device to select one.", num_devices); + "and select one to show.", num_devices); return; } sdi = devices->data; print_dev_line(sdi); - /* This properly opens and initializes the device, so we can get - * current settings. */ - sr_session_new(); - if (sr_session_dev_add(sdi) != SR_OK) { - g_critical("Failed to use device."); + if (sr_dev_open(sdi) != SR_OK) { + g_critical("Failed to open device."); return; } @@ -546,7 +543,6 @@ static void show_dev_detail(void) g_variant_unref(gvar); } else if (srci->key == SR_CONF_DATALOG) { - /* TODO test */ /* Turning on/off internal data logging. */ printf(" %s\t(on/off", srci->id); if (sr_config_get(sdi->driver, SR_CONF_DATALOG, @@ -563,7 +559,7 @@ static void show_dev_detail(void) } g_variant_unref(gvar_opts); - sr_session_destroy(); + sr_dev_close(sdi); } @@ -875,15 +871,15 @@ static void datafeed_in(const struct sr_dev_inst *sdi, break; } - if (o && o->format->recv) { - out = o->format->recv(o, sdi, packet); - if (out && out->len) { + if (o && o->format->receive) { + if (o->format->receive(o, sdi, packet, &out) == SR_OK && out) { fwrite(out->str, 1, out->len, outfile); fflush(outfile); + g_string_free(out, TRUE); } } - /* SR_DF_END needs to be handled after the output module's recv() + /* SR_DF_END needs to be handled after the output module's receive() * is called, so it can properly clean up that module etc. */ if (packet->type == SR_DF_END) { g_debug("cli: Received SR_DF_END"); @@ -1517,12 +1513,12 @@ static void set_options(void) GSList *devices; GHashTable *devargs; - if (!opt_dev) { + if (!opt_config) { g_critical("No setting specified."); return; } - if (!(devargs = parse_generic_arg(opt_dev, FALSE))) + if (!(devargs = parse_generic_arg(opt_config, FALSE))) return; if (!(devices = device_scan())) { @@ -1531,15 +1527,14 @@ static void set_options(void) } sdi = devices->data; - sr_session_new(); - if (sr_session_dev_add(sdi) != SR_OK) { - g_critical("Failed to use device."); + if (sr_dev_open(sdi) != SR_OK) { + g_critical("Failed to open device."); return; } set_dev_options(sdi, devargs); - sr_session_destroy(); + sr_dev_close(sdi); g_slist_free(devices); g_hash_table_destroy(devargs); @@ -1608,14 +1603,19 @@ static void run_session(void) sr_session_new(); sr_session_datafeed_callback_add(datafeed_in, NULL); + if (sr_dev_open(sdi) != SR_OK) { + g_critical("Failed to open device."); + return; + } + if (sr_session_dev_add(sdi) != SR_OK) { - g_critical("Failed to use device."); + g_critical("Failed to add device to session."); sr_session_destroy(); return; } - if (opt_dev) { - if ((devargs = parse_generic_arg(opt_dev, FALSE))) { + if (opt_config) { + if ((devargs = parse_generic_arg(opt_config, FALSE))) { if (set_dev_options(sdi, devargs) != SR_OK) return; g_hash_table_destroy(devargs); @@ -1771,7 +1771,7 @@ int main(int argc, char **argv) if (opt_version) show_version(); - else if (opt_list_devs) + else if (opt_scan_devs) show_dev_list(); #ifdef HAVE_SRD else if (opt_pds && opt_show)