]> sigrok.org Git - pulseview.git/blobdiff - pv/prop/binding/deviceoptions.cpp
Added Binding::add_properties_to_form
[pulseview.git] / pv / prop / binding / deviceoptions.cpp
index 90f474f24935c04616a6871c1dec89df176d17b2..1b95cfe0b2314b89e4f40fe7d3029d2045f59475 100644 (file)
 
 #include "deviceoptions.h"
 
+#include <pv/prop/bool.h>
 #include <pv/prop/double.h>
 #include <pv/prop/enum.h>
+#include <pv/prop/int.h>
 
 using namespace boost;
 using namespace std;
@@ -54,11 +56,13 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) :
                const struct sr_config_info *const info =
                        sr_config_info_get(options[i]);
 
+               if (!info)
+                       continue;
+
                const int key = info->key;
 
-               if (!info || sr_config_list(_sdi->driver, key,
-                       &gvar_list, _sdi) != SR_OK)
-                       continue;
+               if(sr_config_list(_sdi->driver, key, &gvar_list, _sdi) != SR_OK)
+                       gvar_list = NULL;
 
                const QString name(info->name);
 
@@ -68,6 +72,10 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) :
                        bind_samplerate(name, gvar_list);
                        break;
 
+               case SR_CONF_CAPTURE_RATIO:
+                       bind_int(name, key, "%", pair<int64_t, int64_t>(0, 100));
+                       break;
+
                case SR_CONF_PATTERN_MODE:
                case SR_CONF_BUFFERSIZE:
                case SR_CONF_TRIGGER_SOURCE:
@@ -76,6 +84,10 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) :
                        bind_enum(name, key, gvar_list);
                        break;
 
+               case SR_CONF_RLE:
+                       bind_bool(name, key);
+                       break;
+
                case SR_CONF_TIMEBASE:
                        bind_enum(name, key, gvar_list, print_timebase);
                        break;
@@ -83,9 +95,14 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) :
                case SR_CONF_VDIV:
                        bind_enum(name, key, gvar_list, print_vdiv);
                        break;
+
+               case SR_CONF_VOLTAGE_THRESHOLD:
+                       bind_enum(name, key, gvar_list, print_voltage_threshold);
+                       break;
                }
 
-               g_variant_unref(gvar_list);
+               if (gvar_list)
+                       g_variant_unref(gvar_list);
        }
        g_variant_unref(gvar_opts);
 }
@@ -109,6 +126,13 @@ void DeviceOptions::config_setter(
                qDebug() << "WARNING: Failed to set value of sample rate";
 }
 
+void DeviceOptions::bind_bool(const QString &name, int key)
+{
+       _properties.push_back(shared_ptr<Property>(
+               new Bool(name, bind(config_getter, _sdi, key),
+                       bind(config_setter, _sdi, key, _1))));
+}
+
 void DeviceOptions::bind_enum(const QString &name, int key,
        GVariant *const gvar_list, function<QString (GVariant*)> printer)
 {
@@ -116,6 +140,8 @@ void DeviceOptions::bind_enum(const QString &name, int key,
        GVariantIter iter;
        vector< pair<GVariant*, QString> > values;
 
+       assert(gvar_list);
+
        g_variant_iter_init (&iter, gvar_list);
        while ((gvar = g_variant_iter_next_value (&iter)))
                values.push_back(make_pair(gvar, printer(gvar)));
@@ -126,6 +152,15 @@ void DeviceOptions::bind_enum(const QString &name, int key,
                        bind(config_setter, _sdi, key, _1))));
 }
 
+void DeviceOptions::bind_int(const QString &name, int key, QString suffix,
+       optional< std::pair<int64_t, int64_t> > range)
+{
+       _properties.push_back(shared_ptr<Property>(
+               new Int(name, suffix, range,
+                       bind(config_getter, _sdi, key),
+                       bind(config_setter, _sdi, key, _1))));
+}
+
 QString DeviceOptions::print_gvariant(GVariant *const gvar)
 {
        QString s;
@@ -147,6 +182,8 @@ void DeviceOptions::bind_samplerate(const QString &name,
 {
        GVariant *gvar_list_samplerates;
 
+       assert(gvar_list);
+
        if ((gvar_list_samplerates = g_variant_lookup_value(gvar_list,
                        "samplerate-steps", G_VARIANT_TYPE("at"))))
        {
@@ -222,6 +259,15 @@ QString DeviceOptions::print_vdiv(GVariant *const gvar)
        return QString(sr_voltage_string(p, q));
 }
 
+QString DeviceOptions::print_voltage_threshold(GVariant *const gvar)
+{
+       gdouble lo, hi;
+       char buf[64];
+       g_variant_get(gvar, "(dd)", &lo, &hi);
+       snprintf(buf, sizeof(buf), "L<%.1fV H>%.1fV", lo, hi);
+       return QString(buf);
+}
+
 } // binding
 } // prop
 } // pv