X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=sigrok-cli.c;h=16e0bee10becd77baa00a08c68853c6b127afb0d;hp=e96c67a463fac51fc119001b769f6bb15112fa48;hb=3d905bcc7cf67536f715b7abcf8f566015f325ef;hpb=cfd3ec6e659e099f3b83c4a9bbad98ae30b00739 diff --git a/sigrok-cli.c b/sigrok-cli.c index e96c67a..16e0bee 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -36,6 +36,8 @@ #define DEFAULT_OUTPUT_FORMAT "bits:width=64" +static struct sr_context *sr_ctx = NULL; + static uint64_t limit_samples = 0; static uint64_t limit_frames = 0; static struct sr_output_format *output_format = NULL; @@ -132,7 +134,6 @@ static GSList *hash_to_hwopt(GHashTable *hash) value = g_hash_table_lookup(hash, key); hwopt->value = g_strdup(value); opts = g_slist_append(opts, hwopt); - break; } g_list_free(keys); @@ -163,7 +164,7 @@ static GSList *device_scan(void) return NULL; } g_free(drvname); - if (sr_driver_init(driver) != SR_OK) { + if (sr_driver_init(sr_ctx, driver) != SR_OK) { g_critical("Failed to initialize driver."); return NULL; } @@ -179,7 +180,7 @@ static GSList *device_scan(void) drivers = sr_driver_list(); for (i = 0; drivers[i]; i++) { driver = drivers[i]; - if (sr_driver_init(driver) != SR_OK) { + if (sr_driver_init(sr_ctx, driver) != SR_OK) { g_critical("Failed to initialize driver."); return NULL; } @@ -245,6 +246,8 @@ static void show_version(void) static void print_dev_line(const struct sr_dev_inst *sdi) { + struct sr_probe *probe; + GSList *l; if (sdi->vendor && sdi->vendor[0]) printf("%s ", sdi->vendor); @@ -252,8 +255,18 @@ static void print_dev_line(const struct sr_dev_inst *sdi) printf("%s ", sdi->model); if (sdi->version && sdi->version[0]) printf("%s ", sdi->version); - if (sdi->probes) - printf("with %d probes", g_slist_length(sdi->probes)); + if (sdi->probes) { + if (g_slist_length(sdi->probes) == 1) { + probe = sdi->probes->data; + printf("with 1 probe: %s", probe->name); + } else { + printf("with %d probes:", g_slist_length(sdi->probes)); + for (l = sdi->probes; l; l = l->next) { + probe = l->data; + printf(" %s", probe->name); + } + } + } printf("\n"); } @@ -527,7 +540,7 @@ static void show_pd_detail(void) } static void datafeed_in(const struct sr_dev_inst *sdi, - struct sr_datafeed_packet *packet) + const struct sr_datafeed_packet *packet) { static struct sr_output *o = NULL; static int logic_probelist[SR_MAX_NUM_PROBES] = { -1 }; @@ -538,14 +551,15 @@ static void datafeed_in(const struct sr_dev_inst *sdi, static FILE *outfile = NULL; static int num_analog_probes = 0; struct sr_probe *probe; - struct sr_datafeed_logic *logic; - struct sr_datafeed_meta_logic *meta_logic; - struct sr_datafeed_analog *analog; - struct sr_datafeed_meta_analog *meta_analog; + const struct sr_datafeed_logic *logic; + const struct sr_datafeed_meta_logic *meta_logic; + const struct sr_datafeed_analog *analog; + const struct sr_datafeed_meta_analog *meta_analog; static int num_enabled_analog_probes = 0; int num_enabled_probes, sample_size, ret, i; uint64_t output_len, filter_out_len; uint8_t *output_buf, *filter_out; + GString *out; /* If the first packet to come in isn't a header, don't even try. */ if (packet->type != SR_DF_HEADER && o == NULL) @@ -594,6 +608,9 @@ static void datafeed_in(const struct sr_dev_inst *sdi, received_samples); if (outfile && outfile != stdout) fclose(outfile); + + if (o->format->cleanup) + o->format->cleanup(o); g_free(o); o = NULL; break; @@ -784,6 +801,14 @@ static void datafeed_in(const struct sr_dev_inst *sdi, g_message("received unknown packet type %d", packet->type); } + if (o && o->format->recv) { + out = o->format->recv(o, sdi, packet); + if (out && out->len) { + fwrite(out->str, 1, out->len, outfile); + fflush(outfile); + } + } + } /* Register the given PDs for this session. @@ -798,7 +823,6 @@ static int register_pds(struct sr_dev *dev, const char *pdstring) int ret; char **pdtokens, **pdtok, *pd_name; - /* Avoid compiler warnings. */ (void)dev; ret = 0; @@ -1039,31 +1063,23 @@ void show_pd_annotations(struct srd_proto_data *pdata, void *cb_data) static int select_probes(struct sr_dev_inst *sdi) { - char **probelist; - int max_probes, i; + struct sr_probe *probe; + GSList *selected_probes, *l; if (!opt_probes) return SR_OK; - /* - * This only works because a device by default initializes - * and enables all its probes. - */ - max_probes = g_slist_length(sdi->probes); - probelist = parse_probestring(max_probes, opt_probes); - if (!probelist) { + if (!(selected_probes = parse_probestring(sdi, opt_probes))) return SR_ERR; - } - for (i = 0; i < max_probes; i++) { - if (probelist[i]) { - sr_dev_probe_name_set(sdi, i, probelist[i]); - g_free(probelist[i]); - } else { - sr_dev_probe_enable(sdi, i, FALSE); - } + for (l = sdi->probes; l; l = l->next) { + probe = l->data; + if (g_slist_find(selected_probes, probe)) + probe->enabled = TRUE; + else + probe->enabled = FALSE; } - g_free(probelist); + g_slist_free(selected_probes); return SR_OK; } @@ -1267,7 +1283,7 @@ static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) ret = SR_ERR; } if (val) - ret = sdi->driver->dev_config_set(sdi, hwo->hwcap, val); + ret = sr_dev_config_set(sdi, hwo->hwcap, val); if (ret != SR_OK) { g_critical("Failed to set device option '%s'.", (char *)key); return ret; @@ -1292,8 +1308,7 @@ static int set_limit_time(const struct sr_dev_inst *sdi) } if (sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_LIMIT_MSEC)) { - if (sdi->driver->dev_config_set(sdi, - SR_HWCAP_LIMIT_MSEC, &time_msec) != SR_OK) { + if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_MSEC, &time_msec) != SR_OK) { g_critical("Failed to configure time limit."); sr_session_destroy(); return SR_ERR; @@ -1315,8 +1330,8 @@ static int set_limit_time(const struct sr_dev_inst *sdi) return SR_ERR; } - if (sdi->driver->dev_config_set(sdi, - SR_HWCAP_LIMIT_SAMPLES, &limit_samples) != SR_OK) { + if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES, + &limit_samples) != SR_OK) { g_critical("Failed to configure time-based sample limit."); sr_session_destroy(); return SR_ERR; @@ -1348,6 +1363,12 @@ static void run_session(void) sr_session_new(); sr_session_datafeed_callback_add(datafeed_in); + if (sr_session_dev_add(sdi) != SR_OK) { + g_critical("Failed to use device."); + sr_session_destroy(); + return; + } + if (opt_dev) { if ((devargs = parse_generic_arg(opt_dev, FALSE))) { if (set_dev_options(sdi, devargs) != SR_OK) @@ -1356,12 +1377,6 @@ static void run_session(void) } } - 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(); @@ -1383,13 +1398,6 @@ static void run_session(void) g_free(triggerlist); } - 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 (opt_continuous) { if (!sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_CONTINUOUS)) { g_critical("This device does not support continuous sampling."); @@ -1407,7 +1415,7 @@ static void run_session(void) if (opt_samples) { if ((sr_parse_sizestring(opt_samples, &limit_samples) != SR_OK) - || (sdi->driver->dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES, + || (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES, &limit_samples) != SR_OK)) { g_critical("Failed to configure sample limit."); sr_session_destroy(); @@ -1417,8 +1425,8 @@ static void run_session(void) if (opt_frames) { if ((sr_parse_sizestring(opt_frames, &limit_frames) != SR_OK) - || (sdi->driver->dev_config_set(sdi, - SR_HWCAP_LIMIT_FRAMES, &limit_frames) != SR_OK)) { + || (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_FRAMES, + &limit_frames) != SR_OK)) { g_critical("Failed to configure frame limit."); sr_session_destroy(); return; @@ -1451,7 +1459,6 @@ static void run_session(void) static void logger(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer cb_data) { - /* Avoid compiler warnings. */ (void)log_domain; (void)cb_data; @@ -1468,6 +1475,7 @@ static void logger(const gchar *log_domain, GLogLevelFlags log_level, int main(int argc, char **argv) { + int ret = 1; GOptionContext *context; GError *error; @@ -1479,45 +1487,45 @@ int main(int argc, char **argv) if (!g_option_context_parse(context, &argc, &argv, &error)) { g_critical("%s", error->message); - return 1; + goto done; } /* Set the loglevel (amount of messages to output) for libsigrok. */ if (sr_log_loglevel_set(opt_loglevel) != SR_OK) - return 1; + goto done; /* Set the loglevel (amount of messages to output) for libsigrokdecode. */ if (srd_log_loglevel_set(opt_loglevel) != SRD_OK) - return 1; + goto done; - if (sr_init() != SR_OK) - return 1; + if (sr_init(&sr_ctx) != SR_OK) + goto done; if (opt_pds) { if (srd_init(NULL) != SRD_OK) - return 1; + goto done; if (register_pds(NULL, opt_pds) != 0) - return 1; + goto done; if (srd_pd_output_callback_add(SRD_OUTPUT_ANN, show_pd_annotations, NULL) != SRD_OK) - return 1; + goto done; if (setup_pd_stack() != 0) - return 1; + goto done; if (setup_pd_annotations() != 0) - return 1; + goto done; } if (setup_output_format() != 0) - return 1; + goto done; if (opt_version) show_version(); else if (opt_list_devs) show_dev_list(); + else if (opt_pds && opt_show) + show_pd_detail(); else if (opt_show) show_dev_detail(); - else if (opt_pds) - show_pd_detail(); else if (opt_input_file) load_input_file(); else if (opt_samples || opt_time || opt_frames || opt_continuous) @@ -1528,8 +1536,13 @@ int main(int argc, char **argv) if (opt_pds) srd_exit(); + ret = 0; + +done: + if (sr_ctx) + sr_exit(sr_ctx); + g_option_context_free(context); - sr_exit(); - return 0; + return ret; }