X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=main.c;h=b128c8800e2fca733db67aa77a5769338ba56f4c;hb=HEAD;hp=ff3225fd2b35aee03728911d8efbd1bda71fda24;hpb=6709a6946448e9178100e751803c0c5b58e3a396;p=sigrok-cli.git
diff --git a/main.c b/main.c
index ff3225f..b128c88 100644
--- a/main.c
+++ b/main.c
@@ -17,96 +17,16 @@
* along with this program. If not, see .
*/
-#include "sigrok-cli.h"
+#include
#include
#include
+#include "sigrok-cli.h"
struct sr_context *sr_ctx = NULL;
#ifdef HAVE_SRD
struct srd_session *srd_sess = NULL;
#endif
-static gboolean opt_version = FALSE;
-gint opt_loglevel = SR_LOG_WARN; /* Show errors+warnings by default. */
-static gboolean opt_scan_devs = FALSE;
-gboolean opt_wait_trigger = FALSE;
-gchar *opt_input_file = NULL;
-gchar *opt_output_file = NULL;
-gchar *opt_drv = NULL;
-gchar *opt_config = NULL;
-static gchar *opt_channels = NULL;
-gchar *opt_channel_group = NULL;
-gchar *opt_triggers = NULL;
-gchar *opt_pds = NULL;
-#ifdef HAVE_SRD
-static gchar *opt_pd_stack = NULL;
-static gchar *opt_pd_annotations = NULL;
-static gchar *opt_pd_meta = NULL;
-static gchar *opt_pd_binary = NULL;
-#endif
-gchar *opt_input_format = NULL;
-gchar *opt_output_format = NULL;
-static gchar *opt_show = NULL;
-gchar *opt_time = NULL;
-gchar *opt_samples = NULL;
-gchar *opt_frames = NULL;
-gchar *opt_continuous = NULL;
-static gchar *opt_set = NULL;
-
-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 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,
- "Input format", NULL},
- {"output-file", 'o', 0, G_OPTION_ARG_FILENAME, &opt_output_file,
- "Save output to file", NULL},
- {"output-format", 'O', 0, G_OPTION_ARG_STRING, &opt_output_format,
- "Output format", NULL},
- {"channels", 'C', 0, G_OPTION_ARG_STRING, &opt_channels,
- "Channels to use", NULL},
- {"channel-group", 'g', 0, G_OPTION_ARG_STRING, &opt_channel_group,
- "Channel groups", NULL},
- {"triggers", 't', 0, G_OPTION_ARG_STRING, &opt_triggers,
- "Trigger configuration", NULL},
- {"wait-trigger", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_trigger,
- "Wait for trigger", NULL},
-#ifdef HAVE_SRD
- {"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", NULL},
- {"protocol-decoder-annotations", 'A', 0, G_OPTION_ARG_STRING, &opt_pd_annotations,
- "Protocol decoder annotation(s) to show", NULL},
- {"protocol-decoder-meta", 'M', 0, G_OPTION_ARG_STRING, &opt_pd_meta,
- "Protocol decoder meta output to show", NULL},
- {"protocol-decoder-binary", 'B', 0, G_OPTION_ARG_STRING, &opt_pd_binary,
- "Protocol decoder binary output 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,
- "How long to sample (ms)", NULL},
- {"samples", 0, 0, G_OPTION_ARG_STRING, &opt_samples,
- "Number of samples to acquire", NULL},
- {"frames", 0, 0, G_OPTION_ARG_STRING, &opt_frames,
- "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}
-};
-
-
static void logger(const gchar *log_domain, GLogLevelFlags log_level,
const gchar *message, gpointer cb_data)
{
@@ -131,18 +51,20 @@ static void logger(const gchar *log_domain, GLogLevelFlags log_level,
int select_channels(struct sr_dev_inst *sdi)
{
struct sr_channel *ch;
- GSList *selected_channels, *l;
+ gboolean enabled;
+ GSList *selected_channels, *l, *channels;
+
+ channels = sr_dev_inst_channels_get(sdi);
if (opt_channels) {
if (!(selected_channels = parse_channelstring(sdi, opt_channels)))
return SR_ERR;
- for (l = sdi->channels; l; l = l->next) {
+ for (l = channels; l; l = l->next) {
ch = l->data;
- if (g_slist_find(selected_channels, ch))
- ch->enabled = TRUE;
- else
- ch->enabled = FALSE;
+ enabled = (g_slist_find(selected_channels, ch) != NULL);
+ if (sr_dev_channel_enable(ch, enabled) != SR_OK)
+ return SR_ERR;
}
g_slist_free(selected_channels);
}
@@ -152,56 +74,166 @@ int select_channels(struct sr_dev_inst *sdi)
return SR_OK;
}
+int maybe_config_get(struct sr_dev_driver *driver,
+ const struct sr_dev_inst *sdi, struct sr_channel_group *cg,
+ uint32_t key, GVariant **gvar)
+{
+ if (sr_dev_config_capabilities_list(sdi, cg, key) & SR_CONF_GET)
+ return sr_config_get(driver, sdi, cg, key, gvar);
+
+ return SR_ERR_NA;
+}
+
+int maybe_config_set(struct sr_dev_driver *driver,
+ const struct sr_dev_inst *sdi, struct sr_channel_group *cg,
+ uint32_t key, GVariant *gvar)
+{
+ (void)driver;
+
+ if (sr_dev_config_capabilities_list(sdi, cg, key) & SR_CONF_SET)
+ return sr_config_set(sdi, cg, key, gvar);
+
+ return SR_ERR_NA;
+}
+
+int maybe_config_list(struct sr_dev_driver *driver,
+ const struct sr_dev_inst *sdi, struct sr_channel_group *cg,
+ uint32_t key, GVariant **gvar)
+{
+ if (sr_dev_config_capabilities_list(sdi, cg, key) & SR_CONF_LIST)
+ return sr_config_list(driver, sdi, cg, key, gvar);
+
+ return SR_ERR_NA;
+}
+
+static void get_option(struct sr_dev_inst *sdi,
+ struct sr_channel_group *cg, const char *opt)
+{
+ struct sr_dev_driver *driver;
+ const struct sr_key_info *ci;
+ int ret;
+ GVariant *gvar;
+ const struct sr_key_info *srci, *srmqi, *srmqfi;
+ uint32_t mq;
+ uint64_t mask, mqflags;
+ unsigned int j;
+ char *s;
+
+ driver = sr_dev_inst_driver_get(sdi);
+
+ ci = sr_key_info_name_get(SR_KEY_CONFIG, opt);
+ if (!ci)
+ g_critical("Unknown option '%s'", opt);
+
+ ret = maybe_config_get(driver, sdi, cg, ci->key, &gvar);
+ if (ret != SR_OK)
+ g_critical("Failed to get '%s': %s", opt, sr_strerror(ret));
+
+ srci = sr_key_info_get(SR_KEY_CONFIG, ci->key);
+ if (srci && srci->datatype == SR_T_MQ) {
+ g_variant_get(gvar, "(ut)", &mq, &mqflags);
+ if ((srmqi = sr_key_info_get(SR_KEY_MQ, mq)))
+ printf("%s", srmqi->id);
+ else
+ printf("%d", mq);
+ for (j = 0, mask = 1; j < 32; j++, mask <<= 1) {
+ if (!(mqflags & mask))
+ continue;
+ if ((srmqfi = sr_key_info_get(SR_KEY_MQFLAGS, mqflags & mask)))
+ printf("/%s", srmqfi->id);
+ else
+ printf("/%" PRIu64, mqflags & mask);
+ }
+ printf("\n");
+ } else {
+ s = g_variant_print(gvar, FALSE);
+ printf("%s\n", s);
+ g_free(s);
+ }
+
+ g_variant_unref(gvar);
+}
+
+static void get_options(void)
+{
+ GSList *devices;
+ struct sr_dev_inst *sdi;
+ size_t get_idx;
+ char *get_text, *cg_name;
+ GHashTable *args;
+ GHashTableIter iter;
+ gpointer key, value;
+ struct sr_channel_group *cg;
+
+ /* Lookup and open the device. */
+ devices = device_scan();
+ if (!devices) {
+ g_critical("No devices found.");
+ return;
+ }
+ sdi = devices->data;
+ g_slist_free(devices);
+
+ if (sr_dev_open(sdi) != SR_OK) {
+ g_critical("Failed to open device.");
+ return;
+ }
+
+ /* Set configuration values when -c was specified. */
+ set_dev_options_array(sdi, opt_configs);
+
+ /* Get configuration values which were specified by --get. */
+ for (get_idx = 0; (get_text = opt_gets[get_idx]); get_idx++) {
+ args = parse_generic_arg(get_text, FALSE, "channel_group");
+ if (!args)
+ continue;
+ cg_name = g_hash_table_lookup(args, "sigrok_key");
+ cg = lookup_channel_group(sdi, cg_name);
+ g_hash_table_iter_init(&iter, args);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ if (g_ascii_strcasecmp(key, "sigrok_key") == 0)
+ continue;
+ get_option(sdi, cg, key);
+ }
+ }
+
+ /* Close the device. */
+ sr_dev_close(sdi);
+}
+
static void set_options(void)
{
struct sr_dev_inst *sdi;
GSList *devices;
- GHashTable *devargs;
- if (!opt_config) {
+ if (!opt_configs) {
g_critical("No setting specified.");
return;
}
- if (!(devargs = parse_generic_arg(opt_config, FALSE)))
- return;
-
if (!(devices = device_scan())) {
g_critical("No devices found.");
return;
}
sdi = devices->data;
+ g_slist_free(devices);
if (sr_dev_open(sdi) != SR_OK) {
g_critical("Failed to open device.");
return;
}
- set_dev_options(sdi, devargs);
+ set_dev_options_array(sdi, opt_configs);
sr_dev_close(sdi);
- g_slist_free(devices);
- g_hash_table_destroy(devargs);
-
}
int main(int argc, char **argv)
{
- GOptionContext *context;
- GError *error;
- int ret;
- char *help;
-
g_log_set_default_handler(logger, NULL);
- context = g_option_context_new(NULL);
- g_option_context_add_main_entries(context, optargs, NULL);
-
- ret = 1;
- error = NULL;
- if (!g_option_context_parse(context, &argc, &argv, &error)) {
- g_critical("%s", error->message);
- goto done;
+ if (parse_options(argc, argv)) {
+ return 1;
}
/* Set the loglevel (amount of messages to output) for libsigrok. */
@@ -212,6 +244,11 @@ int main(int argc, char **argv)
goto done;
#ifdef HAVE_SRD
+ if (opt_pd_binary && !opt_pds) {
+ g_critical("Option -B will not take effect in the absence of -P.");
+ goto done;
+ }
+
/* Set the loglevel (amount of messages to output) for libsigrokdecode. */
if (srd_log_loglevel_set(opt_loglevel) != SRD_OK)
goto done;
@@ -225,13 +262,13 @@ int main(int argc, char **argv)
}
if (register_pds(opt_pds, opt_pd_annotations) != 0)
goto done;
- if (setup_pd_stack(opt_pds, opt_pd_stack, opt_pd_annotations) != 0)
- goto done;
/* Only one output type is ever shown. */
if (opt_pd_binary) {
if (setup_pd_binary(opt_pd_binary) != 0)
goto done;
+ if (setup_binary_stdout() != 0)
+ goto done;
if (srd_pd_output_callback_add(srd_sess, SRD_OUTPUT_BINARY,
show_pd_binary, NULL) != SRD_OK)
goto done;
@@ -249,11 +286,24 @@ int main(int argc, char **argv)
show_pd_annotations, NULL) != SRD_OK)
goto done;
}
+ show_pd_prepare();
}
#endif
if (opt_version)
show_version();
+ else if (opt_list_supported)
+ show_supported();
+ else if (opt_list_supported_wiki)
+ show_supported_wiki();
+ else if (opt_input_file && opt_show)
+ load_input_file(TRUE);
+ else if (opt_input_format && opt_show)
+ show_input();
+ else if (opt_output_format && opt_show)
+ show_output();
+ else if (opt_transform_module && opt_show)
+ show_transform();
else if (opt_scan_devs)
show_dev_list();
#ifdef HAVE_SRD
@@ -263,29 +313,28 @@ int main(int argc, char **argv)
else if (opt_show)
show_dev_detail();
else if (opt_input_file)
- load_input_file();
+ load_input_file(FALSE);
+ else if (opt_gets)
+ get_options();
else if (opt_set)
set_options();
else if (opt_samples || opt_time || opt_frames || opt_continuous)
run_session();
- else {
- help = g_option_context_get_help(context, TRUE, NULL);
- printf("%s", help);
- g_free(help);
- }
+ else if (opt_list_serial)
+ show_serial_ports();
+ else
+ show_help();
#ifdef HAVE_SRD
+ if (opt_pds)
+ show_pd_close();
if (opt_pds)
srd_exit();
#endif
- ret = 0;
-
done:
if (sr_ctx)
sr_exit(sr_ctx);
- g_option_context_free(context);
-
- return ret;
+ return 0;
}