From 44051a295d0925bf1845a9daafab81be9b936fbb Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Wed, 17 Jun 2015 23:24:17 +0800 Subject: [PATCH] fix channel disable/enalbe issues @ DSO mode --- DSView/pv/sigsession.cpp | 21 ++++++++++++++++++++- DSView/pv/sigsession.h | 8 +++++++- DSView/pv/view/dsosignal.cpp | 22 ++++++++++++---------- DSView/pv/view/header.cpp | 3 ++- DSView/pv/view/viewport.cpp | 2 ++ libsigrok4DSL/hardware/DSL/dscope.c | 9 ++++++++- libsigrok4DSL/hardware/DSL/dslogic.c | 8 ++++++++ 7 files changed, 59 insertions(+), 14 deletions(-) diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 91bf3055..6f9d9592 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -98,8 +98,12 @@ SigSession::SigSession(DeviceManager &device_manager) : register_hotplug_callback(); _view_timer.stop(); _view_timer.setSingleShot(true); + _refresh_timer.stop(); + _refresh_timer.setSingleShot(true); + _data_lock = false; connect(this, SIGNAL(start_timer(int)), &_view_timer, SLOT(start(int))); connect(&_view_timer, SIGNAL(timeout()), this, SLOT(refresh())); + connect(&_refresh_timer, SIGNAL(timeout()), this, SLOT(data_unlock())); } SigSession::~SigSession() @@ -814,7 +818,7 @@ void SigSession::reload() signals_changed(); } -void SigSession::refresh() +void SigSession::refresh(int holdtime) { if (_logic_data) { _logic_data->clear(); @@ -829,6 +833,18 @@ void SigSession::refresh() _cur_analog_snapshot.reset(); } data_updated(); + _data_lock = true; + _refresh_timer.start(holdtime); +} + +void SigSession::data_unlock() +{ + _data_lock = false; +} + +bool SigSession::get_data_lock() +{ + return _data_lock; } void SigSession::feed_in_meta(const sr_dev_inst *sdi, @@ -987,6 +1003,9 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, assert(sdi); assert(packet); + if (_data_lock) + return; + switch (packet->type) { case SR_DF_HEADER: feed_in_header(sdi); diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index 97703b73..883149f2 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -91,6 +91,7 @@ class SigSession : public QObject private: static constexpr float Oversampling = 2.0f; static const int ViewTime = 800; + static const int RefreshTime = 500; bool saveFileThreadRunning = false; public: @@ -176,6 +177,8 @@ public: bool get_instant(); + bool get_data_lock(); + private: void set_capture_state(capture_state state); @@ -258,6 +261,8 @@ private: bool _adv_trigger; QTimer _view_timer; + QTimer _refresh_timer; + bool _data_lock; signals: void capture_state_changed(int state); @@ -294,10 +299,11 @@ signals: public slots: void reload(); - void refresh(); + void refresh(int holdtime); private slots: void cancelSaveFile(); + void data_unlock(); private: // TODO: This should not be necessary. Multiple concurrent diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index 6d82e413..fe814713 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -203,7 +203,7 @@ void DsoSignal::set_enable(bool enable) if ((strcmp(_dev_inst->dev_inst()->driver->name, "DSLogic") == 0) && get_index() == 0) return; - _view->session().refresh(); + _view->session().refresh(INT_MAX); set_vDialActive(false); _dev_inst->set_config(_probe, NULL, SR_CONF_EN_CH, g_variant_new_boolean(enable)); @@ -237,6 +237,7 @@ void DsoSignal::set_enable(bool enable) _view->set_sample_limit(sample_limit, true); _view->set_need_update(true); _view->update(); + _view->session().refresh(800); } bool DsoSignal::get_vDialActive() const @@ -300,7 +301,8 @@ void DsoSignal::set_hDialActive(bool active) bool DsoSignal::go_hDialPre(bool setted) { - if (!_hDial->isMin()) { + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + if (ch_num != 0 && !_hDial->isMin()) { uint64_t sample_rate = _view->session().get_device()->get_sample_rate(); const uint64_t min_div = std::pow(10.0, 9.0) / sample_rate; if (_view->session().get_capture_state() != SigSession::Running && @@ -310,11 +312,10 @@ bool DsoSignal::go_hDialPre(bool setted) } else if ((_view->session().get_capture_state() == SigSession::Running || _data->get_snapshots().empty()) && !_view->session().get_instant()) { - _view->session().refresh(); + _view->session().refresh(100); _hDial->set_sel(_hDial->get_sel() - 1); if (!setted) { - int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); GVariant* gvar; uint64_t max_sample_rate; @@ -349,9 +350,11 @@ bool DsoSignal::go_hDialPre(bool setted) bool DsoSignal::go_hDialCur() { - _view->session().refresh(); - int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + if (ch_num == 0) + return false; + + _view->session().refresh(100); uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); GVariant* gvar; uint64_t max_sample_rate; @@ -377,19 +380,18 @@ bool DsoSignal::go_hDialCur() bool DsoSignal::go_hDialNext(bool setted) { - if (!_hDial->isMax()) { + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + if (ch_num != 0 && !_hDial->isMax()) { if (_view->session().get_capture_state() != SigSession::Running && !_data->get_snapshots().empty()) { _hDial->set_sel(_hDial->get_sel() + 1); } else if ((_view->session().get_capture_state() == SigSession::Running || _data->get_snapshots().empty()) && !_view->session().get_instant()) { - _view->session().refresh(); + _view->session().refresh(100); _hDial->set_sel(_hDial->get_sel() + 1); if (!setted) { - int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); - uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); GVariant* gvar; diff --git a/DSView/pv/view/header.cpp b/DSView/pv/view/header.cpp index 3930d012..d84f3f03 100644 --- a/DSView/pv/view/header.cpp +++ b/DSView/pv/view/header.cpp @@ -272,7 +272,8 @@ void Header::mousePressEvent(QMouseEvent *event) } else if (action == Trace::CHEN && mTrace) { boost::shared_ptr dsoSig; if (dsoSig = dynamic_pointer_cast(mTrace)) { - dsoSig->set_enable(!dsoSig->enabled()); + if (!_view.session().get_data_lock()) + dsoSig->set_enable(!dsoSig->enabled()); } } else if (action == Trace::ACDC && mTrace) { boost::shared_ptr dsoSig; diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index ba36d329..05df2f1c 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -388,6 +388,8 @@ void Viewport::mousePressEvent(QMouseEvent *event) const vector< boost::shared_ptr > sigs(_view.session().get_signals()); BOOST_FOREACH(const boost::shared_ptr s, sigs) { assert(s); + if (!s->enabled()) + continue; boost::shared_ptr dsoSig; if ((dsoSig = dynamic_pointer_cast(s)) && dsoSig->get_trig_rect(0, _view.get_view_width()).contains(_mouse_point)) { diff --git a/libsigrok4DSL/hardware/DSL/dscope.c b/libsigrok4DSL/hardware/DSL/dscope.c index 3059667d..404a18a8 100644 --- a/libsigrok4DSL/hardware/DSL/dscope.c +++ b/libsigrok4DSL/hardware/DSL/dscope.c @@ -1430,7 +1430,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, if (sdi->mode == DSO) { ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_EN_CH)); - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + if (channel_cnt != 0) + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); } if (ret == SR_OK) sr_dbg("%s: setting ENABLE of channel %d to %d", diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index b65e47b0..dede3340 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -1552,6 +1552,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, ch->enabled = g_variant_get_boolean(data); if (sdi->mode == DSO) { ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_EN_CH)); + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + if (channel_cnt != 0) + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); } if (ret == SR_OK) sr_dbg("%s: setting ENABLE of channel %d to %d",