]> sigrok.org Git - pulseview.git/blobdiff - pv/toolbars/samplingbar.cpp
SamplingBar: Add Space as a shortcut to Run/Stop.
[pulseview.git] / pv / toolbars / samplingbar.cpp
index 05c730bf528fe35efdab94acea14be9183838fd6..21421bca34f16b235b644ca3096996f2aa9e0a2d 100644 (file)
@@ -22,8 +22,6 @@
 
 #include <assert.h>
 
-#include <boost/foreach.hpp>
-
 #include <QAction>
 #include <QDebug>
 #include <QHelpEvent>
 #include "samplingbar.h"
 
 #include <pv/devicemanager.h>
-#include <pv/device/devinst.h>
 #include <pv/popups/deviceoptions.h>
-#include <pv/popups/probes.h>
+#include <pv/popups/channels.h>
+#include <pv/util.h>
+
+#include <libsigrok/libsigrok.hpp>
 
-using boost::shared_ptr;
 using std::map;
+using std::vector;
 using std::max;
 using std::min;
+using std::shared_ptr;
 using std::string;
 
+using sigrok::Capability;
+using sigrok::ConfigKey;
+using sigrok::Device;
+using sigrok::Error;
+
 namespace pv {
 namespace toolbars {
 
@@ -56,7 +62,7 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) :
        _updating_device_selector(false),
        _configure_button(this),
        _configure_button_action(NULL),
-       _probes_button(this),
+       _channels_button(this),
        _sample_count(" samples", this),
        _sample_rate("Hz", this),
        _updating_sample_rate(false),
@@ -67,6 +73,8 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) :
        _icon_grey(":/icons/status-grey.svg"),
        _run_stop_button(this)
 {
+       setObjectName(QString::fromUtf8("SamplingBar"));
+
        connect(&_run_stop_button, SIGNAL(clicked()),
                this, SLOT(on_run_stop()));
        connect(&_device_selector, SIGNAL(currentIndexChanged (int)),
@@ -83,14 +91,14 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) :
        _configure_button.setIcon(QIcon::fromTheme("configure",
                QIcon(":/icons/configure.png")));
 
-       _probes_button.setIcon(QIcon::fromTheme("probes",
-               QIcon(":/icons/probes.svg")));
+       _channels_button.setIcon(QIcon::fromTheme("channels",
+               QIcon(":/icons/channels.svg")));
 
        _run_stop_button.setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
 
        addWidget(&_device_selector);
        _configure_button_action = addWidget(&_configure_button);
-       addWidget(&_probes_button);
+       addWidget(&_channels_button);
        addWidget(&_sample_count);
        addWidget(&_sample_rate);
 
@@ -101,8 +109,8 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) :
 }
 
 void SamplingBar::set_device_list(
-       const std::list< shared_ptr<pv::device::DevInst> > &devices,
-       shared_ptr<pv::device::DevInst> selected)
+       const std::list< std::pair<std::shared_ptr<sigrok::Device>, std::string> > &devices,
+       shared_ptr<Device> selected)
 {
        int selected_index = -1;
 
@@ -111,20 +119,18 @@ void SamplingBar::set_device_list(
        _updating_device_selector = true;
 
        _device_selector.clear();
-       _device_selector_map.clear();
 
-       BOOST_FOREACH (shared_ptr<pv::device::DevInst> dev_inst, devices) {
-               assert(dev_inst);
-               const string title = dev_inst->format_device_title();
-               const sr_dev_inst *sdi = dev_inst->dev_inst();
-               assert(sdi);
+       for (auto entry : devices) {
+               auto device = entry.first;
+               auto display_name = entry.second;
 
-               if (selected == dev_inst)
+               assert(device);
+
+               if (selected == device)
                        selected_index = _device_selector.count();
 
-               _device_selector_map[sdi] = dev_inst;
-               _device_selector.addItem(title.c_str(),
-                       qVariantFromValue((void*)sdi));
+               _device_selector.addItem(display_name.c_str(),
+                       qVariantFromValue(device));
        }
 
        // The selected device should have been in the list
@@ -136,23 +142,13 @@ void SamplingBar::set_device_list(
        _updating_device_selector = false;
 }
 
-shared_ptr<pv::device::DevInst> SamplingBar::get_selected_device() const
+shared_ptr<Device> SamplingBar::get_selected_device() const
 {
        const int index = _device_selector.currentIndex();
        if (index < 0)
-               return shared_ptr<pv::device::DevInst>();
-
-       const sr_dev_inst *const sdi =
-               (const sr_dev_inst*)_device_selector.itemData(
-                       index).value<void*>();
-       assert(sdi);
+               return shared_ptr<Device>();
 
-       map<const sr_dev_inst*, boost::weak_ptr<device::DevInst> >::
-               const_iterator iter = _device_selector_map.find(sdi);
-       if (iter == _device_selector_map.end())
-               return shared_ptr<pv::device::DevInst>();
-
-       return shared_ptr<pv::device::DevInst>((*iter).second);
+       return _device_selector.itemData(index).value<shared_ptr<Device>>();
 }
 
 void SamplingBar::set_capture_state(pv::SigSession::capture_state state)
@@ -161,32 +157,35 @@ void SamplingBar::set_capture_state(pv::SigSession::capture_state state)
        _run_stop_button.setIcon(*icons[state]);
        _run_stop_button.setText((state == pv::SigSession::Stopped) ?
                tr("Run") : tr("Stop"));
+       _run_stop_button.setShortcut(QKeySequence(Qt::Key_Space));
 }
 
 void SamplingBar::update_sample_rate_selector()
 {
-       GVariant *gvar_dict, *gvar_list;
+       Glib::VariantContainerBase gvar_dict;
+       GVariant *gvar_list;
        const uint64_t *elements = NULL;
        gsize num_elements;
 
        if (_updating_sample_rate)
                return;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       const shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
        assert(!_updating_sample_rate);
        _updating_sample_rate = true;
 
-       if (!(gvar_dict = dev_inst->list_config(NULL, SR_CONF_SAMPLERATE)))
-       {
+       try {
+               gvar_dict = device->config_list(ConfigKey::SAMPLERATE);
+       } catch (Error error) {
                _sample_rate.show_none();
                _updating_sample_rate = false;
                return;
        }
 
-       if ((gvar_list = g_variant_lookup_value(gvar_dict,
+       if ((gvar_list = g_variant_lookup_value(gvar_dict.gobj(),
                        "samplerate-steps", G_VARIANT_TYPE("at"))))
        {
                elements = (const uint64_t *)g_variant_get_fixed_array(
@@ -214,7 +213,7 @@ void SamplingBar::update_sample_rate_selector()
                        _sample_rate.show_min_max_step(min, max, step);
                }
        }
-       else if ((gvar_list = g_variant_lookup_value(gvar_dict,
+       else if ((gvar_list = g_variant_lookup_value(gvar_dict.gobj(),
                        "samplerates", G_VARIANT_TYPE("at"))))
        {
                elements = (const uint64_t *)g_variant_get_fixed_array(
@@ -224,44 +223,39 @@ void SamplingBar::update_sample_rate_selector()
        }
        _updating_sample_rate = false;
 
-       g_variant_unref(gvar_dict);
        update_sample_rate_selector_value();
 }
 
 void SamplingBar::update_sample_rate_selector_value()
 {
-       GVariant *gvar;
-       uint64_t samplerate;
-
        if (_updating_sample_rate)
                return;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       const shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
-       if (!(gvar = dev_inst->get_config(NULL, SR_CONF_SAMPLERATE))) {
+       try {
+               auto gvar = device->config_get(ConfigKey::SAMPLERATE);
+               uint64_t samplerate =
+                       Glib::VariantBase::cast_dynamic<Glib::Variant<guint64>>(gvar).get();
+               assert(!_updating_sample_rate);
+               _updating_sample_rate = true;
+               _sample_rate.set_value(samplerate);
+               _updating_sample_rate = false;
+       } catch (Error error) {
                qDebug() << "WARNING: Failed to get value of sample rate";
                return;
        }
-       samplerate = g_variant_get_uint64(gvar);
-       g_variant_unref(gvar);
-
-       assert(!_updating_sample_rate);
-       _updating_sample_rate = true;
-       _sample_rate.set_value(samplerate);
-       _updating_sample_rate = false;
 }
 
 void SamplingBar::update_sample_count_selector()
 {
-       GVariant *gvar;
-
        if (_updating_sample_count)
                return;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       const shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
        assert(!_updating_sample_count);
@@ -276,12 +270,11 @@ void SamplingBar::update_sample_count_selector()
                if (sample_count == 0)
                        sample_count = DefaultSampleCount;
 
-               if ((gvar = dev_inst->list_config(NULL, SR_CONF_LIMIT_SAMPLES)))
-               {
-                       g_variant_get(gvar, "(tt)",
+               try {
+                       auto gvar = device->config_list(ConfigKey::LIMIT_SAMPLES);
+                       g_variant_get(gvar.gobj(), "(tt)",
                                &min_sample_count, &max_sample_count);
-                       g_variant_unref(gvar);
-               }
+               } catch (Error error) {}
 
                min_sample_count = min(max(min_sample_count, MinSampleCount),
                        max_sample_count);
@@ -289,16 +282,14 @@ void SamplingBar::update_sample_count_selector()
                _sample_count.show_125_list(
                        min_sample_count, max_sample_count);
 
-               if ((gvar = dev_inst->get_config(NULL, SR_CONF_LIMIT_SAMPLES)))
-               {
-                       sample_count = g_variant_get_uint64(gvar);
+               try {
+                       auto gvar = device->config_get(ConfigKey::LIMIT_SAMPLES);
+                       sample_count = g_variant_get_uint64(gvar.gobj());
                        if (sample_count == 0)
                                sample_count = DefaultSampleCount;
                        sample_count = min(max(sample_count, MinSampleCount),
                                max_sample_count);
-
-                       g_variant_unref(gvar);
-               }
+               } catch (Error error) {}
 
                _sample_count.set_value(sample_count);
        }
@@ -310,50 +301,52 @@ void SamplingBar::update_sample_count_selector()
 
 void SamplingBar::update_device_config_widgets()
 {
-       GVariant *gvar;
-
        using namespace pv::popups;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       const shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
        // Update the configure popup
-       DeviceOptions *const opts = new DeviceOptions(dev_inst, this);
+       DeviceOptions *const opts = new DeviceOptions(device, this);
        _configure_button_action->setVisible(
                !opts->binding().properties().empty());
        _configure_button.set_popup(opts);
 
-       // Update the probes popup
-       Probes *const probes = new Probes(_session, this);
-       _probes_button.set_popup(probes);
+       // Update the channels popup
+       Channels *const channels = new Channels(_session, this);
+       _channels_button.set_popup(channels);
 
        // Update supported options.
        _sample_count_supported = false;
 
-       if ((gvar = dev_inst->list_config(NULL, SR_CONF_DEVICE_OPTIONS)))
-       {
-               gsize num_opts;
-               const int *const options =
-                       (const int32_t *)g_variant_get_fixed_array(
-                               gvar, &num_opts, sizeof(int32_t));
-               for (unsigned int i = 0; i < num_opts; i++)
+       try {
+               for (auto entry : device->config_keys(ConfigKey::DEVICE_OPTIONS))
                {
-                       switch (options[i]) {
+                       auto key = entry.first;
+                       auto capabilities = entry.second;
+                       switch (key->id()) {
                        case SR_CONF_LIMIT_SAMPLES:
-                               _sample_count_supported = true;
+                               if (capabilities.count(Capability::SET))
+                                       _sample_count_supported = true;
                                break;
                        case SR_CONF_LIMIT_FRAMES:
-                               dev_inst->set_config(NULL, SR_CONF_LIMIT_FRAMES,
-                                       g_variant_new_uint64(1));
+                               if (capabilities.count(Capability::SET))
+                               {
+                                       device->config_set(ConfigKey::LIMIT_FRAMES,
+                                               Glib::Variant<guint64>::create(1));
+                                       on_config_changed();
+                               }
+                               break;
+                       default:
                                break;
                        }
                }
-       }
+       } catch (Error error) {}
 
        // Add notification of reconfigure events
        disconnect(this, SLOT(on_config_changed()));
-       connect(dev_inst.get(), SIGNAL(config_changed()),
+       connect(&opts->binding(), SIGNAL(config_changed()),
                this, SLOT(on_config_changed()));
 
        // Update sweep timing widgets.
@@ -368,8 +361,8 @@ void SamplingBar::commit_sample_count()
        if (_updating_sample_count)
                return;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       const shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
        sample_count = _sample_count.value();
@@ -377,11 +370,16 @@ void SamplingBar::commit_sample_count()
        // Set the sample count
        assert(!_updating_sample_count);
        _updating_sample_count = true;
-       if (_sample_count_supported &&
-               !dev_inst->set_config(NULL, SR_CONF_LIMIT_SAMPLES,
-               g_variant_new_uint64(sample_count))) {
-               qDebug() << "Failed to configure sample count.";
-               return;
+       if (_sample_count_supported)
+       {
+               try {
+                       device->config_set(ConfigKey::LIMIT_SAMPLES,
+                               Glib::Variant<guint64>::create(sample_count));
+                       on_config_changed();
+               } catch (Error error) {
+                       qDebug() << "Failed to configure sample count.";
+                       return;
+               }
        }
        _updating_sample_count = false;
 }
@@ -393,8 +391,8 @@ void SamplingBar::commit_sample_rate()
        if (_updating_sample_rate)
                return;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       const shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
        sample_rate = _sample_rate.value();
@@ -404,8 +402,11 @@ void SamplingBar::commit_sample_rate()
        // Set the samplerate
        assert(!_updating_sample_rate);
        _updating_sample_rate = true;
-       if (!dev_inst->set_config(NULL, SR_CONF_SAMPLERATE,
-               g_variant_new_uint64(sample_rate))) {
+       try {
+               device->config_set(ConfigKey::SAMPLERATE,
+                       Glib::Variant<guint64>::create(sample_rate));
+               on_config_changed();
+       } catch (Error error) {
                qDebug() << "Failed to configure samplerate.";
                return;
        }
@@ -417,11 +418,11 @@ void SamplingBar::on_device_selected()
        if (_updating_device_selector)
                return;
 
-       const shared_ptr<device::DevInst> dev_inst = get_selected_device();
-       if (!dev_inst)
+       shared_ptr<Device> device = get_selected_device();
+       if (!device)
                return;
 
-       _session.set_device(dev_inst);
+       _session.set_device(device);
 
        update_device_config_widgets();
 }
@@ -456,16 +457,9 @@ bool SamplingBar::eventFilter(QObject *watched, QEvent *event)
        if ((watched == &_sample_count || watched == &_sample_rate) &&
                (event->type() == QEvent::ToolTip)) {
                double sec = (double)_sample_count.value() / _sample_rate.value();
-
-               QString str;
-               QTextStream(&str)
-                       << tr("Total sampling time: ")
-                       << fixed
-                       << qSetRealNumberPrecision(1)
-                       << sec
-                       << "s";
-
                QHelpEvent *help_event = static_cast<QHelpEvent*>(event);
+
+               QString str = tr("Total sampling time: %1").arg(pv::util::format_second(sec));
                QToolTip::showText(help_event->globalPos(), str);
 
                return true;