static void get_option(void) { struct sr_dev_inst *sdi; struct sr_channel_group *cg; const struct sr_config_info *ci; GSList *devices; GVariant *gvar; GHashTable *devargs; int ret; char *s; struct sr_dev_driver *driver; if (!(devices = device_scan())) { g_critical("No devices found."); return; } sdi = devices->data; g_slist_free(devices); driver = sr_dev_inst_driver_get(sdi); if (sr_dev_open(sdi) != SR_OK) { g_critical("Failed to open device."); return; } cg = select_channel_group(sdi); if (!(ci = sr_config_info_name_get(opt_get))) g_critical("Unknown option '%s'", opt_get); if ((devargs = parse_generic_arg(opt_config, FALSE))) set_dev_options(sdi, devargs); else devargs = NULL; if ((ret = maybe_config_get(driver, sdi, cg, ci->key, &gvar)) != SR_OK) g_critical("Failed to get '%s': %s", opt_get, sr_strerror(ret)); s = g_variant_print(gvar, FALSE); printf("%s\n", s); g_free(s); g_variant_unref(gvar); sr_dev_close(sdi); if (devargs) g_hash_table_destroy(devargs); }
int opt_to_gvar(char *key, char *value, struct sr_config *src) { const struct sr_config_info *srci; double tmp_double, dlow, dhigh; uint64_t tmp_u64, p, q, low, high; GVariant *rational[2], *range[2]; gboolean tmp_bool; int ret; if (!(srci = sr_config_info_name_get(key))) { g_critical("Unknown device option '%s'.", (char *) key); return -1; } src->key = srci->key; if ((value == NULL) && (srci->datatype != SR_T_BOOL)) { g_critical("Option '%s' needs a value.", (char *)key); return -1; } ret = 0; switch (srci->datatype) { case SR_T_UINT64: ret = sr_parse_sizestring(value, &tmp_u64); if (ret != 0) break; src->data = g_variant_new_uint64(tmp_u64); break; case SR_T_INT32: ret = sr_parse_sizestring(value, &tmp_u64); if (ret != 0) break; src->data = g_variant_new_int32(tmp_u64); break; case SR_T_STRING: src->data = g_variant_new_string(value); break; case SR_T_BOOL: if (!value) tmp_bool = TRUE; else tmp_bool = sr_parse_boolstring(value); src->data = g_variant_new_boolean(tmp_bool); break; case SR_T_FLOAT: tmp_double = strtof(value, NULL); src->data = g_variant_new_double(tmp_double); break; case SR_T_RATIONAL_PERIOD: if ((ret = sr_parse_period(value, &p, &q)) != SR_OK) break; rational[0] = g_variant_new_uint64(p); rational[1] = g_variant_new_uint64(q); src->data = g_variant_new_tuple(rational, 2); break; case SR_T_RATIONAL_VOLT: if ((ret = sr_parse_voltage(value, &p, &q)) != SR_OK) break; rational[0] = g_variant_new_uint64(p); rational[1] = g_variant_new_uint64(q); src->data = g_variant_new_tuple(rational, 2); break; case SR_T_UINT64_RANGE: if (sscanf(value, "%"PRIu64"-%"PRIu64, &low, &high) != 2) { ret = -1; break; } else { range[0] = g_variant_new_uint64(low); range[1] = g_variant_new_uint64(high); src->data = g_variant_new_tuple(range, 2); } break; case SR_T_DOUBLE_RANGE: if (sscanf(value, "%lf-%lf", &dlow, &dhigh) != 2) { ret = -1; break; } else { range[0] = g_variant_new_double(dlow); range[1] = g_variant_new_double(dhigh); src->data = g_variant_new_tuple(range, 2); } break; default: ret = -1; } return ret; }