X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=sigrok-cli.c;h=aeffeaa8d42f659aac62fde3d31d642e175cc138;hp=f54828265508449f920cd7977610574e719724ed;hb=11b62b6f90e9c65beb1b6880c7e254551e296ae2;hpb=491e882048295442b38bb4c24d830302a23c0b70 diff --git a/sigrok-cli.c b/sigrok-cli.c index f548282..aeffeaa 100644 --- a/sigrok-cli.c +++ b/sigrok-cli.c @@ -36,9 +36,6 @@ #define DEFAULT_OUTPUT_FORMAT "bits:width=64" -extern struct sr_hwcap_option sr_drvopts[]; -extern struct sr_hwcap_option sr_hwcap_options[]; - static uint64_t limit_samples = 0; static uint64_t limit_frames = 0; static struct sr_output_format *output_format = NULL; @@ -116,7 +113,7 @@ static GOptionEntry optargs[] = { /* Convert driver options hash to GSList of struct sr_hwopt. */ static GSList *hash_to_hwopt(GHashTable *hash) { - struct sr_hwcap_option *ho; + const struct sr_hwcap_option *hwo; struct sr_hwopt *hwopt; GList *gl, *keys; GSList *opts; @@ -126,20 +123,15 @@ static GSList *hash_to_hwopt(GHashTable *hash) opts = NULL; for (gl = keys; gl; gl = gl->next) { key = gl->data; - for (ho = sr_drvopts; ho->shortname; ho++) { - if (!strcmp(key, ho->shortname)) { - hwopt = g_try_malloc(sizeof(struct sr_hwopt)); - hwopt->hwopt = ho->hwcap; - value = g_hash_table_lookup(hash, key); - hwopt->value = g_strdup(value); - opts = g_slist_append(opts, hwopt); - break; - } - } - if (!ho->shortname) { + if (!(hwo = sr_drvopt_name_get(key))) { g_critical("Unknown option %s", key); return NULL; } + hwopt = g_try_malloc(sizeof(struct sr_hwopt)); + hwopt->hwopt = hwo->hwcap; + value = g_hash_table_lookup(hash, key); + hwopt->value = g_strdup(value); + opts = g_slist_append(opts, hwopt); } g_list_free(keys); @@ -252,6 +244,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); @@ -259,9 +253,19 @@ 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)); - printf("\n"); + if (sdi->probes) { + if (g_slist_length(sdi->probes) == 1) { + probe = sdi->probes->data; + printf("with 1 probe: %s\n", probe->name); + } else { + printf("with %d probes:\n", g_slist_length(sdi->probes)); + for (l = sdi->probes; l; l = l->next) { + probe = l->data; + printf(" %s\n", probe->name); + } + } + } else + printf("\n"); } static void show_dev_list(void) @@ -346,7 +350,7 @@ static void show_dev_detail(void) return; for (cap = 0; hwcaps[cap]; cap++) { - if (!(hwo = sr_hw_hwcap_get(hwcaps[cap]))) + if (!(hwo = sr_devopt_get(hwcaps[cap]))) continue; if (title) { @@ -553,6 +557,7 @@ static void datafeed_in(const struct sr_dev_inst *sdi, 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) @@ -601,6 +606,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; @@ -791,6 +799,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. @@ -1143,7 +1159,7 @@ static void load_input_file_format(void) char *fmtspec = NULL; if (opt_input_format) { - fmtargs = parse_generic_arg(opt_input_format); + fmtargs = parse_generic_arg(opt_input_format, TRUE); fmtspec = g_hash_table_lookup(fmtargs, "sigrok_key"); } @@ -1152,7 +1168,7 @@ static void load_input_file_format(void) /* The exact cause was already logged. */ return; } -; + if (fmtargs) g_hash_table_remove(fmtargs, "sigrok_key"); @@ -1216,77 +1232,71 @@ static void load_input_file(void) static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args) { + const struct sr_hwcap_option *hwo; GHashTableIter iter; gpointer key, value; - int ret, i; + int ret; float tmp_float; uint64_t tmp_u64; struct sr_rational tmp_rat; gboolean tmp_bool; - gboolean found; void *val; g_hash_table_iter_init(&iter, args); while (g_hash_table_iter_next(&iter, &key, &value)) { - found = FALSE; - for (i = 0; sr_hwcap_options[i].hwcap; i++) { - if (strcmp(sr_hwcap_options[i].shortname, key)) - continue; - if ((value == NULL) && - (sr_hwcap_options[i].type != SR_T_BOOL)) { - g_critical("Option '%s' needs a value.", (char *)key); - return SR_ERR; - } - found = TRUE; - val = NULL; - switch (sr_hwcap_options[i].type) { - case SR_T_UINT64: - ret = sr_parse_sizestring(value, &tmp_u64); - if (ret != SR_OK) - break; - val = &tmp_u64; - break; - case SR_T_CHAR: - val = value; - break; - case SR_T_BOOL: - if (!value) - tmp_bool = TRUE; - else - tmp_bool = sr_parse_boolstring(value); - val = &tmp_bool; - break; - case SR_T_FLOAT: - tmp_float = strtof(value, NULL); - val = &tmp_float; - break; - case SR_T_RATIONAL_PERIOD: - if ((ret = sr_parse_period(value, &tmp_rat)) != SR_OK) - break; - val = &tmp_rat; - break; - case SR_T_RATIONAL_VOLT: - if ((ret = sr_parse_voltage(value, &tmp_rat)) != SR_OK) - break; - val = &tmp_rat; + if (!(hwo = sr_devopt_name_get(key))) { + g_critical("Unknown device option '%s'.", (char *) key); + return SR_ERR; + } + + if ((value == NULL) && + (hwo->type != SR_T_BOOL)) { + g_critical("Option '%s' needs a value.", (char *)key); + return SR_ERR; + } + val = NULL; + switch (hwo->type) { + case SR_T_UINT64: + ret = sr_parse_sizestring(value, &tmp_u64); + if (ret != SR_OK) break; - default: - ret = SR_ERR; - } - if (val) - ret = sdi->driver->dev_config_set(sdi, - sr_hwcap_options[i].hwcap, val); - if (ret != SR_OK) { - g_critical("Failed to set device option '%s'.", (char *)key); - return ret; - } + val = &tmp_u64; + break; + case SR_T_CHAR: + val = value; + break; + case SR_T_BOOL: + if (!value) + tmp_bool = TRUE; else + tmp_bool = sr_parse_boolstring(value); + val = &tmp_bool; + break; + case SR_T_FLOAT: + tmp_float = strtof(value, NULL); + val = &tmp_float; + break; + case SR_T_RATIONAL_PERIOD: + if ((ret = sr_parse_period(value, &tmp_rat)) != SR_OK) break; + val = &tmp_rat; + break; + case SR_T_RATIONAL_VOLT: + if ((ret = sr_parse_voltage(value, &tmp_rat)) != SR_OK) + break; + val = &tmp_rat; + break; + default: + ret = SR_ERR; } - if (!found) { - g_critical("Unknown device option '%s'.", (char *) key); - return SR_ERR; + if (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; } + else + break; } return SR_OK; @@ -1305,8 +1315,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; @@ -1328,8 +1337,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; @@ -1361,6 +1370,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) @@ -1369,12 +1384,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(); @@ -1396,13 +1405,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."); @@ -1420,7 +1422,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(); @@ -1430,8 +1432,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; @@ -1527,10 +1529,10 @@ int main(int argc, char **argv) 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)