diff --git a/.gitignore b/.gitignore index 06590fbd..fa0ebded 100755 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,8 @@ DSView/DSView DSView/install_manifest.txt DSView/qrc_DSView.cpp DSView/qrc_style.cpp +DSView/qrc_breeze.cpp +DSView/qrc_language.cpp moc_*.cpp moc_*.cpp_parameters diff --git a/DSView/pv/data/dsosnapshot.cpp b/DSView/pv/data/dsosnapshot.cpp index ae576be2..800017fe 100755 --- a/DSView/pv/data/dsosnapshot.cpp +++ b/DSView/pv/data/dsosnapshot.cpp @@ -195,6 +195,7 @@ void DsoSnapshot::enable_envelope(bool enable) const uint8_t *DsoSnapshot::get_samples( int64_t start_sample, int64_t end_sample, uint16_t index) const { + boost::lock_guard lock(_mutex); (void)end_sample; assert(start_sample >= 0); diff --git a/DSView/pv/data/mathstack.cpp b/DSView/pv/data/mathstack.cpp index 5b9ce7a3..759b53b3 100755 --- a/DSView/pv/data/mathstack.cpp +++ b/DSView/pv/data/mathstack.cpp @@ -109,10 +109,13 @@ void MathStack::free_envelop() void MathStack::clear() { + boost::lock_guard lock(_mutex); } void MathStack::init() { + boost::lock_guard lock(_mutex); + _sample_num = 0; _envelope_done = false; } @@ -312,6 +315,8 @@ void MathStack::get_math_envelope_section(EnvelopeSection &s, void MathStack::calc_math() { + boost::lock_guard lock(_mutex); + _math_state = Running; const boost::shared_ptr data = _dsoSig1->dso_data(); diff --git a/DSView/pv/data/signaldata.h b/DSView/pv/data/signaldata.h index c74898d1..f3e9c624 100755 --- a/DSView/pv/data/signaldata.h +++ b/DSView/pv/data/signaldata.h @@ -25,6 +25,7 @@ #define DSVIEW_PV_DATA_SIGNALDATA_H #include +#include namespace pv { namespace data { @@ -43,6 +44,8 @@ public: virtual void init() = 0; protected: + mutable boost::recursive_mutex _mutex; + double _samplerate; }; diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 763cb499..65f1e6f7 100755 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -105,7 +105,7 @@ SigSession::SigSession(DeviceManager &device_manager) : _hot_detach = false; _group_cnt = 0; register_hotplug_callback(); - _view_timer.stop(); + _feed_timer.stop(); _noData_cnt = 0; _data_lock = false; _data_updated = false; @@ -129,7 +129,7 @@ SigSession::SigSession(DeviceManager &device_manager) : _group_data.reset(new data::Group()); _group_cnt = 0; - connect(&_view_timer, SIGNAL(timeout()), this, SLOT(check_update())); + connect(&_feed_timer, SIGNAL(timeout()), this, SLOT(data_unlock())); } SigSession::~SigSession() @@ -354,9 +354,10 @@ void SigSession::capture_init() _trigger_flag = false; _hw_replied = false; if (_dev_inst->dev_inst()->mode != LOGIC) - _view_timer.start(ViewTime); + _feed_timer.start(FeedInterval); else - _view_timer.stop(); + _feed_timer.stop(); + _noData_cnt = 0; data_unlock(); @@ -587,7 +588,9 @@ void SigSession::sample_thread_proc(boost::shared_ptr dev_inst, void SigSession::check_update() { - data_unlock(); + boost::lock_guard lock(_data_mutex); + + //data_unlock(); unlock after wave rendering if (_capture_state != Running) return; @@ -597,7 +600,7 @@ void SigSession::check_update() _noData_cnt = 0; data_auto_unlock(); } else { - if (++_noData_cnt >= (WaitShowTime/ViewTime)) + if (++_noData_cnt >= (WaitShowTime/FeedInterval)) nodata_timeout(); } } @@ -1070,7 +1073,7 @@ void SigSession::feed_in_dso(const sr_datafeed_dso &dso) _trigger_flag = dso.trig_flag; receive_data(dso.num_samples); - //data_updated(); + if (!_instant) data_lock(); _data_updated = true; diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index a8fac4c0..d95ab415 100755 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -102,7 +102,7 @@ private: static const int RepeatHoldDiv = 20; public: - static const int ViewTime = 50; + static const int FeedInterval = 50; static const int WaitShowTime = 500; public: @@ -337,7 +337,7 @@ private: bool _hot_attach; bool _hot_detach; - QTimer _view_timer; + QTimer _feed_timer; int _noData_cnt; bool _data_lock; bool _data_updated; @@ -413,6 +413,7 @@ public slots: void reload(); void refresh(int holdtime); void stop_capture(); + void check_update(); // repeat void set_repeating(bool repeat); void set_map_zoom(int index); @@ -422,7 +423,6 @@ public slots: private slots: void data_lock(); void data_unlock(); - void check_update(); void nodata_timeout(); void repeat_update(); diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index c4e83e34..a8ef83c3 100755 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -141,6 +141,7 @@ void Viewport::paintEvent(QPaintEvent *event) QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this); + _view.session().check_update(); QColor fore(QWidget::palette().color(QWidget::foregroundRole())); QColor back(QWidget::palette().color(QWidget::backgroundRole())); fore.setAlpha(View::ForeAlpha); @@ -328,7 +329,7 @@ void Viewport::paintSignals(QPainter &p, QColor fore, QColor back) } else if (_waiting_trig > 0) { type_str = "Waiting Trig"; for (int i = 1; i < _waiting_trig; i++) - if (i % (WaitLoopTime / SigSession::ViewTime) == 0) + if (i % (WaitLoopTime / SigSession::FeedInterval) == 0) type_str += "."; } else { type_str = "Trig'd"; @@ -1613,7 +1614,7 @@ void Viewport::set_need_update(bool update) void Viewport::show_wait_trigger() { - _waiting_trig %= (WaitLoopTime / SigSession::ViewTime) * 4; + _waiting_trig %= (WaitLoopTime / SigSession::FeedInterval) * 4; _waiting_trig++; update(); }