From 6dc75374bd1d769db77873ffed7ed320954efa06 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Mon, 4 May 2015 15:13:27 +0800 Subject: [PATCH] keep channel setting when reload @ LA mode --- DSView/pv/sigsession.cpp | 24 +++++++++++++++++------- DSView/pv/view/decodetrace.cpp | 2 +- DSView/pv/view/logicsignal.cpp | 9 +++++++++ DSView/pv/view/logicsignal.h | 4 ++++ DSView/pv/view/signal.cpp | 7 +++++++ DSView/pv/view/signal.h | 5 +++++ DSView/pv/view/trace.cpp | 29 +++++++++++++++++------------ DSView/pv/view/trace.h | 8 ++++++-- DSView/pv/view/view.cpp | 5 ++++- 9 files changed, 70 insertions(+), 23 deletions(-) diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index b122fbee..2a4f5006 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -667,6 +667,7 @@ void SigSession::init_signals() assert(_dev_inst); stop_capture(); + vector< boost::shared_ptr > sigs; boost::shared_ptr signal; unsigned int logic_probe_count = 0; unsigned int dso_probe_count = 0; @@ -726,8 +727,6 @@ void SigSession::init_signals() // Make the logic probe list { - _signals.clear(); - for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) { const sr_channel *const probe = (const sr_channel *)l->data; @@ -752,8 +751,13 @@ void SigSession::init_signals() break; } if(signal.get()) - _signals.push_back(signal); + sigs.push_back(signal); } + + _signals.clear(); + vector< boost::shared_ptr >().swap(_signals); + _signals = sigs; + signals_changed(); data_updated(); } @@ -766,12 +770,11 @@ void SigSession::reload() if (_capture_state == Running) stop_capture(); + vector< boost::shared_ptr > sigs; boost::shared_ptr signal; // Make the logic probe list { - _signals.clear(); - for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) { const sr_channel *const probe = (const sr_channel *)l->data; @@ -779,7 +782,10 @@ void SigSession::reload() signal.reset(); switch(probe->type) { case SR_CHANNEL_LOGIC: - if (probe->enabled) + if (probe->enabled && probe->index < _signals.size()) + signal = boost::shared_ptr( + new view::LogicSignal(*_signals[probe->index].get(), _logic_data, probe)); + else if (probe->enabled) signal = boost::shared_ptr( new view::LogicSignal(_dev_inst, _logic_data, probe)); break; @@ -796,8 +802,12 @@ void SigSession::reload() break; } if (signal.get()) - _signals.push_back(signal); + sigs.push_back(signal); } + + _signals.clear(); + vector< boost::shared_ptr >().swap(_signals); + _signals = sigs; } signals_changed(); diff --git a/DSView/pv/view/decodetrace.cpp b/DSView/pv/view/decodetrace.cpp index a478d9db..7b0fea45 100644 --- a/DSView/pv/view/decodetrace.cpp +++ b/DSView/pv/view/decodetrace.cpp @@ -117,7 +117,7 @@ const QColor DecodeTrace::OutlineColours[16] = { DecodeTrace::DecodeTrace(pv::SigSession &session, boost::shared_ptr decoder_stack, int index) : Trace(QString::fromUtf8( - decoder_stack->stack().front()->decoder()->name), Trace::DS_DECODER), + decoder_stack->stack().front()->decoder()->name), index, Trace::DS_DECODER), _session(session), _decoder_stack(decoder_stack), _show_hide_mapper(this) diff --git a/DSView/pv/view/logicsignal.cpp b/DSView/pv/view/logicsignal.cpp index 83db2e7c..bd95cc0a 100644 --- a/DSView/pv/view/logicsignal.cpp +++ b/DSView/pv/view/logicsignal.cpp @@ -76,6 +76,15 @@ LogicSignal::LogicSignal(boost::shared_ptr dev_inst, _colour = SignalColours[probe->index % countof(SignalColours)]; } +LogicSignal::LogicSignal(const Signal &s, + boost::shared_ptr data, + const sr_channel * const probe) : + Signal(s, probe), + _data(data) +{ + assert(probe->index >= 0); +} + LogicSignal::~LogicSignal() { } diff --git a/DSView/pv/view/logicsignal.h b/DSView/pv/view/logicsignal.h index 75ea8e4d..9a03464f 100644 --- a/DSView/pv/view/logicsignal.h +++ b/DSView/pv/view/logicsignal.h @@ -58,6 +58,10 @@ public: boost::shared_ptr data, const sr_channel * const probe); + LogicSignal(const Signal &s, + boost::shared_ptr data, + const sr_channel * const probe); + virtual ~LogicSignal(); const sr_channel* probe() const; diff --git a/DSView/pv/view/signal.cpp b/DSView/pv/view/signal.cpp index 4c9c09a5..e4cba490 100644 --- a/DSView/pv/view/signal.cpp +++ b/DSView/pv/view/signal.cpp @@ -42,6 +42,13 @@ Signal::Signal(boost::shared_ptr dev_inst, { } +Signal::Signal(const Signal &s, const sr_channel * const probe) : + Trace((const Trace &)s), + _dev_inst(s._dev_inst), + _probe(probe) +{ +} + bool Signal::enabled() const { return _probe->enabled; diff --git a/DSView/pv/view/signal.h b/DSView/pv/view/signal.h index b599a07c..3ad90f44 100644 --- a/DSView/pv/view/signal.h +++ b/DSView/pv/view/signal.h @@ -59,6 +59,11 @@ protected: Signal(boost::shared_ptr dev_inst, const sr_channel * const probe, int type); + /** + * Copy constructor + */ + Signal(const Signal &s, const sr_channel * const probe); + public: virtual boost::shared_ptr data() const = 0; diff --git a/DSView/pv/view/trace.cpp b/DSView/pv/view/trace.cpp index a6820b9d..e234a723 100644 --- a/DSView/pv/view/trace.cpp +++ b/DSView/pv/view/trace.cpp @@ -53,19 +53,9 @@ const QPen Trace::SignalAxisPen = QColor(128, 128, 128, 64); const QPen Trace::AxisPen(QColor(128, 128, 128, 64)); const int Trace::LabelHitPadding = 2; -Trace::Trace(QString name, int type) : - _name(name), - _v_offset(0), - _type(type), - _sec_index(0), - _signalHeight(30), - _trig(0) -{ -} - Trace::Trace(QString name, int index, int type) : _name(name), - _v_offset(0), + _v_offset(INT_MAX), _type(type), _sec_index(0), _signalHeight(30), @@ -76,7 +66,7 @@ Trace::Trace(QString name, int index, int type) : Trace::Trace(QString name, std::list index_list, int type, int sec_index) : _name(name), - _v_offset(0), + _v_offset(INT_MAX), _type(type), _index_list(index_list), _sec_index(sec_index), @@ -85,6 +75,21 @@ Trace::Trace(QString name, std::list index_list, int type, int sec_index) : { } +Trace::Trace(const Trace &t) : + _view(t._view), + _name(t._name), + _colour(t._colour), + _v_offset(t._v_offset), + _type(t._type), + _index_list(t._index_list), + _sec_index(t._sec_index), + _old_v_offset(t._old_v_offset), + _signalHeight(t._signalHeight), + _trig(t._trig), + _text_size(t._text_size) +{ +} + QString Trace::get_name() const { return _name; diff --git a/DSView/pv/view/trace.h b/DSView/pv/view/trace.h index 8eaae6bc..031f94a7 100644 --- a/DSView/pv/view/trace.h +++ b/DSView/pv/view/trace.h @@ -84,12 +84,16 @@ public: static const QPen SignalAxisPen; protected: - Trace(QString name, int type); Trace(QString name, int index, int type); Trace(QString name, std::list index_list, int type, int sec_index); + /** + * Copy constructor + */ + Trace(const Trace &t); + public: - enum {DS_LOGIC = 0, DS_ANALOG, DS_GROUP, DS_DSO, DS_DECODER}; + enum {DS_LOGIC = 0, DS_ANALOG, DS_DSO, DS_GROUP, DS_DECODER}; public: /** diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index 4ae18dd9..66f2e415 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -298,7 +298,10 @@ bool View::compare_trace_v_offsets(const boost::shared_ptr &a, { assert(a); assert(b); - return a->get_v_offset() < b->get_v_offset(); + if (a->get_type() != b->get_type()) + return a->get_type() > b->get_type(); + else + return a->get_v_offset() < b->get_v_offset(); } bool View::cursors_shown() const