]> sigrok.org Git - libsigrok.git/blobdiff - src/std.c
drivers: Factor out std_gvar_min_max_step_thresholds().
[libsigrok.git] / src / std.c
index bd9c62860cccd9ccf15e7e383a8fa6c1ea49aa7f..45cc3a49acf9b3ea25cae96513d095313b89f97d 100644 (file)
--- a/src/std.c
+++ b/src/std.c
@@ -540,3 +540,109 @@ 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)
+{
+       unsigned int i;
+       GVariant *rational[2];
+       GVariantBuilder gvb;
+
+       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]);
+
+               /* FIXME: Valgrind reports a memory leak here. */
+               g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational, 2));
+       }
+
+       return g_variant_builder_end(&gvb);
+}
+
+SR_PRIV GVariant *std_gvar_tuple_rational(const struct sr_rational *r, unsigned int n)
+{
+       unsigned int i;
+       GVariant *rational[2];
+       GVariantBuilder gvb;
+
+       g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
+
+       for (i = 0; i < n; i++) {
+               rational[0] = g_variant_new_uint64(r[i].p);
+               rational[1] = g_variant_new_uint64(r[i].q);
+
+               /* FIXME: Valgrind reports a memory leak here. */
+               g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational, 2));
+       }
+
+       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);
+}