diff options
Diffstat (limited to 'DSLogic-gui/pv/view')
-rw-r--r-- | DSLogic-gui/pv/view/analogsignal.cpp | 12 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/analogsignal.h | 1 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/dsldial.cpp | 110 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/dsldial.h | 48 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/dsosignal.cpp | 224 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/dsosignal.h | 103 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/groupsignal.cpp | 12 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/groupsignal.h | 1 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/header.cpp | 240 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/header.h | 21 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/logicsignal.cpp | 8 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/logicsignal.h | 1 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/protocolsignal.cpp | 9 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/protocolsignal.h | 1 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/ruler.cpp | 6 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/signal.cpp | 498 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/signal.h | 112 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/view.cpp | 95 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/view.h | 7 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/viewport.cpp | 129 | ||||
-rw-r--r-- | DSLogic-gui/pv/view/viewport.h | 9 |
21 files changed, 1396 insertions, 251 deletions
diff --git a/DSLogic-gui/pv/view/analogsignal.cpp b/DSLogic-gui/pv/view/analogsignal.cpp index 1d86310..2e62bfa 100644 --- a/DSLogic-gui/pv/view/analogsignal.cpp +++ b/DSLogic-gui/pv/view/analogsignal.cpp @@ -50,7 +50,7 @@ const QColor AnalogSignal::SignalColours[4] = { const float AnalogSignal::EnvelopeThreshold = 256.0f; -AnalogSignal::AnalogSignal(QString name, shared_ptr<data::Analog> data, +AnalogSignal::AnalogSignal(QString name, boost::shared_ptr<data::Analog> data, int probe_index, int order) : Signal(name, probe_index, DS_ANALOG, order), _data(data) @@ -64,9 +64,11 @@ AnalogSignal::~AnalogSignal() } void AnalogSignal::set_data(boost::shared_ptr<data::Logic> _logic_data, + boost::shared_ptr<data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<data::Group> _group_data) { + (void)_dso_data; (void)_logic_data; (void)_group_data; @@ -89,13 +91,13 @@ void AnalogSignal::paint(QPainter &p, int y, int left, int right, double scale, //paint_axis(p, y, left, right); - const deque< shared_ptr<pv::data::AnalogSnapshot> > &snapshots = + const deque< boost::shared_ptr<pv::data::AnalogSnapshot> > &snapshots = _data->get_snapshots(); if (snapshots.empty()) return; _scale = _signalHeight * 1.0f / 65536; - const shared_ptr<pv::data::AnalogSnapshot> &snapshot = + const boost::shared_ptr<pv::data::AnalogSnapshot> &snapshot = snapshots.front(); if (get_index() >= (int)snapshot->get_channel_num()) @@ -125,7 +127,7 @@ void AnalogSignal::paint(QPainter &p, int y, int left, int right, double scale, } void AnalogSignal::paint_trace(QPainter &p, - const shared_ptr<pv::data::AnalogSnapshot> &snapshot, + const boost::shared_ptr<pv::data::AnalogSnapshot> &snapshot, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel) { @@ -157,7 +159,7 @@ void AnalogSignal::paint_trace(QPainter &p, } void AnalogSignal::paint_envelope(QPainter &p, - const shared_ptr<pv::data::AnalogSnapshot> &snapshot, + const boost::shared_ptr<pv::data::AnalogSnapshot> &snapshot, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel) { diff --git a/DSLogic-gui/pv/view/analogsignal.h b/DSLogic-gui/pv/view/analogsignal.h index fc38a2e..b954487 100644 --- a/DSLogic-gui/pv/view/analogsignal.h +++ b/DSLogic-gui/pv/view/analogsignal.h @@ -75,6 +75,7 @@ public: void del_decoder(); void set_data(boost::shared_ptr<pv::data::Logic> _logic_data, + boost::shared_ptr<pv::data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<pv::data::Group> _group_data); diff --git a/DSLogic-gui/pv/view/dsldial.cpp b/DSLogic-gui/pv/view/dsldial.cpp new file mode 100644 index 0000000..ccdec2e --- /dev/null +++ b/DSLogic-gui/pv/view/dsldial.cpp @@ -0,0 +1,110 @@ +#include "dsldial.h"
+
+#include <assert.h>
+
+namespace pv {
+namespace view {
+
+dslDial::dslDial(quint64 div, quint64 step,
+ QVector<quint64> value, QVector<QString> unit)
+{
+ assert(div > 0);
+ assert(step > 0);
+ assert((quint64)value.count() == div);
+ assert(unit.count() > 0);
+
+ _div = div;
+ _step = step;
+ _value = value;
+ _unit = unit;
+ _sel = 0;
+}
+
+dslDial::~dslDial()
+{
+}
+
+void dslDial::paint(QPainter &p, QRectF dialRect, QColor dialColor)
+{
+ p.setRenderHint(QPainter::Antialiasing, true);
+ p.setPen(dialColor);
+ p.setBrush(dialColor);
+
+ int dialStartAngle = 225 * 16;
+ int dialSpanAngle = -270 * 16;
+
+ // draw dial arc
+ p.drawArc(dialRect, dialStartAngle, dialSpanAngle);
+ // draw ticks
+ p.save();
+ p.translate(dialRect.center());
+ p.rotate(45);
+ for (quint64 i = 0; i < _div; i++) {
+ // draw major ticks
+ p.drawLine(0, dialRect.width()/2+3, 0, dialRect.width()/2+8);
+ // draw minor ticks
+ for (quint64 j = 0; (j < 5) && (i < _div - 1); j++) {
+ p.drawLine(0, dialRect.width()/2+3, 0, dialRect.width()/2+5);
+ p.rotate(54.0/(_div-1));
+ }
+ }
+ // draw pointer
+ p.rotate(90+270.0/(_div-1)*_sel);
+ p.drawEllipse(-3, -3, 6, 6);
+ p.drawLine(3, 0, 0, dialRect.width()/2-3);
+ p.drawLine(-3, 0, 0, dialRect.width()/2-3);
+ p.restore();
+ // draw value
+ quint64 displayValue = _value[_sel];
+ quint64 displayIndex = 0;
+ while(displayValue / _step >= 1) {
+ displayValue = displayValue / _step;
+ displayIndex++;
+ }
+ QString pText = QString::number(displayValue) + _unit[displayIndex] + "/div";
+ QFontMetrics fm(p.font());
+ p.drawText(QRectF(dialRect.left(), dialRect.bottom()-dialRect.width()*0.3+fm.height()*0.5, dialRect.width(), fm.height()), Qt::AlignCenter, pText);
+
+}
+
+void dslDial::set_sel(quint64 sel)
+{
+ assert(sel < _div);
+
+ _sel = sel;
+}
+
+quint64 dslDial::get_sel()
+{
+ return _sel;
+}
+
+bool dslDial::isMin()
+{
+ if(_sel == 0)
+ return true;
+ else
+ return false;
+}
+
+bool dslDial::isMax()
+{
+ if(_sel == _div - 1)
+ return true;
+ else
+ return false;
+}
+
+quint64 dslDial::get_value()
+{
+ return _value[_sel];
+}
+
+bool dslDial::set_value(quint64 value)
+{
+ assert(_value.contains(value));
+ _sel = _value.indexOf(value, 0);
+}
+
+} // namespace view
+} // namespace pv
diff --git a/DSLogic-gui/pv/view/dsldial.h b/DSLogic-gui/pv/view/dsldial.h new file mode 100644 index 0000000..6925309 --- /dev/null +++ b/DSLogic-gui/pv/view/dsldial.h @@ -0,0 +1,48 @@ +#ifndef DSLOGIC_PV_VIEW_DSLDIAL_H
+#define DSLOGIC_PV_VIEW_DSLDIAL_H
+
+#include <QRect>
+#include <QPainter>
+
+namespace pv {
+namespace view {
+
+class dslDial
+{
+public:
+ dslDial(quint64 div, quint64 step,
+ QVector<quint64> value, QVector<QString> unit);
+ virtual ~dslDial();
+
+public:
+ /**
+ * Paints the dial with a QPainter
+ * @param p the QPainter to paint into.
+ * @param dialRect the rectangle to draw the dial at.
+ **/
+ void paint(QPainter &p, QRectF dialRect, QColor dialColor);
+
+ // set/get current select
+ void set_sel(quint64 sel);
+ quint64 get_sel();
+
+ // boundary detection
+ bool isMin();
+ bool isMax();
+
+ // get current value
+ quint64 get_value();
+ bool set_value(quint64 value);
+
+private:
+ quint64 _div;
+ quint64 _step;
+ QVector<quint64> _value;
+ QVector<QString> _unit;
+ quint64 _sel;
+};
+
+} // namespace view
+} // namespace pv
+
+#endif // DSLOGIC_PV_VIEW_DSLDIAL_H
diff --git a/DSLogic-gui/pv/view/dsosignal.cpp b/DSLogic-gui/pv/view/dsosignal.cpp new file mode 100644 index 0000000..d11108b --- /dev/null +++ b/DSLogic-gui/pv/view/dsosignal.cpp @@ -0,0 +1,224 @@ +/* + * This file is part of the DSLogic-gui project. + * DSLogic-gui is based on PulseView. + * + * Copyright (C) 2013 DreamSourceLab <dreamsourcelab@dreamsourcelab.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include <extdef.h> + +#include <math.h> + +#include "dsosignal.h" +#include "pv/data/dso.h" +#include "pv/data/dsosnapshot.h" + +using namespace boost; +using namespace std; + +namespace pv { +namespace view { + +const QColor DsoSignal::SignalColours[4] = { + QColor(238, 178, 17, 200), // dsYellow + QColor(0, 153, 37, 200), // dsGreen + QColor(213, 15, 37, 200), // dsRed + QColor(17, 133, 209, 200) // dsBlue + +}; + +const float DsoSignal::EnvelopeThreshold = 256.0f; + +DsoSignal::DsoSignal(QString name, boost::shared_ptr<data::Dso> data, + int probe_index, int order, uint64_t vdiv, uint64_t timebase, bool coupling, bool active) : + Signal(name, probe_index, DS_DSO, order), + _data(data) +{ + _colour = SignalColours[probe_index % countof(SignalColours)]; + _scale = _windowHeight * 1.0f / 256; + _vDial->set_value(vdiv); + _hDial->set_value(timebase); + _acCoupling = coupling; + _active = active; +} + +DsoSignal::~DsoSignal() +{ +} + +void DsoSignal::set_data(boost::shared_ptr<data::Logic> _logic_data, + boost::shared_ptr<data::Dso> _dso_data, + boost::shared_ptr<pv::data::Analog> _analog_data, + boost::shared_ptr<data::Group> _group_data) +{ + (void)_analog_data; + (void)_logic_data; + (void)_group_data; + + assert(_dso_data); + + _data = _dso_data; +} + +void DsoSignal::set_scale(float scale) +{ + _scale = scale; +} + +void DsoSignal::paint(QPainter &p, int y, int left, int right, double scale, + double offset) +{ + assert(scale > 0); + assert(_data); + assert(right >= left); + + const deque< boost::shared_ptr<pv::data::DsoSnapshot> > &snapshots = + _data->get_snapshots(); + if (snapshots.empty()) + return; + + _scale = _windowHeight * 1.0f / 256; + const boost::shared_ptr<pv::data::DsoSnapshot> &snapshot = + snapshots.front(); + + const uint16_t number_channels = snapshot->get_channel_num(); + if ((unsigned int)get_index() >= number_channels) + return; + + const double pixels_offset = offset / scale; + const double samplerate = _data->get_samplerate(); + const double start_time = _data->get_start_time(); + const int64_t last_sample = max((int64_t)(snapshot->get_sample_count() - 1), (int64_t)0); + const double samples_per_pixel = samplerate * scale; + const double start = samplerate * (offset - start_time); + const double end = start + samples_per_pixel * (right - left); + + const int64_t start_sample = min(max((int64_t)floor(start), + (int64_t)0), last_sample); + const int64_t end_sample = min(max((int64_t)ceil(end) + 1, + (int64_t)0), last_sample); + + if (samples_per_pixel < EnvelopeThreshold) + paint_trace(p, snapshot, y, left, + start_sample, end_sample, + pixels_offset, samples_per_pixel, number_channels); + else + paint_envelope(p, snapshot, y, left, + start_sample, end_sample, + pixels_offset, samples_per_pixel); +} + +void DsoSignal::paint_trace(QPainter &p, + const boost::shared_ptr<pv::data::DsoSnapshot> &snapshot, + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel, uint64_t num_channels) +{ + const int64_t sample_count = end - start; + + if (sample_count > 0) { + const uint8_t *const samples = snapshot->get_samples(start, end, get_index()); + assert(samples); + + p.setPen(_colour); + //p.setPen(QPen(_colour, 3, Qt::SolidLine)); + + QPointF *points = new QPointF[sample_count]; + QPointF *point = points; + + for (int64_t sample = start; sample < end; sample++) { + const float x = (sample / samples_per_pixel - pixels_offset) + left; + uint8_t offset = samples[(sample - start)*num_channels]; + *point++ = QPointF(x, + y - offset * _scale); + } + + p.drawPolyline(points, point - points); + + //delete[] samples; + delete[] points; + } +} + +void DsoSignal::paint_envelope(QPainter &p, + const boost::shared_ptr<pv::data::DsoSnapshot> &snapshot, + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel) +{ + using namespace Qt; + using pv::data::DsoSnapshot; + + DsoSnapshot::EnvelopeSection e; + snapshot->get_envelope_section(e, start, end, samples_per_pixel, get_index()); + + if (e.length < 2) + return; + + p.setPen(QPen(NoPen)); + //p.setPen(QPen(_colour, 2, Qt::SolidLine)); + p.setBrush(_colour); + + QRectF *const rects = new QRectF[e.length]; + QRectF *rect = rects; + + for(uint64_t sample = 0; sample < e.length-1; sample++) { + const float x = ((e.scale * sample + e.start) / + samples_per_pixel - pixels_offset) + left; + const DsoSnapshot::EnvelopeSample *const s = + e.samples + sample; + + // We overlap this sample with the next so that vertical + // gaps do not appear during steep rising or falling edges + const float b = y - max(s->max, (s+1)->min) * _scale; + const float t = y - min(s->min, (s+1)->max) * _scale; + + float h = b - t; + if(h >= 0.0f && h <= 1.0f) + h = 1.0f; + if(h <= 0.0f && h >= -1.0f) + h = -1.0f; + + *rect++ = QRectF(x, t, 1.0f, h); + } + + p.drawRects(rects, e.length); + + delete[] rects; + //delete[] e.samples; +} + +const std::vector< std::pair<uint64_t, bool> > DsoSignal::cur_edges() const +{ + +} + +void DsoSignal::set_decoder(pv::decoder::Decoder *decoder) +{ + (void)decoder; +} + +decoder::Decoder *DsoSignal::get_decoder() +{ + return NULL; +} + +void DsoSignal::del_decoder() +{ +} + +} // namespace view +} // namespace pv diff --git a/DSLogic-gui/pv/view/dsosignal.h b/DSLogic-gui/pv/view/dsosignal.h new file mode 100644 index 0000000..e22680a --- /dev/null +++ b/DSLogic-gui/pv/view/dsosignal.h @@ -0,0 +1,103 @@ +/* + * This file is part of the DSLogic-gui project. + * DSLogic-gui is based on PulseView. + * + * Copyright (C) 2013 DreamSourceLab <dreamsourcelab@dreamsourcelab.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef DSLOGIC_PV_DSOSIGNAL_H +#define DSLOGIC_PV_DSOSIGNAL_H + +#include "signal.h" + +#include <boost/shared_ptr.hpp> + +namespace pv { + +namespace data { +class Logic; +class Dso; +class Analog; +class DsoSnapshot; +} + +namespace view { + +class DsoSignal : public Signal +{ +private: + static const QColor SignalColours[4]; + + static const float EnvelopeThreshold; + +public: + DsoSignal(QString name, + boost::shared_ptr<pv::data::Dso> data, int probe_index, int order, + uint64_t vdiv, uint64_t timebase, bool coupling, bool active); + + virtual ~DsoSignal(); + + void set_scale(float scale); + + /** + * Paints the signal with a QPainter + * @param p the QPainter to paint into. + * @param y the y-coordinate to draw the signal at. + * @param left the x-coordinate of the left edge of the signal. + * @param right the x-coordinate of the right edge of the signal. + * @param scale the scale in seconds per pixel. + * @param offset the time to show at the left hand edge of + * the view in seconds. + **/ + void paint(QPainter &p, int y, int left, int right, double scale, + double offset); + + const std::vector< std::pair<uint64_t, bool> > cur_edges() const; + + void set_decoder(pv::decoder::Decoder *decoder); + + pv::decoder::Decoder* get_decoder(); + + void del_decoder(); + + void set_data(boost::shared_ptr<pv::data::Logic> _logic_data, + boost::shared_ptr<pv::data::Dso> _dso_data, + boost::shared_ptr<pv::data::Analog> _analog_data, + boost::shared_ptr<pv::data::Group> _group_data); + +private: + void paint_trace(QPainter &p, + const boost::shared_ptr<pv::data::DsoSnapshot> &snapshot, + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel, + uint64_t num_channels); + + void paint_envelope(QPainter &p, + const boost::shared_ptr<pv::data::DsoSnapshot> &snapshot, + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel); + +private: + boost::shared_ptr<pv::data::Dso> _data; + float _scale; +}; + +} // namespace view +} // namespace pv + +#endif // DSLOGIC_PV_DSOSIGNAL_H diff --git a/DSLogic-gui/pv/view/groupsignal.cpp b/DSLogic-gui/pv/view/groupsignal.cpp index 391779c..5330c06 100644 --- a/DSLogic-gui/pv/view/groupsignal.cpp +++ b/DSLogic-gui/pv/view/groupsignal.cpp @@ -58,10 +58,12 @@ GroupSignal::~GroupSignal() } void GroupSignal::set_data(boost::shared_ptr<data::Logic> _logic_data, + boost::shared_ptr<data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<data::Group> _group_data) { (void)_logic_data; + (void)_dso_data; (void)_analog_data; assert(_group_data); @@ -75,7 +77,7 @@ void GroupSignal::set_scale(float scale) } void GroupSignal::paint(QPainter &p, int y, int left, int right, double scale, - double offset) + double offset) { assert(scale > 0); assert(_data); @@ -84,12 +86,12 @@ void GroupSignal::paint(QPainter &p, int y, int left, int right, double scale, _scale = _signalHeight * 1.0f / pow(2, _index_list.size()); paint_axis(p, y, left, right); - const deque< shared_ptr<pv::data::GroupSnapshot> > &snapshots = + const deque< boost::shared_ptr<pv::data::GroupSnapshot> > &snapshots = _data->get_snapshots(); if (snapshots.empty()) return; - const shared_ptr<pv::data::GroupSnapshot> &snapshot = + const boost::shared_ptr<pv::data::GroupSnapshot> &snapshot = snapshots.at(_sec_index); const double pixels_offset = offset / scale; @@ -116,7 +118,7 @@ void GroupSignal::paint(QPainter &p, int y, int left, int right, double scale, } void GroupSignal::paint_trace(QPainter &p, - const shared_ptr<pv::data::GroupSnapshot> &snapshot, + const boost::shared_ptr<pv::data::GroupSnapshot> &snapshot, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel) { @@ -144,7 +146,7 @@ void GroupSignal::paint_trace(QPainter &p, } void GroupSignal::paint_envelope(QPainter &p, - const shared_ptr<pv::data::GroupSnapshot> &snapshot, + const boost::shared_ptr<pv::data::GroupSnapshot> &snapshot, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel) { diff --git a/DSLogic-gui/pv/view/groupsignal.h b/DSLogic-gui/pv/view/groupsignal.h index 43f858d..d38d1be 100644 --- a/DSLogic-gui/pv/view/groupsignal.h +++ b/DSLogic-gui/pv/view/groupsignal.h @@ -79,6 +79,7 @@ public: void del_decoder(); void set_data(boost::shared_ptr<pv::data::Logic> _logic_data, + boost::shared_ptr<pv::data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<pv::data::Group> _group_data); diff --git a/DSLogic-gui/pv/view/header.cpp b/DSLogic-gui/pv/view/header.cpp index 9bbea0b..6803e3a 100644 --- a/DSLogic-gui/pv/view/header.cpp +++ b/DSLogic-gui/pv/view/header.cpp @@ -39,6 +39,7 @@ #include <QPainter> #include <QRect> #include <QStyleOption> +#include <QMessageBox> using namespace boost; using namespace std; @@ -46,14 +47,6 @@ using namespace std; namespace pv { namespace view { -const int Header::COLOR = 1; -const int Header::NAME = 2; -const int Header::POSTRIG = 3; -const int Header::HIGTRIG = 4; -const int Header::NEGTRIG = 5; -const int Header::LOWTRIG = 6; -const int Header::LABEL = 7; - Header::Header(View &parent) : QWidget(&parent), _view(parent), @@ -90,16 +83,16 @@ int Header::get_nameEditWidth() return 0; } -boost::shared_ptr<pv::view::Signal> Header::get_mouse_over_signal( +boost::shared_ptr<pv::view::Signal> Header::get_mSig( int &action, const QPoint &pt) { const int w = width(); - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); const int v_offset = _view.v_offset(); - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { assert(s); @@ -108,7 +101,7 @@ boost::shared_ptr<pv::view::Signal> Header::get_mouse_over_signal( return s; } - return shared_ptr<Signal>(); + return boost::shared_ptr<Signal>(); } void Header::paintEvent(QPaintEvent*) @@ -122,7 +115,7 @@ void Header::paintEvent(QPaintEvent*) const int w = width(); int action; - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); //QPainter painter(this); @@ -130,7 +123,7 @@ void Header::paintEvent(QPaintEvent*) const int v_offset = _view.v_offset(); const bool dragging = !_drag_sigs.empty(); - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { assert(s); @@ -147,7 +140,7 @@ void Header::paintEvent(QPaintEvent*) w, s->get_old_v_offset() - v_offset - s->get_signalHeight()); painter.drawLine(0, s->get_old_v_offset() - v_offset, w, s->get_old_v_offset() - v_offset); - } else { + } else if (s->get_type() == Signal::DS_LOGIC){ painter.drawLine(0, s->get_old_v_offset() - v_offset + 10, w, s->get_old_v_offset() - v_offset + 10); } @@ -157,7 +150,7 @@ void Header::paintEvent(QPaintEvent*) w, s->get_v_offset() - v_offset); painter.drawLine(0, s->get_v_offset() - v_offset - s->get_signalHeight(), w, s->get_v_offset() - v_offset - s->get_signalHeight()); - } else { + } else if (s->get_type() == Signal::DS_LOGIC) { painter.drawLine(0, s->get_v_offset() - v_offset + 10, w, s->get_v_offset() - v_offset + 10); } @@ -171,7 +164,7 @@ void Header::mousePressEvent(QMouseEvent *event) { assert(event); - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); int action; @@ -179,23 +172,24 @@ void Header::mousePressEvent(QMouseEvent *event) _mouse_down_point = event->pos(); // Save the offsets of any signals which will be dragged - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) if (s->selected()) _drag_sigs.push_back( make_pair(s, s->get_v_offset())); // Select the signal if it has been clicked - const shared_ptr<Signal> mouse_over_signal = - get_mouse_over_signal(action, event->pos()); - if (action == COLOR && mouse_over_signal) { + const boost::shared_ptr<Signal> mSig = + get_mSig(action, event->pos()); + if (action == Signal::COLOR && mSig) { _colorFlag = true; - } else if (action == NAME && mouse_over_signal) { + } else if (action == Signal::NAME && mSig) { _nameFlag = true; - } else if (action == LABEL && mouse_over_signal) { - if (mouse_over_signal->selected()) - mouse_over_signal->select(false); + } else if (action == Signal::LABEL && mSig) { + if (mSig->selected()) + mSig->select(false); else { - mouse_over_signal->select(true); + if (mSig->get_type() != Signal::DS_DSO) + mSig->select(true); if (~QApplication::keyboardModifiers() & Qt::ControlModifier) @@ -204,37 +198,91 @@ void Header::mousePressEvent(QMouseEvent *event) // Add the signal to the drag list if (event->button() & Qt::LeftButton) _drag_sigs.push_back( - make_pair(mouse_over_signal, - mouse_over_signal->get_v_offset())); + make_pair(mSig, + (mSig->get_type() == Signal::DS_DSO) ? mSig->get_zeroPos() : mSig->get_v_offset())); } - mouse_over_signal->set_old_v_offset(mouse_over_signal->get_v_offset()); - } else if (action == POSTRIG && mouse_over_signal) { - if (mouse_over_signal->get_trig() == POSTRIG) - mouse_over_signal->set_trig(0); + mSig->set_old_v_offset(mSig->get_v_offset()); + } else if (action == Signal::POSTRIG && mSig) { + if (mSig->get_trig() == Signal::POSTRIG) + mSig->set_trig(0); else - mouse_over_signal->set_trig(POSTRIG); - } else if (action == HIGTRIG && mouse_over_signal) { - if (mouse_over_signal->get_trig() == HIGTRIG) - mouse_over_signal->set_trig(0); + mSig->set_trig(Signal::POSTRIG); + } else if (action == Signal::HIGTRIG && mSig) { + if (mSig->get_trig() == Signal::HIGTRIG) + mSig->set_trig(0); else - mouse_over_signal->set_trig(HIGTRIG); - } else if (action == NEGTRIG && mouse_over_signal) { - if (mouse_over_signal->get_trig() == NEGTRIG) - mouse_over_signal->set_trig(0); + mSig->set_trig(Signal::HIGTRIG); + } else if (action == Signal::NEGTRIG && mSig) { + if (mSig->get_trig() == Signal::NEGTRIG) + mSig->set_trig(0); else - mouse_over_signal->set_trig(NEGTRIG); - } else if (action == LOWTRIG && mouse_over_signal) { - if (mouse_over_signal->get_trig() == LOWTRIG) - mouse_over_signal->set_trig(0); + mSig->set_trig(Signal::NEGTRIG); + } else if (action == Signal::LOWTRIG && mSig) { + if (mSig->get_trig() == Signal::LOWTRIG) + mSig->set_trig(0); else - mouse_over_signal->set_trig(LOWTRIG); + mSig->set_trig(Signal::LOWTRIG); + } else if (action == Signal::EDGETRIG && mSig) { + if (mSig->get_trig() == Signal::EDGETRIG) + mSig->set_trig(0); + else + mSig->set_trig(Signal::EDGETRIG); + } else if (action == Signal::VDIAL && mSig) { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + s->set_hDialActive(false); + if (s != mSig) { + s->set_vDialActive(false); + } + } + mSig->set_vDialActive(!mSig->get_vDialActive()); + } else if (action == Signal::HDIAL && mSig) { + if (mSig->get_hDialActive()) { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + s->set_vDialActive(false); + s->set_hDialActive(false); + } + } else { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + s->set_vDialActive(false); + s->set_hDialActive(true); + } + } + } else if (action == Signal::CHEN && mSig) { + int channel; + if (mSig->get_index() == 0) { + bool last = 1; + channel = 0; + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + if (s->get_index() != 0 && s->get_active()) { + QMessageBox msg(this); + msg.setText("Tips"); + msg.setInformativeText("If only one channel want, Channel0 has a higher maximum sample rate!"); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Information); + msg.exec(); + s->set_active(!s->get_active()); + last = 0; + channel = s->get_index(); + break; + } + } + if (last) + mSig->set_active(!mSig->get_active()); + } else { + mSig->set_active(!mSig->get_active()); + channel = mSig->get_index(); + } + ch_changed(channel); + } else if (action == Signal::ACDC && mSig) { + mSig->set_acCoupling(!mSig->get_acCoupling()); + acdc_changed(mSig->get_index()); } if (~QApplication::keyboardModifiers() & Qt::ControlModifier) { // Unselect all other signals because the Ctrl is not // pressed - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) - if (s != mouse_over_signal) + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) + if (s != mSig) s->select(false); } update(); @@ -247,15 +295,15 @@ void Header::mouseReleaseEvent(QMouseEvent *event) // judge for color / name / trigger / move int action; - const shared_ptr<Signal> mouse_over_signal = - get_mouse_over_signal(action, event->pos()); - if (mouse_over_signal){ - if (action == COLOR && _colorFlag) { - _context_signal = mouse_over_signal; + const boost::shared_ptr<Signal> mSig = + get_mSig(action, event->pos()); + if (mSig){ + if (action == Signal::COLOR && _colorFlag) { + _context_signal = mSig; changeColor(event); _view.set_need_update(true); - } else if (action == NAME && _nameFlag) { - _context_signal = mouse_over_signal; + } else if (action == Signal::NAME && _nameFlag) { + _context_signal = mSig; changeName(event); } } @@ -270,12 +318,48 @@ void Header::mouseReleaseEvent(QMouseEvent *event) _view.normalize_layout(); } +void Header::wheelEvent(QWheelEvent *event) +{ + assert(event); + + if (event->orientation() == Qt::Vertical) { + const vector< shared_ptr<Signal> > sigs( + _view.session().get_signals()); + // Vertical scrolling + double shift = event->delta() / 20.0; + if (shift > 1.0) { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + if (s->get_vDialActive()) { + if(s->go_vDialNext()) + vDial_changed(s->get_index()); + break; + } else if (s->get_hDialActive()) { + if(s->go_hDialNext()) + hDial_changed(0); + } + } + } else if (shift < -1.0) { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + if (s->get_vDialActive()) { + if(s->go_vDialPre()) + vDial_changed(s->get_index()); + break; + } else if (s->get_hDialActive()) { + if(s->go_hDialPre()) + hDial_changed(0); + } + } + } + update(); + } +} + void Header::move(QMouseEvent *event) { bool _moveValid = false; bool _moveUp = false; bool firstCheck = true; - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); boost::shared_ptr<Signal> minDragSig; boost::shared_ptr<Signal> maxDragSig; @@ -323,7 +407,7 @@ void Header::move(QMouseEvent *event) } if (!_moveValid && firstCheck){ firstCheck = false; - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { if (_moveUp) { if (s->selected()) { if ((minOffset <= s->get_old_v_offset()) && (minOffset > (s->get_old_v_offset() - _view.get_spanY()))) { @@ -360,7 +444,7 @@ void Header::move(QMouseEvent *event) } } if (_moveValid) { - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { if (_moveUp) { if (s->selected() && s == minDragSig) { s->set_v_offset(targetOffset); @@ -393,7 +477,7 @@ void Header::move(QMouseEvent *event) if (_moveValid) { signals_moved(); } else { - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { if (s->selected()) { s->set_v_offset(s->get_old_v_offset()); s->select(false); @@ -439,24 +523,31 @@ void Header::mouseMoveEvent(QMouseEvent *event) i != _drag_sigs.end(); i++) { const boost::shared_ptr<Signal> sig((*i).first); if (sig) { - const int y = (*i).second + delta; - const int y_snap = - ((y + View::SignalSnapGridSize / 2) / - View::SignalSnapGridSize) * - View::SignalSnapGridSize; - if (y_snap != sig->get_v_offset()) { - _moveFlag = true; - sig->set_v_offset(y_snap); + int y = (*i).second + delta; + if (sig->get_type() != Signal::DS_DSO) { + const int y_snap = + ((y + View::SignalSnapGridSize / 2) / + View::SignalSnapGridSize) * + View::SignalSnapGridSize; + if (y_snap != sig->get_v_offset()) { + _moveFlag = true; + sig->set_v_offset(y_snap); + } + // Ensure the signal is selected + sig->select(true); + } else { + if (y < 0) + y = 0; + else if (y > height()) + y = height(); + sig->set_zeroPos(y); + sig->select(false); + signals_moved(); } - // Ensure the signal is selected - sig->select(true); } - } - //signals_moved(); } - update(); } @@ -470,10 +561,9 @@ void Header::contextMenuEvent(QContextMenuEvent *event) { int action; - const shared_ptr<Signal> s = get_mouse_over_signal(action, _mouse_point); + const boost::shared_ptr<Signal> s = get_mSig(action, _mouse_point); - //if (!s || action != LABEL) - if (!s || !s->selected() || action != LABEL) + if (!s || !s->selected() || action != Signal::LABEL) return; QMenu menu(this); @@ -489,7 +579,7 @@ void Header::contextMenuEvent(QContextMenuEvent *event) void Header::on_action_set_name_triggered() { - shared_ptr<view::Signal> context_signal = _context_signal; + boost::shared_ptr<view::Signal> context_signal = _context_signal; if (!context_signal) return; diff --git a/DSLogic-gui/pv/view/header.h b/DSLogic-gui/pv/view/header.h index 1756278..3e16f27 100644 --- a/DSLogic-gui/pv/view/header.h +++ b/DSLogic-gui/pv/view/header.h @@ -47,16 +47,7 @@ public: Header(View &parent); private: - static const int COLOR; - static const int NAME; - static const int POSTRIG; - static const int HIGTRIG; - static const int NEGTRIG; - static const int LOWTRIG; - static const int LABEL; - -private: - boost::shared_ptr<pv::view::Signal> get_mouse_over_signal( + boost::shared_ptr<pv::view::Signal> get_mSig( int &action, const QPoint &pt); @@ -65,13 +56,10 @@ private: private: void mousePressEvent(QMouseEvent * event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void leaveEvent(QEvent *event); - + void wheelEvent(QWheelEvent *event); void contextMenuEvent(QContextMenuEvent *event); void move(QMouseEvent *event); @@ -93,8 +81,11 @@ private slots: signals: void signals_moved(); - void header_updated(); + void vDial_changed(quint16); + void hDial_changed(quint16); + void acdc_changed(quint16); + void ch_changed(quint16); private: View &_view; diff --git a/DSLogic-gui/pv/view/logicsignal.cpp b/DSLogic-gui/pv/view/logicsignal.cpp index 5e66bb7..f9fae10 100644 --- a/DSLogic-gui/pv/view/logicsignal.cpp +++ b/DSLogic-gui/pv/view/logicsignal.cpp @@ -65,7 +65,7 @@ const QColor LogicSignal::SignalColours[8] = { const int LogicSignal::StateHeight = 12; const int LogicSignal::StateRound = 5; -LogicSignal::LogicSignal(QString name, shared_ptr<data::Logic> data, +LogicSignal::LogicSignal(QString name, boost::shared_ptr<data::Logic> data, int probe_index, int order) : Signal(name, probe_index, DS_LOGIC, order), _probe_index(probe_index), @@ -82,9 +82,11 @@ LogicSignal::~LogicSignal() } void LogicSignal::set_data(boost::shared_ptr<data::Logic> _logic_data, + boost::shared_ptr<data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<data::Group> _group_data) { + (void)_dso_data; (void)_analog_data; (void)_group_data; @@ -110,12 +112,12 @@ void LogicSignal::paint(QPainter &p, int y, int left, int right, const float high_offset = y - _signalHeight + 0.5f; const float low_offset = y + 0.5f; - const deque< shared_ptr<pv::data::LogicSnapshot> > &snapshots = + const deque< boost::shared_ptr<pv::data::LogicSnapshot> > &snapshots = _data->get_snapshots(); if (snapshots.empty()) return; - const shared_ptr<pv::data::LogicSnapshot> &snapshot = + const boost::shared_ptr<pv::data::LogicSnapshot> &snapshot = snapshots.front(); double samplerate = _data->get_samplerate(); diff --git a/DSLogic-gui/pv/view/logicsignal.h b/DSLogic-gui/pv/view/logicsignal.h index 39dd388..fa407f2 100644 --- a/DSLogic-gui/pv/view/logicsignal.h +++ b/DSLogic-gui/pv/view/logicsignal.h @@ -62,6 +62,7 @@ public: virtual ~LogicSignal(); void set_data(boost::shared_ptr<pv::data::Logic> _logic_data, + boost::shared_ptr<pv::data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<pv::data::Group> _group_data); /** diff --git a/DSLogic-gui/pv/view/protocolsignal.cpp b/DSLogic-gui/pv/view/protocolsignal.cpp index 91834d3..9ad3830 100644 --- a/DSLogic-gui/pv/view/protocolsignal.cpp +++ b/DSLogic-gui/pv/view/protocolsignal.cpp @@ -41,7 +41,7 @@ namespace view { const int ProtocolSignal::StateHeight = 16;
const int ProtocolSignal::StateRound = 3;
-ProtocolSignal::ProtocolSignal(QString name, shared_ptr<data::Logic> data,
+ProtocolSignal::ProtocolSignal(QString name, boost::shared_ptr<data::Logic> data,
pv::decoder::Decoder *decoder, std::list<int> probe_index_list, int order, int protocol_index) :
Signal(name, probe_index_list, DS_PROTOCOL, order, protocol_index),
_probe_index_list(probe_index_list),
@@ -55,10 +55,11 @@ ProtocolSignal::~ProtocolSignal() {
}
-void ProtocolSignal::set_data(boost::shared_ptr<data::Logic> _logic_data,
+void ProtocolSignal::set_data(boost::shared_ptr<data::Logic> _logic_data, boost::shared_ptr<data::Dso> _dso_data,
boost::shared_ptr<pv::data::Analog> _analog_data,
boost::shared_ptr<data::Group> _group_data)
{
+ (void)_dso_data;
(void)_analog_data;
(void)_group_data;
@@ -86,12 +87,12 @@ void ProtocolSignal::paint(QPainter &p, int y, int left, int right, double scale const float middle_offset = y - _signalHeight / 2 + 0.5f;
//const float low_offset = y + 0.5f;
- const deque< shared_ptr<pv::data::LogicSnapshot> > &snapshots =
+ const deque< boost::shared_ptr<pv::data::LogicSnapshot> > &snapshots =
_data->get_snapshots();
if (snapshots.empty())
return;
- const shared_ptr<pv::data::LogicSnapshot> &snapshot =
+ const boost::shared_ptr<pv::data::LogicSnapshot> &snapshot =
snapshots.front();
double samplerate = _data->get_samplerate();
diff --git a/DSLogic-gui/pv/view/protocolsignal.h b/DSLogic-gui/pv/view/protocolsignal.h index e608be4..2e37ab8 100644 --- a/DSLogic-gui/pv/view/protocolsignal.h +++ b/DSLogic-gui/pv/view/protocolsignal.h @@ -57,6 +57,7 @@ public: virtual ~ProtocolSignal();
void set_data(boost::shared_ptr<pv::data::Logic> _logic_data,
+ boost::shared_ptr<pv::data::Dso> _dso_data,
boost::shared_ptr<pv::data::Analog> _analog_data,
boost::shared_ptr<pv::data::Group> _group_data);
diff --git a/DSLogic-gui/pv/view/ruler.cpp b/DSLogic-gui/pv/view/ruler.cpp index 1441318..f049beb 100644 --- a/DSLogic-gui/pv/view/ruler.cpp +++ b/DSLogic-gui/pv/view/ruler.cpp @@ -99,7 +99,7 @@ QString Ruler::format_freq(double period, unsigned precision) assert(order >= FirstSIPrefixPower); const unsigned int prefix = ceil((order - FirstSIPrefixPower) / 3.0f); const double multiplier = pow(10.0, - - prefix * 3 - FirstSIPrefixPower); + static_cast<double>(- prefix * 3 - FirstSIPrefixPower)); QString s; QTextStream ts(&s); @@ -114,7 +114,7 @@ QString Ruler::format_time(double t, unsigned int prefix, unsigned int precision) { const double multiplier = pow(10.0, - - prefix * 3 - FirstSIPrefixPower); + static_cast<double>(- prefix * 3 - FirstSIPrefixPower)); QString s; QTextStream ts(&s); @@ -318,7 +318,7 @@ void Ruler::draw_tick_mark(QPainter &p) //const int order = (int)floorf(log10f(_min_period)); const int order = ceil(log10f(_min_period)); - const double order_decimal = pow(10, order); + const double order_decimal = pow(10.0, static_cast<double>(order)); unsigned int unit = 0; diff --git a/DSLogic-gui/pv/view/signal.cpp b/DSLogic-gui/pv/view/signal.cpp index 2ac4e92..11ef319 100644 --- a/DSLogic-gui/pv/view/signal.cpp +++ b/DSLogic-gui/pv/view/signal.cpp @@ -33,26 +33,67 @@ namespace pv { namespace view { -const int Signal::SquareWidth = 20; -const int Signal::Margin = 5; - -const int Signal::COLOR = 1; -const int Signal::NAME = 2; -const int Signal::POSTRIG = 3; -const int Signal::HIGTRIG = 4; -const int Signal::NEGTRIG = 5; -const int Signal::LOWTRIG = 6; -const int Signal::LABEL = 7; - const QColor Signal::dsBlue = QColor(17, 133, 209, 255); const QColor Signal::dsYellow = QColor(238, 178, 17, 255); const QColor Signal::dsRed = QColor(213, 15, 37, 255); const QColor Signal::dsGreen = QColor(0, 153, 37, 255); const QColor Signal::dsGray = QColor(0x88, 0x8A, 0x85, 100); +const QColor Signal::dsDisable = QColor(0x88, 0x8A, 0x85, 200); +const QColor Signal::dsActive = QColor(17, 133, 209, 255); const QColor Signal::dsLightBlue = QColor(17, 133, 209, 150); const QColor Signal::dsLightRed = QColor(213, 15, 37, 150); - -const QPen Signal::SignalAxisPen(QColor(128, 128, 128, 64)); +const QPen Signal::SignalAxisPen = QColor(128, 128, 128, 64); + +const quint64 Signal::vDialValue[Signal::vDialValueCount] = { + 5, + 10, + 20, + 50, + 100, + 200, + 500, + 1000, + 2000, + 5000, +}; +const QString Signal::vDialUnit[Signal::vDialUnitCount] = { + "mv", + "v", +}; + +const quint64 Signal::hDialValue[Signal::hDialValueCount] = { + 10, + 20, + 50, + 100, + 200, + 500, + 1000, + 2000, + 5000, + 10000, + 20000, + 50000, + 100000, + 200000, + 500000, + 1000000, + 2000000, + 5000000, + 10000000, + 20000000, + 50000000, + 100000000, + 200000000, + 500000000, + 1000000000, +}; +const QString Signal::hDialUnit[Signal::hDialUnitCount] = { + "ns", + "us", + "ms", + "s", +}; Signal::Signal(QString name, int index, int type, int order) : _type(type), @@ -62,9 +103,37 @@ Signal::Signal(QString name, int index, int type, int order) : _v_offset(0), _signalHeight(30), _selected(false), - _trig(0) + _trig(0), + _vDialActive(false), + _hDialActive(false), + _acCoupling(false), + _active(true), + _windowHeight(0) { _index_list.push_back(index); + if (_type == DS_DSO) { + QVector<quint64> vValue; + QVector<QString> vUnit; + QVector<quint64> hValue; + QVector<QString> hUnit; + for(quint64 i = 0; i < Signal::vDialValueCount; i++) + vValue.append(Signal::vDialValue[i]); + for(quint64 i = 0; i < Signal::vDialUnitCount; i++) + vUnit.append(Signal::vDialUnit[i]); + + for(quint64 i = 0; i < Signal::hDialValueCount; i++) + hValue.append(Signal::hDialValue[i]); + for(quint64 i = 0; i < Signal::hDialUnitCount; i++) + hUnit.append(Signal::hDialUnit[i]); + + _vDial = new dslDial(vDialValueCount, vDialValueStep, vValue, vUnit); + _hDial = new dslDial(hDialValueCount, hDialValueStep, hValue, hUnit); + _vDial->set_sel(0); + _hDial->set_sel(0); + + _trig_vpos = 0; + _trig_en = true; + } } Signal::Signal(QString name, std::list<int> index_list, int type, int order, int sec_index) : @@ -76,8 +145,32 @@ Signal::Signal(QString name, std::list<int> index_list, int type, int order, int _v_offset(0), _signalHeight(30), _selected(false), - _trig(0) -{ + _trig(0), + _vDialActive(false), + _hDialActive(false), + _acCoupling(false), + _active(true) +{ + if (_type == DS_DSO) { + QVector<quint64> vValue; + QVector<QString> vUnit; + QVector<quint64> hValue; + QVector<QString> hUnit; + for(quint64 i = 0; i < Signal::vDialValueCount; i++) + vValue.append(Signal::vDialValue[i]); + for(quint64 i = 0; i < Signal::vDialUnitCount; i++) + vUnit.append(Signal::vDialUnit[i]); + + for(quint64 i = 0; i < Signal::hDialValueCount; i++) + hValue.append(Signal::hDialValue[i]); + for(quint64 i = 0; i < Signal::hDialUnitCount; i++) + hUnit.append(Signal::hDialUnit[i]); + + _vDial = new dslDial(Signal::vDialValueCount, Signal::vDialValueStep, vValue, vUnit); + _hDial = new dslDial(Signal::hDialValueCount, Signal::hDialValueStep, hValue, hUnit); + _vDial->set_sel(0); + _hDial->set_sel(0); + } } int Signal::get_type() const @@ -104,7 +197,7 @@ int Signal::get_leftWidth() const int Signal::get_rightWidth() const { - return 2 * Margin + 4 * SquareWidth + 1.5 * SquareWidth; + return 2 * Margin + SquareNum * SquareWidth + 1.5 * SquareWidth; } int Signal::get_headerHeight() const @@ -217,31 +310,174 @@ void Signal::set_trig(int trig) ds_trigger_probe_set(_index_list.front(), 'F', 'X'); else if (trig == LOWTRIG) ds_trigger_probe_set(_index_list.front(), '0', 'X'); + else if (trig == EDGETRIG) + ds_trigger_probe_set(_index_list.front(), 'C', 'X'); +} + +bool Signal::get_vDialActive() const +{ + return _vDialActive; +} + +void Signal::set_vDialActive(bool active) +{ + _vDialActive = active; +} + +bool Signal::go_vDialPre() +{ + assert(_type == DS_DSO); + + if (!_vDial->isMin()) { + _vDial->set_sel(_vDial->get_sel() - 1); + return true; + } else { + return false; + } +} + +bool Signal::go_vDialNext() +{ + assert(_type == DS_DSO); + + if (!_vDial->isMax()) { + _vDial->set_sel(_vDial->get_sel() + 1); + return true; + } else { + return false; + } +} + +bool Signal::get_hDialActive() const +{ + return _hDialActive; +} + +void Signal::set_hDialActive(bool active) +{ + _hDialActive = active; +} + +bool Signal::go_hDialPre() +{ + assert(_type == DS_DSO); + + if (!_hDial->isMin()) { + _hDial->set_sel(_hDial->get_sel() - 1); + return true; + } else { + return false; + } +} + +bool Signal::go_hDialNext() +{ + assert(_type == DS_DSO); + + if (!_hDial->isMax()) { + _hDial->set_sel(_hDial->get_sel() + 1); + return true; + } else { + return false; + } +} + +quint64 Signal::get_vDialValue() const +{ + return _vDial->get_value(); +} + +quint64 Signal::get_hDialValue() const +{ + return _hDial->get_value(); +} + +uint16_t Signal::get_vDialSel() const +{ + return _vDial->get_sel(); +} + +uint16_t Signal::get_hDialSel() const +{ + return _hDial->get_sel(); +} + +bool Signal::get_acCoupling() const +{ + return _acCoupling; +} + +void Signal::set_acCoupling(bool coupling) +{ + _acCoupling = coupling; +} + +bool Signal::get_active() const +{ + return _active; +} + +void Signal::set_active(bool active) +{ + _active = active; +} + +int Signal::get_zeroPos() const +{ + return _zeroPos; +} + +void Signal::set_zeroPos(int pos) +{ + _zeroPos = pos; +} + +int Signal::get_windowHeight() const +{ + return _windowHeight; +} + +void Signal::set_windowHeight(int height) +{ + _windowHeight = height; +} + +int Signal::get_trig_vpos() const +{ + return _trig_vpos; +} + +void Signal::set_trig_vpos(int value) +{ + _trig_vpos = value; } void Signal::paint_label(QPainter &p, int y, int right, bool hover, int action) { compute_text_size(p); + const QRectF color_rect = get_rect("color", y, right); const QRectF name_rect = get_rect("name", y, right); - const QRectF posTrig_rect = get_rect("posTrig", y, right); - const QRectF higTrig_rect = get_rect("higTrig", y, right); - const QRectF negTrig_rect = get_rect("negTrig", y, right); - const QRectF lowTrig_rect = get_rect("lowTrig", y, right); - const QRectF label_rect = get_rect("label", y, right); + const QRectF label_rect = get_rect("label", (_type == DS_DSO) ? _zeroPos : y, right); p.setRenderHint(QPainter::Antialiasing); // Paint the ColorButton p.setPen(Qt::transparent); - p.setBrush(_colour); + p.setBrush(_active ? _colour : dsDisable); p.drawRect(color_rect); // Paint the signal name - p.setPen(Qt::black); + p.setPen(_active ? Qt::black : dsDisable); p.drawText(name_rect, Qt::AlignLeft | Qt::AlignVCenter, _name); // Paint the trigButton - if (_type == DS_LOGIC) { + if (_type == DS_LOGIC) { + const QRectF posTrig_rect = get_rect("posTrig", y, right); + const QRectF higTrig_rect = get_rect("higTrig", y, right); + const QRectF negTrig_rect = get_rect("negTrig", y, right); + const QRectF lowTrig_rect = get_rect("lowTrig", y, right); + const QRectF edgeTrig_rect = get_rect("edgeTrig", y, right); + p.setPen(Qt::transparent); p.setBrush(((hover && action == POSTRIG) || (_trig == POSTRIG)) ? dsYellow : @@ -259,6 +495,10 @@ void Signal::paint_label(QPainter &p, int y, int right, bool hover, int action) dsYellow : dsBlue); p.drawRect(lowTrig_rect); + p.setBrush(((hover && action == EDGETRIG) || (_trig == EDGETRIG)) ? + dsYellow : + dsBlue); + p.drawRect(edgeTrig_rect); p.setPen(QPen(Qt::blue, 1, Qt::DotLine)); p.setBrush(Qt::transparent); @@ -268,6 +508,8 @@ void Signal::paint_label(QPainter &p, int y, int right, bool hover, int action) higTrig_rect.right(), higTrig_rect.bottom() - 3); p.drawLine(negTrig_rect.right(), negTrig_rect.top() + 3, negTrig_rect.right(), negTrig_rect.bottom() - 3); + p.drawLine(lowTrig_rect.right(), lowTrig_rect.top() + 3, + lowTrig_rect.right(), lowTrig_rect.bottom() - 3); p.setPen(QPen(Qt::white, 2, Qt::SolidLine)); p.setBrush(Qt::transparent); @@ -290,6 +532,17 @@ void Signal::paint_label(QPainter &p, int y, int right, bool hover, int action) p.drawLine(lowTrig_rect.left() + 5, lowTrig_rect.bottom() - 5, lowTrig_rect.right() - 5, lowTrig_rect.bottom() - 5); + + p.drawLine(edgeTrig_rect.left() + 5, edgeTrig_rect.top() + 5, + edgeTrig_rect.center().x() - 2, edgeTrig_rect.top() + 5); + p.drawLine(edgeTrig_rect.center().x() + 2 , edgeTrig_rect.top() + 5, + edgeTrig_rect.right() - 5, edgeTrig_rect.top() + 5); + p.drawLine(edgeTrig_rect.center().x(), edgeTrig_rect.top() + 7, + edgeTrig_rect.center().x(), edgeTrig_rect.bottom() - 7); + p.drawLine(edgeTrig_rect.left() + 5, edgeTrig_rect.bottom() - 5, + edgeTrig_rect.center().x() - 2, edgeTrig_rect.bottom() - 5); + p.drawLine(edgeTrig_rect.center().x() + 2, edgeTrig_rect.bottom() - 5, + edgeTrig_rect.right() - 5, edgeTrig_rect.bottom() - 5); } else if (_type == DS_GROUP || _type == DS_PROTOCOL) { const QRectF group_index_rect = get_rect("groupIndex", y, right); QString index_string; @@ -311,40 +564,92 @@ void Signal::paint_label(QPainter &p, int y, int right, bool hover, int action) } p.setPen(Qt::white); p.drawText(group_index_rect, Qt::AlignRight | Qt::AlignVCenter, index_string); + } else if (_type == DS_DSO) { + const QRectF vDial_rect = get_rect("vDial", y, right); + const QRectF hDial_rect = get_rect("hDial", y, right); + const QRectF acdc_rect = get_rect("acdc", y, right); + const QRectF chEn_rect = get_rect("chEn", y, right); + + QColor vDial_color = _vDialActive ? dsActive : dsDisable; + QColor hDial_color = _hDialActive ? dsActive : dsDisable; + _vDial->paint(p, vDial_rect, vDial_color); + _hDial->paint(p, hDial_rect, hDial_color); + + p.setPen(Qt::transparent); + p.setBrush((hover && action == CHEN) ? _colour.darker() : _colour); + p.drawRect(chEn_rect); + p.setPen(Qt::white); + p.drawText(chEn_rect, Qt::AlignCenter | Qt::AlignVCenter, _active ? "EN" : "DIS"); + + p.setPen(Qt::transparent); + p.setBrush(_active ? ((hover && action == ACDC) ? _colour.darker() : _colour) : dsDisable); + p.drawRect(acdc_rect); + p.setPen(Qt::white); + p.drawText(acdc_rect, Qt::AlignCenter | Qt::AlignVCenter, _acCoupling ? "AC" : "DC"); } // Paint the label - const QPointF points[] = { - label_rect.topLeft(), - label_rect.topRight(), - QPointF(right, y), - label_rect.bottomRight(), - label_rect.bottomLeft() - }; - - p.setPen(Qt::transparent); - p.setBrush(((hover && action == LABEL) || _selected) ? dsYellow : dsBlue); - p.drawPolygon(points, countof(points)); - - if ((hover && action == LABEL) || _selected) { - p.setPen(QPen(dsBlue, 2, Qt::DotLine)); + if (_active) { + const QPointF points[] = { + label_rect.topLeft(), + label_rect.topRight(), + QPointF(right, (_type == DS_DSO) ? _zeroPos : y), + label_rect.bottomRight(), + label_rect.bottomLeft() + }; + + p.setPen(Qt::transparent); + if (_type == DS_DSO) + p.setBrush(((hover && action == LABEL) || _selected) ? _colour.darker() : _colour); + else + p.setBrush(((hover && action == LABEL) || _selected) ? dsYellow : dsBlue); + p.drawPolygon(points, countof(points)); + + p.setPen(QPen(Qt::blue, 1, Qt::DotLine)); p.setBrush(Qt::transparent); - p.drawPoint(label_rect.right(), label_rect.top() + 4); - p.drawPoint(label_rect.right(), label_rect.top() + 8); - p.drawPoint(label_rect.right(), label_rect.top() + 12); - p.drawPoint(label_rect.right(), label_rect.top() + 16); + p.drawLine(label_rect.right(), label_rect.top() + 3, + label_rect.right(), label_rect.bottom() - 3); + + // Paint the text + p.setPen(Qt::white); + if (_type == DS_GROUP) + p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "G"); + else if (_type == DS_ANALOG) + p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "A"); + else if (_type == DS_PROTOCOL) + p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "D"); + else + p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, QString::number(_index_list.front())); } +} - // Paint the text - p.setPen(Qt::white); - if (_type == DS_GROUP) - p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "G"); - else if (_type == DS_ANALOG) - p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "A"); - else if (_type == DS_PROTOCOL) - p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "D"); - else - p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, QString::number(_index_list.front())); +void Signal::paint_trig(QPainter &p, int left, int right, bool hover) +{ + if (_type == DS_DSO) { + const QRectF label_rect = get_rect("dsoTrig", -1, right); + // Paint the trig line + if (_trig_en) { + const QPointF points[] = { + QPointF(right - label_rect.width()*1.5, _trig_vpos), + label_rect.topLeft(), + label_rect.topRight(), + label_rect.bottomRight(), + label_rect.bottomLeft() + }; + + p.setPen(Qt::transparent); + p.setBrush(_colour); + p.drawPolygon(points, countof(points)); + + // paint the _trig_vpos line + p.setPen(QPen(_colour, hover ? 2 : 1, Qt::DashLine)); + p.drawLine(left, _trig_vpos, right - label_rect.width()*1.5, _trig_vpos); + + // Paint the text + p.setPen(Qt::white); + p.drawText(label_rect, Qt::AlignCenter | Qt::AlignVCenter, "T"); + } + } } int Signal::pt_in_rect(int y, int right, const QPoint &point) @@ -355,11 +660,17 @@ int Signal::pt_in_rect(int y, int right, const QPoint &point) const QRectF higTrig = get_rect("higTrig", y, right); const QRectF negTrig = get_rect("negTrig", y, right); const QRectF lowTrig = get_rect("lowTrig", y, right); - const QRectF label = get_rect("label", y, right); - - if (color.contains(point)) + const QRectF edgeTrig = get_rect("edgeTrig", y, right); + const QRectF label = get_rect("label", (_type == DS_DSO) ? _zeroPos : y, right); + const QRectF vDial = get_rect("vDial", y, right); + const QRectF hDial = get_rect("hDial", y, right); + const QRectF chEn = get_rect("chEn", y, right); + const QRectF acdc = get_rect("acdc", y, right); + const QRectF dsoTrig = get_rect("dsoTrig", 0, right); + + if (color.contains(point) && _active) return COLOR; - else if (name.contains(point)) + else if (name.contains(point) && _active) return NAME; else if (posTrig.contains(point) && _type == DS_LOGIC) return POSTRIG; @@ -369,8 +680,20 @@ int Signal::pt_in_rect(int y, int right, const QPoint &point) return NEGTRIG; else if (lowTrig.contains(point) && _type == DS_LOGIC) return LOWTRIG; - else if (label.contains(point)) + else if (edgeTrig.contains(point) && _type == DS_LOGIC) + return EDGETRIG; + else if (label.contains(point) && _active) return LABEL; + else if (vDial.contains(point) && _type == DS_DSO && _active) + return VDIAL; + else if (hDial.contains(point) && _type == DS_DSO && _active) + return HDIAL; + else if (chEn.contains(point) && _type == DS_DSO) + return CHEN; + else if (acdc.contains(point) && _type == DS_DSO && _active) + return ACDC; + else if (dsoTrig.contains(point) && _type == DS_DSO && _active) + return DSOTRIG; else return 0; } @@ -392,7 +715,8 @@ QRectF Signal::get_rect(const char *s, int y, int right) { const QSizeF color_size(SquareWidth, SquareWidth); const QSizeF name_size(right - get_leftWidth() - get_rightWidth(), SquareWidth); - const QSizeF label_size(_text_size.width() + Margin, SquareWidth); + //const QSizeF label_size(_text_size.width() + Margin, SquareWidth); + const QSizeF label_size(SquareWidth, SquareWidth); if (!strcmp(s, "name")) return QRectF( @@ -402,38 +726,68 @@ QRectF Signal::get_rect(const char *s, int y, int right) else if (!strcmp(s, "label")) return QRectF( right - 1.5f * label_size.width(), - y - label_size.height() / 2, + y - SquareWidth / 2, label_size.width(), label_size.height()); else if (!strcmp(s, "posTrig")) return QRectF( get_leftWidth() + name_size.width() + Margin, - y - color_size.height() / 2, - color_size.width(), color_size.height()); + y - SquareWidth / 2, + SquareWidth, SquareWidth); else if (!strcmp(s, "higTrig")) return QRectF( get_leftWidth() + name_size.width() + SquareWidth + Margin, - y - color_size.height() / 2, - color_size.width(), color_size.height()); + y - SquareWidth / 2, + SquareWidth, SquareWidth); else if (!strcmp(s, "negTrig")) return QRectF( get_leftWidth() + name_size.width() + 2 * SquareWidth + Margin, - y - color_size.height() / 2, - color_size.width(), color_size.height()); + y - SquareWidth / 2, + SquareWidth, SquareWidth); else if (!strcmp(s, "lowTrig")) return QRectF( get_leftWidth() + name_size.width() + 3 * SquareWidth + Margin, - y - color_size.height() / 2, - color_size.width(), color_size.height()); + y - SquareWidth / 2, + SquareWidth, SquareWidth); + else if (!strcmp(s, "edgeTrig")) + return QRectF( + get_leftWidth() + name_size.width() + 4 * SquareWidth + Margin, + y - SquareWidth / 2, + SquareWidth, SquareWidth); else if (!strcmp(s, "groupIndex")) return QRectF( get_leftWidth() + name_size.width() + Margin, - y - color_size.height() / 2, - color_size.width() * 4, color_size.height()); + y - SquareWidth / 2, + SquareWidth * SquareNum, SquareWidth); + else if (!strcmp(s, "vDial")) + return QRectF( + get_leftWidth() + name_size.width() + SquareWidth*0.5 + Margin, + y - SquareWidth * SquareNum, + SquareWidth * (SquareNum-1), SquareWidth * (SquareNum-1)); + else if (!strcmp(s, "hDial")) + return QRectF( + get_leftWidth() + name_size.width() + SquareWidth*0.5 + Margin, + y + SquareWidth * 1.5, + SquareWidth * (SquareNum-1), SquareWidth * (SquareNum-1)); + else if (!strcmp(s, "chEn")) + return QRectF( + get_leftWidth() + name_size.width() + SquareWidth*0.75 + Margin, + y - SquareWidth / 2, + SquareWidth * 1.5, SquareWidth); + else if (!strcmp(s, "acdc")) + return QRectF( + get_leftWidth() + name_size.width() + SquareWidth*2.75 + Margin, + y - SquareWidth / 2, + SquareWidth * 1.5, SquareWidth); + else if (!strcmp(s, "dsoTrig")) + return QRectF( + right - label_size.width(), + _trig_vpos - SquareWidth / 2, + label_size.width(), label_size.height()); else return QRectF( 2, - y - color_size.height() / 2, - color_size.width(), color_size.height()); + y - SquareWidth / 2, + SquareWidth, SquareWidth); } } // namespace view diff --git a/DSLogic-gui/pv/view/signal.h b/DSLogic-gui/pv/view/signal.h index f6f8242..8420314 100644 --- a/DSLogic-gui/pv/view/signal.h +++ b/DSLogic-gui/pv/view/signal.h @@ -36,12 +36,14 @@ #include <list> #include "libsigrok4DSLogic/libsigrok.h" +#include "dsldial.h" namespace pv { namespace data { class SignalData; class Logic; +class Dso; class Analog; class Group; } @@ -55,28 +57,49 @@ namespace view { class Signal { private: - static const int SquareWidth; - static const int Margin; - - static const int COLOR; - static const int NAME; - static const int POSTRIG; - static const int HIGTRIG; - static const int NEGTRIG; - static const int LOWTRIG; - static const int LABEL; + static const int SquareWidth = 20; + static const int Margin = 3; + static const int SquareNum = 5; + + static const quint64 vDialValueCount = 10; + static const quint64 vDialValueStep = 1000; + static const quint64 vDialUnitCount = 2; + static const quint64 hDialValueCount = 25; + static const quint64 hDialValueStep = 1000; + static const quint64 hDialUnitCount = 4; + static const quint64 vDialValue[vDialValueCount]; + static const QString vDialUnit[vDialUnitCount]; + + static const quint64 hDialValue[hDialValueCount]; + static const QString hDialUnit[hDialUnitCount]; public: + static const int COLOR = 1; + static const int NAME = 2; + static const int POSTRIG = 3; + static const int HIGTRIG = 4; + static const int NEGTRIG = 5; + static const int LOWTRIG = 6; + static const int EDGETRIG = 7; + static const int LABEL = 8; + static const int VDIAL = 9; + static const int HDIAL = 10; + static const int CHEN = 11; + static const int ACDC = 12; + static const int DSOTRIG = 13; + static const QColor dsBlue; static const QColor dsYellow; static const QColor dsRed; static const QColor dsGreen; static const QColor dsGray; + static const QColor dsDisable; + static const QColor dsActive; static const QColor dsLightBlue; static const QColor dsLightRed; - static const QPen SignalAxisPen; + static const QPen SignalAxisPen; - enum {DS_LOGIC = 0, DS_ANALOG, DS_GROUP, DS_PROTOCOL}; + enum {DS_LOGIC = 0, DS_ANALOG, DS_GROUP, DS_PROTOCOL, DS_DSO}; protected: Signal(QString name, int index, int type, int order); @@ -165,6 +188,32 @@ public: int get_trig() const; void set_trig(int trig); + /* + * + */ + bool get_vDialActive() const; + void set_vDialActive(bool active); + bool get_hDialActive() const; + void set_hDialActive(bool active); + bool go_vDialPre(); + bool go_vDialNext(); + bool go_hDialPre(); + bool go_hDialNext(); + quint64 get_vDialValue() const; + quint64 get_hDialValue() const; + uint16_t get_vDialSel() const; + uint16_t get_hDialSel() const; + bool get_acCoupling() const; + void set_acCoupling(bool coupling); + bool get_active() const; + void set_active(bool active); + int get_zeroPos() const; + void set_zeroPos(int pos); + int get_windowHeight() const; + void set_windowHeight(int height); + void set_trig_vpos(int value); + int get_trig_vpos() const; + /** * Paints the signal with a QPainter * @param p the QPainter to paint into. @@ -176,7 +225,7 @@ public: * the view in seconds. **/ virtual void paint(QPainter &p, int y, int left, int right, - double scale, double offset) = 0; + double scale, double offset) = 0; virtual const std::vector< std::pair<uint64_t, bool> > cur_edges() const = 0; @@ -187,6 +236,7 @@ public: virtual void del_decoder() = 0; virtual void set_data(boost::shared_ptr<pv::data::Logic> _logic_data, + boost::shared_ptr<pv::data::Dso> _dso_data, boost::shared_ptr<pv::data::Analog> _analog_data, boost::shared_ptr<pv::data::Group> _group_data) = 0; @@ -198,9 +248,12 @@ public: * area. * @param hover true if the label is being hovered over by the mouse. */ - virtual void paint_label(QPainter &p, int y, int right, + virtual void paint_label(QPainter &p, int y, int right, bool hover, int action); + virtual void paint_trig(QPainter &p, int left, int right, + bool hover); + /** * Determines if a point is in the header rect. * 1 - in color rect @@ -219,6 +272,16 @@ public: int pt_in_rect(int y, int right, const QPoint &point); + /** + * Computes the outline rectangle of a label. + * @param p the QPainter to lay out text with. + * @param y the y-coordinate of the signal. + * @param right the x-coordinate of the right edge of the header + * area. + * @return Returns the rectangle of the signal label. + */ + QRectF get_rect(const char *s, int y, int right); + protected: /** @@ -237,16 +300,6 @@ private: */ void compute_text_size(QPainter &p); - /** - * Computes the outline rectangle of a label. - * @param p the QPainter to lay out text with. - * @param y the y-coordinate of the signal. - * @param right the x-coordinate of the right edge of the header - * area. - * @return Returns the rectangle of the signal label. - */ - QRectF get_rect(const char *s, int y, int right); - protected: int _type; std::list<int> _index_list; @@ -264,6 +317,17 @@ protected: int _trig; QSizeF _text_size; + dslDial *_vDial; + dslDial *_hDial; + bool _vDialActive; + bool _hDialActive; + bool _acCoupling; + bool _active; + int _zeroPos; + int _windowHeight; + + int _trig_vpos; + bool _trig_en; }; } // namespace view diff --git a/DSLogic-gui/pv/view/view.cpp b/DSLogic-gui/pv/view/view.cpp index 7d9d8bd..fdd8624 100644 --- a/DSLogic-gui/pv/view/view.cpp +++ b/DSLogic-gui/pv/view/view.cpp @@ -27,6 +27,7 @@ #include <boost/foreach.hpp> +#include <QtGui/QApplication> #include <QEvent> #include <QMouseEvent> #include <QScrollBar> @@ -104,6 +105,14 @@ View::View(SigSession &session, QWidget *parent) : this, SLOT(on_signals_moved())); connect(_header, SIGNAL(header_updated()), this, SLOT(header_updated())); + connect(_header, SIGNAL(vDial_changed(quint16)), + this, SLOT(vDial_changed(quint16))); + connect(_header, SIGNAL(hDial_changed(quint16)), + this, SLOT(hDial_changed(quint16))); + connect(_header, SIGNAL(acdc_changed(quint16)), + this, SLOT(acdc_changed(quint16))); + connect(_header, SIGNAL(ch_changed(quint16)), + this, SLOT(ch_changed(quint16))); setViewportMargins(headerWidth(), RulerHeight, 0, 0); setViewport(_viewport); @@ -175,8 +184,20 @@ void View::zoom(double steps, int offset) _preOffset = _offset; const double cursor_offset = _offset + _scale * offset; - _scale *= pow(3.0/2.0, -steps); - _scale = max(min(_scale, _maxscale), _minscale); + if (_session.get_device()->mode != DSO) { + _scale *= pow(3.0/2.0, -steps); + _scale = max(min(_scale, _maxscale), _minscale); + } else { + const vector< shared_ptr<Signal> > sigs(_session.get_signals()); + if (steps > 0.5) { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) + s->go_hDialNext(); + } else if(steps < -0.5) { + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) + s->go_hDialPre(); + } + _scale = sigs.at(0)->get_hDialValue() * pow(10, -9) * Viewport::NumSpanX / _viewport->width(); + } _offset = cursor_offset - _scale * offset; const double MinOffset = -(_scale * (_viewport->width() * (1 - MaxViewRate))); const double MaxOffset = _data_length * 1.0f / _session.get_last_sample_rate() - @@ -184,6 +205,7 @@ void View::zoom(double steps, int offset) _offset = max(min(_offset, MaxOffset), MinOffset); if (_scale != _preScale || _offset != _preOffset) { + _header->update(); _ruler->update(); _viewport->update(); update_scroll(); @@ -198,7 +220,9 @@ void View::set_scale_offset(double scale, double offset) _preScale = _scale; _preOffset = _offset; - _scale = max(min(scale, _maxscale), _minscale); + if (_session.get_device()->mode != DSO) + _scale = max(min(scale, _maxscale), _minscale); + const double MinOffset = -(_scale * (_viewport->width() * (1 - MaxViewRate))); const double MaxOffset = _data_length * 1.0f / _session.get_last_sample_rate() - _scale * (_viewport->width() * MaxViewRate); @@ -297,14 +321,14 @@ const QPointF& View::hover_point() const void View::normalize_layout() { - const vector< shared_ptr<Signal> > sigs(_session.get_signals()); + const vector< boost::shared_ptr<Signal> > sigs(_session.get_signals()); int v_min = INT_MAX; - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) v_min = min(s->get_v_offset(), v_min); const int delta = -min(v_min, 0); - BOOST_FOREACH(shared_ptr<Signal> s, sigs) + BOOST_FOREACH(boost::shared_ptr<Signal> s, sigs) s->set_v_offset(s->get_v_offset() + delta); verticalScrollBar()->setSliderPosition(_v_offset + delta); @@ -324,7 +348,7 @@ int View::get_signalHeight() void View::get_scroll_layout(double &length, double &offset) const { - const shared_ptr<data::SignalData> sig_data = _session.get_data(); + const boost::shared_ptr<data::SignalData> sig_data = _session.get_data(); if (!sig_data) return; @@ -376,12 +400,14 @@ void View::reset_signal_layout() int offset = SignalMargin + SignalHeight; _spanY = SignalHeight + 2 * SignalMargin; - const vector< shared_ptr<Signal> > sigs(_session.get_signals()); - BOOST_FOREACH(shared_ptr<Signal> s, sigs) { + const vector< boost::shared_ptr<Signal> > sigs(_session.get_signals()); + BOOST_FOREACH(boost::shared_ptr<Signal> s, sigs) { s->set_signalHeight(SignalHeight); + s->set_windowHeight(_viewport->height()); //s->set_v_offset(offset); //offset += SignalHeight + 2 * SignalMargin; s->set_v_offset(offset + s->get_order() * _spanY); + s->set_zeroPos(_viewport->height()*0.5); } normalize_layout(); } @@ -438,10 +464,15 @@ int View::headerWidth() int maxNameWidth = 0; int maxLeftWidth = 0; int maxRightWidth = 0; + + QFont font = QApplication::font(); + QFontMetrics fm(font); + int fontWidth=fm.width("A"); + const vector< shared_ptr<Signal> > sigs(_session.get_signals()); if (!sigs.empty()){ BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { - maxNameWidth = max(s->get_name().length() * 6, maxNameWidth); + maxNameWidth = max(s->get_name().length() * fontWidth, maxNameWidth); maxLeftWidth = max(s->get_leftWidth(), maxLeftWidth); maxRightWidth = max(s->get_rightWidth(), maxRightWidth); } @@ -512,7 +543,8 @@ void View::data_updated() // Get the new data length _data_length = max(_session.get_total_sample_len(), (quint64)1000); _maxscale = (_data_length * 1.0f / _session.get_last_sample_rate()) / (_viewport->width() * MaxViewRate); - _scale = min(_scale, _maxscale); + if(_session.get_device()->mode != DSO) + _scale = min(_scale, _maxscale); setViewportMargins(headerWidth(), RulerHeight, 0, 0); update_margins(); @@ -549,7 +581,9 @@ void View::sample_rate_changed(quint64 sample_rate) { assert(sample_rate > 0); - _scale = (1.0f / sample_rate) / WellPixelsPerSample; + if (_session.get_device()->mode != DSO) + _scale = (1.0f / sample_rate) / WellPixelsPerSample; + _minscale = (1.0f / sample_rate) / (_viewport->width() * MaxViewRate); _offset = 0; _preScale = _scale; @@ -568,7 +602,8 @@ void View::marker_time_changed() void View::on_signals_moved() { update_scroll(); - signals_moved(); + _viewport->update(); + //signals_moved(); } /* @@ -698,5 +733,39 @@ void View::on_state_changed(bool stop) _viewport->stop_trigger_timer(); } +void View::vDial_changed(uint16_t channel) +{ + if (channel == 0) + _session.set_dso_ctrl(SR_CONF_VDIV0); + else + _session.set_dso_ctrl(SR_CONF_VDIV1); +} + +void View::hDial_changed(uint16_t channel) +{ + const vector< shared_ptr<Signal> > sigs(_session.get_signals()); + _session.set_dso_ctrl(SR_CONF_TIMEBASE); + _scale = sigs.at(channel)->get_hDialValue() * pow(10, -9) * Viewport::NumSpanX / _viewport->width(); + _ruler->update(); + _viewport->update(); + update_scroll(); +} + +void View::acdc_changed(uint16_t channel) +{ + if (channel == 0) + _session.set_dso_ctrl(SR_CONF_COUPLING0); + else + _session.set_dso_ctrl(SR_CONF_COUPLING1); +} + +void View::ch_changed(uint16_t channel) +{ + if (channel == 0) + _session.set_dso_ctrl(SR_CONF_EN_CH0); + else + _session.set_dso_ctrl(SR_CONF_EN_CH1); +} + } // namespace view } // namespace pv diff --git a/DSLogic-gui/pv/view/view.h b/DSLogic-gui/pv/view/view.h index 346e298..61a3eea 100644 --- a/DSLogic-gui/pv/view/view.h +++ b/DSLogic-gui/pv/view/view.h @@ -187,7 +187,8 @@ private: void resizeEvent(QResizeEvent *e); public slots: - void set_measure_en(int enable); + void set_measure_en(int enable); + void hDial_changed(quint16 channel); private slots: @@ -209,6 +210,10 @@ private slots: void set_trig_pos(quint64 trig_pos); + void vDial_changed(quint16 channel); + void acdc_changed(quint16 channel); + void ch_changed(quint16 channel); + private: SigSession &_session; diff --git a/DSLogic-gui/pv/view/viewport.cpp b/DSLogic-gui/pv/view/viewport.cpp index e0b7e45..9a59aa8 100644 --- a/DSLogic-gui/pv/view/viewport.cpp +++ b/DSLogic-gui/pv/view/viewport.cpp @@ -79,9 +79,9 @@ Viewport::Viewport(View &parent) : int Viewport::get_total_height() const { int h = 0; - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { assert(s); //h = max(s->get_v_offset() + _view.get_signalHeight(), h); h = max(s->get_v_offset(), h); @@ -95,7 +95,7 @@ void Viewport::paintEvent(QPaintEvent *event) (void)event; using pv::view::Signal; - + int i, j; QStyleOption o; o.initFrom(this); QPainter p(this); @@ -105,36 +105,35 @@ void Viewport::paintEvent(QPaintEvent *event) p.setRenderHint(QPainter::Antialiasing); if (_view.session().get_device()->mode == LOGIC) { - switch(_view.session().get_capture_state()) { - case SigSession::Init: - break; + switch(_view.session().get_capture_state()) { + case SigSession::Init: + break; - case SigSession::Stopped: - paintSignals(p); - break; + case SigSession::Stopped: + paintSignals(p); + break; - case SigSession::Running: - //p.setRenderHint(QPainter::Antialiasing); - paintProgress(p); - break; - } - } else if (_view.session().get_device()->mode == ANALOG) { + case SigSession::Running: + //p.setRenderHint(QPainter::Antialiasing); + paintProgress(p); + break; + } + } else { paintSignals(p); } p.setRenderHint(QPainter::Antialiasing, false); if (_view.get_signalHeight() != _curSignalHeight) _curSignalHeight = _view.get_signalHeight(); - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { assert(s); //paint_axis(p, y, left, right); p.setPen(Signal::dsGray); const double sigY = s->get_v_offset() - _view.v_offset(); - int i, j; if (s->get_type() == Signal::DS_ANALOG) { p.drawLine(0, sigY, width(), sigY); const double spanY = (s->get_signalHeight()) * 1.0f / NumSpanY; @@ -152,19 +151,47 @@ void Viewport::paintEvent(QPaintEvent *event) p.drawLine(0 + spanX * i, sigY, 0 + spanX * i, sigY - s->get_signalHeight()); } - } else { + } else if (s->get_type() == Signal::DS_LOGIC) { p.drawLine(0, sigY + 10, width(), sigY + 10); } } + if (_view.session().get_device()->mode == DSO) { + + p.setPen(Signal::dsGray); + p.setPen(Qt::DotLine); + + const double spanY =height() * 1.0f / 10; + for (i = 1; i < 11; i++) { + const double posY = spanY * i; + p.drawLine(0, posY, width(), posY); + const double miniSpanY = spanY / 5; + for (j = 1; j < 5; j++) { + p.drawLine(width() / 2.0f - 10, posY - miniSpanY * j, + width() / 2.0f + 10, posY - miniSpanY * j); + } + } + const double spanX = width() * 1.0f / 10; + for (i = 1; i < 11; i++) { + const double posX = spanX * i; + p.drawLine(posX, 0, + posX, height()); + const double miniSpanX = spanX / 5; + for (j = 1; j < 5; j++) { + p.drawLine(posX - miniSpanX * j, height() / 2.0f - 10, + posX - miniSpanX * j, height() / 2.0f + 10); + } + } + } + p.end(); } void Viewport::paintSignals(QPainter &p) { - const vector< shared_ptr<Signal> > sigs( + const vector< boost::shared_ptr<Signal> > sigs( _view.session().get_signals()); -// const vector< shared_ptr<Signal> > pro_sigs( +// const vector< boost::shared_ptr<Signal> > pro_sigs( // _view.session().get_pro_signals()); // Plot the signal const int v_offset = _view.v_offset(); @@ -181,13 +208,14 @@ void Viewport::paintSignals(QPainter &p) QPainter dbp(&pixmap); dbp.initFrom(this); p.setRenderHint(QPainter::Antialiasing, false); - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { assert(s); - s->paint(dbp, s->get_v_offset() - v_offset, 0, width(), - _view.scale(), _view.offset()); + if (s->get_active()) + s->paint(dbp, ((s->get_type() == Signal::DS_DSO) ? s->get_zeroPos() + height()*0.5 : s->get_v_offset() - v_offset), 0, width(), + _view.scale(), _view.offset()); } // p.setRenderHint(QPainter::Antialiasing); -// BOOST_FOREACH(const shared_ptr<Signal> s, pro_sigs) { +// BOOST_FOREACH(const boost::shared_ptr<Signal> s, pro_sigs) { // assert(s); // s->paint(dbp, s->get_v_offset() - v_offset, 0, width(), // _view.scale(), _view.offset()); @@ -196,6 +224,13 @@ void Viewport::paintSignals(QPainter &p) } p.drawPixmap(0, 0, pixmap); + // plot trig line in DSO mode + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + assert(s); + if (s->get_active() && s->get_type() == Signal::DS_DSO) + s->paint_trig(p, 0, width(), qAbs(_mouse_point.y() - s->get_trig_vpos()) <= HitCursorMargin ); + } + // plot cursors if (_view.cursors_shown()) { list<Cursor*>::iterator i = _view.get_cursorList().begin(); @@ -364,6 +399,20 @@ void Viewport::mousePressEvent(QMouseEvent *event) // if (!_view.get_ruler()->get_grabbed_cursor()) { // _zoom_rect_visible = true; // } + + const vector< shared_ptr<Signal> > sigs(_view.session().get_signals()); + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + assert(s); + if (s->get_active() && + s->get_type() == Signal::DS_DSO && + qAbs(_mouse_point.y() - s->get_trig_vpos()) <= HitCursorMargin) { + if (_drag_sig) + _drag_sig.reset(); + else + _drag_sig = s; + break; + } + } update(); } } @@ -371,7 +420,7 @@ void Viewport::mousePressEvent(QMouseEvent *event) void Viewport::mouseMoveEvent(QMouseEvent *event) { assert(event); - + _mouse_point = event->pos(); if (event->buttons() & Qt::RightButton) { _zoom_rect = QRectF(_mouse_down_point, event->pos()); _zoom_rect_visible = true; @@ -382,16 +431,35 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) _mouse_down_offset + (_mouse_down_point - event->pos()).x() * _view.scale()); - measure(); } if (!(event->buttons() || Qt::NoButton)) { + if (_drag_sig) { + uint16_t trig_value = 0; + int vpos = _mouse_point.y(); + if (vpos < 0) + vpos = 0; + else if (vpos > height()) + vpos = height(); + _drag_sig->set_trig_vpos(vpos); + + const vector< shared_ptr<Signal> > sigs(_view.session().get_signals()); + BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + assert(s); + if (s->get_active() && + s->get_type() == Signal::DS_DSO) { + trig_value += (((uint16_t)(255 - s->get_trig_vpos()*1.0/height()*255)) << 8*s->get_index()); + } + } + sr_config_set(_view.session().get_device(), + SR_CONF_TRIGGER_VALUE, g_variant_new_uint16(trig_value)); + } + TimeMarker* grabbed_marker = _view.get_ruler()->get_grabbed_cursor(); if (_view.cursors_shown() && grabbed_marker) { grabbed_marker->set_time(_view.offset() + _view.hover_point().x() * _view.scale()); } - measure(); } @@ -445,6 +513,7 @@ void Viewport::wheelEvent(QWheelEvent *event) void Viewport::leaveEvent(QEvent *) { _measure_shown = false; + _mouse_point = QPoint(-1, -1); //_view.show_cursors(false); update(); } @@ -471,8 +540,8 @@ void Viewport::set_receive_len(quint64 length) void Viewport::measure() { - const vector< shared_ptr<Signal> > sigs(_view.session().get_signals()); - BOOST_FOREACH(const shared_ptr<Signal> s, sigs) { + const vector< boost::shared_ptr<Signal> > sigs(_view.session().get_signals()); + BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) { assert(s); const int curY = _view.hover_point().y(); const double curX = _view.hover_point().x(); diff --git a/DSLogic-gui/pv/view/viewport.h b/DSLogic-gui/pv/view/viewport.h index 0ecb0c7..c373c78 100644 --- a/DSLogic-gui/pv/view/viewport.h +++ b/DSLogic-gui/pv/view/viewport.h @@ -24,6 +24,9 @@ #ifndef DSLOGIC_PV_VIEW_VIEWPORT_H #define DSLOGIC_PV_VIEW_VIEWPORT_H +#include <boost/shared_ptr.hpp> +#include <boost/weak_ptr.hpp> + #include <QTimer> #include <QWidget> #include <stdint.h> @@ -35,13 +38,14 @@ class SigSession; namespace pv { namespace view { +class Signal; class View; class Viewport : public QWidget { Q_OBJECT -private: +public: static const int HitCursorMargin; static const int NumSpanY; static const int NumMiniSpanY; @@ -88,6 +92,7 @@ private: View &_view; quint64 _total_receive_len; + QPoint _mouse_point; QPoint _mouse_down_point; double _mouse_down_offset; double _curScale; @@ -115,6 +120,8 @@ private: QTimer trigger_timer; bool triggered; int timer_cnt; + + boost::shared_ptr<Signal> _drag_sig; }; } // namespace view |