/** * Prints out the state of the device as we currently know it. * * @param config This is the scope configuration. * @param state The current scope state to print. */ static void scope_state_dump(const struct scope_config *config, struct scope_state *state) { unsigned int i; char *tmp; for (i = 0; i < config->analog_channels; i++) { tmp = sr_voltage_string(dlm_vdivs[state->analog_states[i].vdiv][0], dlm_vdivs[state->analog_states[i].vdiv][1]); sr_info("State of analog channel %d -> %s : %s (coupling) %s (vdiv) %2.2e (offset)", i + 1, state->analog_states[i].state ? "On" : "Off", (*config->coupling_options)[state->analog_states[i].coupling], tmp, state->analog_states[i].vertical_offset); } for (i = 0; i < config->digital_channels; i++) { sr_info("State of digital channel %d -> %s", i, state->digital_states[i] ? "On" : "Off"); } for (i = 0; i < config->pods; i++) { sr_info("State of digital POD %d -> %s", i, state->pod_states[i] ? "On" : "Off"); } tmp = sr_period_string(dlm_timebases[state->timebase][0] * dlm_timebases[state->timebase][1]); sr_info("Current timebase: %s", tmp); g_free(tmp); tmp = sr_samplerate_string(state->sample_rate); sr_info("Current samplerate: %s", tmp); g_free(tmp); sr_info("Current samples per acquisition (i.e. frame): %d", state->samples_per_frame); sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)", (*config->trigger_sources)[state->trigger_source], dlm_trigger_slopes[state->trigger_slope], state->horiz_triggerpos); }
QString DeviceOptions::print_timebase(GVariant *const gvar) { uint64_t p, q; g_variant_get(gvar, "(tt)", &p, &q); return QString::fromUtf8(sr_period_string(p * q)); }
void show_dev_detail(void) { struct sr_dev_inst *sdi; const struct sr_config_info *srci; struct sr_channel *ch; struct sr_channel_group *channel_group, *cg; GSList *devices, *cgl, *chl; GVariant *gvar_opts, *gvar_dict, *gvar_list, *gvar; gsize num_opts, num_elements; double dlow, dhigh, dcur_low, dcur_high; const uint64_t *uint64, p, q, low, high; uint64_t cur_low, cur_high; const int32_t *int32, *opts; unsigned int num_devices, o, i; char *tmp_str; char *s, c; const char **stropts; if (!(devices = device_scan())) { g_critical("No devices found."); return; } num_devices = g_slist_length(devices); if (num_devices > 1) { g_critical("%d devices found. Use --scan to show them, " "and select one to show.", num_devices); return; } sdi = devices->data; print_dev_line(sdi); if (sr_dev_open(sdi) != SR_OK) { g_critical("Failed to open device."); return; } if ((sr_config_list(sdi->driver, NULL, NULL, SR_CONF_SCAN_OPTIONS, &gvar_opts) == SR_OK)) { opts = g_variant_get_fixed_array(gvar_opts, &num_elements, sizeof(int32_t)); printf("Supported driver options:\n"); for (i = 0; i < num_elements; i++) { if (!(srci = sr_config_info_get(opts[i]))) continue; printf(" %s\n", srci->id); } g_variant_unref(gvar_opts); } /* Selected channels and channel group may affect which options are * returned, or which values for them. */ select_channels(sdi); channel_group = select_channel_group(sdi); if ((sr_config_list(sdi->driver, sdi, channel_group, SR_CONF_DEVICE_OPTIONS, &gvar_opts)) != SR_OK) /* Driver supports no device instance options. */ return; if (sdi->channel_groups) { printf("Channel groups:\n"); for (cgl = sdi->channel_groups; cgl; cgl = cgl->next) { cg = cgl->data; printf(" %s: channel%s", cg->name, g_slist_length(cg->channels) > 1 ? "s" : ""); for (chl = cg->channels; chl; chl = chl->next) { ch = chl->data; printf(" %s", ch->name); } printf("\n"); } } printf("Supported configuration options"); if (sdi->channel_groups) { if (!channel_group) printf(" across all channel groups"); else printf(" on channel group %s", channel_group->name); } printf(":\n"); opts = g_variant_get_fixed_array(gvar_opts, &num_opts, sizeof(int32_t)); for (o = 0; o < num_opts; o++) { if (!(srci = sr_config_info_get(opts[o]))) continue; if (srci->key == SR_CONF_TRIGGER_MATCH) { if (sr_config_list(sdi->driver, sdi, channel_group, srci->key, &gvar_list) != SR_OK) { printf("\n"); continue; } int32 = g_variant_get_fixed_array(gvar_list, &num_elements, sizeof(int32_t)); printf(" Supported triggers: "); for (i = 0; i < num_elements; i++) { switch(int32[i]) { case SR_TRIGGER_ZERO: c = '0'; break; case SR_TRIGGER_ONE: c = '1'; break; case SR_TRIGGER_RISING: c = 'r'; break; case SR_TRIGGER_FALLING: c = 'f'; break; case SR_TRIGGER_EDGE: c = 'e'; break; case SR_TRIGGER_OVER: c = 'o'; break; case SR_TRIGGER_UNDER: c = 'u'; break; default: c = 0; break; } if (c) printf("%c ", c); } printf("\n"); g_variant_unref(gvar_list); } else if (srci->key == SR_CONF_LIMIT_SAMPLES) { /* If implemented in config_list(), this denotes the * maximum number of samples a device can send. This * really applies only to logic analyzers, and then * only to those that don't support compression, or * have it turned off by default. The values returned * are the low/high limits. */ if (sr_config_list(sdi->driver, sdi, channel_group, srci->key, &gvar) != SR_OK) { continue; } g_variant_get(gvar, "(tt)", &low, &high); g_variant_unref(gvar); printf(" Maximum number of samples: %"PRIu64"\n", high); } else if (srci->key == SR_CONF_SAMPLERATE) { /* Supported samplerates */ printf(" %s", srci->id); if (sr_config_list(sdi->driver, sdi, channel_group, SR_CONF_SAMPLERATE, &gvar_dict) != SR_OK) { printf("\n"); continue; } if ((gvar_list = g_variant_lookup_value(gvar_dict, "samplerates", G_VARIANT_TYPE("at")))) { uint64 = g_variant_get_fixed_array(gvar_list, &num_elements, sizeof(uint64_t)); printf(" - supported samplerates:\n"); for (i = 0; i < num_elements; i++) { if (!(s = sr_samplerate_string(uint64[i]))) continue; printf(" %s\n", s); g_free(s); } g_variant_unref(gvar_list); } else if ((gvar_list = g_variant_lookup_value(gvar_dict, "samplerate-steps", G_VARIANT_TYPE("at")))) { uint64 = g_variant_get_fixed_array(gvar_list, &num_elements, sizeof(uint64_t)); /* low */ if (!(s = sr_samplerate_string(uint64[0]))) continue; printf(" (%s", s); g_free(s); /* high */ if (!(s = sr_samplerate_string(uint64[1]))) continue; printf(" - %s", s); g_free(s); /* step */ if (!(s = sr_samplerate_string(uint64[2]))) continue; printf(" in steps of %s)\n", s); g_free(s); g_variant_unref(gvar_list); } g_variant_unref(gvar_dict); } else if (srci->key == SR_CONF_BUFFERSIZE) { /* Supported buffer sizes */ printf(" %s", srci->id); if (sr_config_list(sdi->driver, sdi, channel_group, SR_CONF_BUFFERSIZE, &gvar_list) != SR_OK) { printf("\n"); continue; } uint64 = g_variant_get_fixed_array(gvar_list, &num_elements, sizeof(uint64_t)); printf(" - supported buffer sizes:\n"); for (i = 0; i < num_elements; i++) printf(" %"PRIu64"\n", uint64[i]); g_variant_unref(gvar_list); } else if (srci->key == SR_CONF_TIMEBASE) { /* Supported time bases */ printf(" %s", srci->id); if (sr_config_list(sdi->driver, sdi, channel_group, SR_CONF_TIMEBASE, &gvar_list) != SR_OK) { printf("\n"); continue; } printf(" - supported time bases:\n"); num_elements = g_variant_n_children(gvar_list); for (i = 0; i < num_elements; i++) { gvar = g_variant_get_child_value(gvar_list, i); g_variant_get(gvar, "(tt)", &p, &q); s = sr_period_string(p * q); printf(" %s\n", s); g_free(s); } g_variant_unref(gvar_list); } else if (srci->key == SR_CONF_VDIV) { /* Supported volts/div values */ printf(" %s", srci->id); if (sr_config_list(sdi->driver, sdi, channel_group, SR_CONF_VDIV, &gvar_list) != SR_OK) { printf("\n"); continue; } printf(" - supported volts/div:\n"); num_elements = g_variant_n_children(gvar_list); for (i = 0; i < num_elements; i++) { gvar = g_variant_get_child_value(gvar_list, i); g_variant_get(gvar, "(tt)", &p, &q); s = sr_voltage_string(p, q); printf(" %s\n", s); g_free(s); } g_variant_unref(gvar_list); } else if (srci->datatype == SR_T_STRING) { printf(" %s: ", srci->id); if (sr_config_get(sdi->driver, sdi, channel_group, srci->key, &gvar) == SR_OK) { tmp_str = g_strdup(g_variant_get_string(gvar, NULL)); g_variant_unref(gvar); } else tmp_str = NULL; if (sr_config_list(sdi->driver, sdi, channel_group, srci->key, &gvar) != SR_OK) { printf("\n"); continue; } stropts = g_variant_get_strv(gvar, &num_elements); for (i = 0; i < num_elements; i++) { if (i) printf(", "); printf("%s", stropts[i]); if (tmp_str && !strcmp(tmp_str, stropts[i])) printf(" (current)"); } printf("\n"); g_free(stropts); g_free(tmp_str); g_variant_unref(gvar); } else if (srci->datatype == SR_T_UINT64_RANGE) { printf(" %s: ", srci->id); if (sr_config_list(sdi->driver, sdi, channel_group, srci->key, &gvar_list) != SR_OK) { printf("\n"); continue; } if (sr_config_get(sdi->driver, sdi, NULL, srci->key, &gvar) == SR_OK) { g_variant_get(gvar, "(tt)", &cur_low, &cur_high); g_variant_unref(gvar); } else { cur_low = 0; cur_high = 0; } num_elements = g_variant_n_children(gvar_list); for (i = 0; i < num_elements; i++) { gvar = g_variant_get_child_value(gvar_list, i); g_variant_get(gvar, "(tt)", &low, &high); g_variant_unref(gvar); if (i) printf(", "); printf("%"PRIu64"-%"PRIu64, low, high); if (low == cur_low && high == cur_high) printf(" (current)"); } printf("\n"); g_variant_unref(gvar_list); } else if (srci->datatype == SR_T_BOOL) { printf(" %s: ", srci->id); if (sr_config_get(sdi->driver, sdi, NULL, srci->key, &gvar) == SR_OK) { if (g_variant_get_boolean(gvar)) printf("on (current), off\n"); else printf("on, off (current)\n"); g_variant_unref(gvar); } else printf("on, off\n"); } else if (srci->datatype == SR_T_DOUBLE_RANGE) { printf(" %s: ", srci->id); if (sr_config_list(sdi->driver, sdi, channel_group, srci->key, &gvar_list) != SR_OK) { printf("\n"); continue; } if (sr_config_get(sdi->driver, sdi, NULL, srci->key, &gvar) == SR_OK) { g_variant_get(gvar, "(dd)", &dcur_low, &dcur_high); g_variant_unref(gvar); } else { dcur_low = 0; dcur_high = 0; } num_elements = g_variant_n_children(gvar_list); for (i = 0; i < num_elements; i++) { gvar = g_variant_get_child_value(gvar_list, i); g_variant_get(gvar, "(dd)", &dlow, &dhigh); g_variant_unref(gvar); if (i) printf(", "); printf("%.1f-%.1f", dlow, dhigh); if (dlow == dcur_low && dhigh == dcur_high) printf(" (current)"); } printf("\n"); g_variant_unref(gvar_list); } else { /* Everything else */ printf(" %s\n", srci->id); } } g_variant_unref(gvar_opts); sr_dev_close(sdi); g_slist_free(devices); }
static void show_dev_detail(void) { struct sr_dev *dev; const struct sr_hwcap_option *hwo; const struct sr_samplerates *samplerates; struct sr_rational *rationals; uint64_t *integers; const int *hwcaps; int cap, i; char *s, *title; const char *charopts, **stropts; dev = parse_devstring(opt_dev); if (!dev) { printf("No such device. Use -D to list all devices.\n"); return; } print_dev_line(dev); if (sr_dev_info_get(dev, SR_DI_TRIGGER_TYPES, (const void **)&charopts) == SR_OK) { printf("Supported triggers: "); while (*charopts) { printf("%c ", *charopts); charopts++; } printf("\n"); } title = "Supported options:\n"; hwcaps = dev->driver->hwcap_get_all(); for (cap = 0; hwcaps[cap]; cap++) { if (!(hwo = sr_hw_hwcap_get(hwcaps[cap]))) continue; if (title) { printf("%s", title); title = NULL; } if (hwo->hwcap == SR_HWCAP_PATTERN_MODE) { /* Pattern generator modes */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_PATTERNS, (const void **)&stropts) == SR_OK) { printf(" - supported patterns:\n"); for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); } else { printf("\n"); } } else if (hwo->hwcap == SR_HWCAP_SAMPLERATE) { /* Supported samplerates */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_SAMPLERATES, (const void **)&samplerates) != SR_OK) { printf("\n"); continue; } if (samplerates->step) { /* low */ if (!(s = sr_samplerate_string(samplerates->low))) continue; printf(" (%s", s); g_free(s); /* high */ if (!(s = sr_samplerate_string(samplerates->high))) continue; printf(" - %s", s); g_free(s); /* step */ if (!(s = sr_samplerate_string(samplerates->step))) continue; printf(" in steps of %s)\n", s); g_free(s); } else { printf(" - supported samplerates:\n"); for (i = 0; samplerates->list[i]; i++) printf(" %s\n", sr_samplerate_string(samplerates->list[i])); } } else if (hwo->hwcap == SR_HWCAP_BUFFERSIZE) { /* Supported buffer sizes */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_BUFFERSIZES, (const void **)&integers) != SR_OK) { printf("\n"); continue; } printf(" - supported buffer sizes:\n"); for (i = 0; integers[i]; i++) printf(" %"PRIu64"\n", integers[i]); } else if (hwo->hwcap == SR_HWCAP_TIMEBASE) { /* Supported time bases */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_TIMEBASES, (const void **)&rationals) != SR_OK) { printf("\n"); continue; } printf(" - supported time bases:\n"); for (i = 0; rationals[i].p && rationals[i].q; i++) printf(" %s\n", sr_period_string( rationals[i].p * rationals[i].q)); } else if (hwo->hwcap == SR_HWCAP_TRIGGER_SOURCE) { /* Supported trigger sources */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_TRIGGER_SOURCES, (const void **)&stropts) != SR_OK) { printf("\n"); continue; } printf(" - supported trigger sources:\n"); for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); } else if (hwo->hwcap == SR_HWCAP_FILTER) { /* Supported trigger sources */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_FILTERS, (const void **)&stropts) != SR_OK) { printf("\n"); continue; } printf(" - supported filter targets:\n"); for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); } else if (hwo->hwcap == SR_HWCAP_VDIV) { /* Supported volts/div values */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_VDIVS, (const void **)&rationals) != SR_OK) { printf("\n"); continue; } printf(" - supported volts/div:\n"); for (i = 0; rationals[i].p && rationals[i].q; i++) printf(" %s\n", sr_voltage_string( &rationals[i])); } else if (hwo->hwcap == SR_HWCAP_COUPLING) { /* Supported coupling settings */ printf(" %s", hwo->shortname); if (sr_dev_info_get(dev, SR_DI_COUPLING, (const void **)&stropts) != SR_OK) { printf("\n"); continue; } printf(" - supported coupling options:\n"); for (i = 0; stropts[i]; i++) printf(" %s\n", stropts[i]); } else { /* Everything else */ printf(" %s\n", hwo->shortname); } } }