diff --git a/DSView/pv/data/logicsnapshot.cpp b/DSView/pv/data/logicsnapshot.cpp index 94918d08..16c7d026 100644 --- a/DSView/pv/data/logicsnapshot.cpp +++ b/DSView/pv/data/logicsnapshot.cpp @@ -532,6 +532,9 @@ bool LogicSnapshot::get_display_edges(std::vector > &edges if (_ring_sample_count == 0) return false; + if (_sample_count > _ring_sample_count) + dsv_info("_sample_count > _ring_sample_count"); + assert(end < _ring_sample_count); assert(start <= end); assert(min_length > 0); diff --git a/DSView/pv/data/snapshot.cpp b/DSView/pv/data/snapshot.cpp index 8558ea5c..a8d99d95 100644 --- a/DSView/pv/data/snapshot.cpp +++ b/DSView/pv/data/snapshot.cpp @@ -75,6 +75,12 @@ uint64_t Snapshot::get_sample_count() std::lock_guard lock(_mutex); return _sample_count; } + +uint64_t Snapshot::get_ring_sample_count() +{ + std::lock_guard lock(_mutex); + return _ring_sample_count; +} uint64_t Snapshot::get_ring_start() { diff --git a/DSView/pv/data/snapshot.h b/DSView/pv/data/snapshot.h index e2ee9dbc..31c576d7 100644 --- a/DSView/pv/data/snapshot.h +++ b/DSView/pv/data/snapshot.h @@ -40,6 +40,7 @@ public: virtual void init() = 0; uint64_t get_sample_count(); + uint64_t get_ring_sample_count(); uint64_t get_ring_start(); uint64_t get_ring_end(); diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 2d398a74..444da686 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -85,6 +85,8 @@ namespace pv _data_lock = false; _data_updated = false; _opt_mode = OPT_SINGLE; + _rt_refresh_time_id = 0; + _rt_ck_refresh_time_id = 0; this->add_msg_listener(this); @@ -113,6 +115,7 @@ namespace pv _feed_timer.SetCallback(std::bind(&SigSession::feed_timeout, this)); _repeat_timer.SetCallback(std::bind(&SigSession::repeat_capture_wait_timeout, this)); _repeat_wait_prog_timer.SetCallback(std::bind(&SigSession::repeat_wait_prog_timeout, this)); + _refresh_rt_timer.SetCallback(std::bind(&SigSession::realtime_refresh_timeout, this)); } SigSession::SigSession(SigSession &o) @@ -374,6 +377,8 @@ namespace pv _trigger_flag = false; _trigger_ch = 0; _hw_replied = false; + _rt_refresh_time_id = 0; + _rt_ck_refresh_time_id = 0; int work_mode = _device_agent.get_work_mode(); if (work_mode == DSO || work_mode == ANALOG) @@ -472,6 +477,10 @@ namespace pv _capture_time_id++; _is_working = true; _callback->trigger_message(DSV_MSG_START_COLLECT_WORK); + + if (is_realtime_mode()){ + _refresh_rt_timer.Start(1000 / 30); + } return true; } @@ -528,6 +537,7 @@ namespace pv _is_working = false; _repeat_timer.Stop(); _repeat_wait_prog_timer.Stop(); + _refresh_rt_timer.Stop(); exit_capture(); return; } @@ -548,6 +558,7 @@ namespace pv _is_working = false; _repeat_timer.Stop(); _repeat_wait_prog_timer.Stop(); + _refresh_rt_timer.Stop(); if (_repeat_hold_prg != 0 && is_repeat_mode()){ _repeat_hold_prg = 0; @@ -635,7 +646,6 @@ namespace pv if (_data_updated) { - data_updated(); _data_updated = false; _noData_cnt = 0; data_auto_unlock(); @@ -2001,4 +2011,20 @@ namespace pv return false; } + void SigSession::realtime_refresh_timeout() + { + _rt_refresh_time_id++; + } + + bool SigSession::have_new_realtime_refresh(bool keep) + { + if (_rt_ck_refresh_time_id != _rt_refresh_time_id){ + if (!keep){ + _rt_ck_refresh_time_id = _rt_refresh_time_id; + } + return true; + } + return false; + } + } // namespace pv diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index 14435a88..ddce5473 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -367,6 +367,7 @@ public: void add_msg_listener(IMessageListener *ln); void broadcast_msg(int msg); bool switch_work_mode(int mode); + bool have_new_realtime_refresh(bool keep); private: void set_cur_samplelimits(uint64_t samplelimits); @@ -441,6 +442,7 @@ private: void repeat_capture_wait_timeout(); void repeat_wait_prog_timeout(); + void realtime_refresh_timeout(); private: mutable std::mutex _sampling_mutex; @@ -470,6 +472,7 @@ private: DsTimer _out_timer; DsTimer _repeat_timer; DsTimer _repeat_wait_prog_timer; + DsTimer _refresh_rt_timer; int _noData_cnt; bool _data_lock; bool _data_updated; @@ -499,6 +502,8 @@ private: int _device_status; int _capture_time_id; int _confirm_store_time_id; + uint64_t _rt_refresh_time_id; + uint64_t _rt_ck_refresh_time_id; COLLECT_OPT_MODE _opt_mode; diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index 50323550..d292ad9d 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -238,14 +238,15 @@ namespace pv { QString iconPath = GetIconPath(); _configure_button.setIcon(QIcon(iconPath + "/params.svg")); - QString icon1 = _session->is_repeat_mode() ? "moder.svg" : "modes.svg"; - _mode_button.setIcon(QIcon(iconPath + "/" + icon1)); + QString icon2 = _session->is_working() ? "stop.svg" : "start.svg"; _run_stop_button.setIcon(QIcon(iconPath + "/" + icon2)); _instant_button.setIcon(QIcon(iconPath + "/single.svg")); _action_single->setIcon(QIcon(iconPath + "/oneloop.svg")); _action_repeat->setIcon(QIcon(iconPath + "/repeat.svg")); _action_realtime->setIcon(QIcon(iconPath + "/update.svg")); + + update_mode_icon(); } } @@ -1031,8 +1032,7 @@ namespace pv else { - QString icon = _session->is_repeat_mode() ? "/moder.svg" : "/modes.svg"; - _mode_button.setIcon(QIcon(iconPath + icon)); + update_mode_icon(); _mode_action->setVisible(true); } _run_stop_action->setVisible(true); @@ -1062,13 +1062,11 @@ namespace pv QAction *act = qobject_cast(sender()); if (act == _action_single) - { - _mode_button.setIcon(QIcon(iconPath + "/modes.svg")); + { _session->set_operation_mode(OPT_SINGLE); } else if (act == _action_repeat) - { - _mode_button.setIcon(QIcon(iconPath + "/moder.svg")); + { pv::dialogs::Interval interval_dlg(this); interval_dlg.set_interval(_session->get_repeat_intvl()); @@ -1081,10 +1079,11 @@ namespace pv } } else if (act == _action_realtime) - { - _mode_button.setIcon(QIcon(iconPath + "/update.svg")); + { _session->set_operation_mode(OPT_REALTIME); } + + update_mode_icon(); } void SamplingBar::update_device_list() @@ -1181,14 +1180,14 @@ namespace pv _instant_button.setIcon(!bEnable ? QIcon(iconPath + "/stop.svg") : QIcon(iconPath + "/single.svg")); else _run_stop_button.setIcon(!bEnable ? QIcon(iconPath + "/stop.svg") : QIcon(iconPath + "/start.svg")); - - _mode_button.setIcon(_session->is_repeat_mode() == false ? QIcon(iconPath + "/modes.svg") : QIcon(iconPath + "/moder.svg")); - + retranslateUi(); if (bEnable){ _is_run_as_instant = false; - } + } + + update_mode_icon(); } ds_device_handle SamplingBar::get_next_device_handle() @@ -1198,5 +1197,17 @@ namespace pv return h; } + void SamplingBar::update_mode_icon() + { + QString iconPath = GetIconPath(); + + if (_session->is_repeat_mode()) + _mode_button.setIcon(QIcon(iconPath + "/moder.svg")); + else if (_session->is_realtime_mode()) + _mode_button.setIcon(QIcon(iconPath + "/update.svg")); + else + _mode_button.setIcon(QIcon(iconPath + "/modes.svg")); + } + } // namespace toolbars } // namespace pv diff --git a/DSView/pv/toolbars/samplingbar.h b/DSView/pv/toolbars/samplingbar.h index 4a724dec..c4a9c093 100644 --- a/DSView/pv/toolbars/samplingbar.h +++ b/DSView/pv/toolbars/samplingbar.h @@ -103,6 +103,7 @@ namespace pv void commit_settings(); void setting_adj(); void enable_toggle(bool enable); + void update_mode_icon(); private slots: void on_mode(); diff --git a/DSView/pv/view/logicsignal.cpp b/DSView/pv/view/logicsignal.cpp index 13a09486..0e8f2cd4 100644 --- a/DSView/pv/view/logicsignal.cpp +++ b/DSView/pv/view/logicsignal.cpp @@ -145,7 +145,7 @@ void LogicSignal::paint_mid(QPainter &p, int left, int right, QColor fore, QColo if (!snapshot->has_data(_probe->index)) return; - const int64_t last_sample = snapshot->get_sample_count() - 1; + const int64_t last_sample = snapshot->get_ring_sample_count() - 1; const double samples_per_pixel = samplerate * scale; uint16_t width = right - left; diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index 92759344..38f509e0 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -1332,7 +1332,7 @@ void View::set_receive_len(uint64_t len) if (_time_viewport) _time_viewport->set_receive_len(len); - if (_fft_viewport) + if (_fft_viewport && _session->get_device()->get_work_mode() == DSO) _fft_viewport->set_receive_len(len); } diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index c2214705..c2f46d53 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -138,11 +138,19 @@ bool Viewport::event(QEvent *event) } void Viewport::paintEvent(QPaintEvent *event) -{ - (void)event; +{ + (void)event; + doPaint(true); +} + +void Viewport::doPaint(bool bForce) +{ using pv::view::Signal; + // if (_view.session().is_stopped_status()) + // dsv_info("paint"); + QStyleOption o; o.initFrom(this); QPainter p(this); @@ -153,7 +161,7 @@ void Viewport::paintEvent(QPaintEvent *event) QColor back(QWidget::palette().color(QWidget::backgroundRole())); fore.setAlpha(View::ForeAlpha); _view.set_back(false); - + std::vector traces; _view.get_traces(_type, traces); @@ -166,11 +174,15 @@ void Viewport::paintEvent(QPaintEvent *event) if (_view.session().get_device()->get_work_mode() == LOGIC || _view.session().is_instant()) { - if (_view.session().is_stopped_status() - || _view.session().is_realtime_mode()) + if (_view.session().is_stopped_status()) { paintSignals(p, fore, back); } + else if (_view.session().is_realtime_mode()) + { + if (_view.session().have_new_realtime_refresh(false) || bForce) + paintSignals(p, fore, back); + } else if (_view.session().is_running_status()){ if (_view.session().is_repeat_mode() && !_transfer_started) { _view.set_capture_status(); @@ -735,20 +747,21 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) _mouse_point = event->pos(); measure(); + update(); } void Viewport::mouseReleaseEvent(QMouseEvent *event) { - assert(event); + assert(event); - bool quickScroll = AppConfig::Instance()._appOptions.quickScroll; - bool isMaxWindow = AppControl::Instance()->TopWindowIsMaximized(); + bool quickScroll = AppConfig::Instance()._appOptions.quickScroll; + bool isMaxWindow = AppControl::Instance()->TopWindowIsMaximized(); - if (_type != TIME_VIEW){ - update(); - return; - } + if (_type != TIME_VIEW){ + update(); + return; + } if ((_action_type == NO_ACTION) && (event->button() == Qt::LeftButton)) { @@ -1000,6 +1013,7 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); _view.show_cursors(true); } + update(); } else if (_view.session().get_device()->get_work_mode() == DSO @@ -1189,6 +1203,12 @@ void Viewport::set_receive_len(quint64 length) else _sample_received += length; } + + if (_view.session().is_realtime_mode() && _view.session().have_new_realtime_refresh(true) == false){ + return; + } + + // Received new data, and refresh the view. update(); } @@ -1714,7 +1734,7 @@ void Viewport::show_wait_trigger() } void Viewport::unshow_wait_trigger() -{ +{ _waiting_trig = 0; update(); } diff --git a/DSView/pv/view/viewport.h b/DSView/pv/view/viewport.h index 1825f42d..c5f290ac 100644 --- a/DSView/pv/view/viewport.h +++ b/DSView/pv/view/viewport.h @@ -100,12 +100,16 @@ public: void clear_dso_xm(); void set_need_update(bool update); bool get_dso_trig_moved(); + void set_receive_len(quint64 length); + void unshow_wait_trigger(); + void show_wait_trigger(); protected: bool event(QEvent *event) override; void paintEvent(QPaintEvent *event) override; private: + void doPaint(bool bForce); void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; @@ -129,11 +133,6 @@ private slots: void add_cursor_x(); void add_cursor_y(); -public slots: - void show_wait_trigger(); - void unshow_wait_trigger(); - void set_receive_len(quint64 length); - signals: void measure_updated(); void prgRate(int progress);