X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fstd.c;h=3561c590bbe60d0d74f58de55ab1ca53b583e809;hb=43995cda362b117ecae790f01e05eb9b43d5e886;hp=c6ff4ccef96cc07d758b13f4936db374eb2631f2;hpb=db944f1622479a91c257315ad368b63c5b58149c;p=libsigrok.git diff --git a/src/std.c b/src/std.c index c6ff4cce..3561c590 100644 --- a/src/std.c +++ b/src/std.c @@ -541,7 +541,7 @@ SR_PRIV int std_opts_config_list(uint32_t key, GVariant **data, return SR_OK; } -SR_PRIV GVariant *std_gvar_tuple_array(const uint64_t (*a)[][2], unsigned int n) +SR_PRIV GVariant *std_gvar_tuple_array(const uint64_t a[][2], unsigned int n) { unsigned int i; GVariant *rational[2]; @@ -550,8 +550,8 @@ SR_PRIV GVariant *std_gvar_tuple_array(const uint64_t (*a)[][2], unsigned int n) g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); for (i = 0; i < n; i++) { - rational[0] = g_variant_new_uint64((*a)[i][0]); - rational[1] = g_variant_new_uint64((*a)[i][1]); + rational[0] = g_variant_new_uint64(a[i][0]); + rational[1] = g_variant_new_uint64(a[i][1]); /* FIXME: Valgrind reports a memory leak here. */ g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational, 2)); @@ -578,3 +578,109 @@ SR_PRIV GVariant *std_gvar_tuple_rational(const struct sr_rational *r, unsigned return g_variant_builder_end(&gvb); } + +static GVariant *samplerate_helper(const uint64_t samplerates[], unsigned int n, const char *str) +{ + GVariant *gvar; + GVariantBuilder gvb; + + g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); + gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates, + n, sizeof(uint64_t)); + g_variant_builder_add(&gvb, "{sv}", str, gvar); + + return g_variant_builder_end(&gvb); +} + +SR_PRIV GVariant *std_gvar_samplerates(const uint64_t samplerates[], unsigned int n) +{ + return samplerate_helper(samplerates, n, "samplerates"); +} + +SR_PRIV GVariant *std_gvar_samplerates_steps(const uint64_t samplerates[], unsigned int n) +{ + return samplerate_helper(samplerates, n, "samplerate-steps"); +} + +SR_PRIV GVariant *std_gvar_min_max_step(double min, double max, double step) +{ + GVariantBuilder gvb; + + g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); + + g_variant_builder_add_value(&gvb, g_variant_new_double(min)); + g_variant_builder_add_value(&gvb, g_variant_new_double(max)); + g_variant_builder_add_value(&gvb, g_variant_new_double(step)); + + return g_variant_builder_end(&gvb); +} + +SR_PRIV GVariant *std_gvar_min_max_step_array(const double a[3]) +{ + unsigned int i; + GVariantBuilder gvb; + + g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); + + for (i = 0; i < 3; i++) + g_variant_builder_add_value(&gvb, g_variant_new_double(a[i])); + + return g_variant_builder_end(&gvb); +} + +SR_PRIV GVariant *std_gvar_min_max_step_thresholds(const double min, const double max, const double step) +{ + double d; + GVariant *gvar, *range[2]; + GVariantBuilder gvb; + + g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); + + for (d = min; d <= max; d += step) { + range[0] = g_variant_new_double(d); + range[1] = g_variant_new_double(d); + + gvar = g_variant_new_tuple(range, 2); + g_variant_builder_add_value(&gvb, gvar); + } + + return g_variant_builder_end(&gvb); +} + +SR_PRIV GVariant *std_gvar_tuple_u64(uint64_t low, uint64_t high) +{ + GVariant *range[2]; + + range[0] = g_variant_new_uint64(low); + range[1] = g_variant_new_uint64(high); + + return g_variant_new_tuple(range, 2); +} + +SR_PRIV GVariant *std_gvar_tuple_double(double low, double high) +{ + GVariant *range[2]; + + range[0] = g_variant_new_double(low); + range[1] = g_variant_new_double(high); + + return g_variant_new_tuple(range, 2); +} + +SR_PRIV GVariant *std_gvar_array_i32(const int32_t *a, unsigned int n) +{ + return g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, + a, n, sizeof(int32_t)); +} + +SR_PRIV GVariant *std_gvar_array_u32(const uint32_t *a, unsigned int n) +{ + return g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + a, n, sizeof(uint32_t)); +} + +SR_PRIV GVariant *std_gvar_array_u64(const uint64_t *a, unsigned int n) +{ + return g_variant_new_fixed_array(G_VARIANT_TYPE_UINT64, + a, n, sizeof(uint64_t)); +}