From 7cd5faf8cfed1871195aed7a4c325342172944b3 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sat, 16 Jun 2012 12:28:28 +0100 Subject: [PATCH 1/1] Initial interractive zoom support --- logicsignal.cpp | 21 +++++++++++++++------ signaldata.cpp | 10 ++++++++++ signaldata.h | 4 ++++ sigview.cpp | 30 ++++++++++++++++++++++++++++++ sigview.h | 5 +++++ 5 files changed, 64 insertions(+), 6 deletions(-) diff --git a/logicsignal.cpp b/logicsignal.cpp index 1587bddd..584be441 100644 --- a/logicsignal.cpp +++ b/logicsignal.cpp @@ -22,6 +22,8 @@ #include #include +#include + #include "logicdata.h" #include "logicdatasnapshot.h" #include "logicsignal.h" @@ -29,6 +31,8 @@ using namespace boost; using namespace std; +const float Log2 = logf(2.0f); + LogicSignal::LogicSignal(QString name, shared_ptr data, int probe_index) : Signal(name), @@ -54,9 +58,14 @@ void LogicSignal::paint(QGLWidget &widget, const QRect &rect, const shared_ptr &snapshot = snapshots.front(); - const int64_t start = 0; - const int64_t end = 8000; - const int64_t quantization_length = 4; + const uint64_t samplerate = _data->get_samplerate(); + const int64_t start_time = _data->get_start_time(); + const float samples_per_pixel = samplerate * scale / 1e15f; + const int64_t start = samplerate * (offset - start_time) / + 1000000000000000ULL; + const int64_t end = start + samples_per_pixel * rect.width(); + const int64_t quantization_length = 1LL << (int64_t)floorf( + max(logf(samples_per_pixel / Log2), 0.0f)); snapshot->get_subsampled_edges(edges, start, end, quantization_length, _probe_index); @@ -69,7 +78,7 @@ void LogicSignal::paint(QGLWidget &widget, const QRect &rect, for(vector::const_iterator i = edges.begin() + 1; i != edges.end() - 1; i++) { - const int x = edge.first / quantization_length + + const int x = (int)((*i).first / samples_per_pixel) + rect.left(); vertex->x = x, vertex->y = 10 + rect.top() - 1; @@ -92,12 +101,12 @@ void LogicSignal::paint(QGLWidget &widget, const QRect &rect, { const int y = ((*i).second ? 10 : 40) + rect.top(); - vertex->x = (*i).first / quantization_length + + vertex->x = (int)((*i).first / samples_per_pixel) + rect.left() - 1; vertex->y = y; vertex++; - vertex->x = (*(i+1)).first / quantization_length + + vertex->x = (int)((*(i+1)).first / samples_per_pixel) + rect.left(); vertex->y = y; vertex++; diff --git a/signaldata.cpp b/signaldata.cpp index fbc10133..0ddb34a7 100644 --- a/signaldata.cpp +++ b/signaldata.cpp @@ -27,3 +27,13 @@ SignalData::SignalData(uint64_t samplerate) : _start_time(0) { } + +uint64_t SignalData::get_samplerate() const +{ + return _samplerate; +} + +int64_t SignalData::get_start_time() const +{ + return _start_time; +} \ No newline at end of file diff --git a/signaldata.h b/signaldata.h index 18c9b3d5..67ff2960 100644 --- a/signaldata.h +++ b/signaldata.h @@ -25,6 +25,10 @@ class SignalData public: SignalData(uint64_t samplerate); +public: + uint64_t get_samplerate() const; + int64_t get_start_time() const; + protected: const uint64_t _samplerate; const int64_t _start_time; diff --git a/sigview.cpp b/sigview.cpp index 53fbdeaa..df1eefec 100644 --- a/sigview.cpp +++ b/sigview.cpp @@ -23,6 +23,8 @@ #include "sigsession.h" #include "signal.h" +#include + #include using namespace boost; @@ -82,3 +84,31 @@ void SigView::dataUpdated() update(); } +void SigView::mouseMoveEvent(QMouseEvent *event) +{ + assert(event); +} + +void SigView::mousePressEvent(QMouseEvent *event) +{ + assert(event); +} + +void SigView::mouseReleaseEvent(QMouseEvent *event) +{ + assert(event); + + switch(event->button()) + { + case Qt::LeftButton: + _scale = (_scale * 2) / 3; + break; + + case Qt::RightButton: + _scale = (_scale * 3) / 2; + break; + } + + updateGL(); +} + diff --git a/sigview.h b/sigview.h index 2c7ba1dd..ccbc8c84 100644 --- a/sigview.h +++ b/sigview.h @@ -44,6 +44,11 @@ protected: void paintGL(); +private: + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + private slots: void dataUpdated(); -- 2.30.2