Commit c1555897 authored by DreamSourceLab's avatar DreamSourceLab

Add edges calculation function @ LA mode

parent a042fabf
......@@ -252,7 +252,7 @@ bool LogicSnapshot::get_nxt_edge(
unsigned int level;
bool fast_forward;
assert(index > 0);
//assert(index > 0);
const unsigned int min_level = max((int)floorf(logf(min_length) /
LogMipMapScaleFactor) - 1, 0);
......
......@@ -324,5 +324,49 @@ bool LogicSignal::measure(const QPointF &p, uint64_t &index0, uint64_t &index1,
return false;
}
bool LogicSignal::edges(const QPointF &p, uint64_t start, uint64_t &rising, uint64_t &falling) const
{
uint64_t index, end;
const float gap = abs(p.y() - get_y());
if (gap < get_signalHeight() * 0.5) {
const deque< boost::shared_ptr<pv::data::LogicSnapshot> > &snapshots =
_data->get_snapshots();
if (snapshots.empty())
return false;
const boost::shared_ptr<pv::data::LogicSnapshot> &snapshot =
snapshots.front();
if (snapshot->buf_null())
return false;
end = _data->samplerate() * (_view->offset() - _data->get_start_time() + p.x() * _view->scale());
index = min(start, end);
end = max(start, end);
start = index;
if (end > (snapshot->get_sample_count() - 1))
return false;
const uint64_t sig_mask = 1ULL << get_index();
bool sample = snapshot->get_sample(start) & sig_mask;
rising = 0;
falling = 0;
do {
if (snapshot->get_nxt_edge(index, sample, snapshot->get_sample_count(), 1, get_index())) {
if (index > end)
break;
rising += !sample;
falling += sample;
sample = !sample;
} else {
break;
}
} while(index <= end);
return true;
}
return false;
}
} // namespace view
} // namespace pv
......@@ -82,6 +82,8 @@ public:
bool measure(const QPointF &p, uint64_t &index0, uint64_t &index1, uint64_t &index2) const;
bool edges(const QPointF &p, uint64_t start, uint64_t &rising, uint64_t &falling) const;
protected:
void paint_type_options(QPainter &p, int right, bool hover, int action);
......
......@@ -511,16 +511,34 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event)
if(_drag_sig)
_drag_sig.reset();
const double strength = _drag_strength*DragTimerInterval*1.0/_time.elapsed();
if (abs(_drag_strength) < MinorDragOffsetUp && abs(strength) > MinorDragRateUp) {
_drag_strength = _drag_strength;
_drag_timer.start(DragTimerInterval);
} else if (abs(strength) > DragTimerInterval) {
_drag_strength = strength * 5;
_drag_timer.start(DragTimerInterval);
} else {
_drag_strength = 0;
_drag_timer.stop();
if (_mouse_down_point.x() == event->pos().x() &&
event->button() & Qt::LeftButton) {
if (_measure_type == LOGIC_EDGE) {
_measure_type = NO_MEASURE;
_measure_shown = false;
_edge_rising = 0;
_edge_falling = 0;
} else if (_measure_type != LOGIC_MOVE) {
_measure_type = LOGIC_EDGE;
_edge_start = (_view.offset() + (event->pos().x() + 0.5) * _view.scale()) * _view.session().get_device()->get_sample_rate();
}
}
if (_measure_type != LOGIC_EDGE) {
const double strength = _drag_strength*DragTimerInterval*1.0/_time.elapsed();
if (abs(_drag_strength) < MinorDragOffsetUp && abs(strength) > MinorDragRateUp) {
_drag_strength = _drag_strength;
_drag_timer.start(DragTimerInterval);
_measure_type = LOGIC_MOVE;
} else if (abs(strength) > DragTimerInterval) {
_drag_strength = strength * 5;
_drag_timer.start(DragTimerInterval);
_measure_type = LOGIC_MOVE;
} else {
_drag_strength = 0;
_drag_timer.stop();
_measure_type = NO_MEASURE;
}
}
update();
......@@ -593,6 +611,10 @@ void Viewport::leaveEvent(QEvent *)
_measure_shown = _dso_xm || _dso_ym;
_mouse_point = QPoint(-1, -1);
//_view.show_cursors(false);
if (_measure_type == LOGIC_EDGE) {
_measure_type = NO_MEASURE;
_measure_shown = false;
}
update();
}
......@@ -622,46 +644,62 @@ void Viewport::measure()
_view.session().get_capture_state() == SigSession::Running) ||
_drag_strength != 0)
return;
_measure_shown = _dso_xm || _dso_ym;
const uint64_t sample_rate = _view.session().get_device()->get_sample_rate();
const vector< boost::shared_ptr<Signal> > sigs(_view.session().get_signals());
BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) {
assert(s);
boost::shared_ptr<view::LogicSignal> logicSig;
boost::shared_ptr<view::DsoSignal> dsoSig;
if (logicSig = dynamic_pointer_cast<view::LogicSignal>(s)) {
if (logicSig->measure(_view.hover_point(), _cur_sample, _nxt_sample, _thd_sample)) {
_measure_shown = true;
_measure_type = LOGIC_FREQ;
_mm_width = _view.get_ruler()->format_real_time(_nxt_sample - _cur_sample, sample_rate);
_mm_period = _thd_sample != 0 ? _view.get_ruler()->format_real_time(_thd_sample - _cur_sample, sample_rate) : "#####";
_mm_freq = _thd_sample != 0 ? _view.get_ruler()->format_real_freq(_thd_sample - _cur_sample, sample_rate) : "#####";
const double pixels_offset = _view.offset() / _view.scale();
const double samples_per_pixel = sample_rate * _view.scale();
_cur_preX = _cur_sample / samples_per_pixel - pixels_offset;
_cur_aftX = _nxt_sample / samples_per_pixel - pixels_offset;
_cur_thdX = _thd_sample / samples_per_pixel - pixels_offset;
_cur_midY = logicSig->get_y();
_mm_duty = _thd_sample != 0 ? QString::number((_nxt_sample - _cur_sample) * 100.0 / (_thd_sample - _cur_sample), 'f', 2)+"%" :
_measure_shown = _dso_xm || _dso_ym;
const uint64_t sample_rate = _view.session().get_device()->get_sample_rate();
const vector< boost::shared_ptr<Signal> > sigs(_view.session().get_signals());
BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) {
assert(s);
boost::shared_ptr<view::LogicSignal> logicSig;
boost::shared_ptr<view::DsoSignal> dsoSig;
if (logicSig = dynamic_pointer_cast<view::LogicSignal>(s)) {
if (_measure_type != LOGIC_EDGE &&
logicSig->measure(_view.hover_point(), _cur_sample, _nxt_sample, _thd_sample)) {
_measure_shown = true;
_measure_type = LOGIC_FREQ;
_mm_width = _view.get_ruler()->format_real_time(_nxt_sample - _cur_sample, sample_rate);
_mm_period = _thd_sample != 0 ? _view.get_ruler()->format_real_time(_thd_sample - _cur_sample, sample_rate) : "#####";
_mm_freq = _thd_sample != 0 ? _view.get_ruler()->format_real_freq(_thd_sample - _cur_sample, sample_rate) : "#####";
const double pixels_offset = _view.offset() / _view.scale();
const double samples_per_pixel = sample_rate * _view.scale();
_cur_preX = _cur_sample / samples_per_pixel - pixels_offset;
_cur_aftX = _nxt_sample / samples_per_pixel - pixels_offset;
_cur_thdX = _thd_sample / samples_per_pixel - pixels_offset;
_cur_midY = logicSig->get_y();
_mm_duty = _thd_sample != 0 ? QString::number((_nxt_sample - _cur_sample) * 100.0 / (_thd_sample - _cur_sample), 'f', 2)+"%" :
"#####";
mouse_measure();
break;
} else {
_mm_width = "#####";
_mm_period = "#####";
_mm_freq = "#####";
_mm_duty = "#####";
}
mouse_measure();
} else if (dsoSig = dynamic_pointer_cast<view::DsoSignal>(s)) {
if (_measure_en && dsoSig->measure(_view.hover_point())) {
_measure_shown = true;
_measure_type = DSO_FREQ;
}
}
mouse_measure();
break;
} else if (_measure_type == LOGIC_EDGE &&
logicSig->edges(_view.hover_point(), _edge_start, _edge_rising, _edge_falling)) {
_measure_shown = true;
const double pixels_offset = _view.offset() / _view.scale();
const double samples_per_pixel = sample_rate * _view.scale();
_cur_preX = _edge_start / samples_per_pixel - pixels_offset;
_cur_aftX = _view.hover_point().x();
_cur_midY = logicSig->get_y() - logicSig->get_signalHeight()/2 - 5;
_em_rising = "Rising: " + QString::number(_edge_rising);
_em_falling = "Falling: " + QString::number(_edge_falling);
_em_edges = "Edges: " + QString::number(_edge_rising + _edge_falling);
break;
} else {
_mm_width = "#####";
_mm_period = "#####";
_mm_freq = "#####";
_mm_duty = "#####";
}
mouse_measure();
} else if (dsoSig = dynamic_pointer_cast<view::DsoSignal>(s)) {
if (_measure_en && dsoSig->measure(_view.hover_point())) {
_measure_shown = true;
_measure_type = DSO_FREQ;
}
}
}
}
......@@ -721,6 +759,43 @@ void Viewport::paintMeasure(QPainter &p)
p.drawText(measure4_rect, Qt::AlignRight | Qt::AlignVCenter,
tr("Duty Cycle: ") + _mm_duty);
}
} else if (_measure_type == LOGIC_EDGE) {
p.setPen(QColor(17, 133, 209, 255));
p.drawLine(QLineF(_cur_preX, _cur_midY-5, _cur_preX, _cur_midY+5));
p.drawLine(QLineF(_cur_aftX, _cur_midY-5, _cur_aftX, _cur_midY+5));
p.drawLine(QLineF(_cur_preX, _cur_midY, _cur_aftX, _cur_midY));
int typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX,
Qt::AlignLeft | Qt::AlignTop, _em_edges).width();
typical_width = max(typical_width, p.boundingRect(0, 0, INT_MAX, INT_MAX,
Qt::AlignLeft | Qt::AlignTop, _em_rising).width());
typical_width = max(typical_width, p.boundingRect(0, 0, INT_MAX, INT_MAX,
Qt::AlignLeft | Qt::AlignTop, _em_falling).width());
typical_width = typical_width + 30;
const double width = _view.get_view_width();
const double height = _view.viewport()->height();
const double left = _view.hover_point().x();
const double top = _view.hover_point().y();
const double right = left + typical_width;
const double bottom = top + 60;
QPointF org_pos = QPointF(right > width ? left - typical_width : left, bottom > height ? top - 80 : top);
QRectF measure_rect = QRectF(org_pos.x(), org_pos.y(), (double)typical_width, 60.0);
QRectF measure1_rect = QRectF(org_pos.x(), org_pos.y(), (double)typical_width, 20.0);
QRectF measure2_rect = QRectF(org_pos.x(), org_pos.y()+20, (double)typical_width, 20.0);
QRectF measure3_rect = QRectF(org_pos.x(), org_pos.y()+40, (double)typical_width, 20.0);
p.setPen(Qt::NoPen);
p.setBrush(QColor(17, 133, 209, 150));
p.drawRect(measure_rect);
p.setPen(Qt::black);
p.drawText(measure1_rect, Qt::AlignRight | Qt::AlignVCenter, _em_edges);
p.drawText(measure2_rect, Qt::AlignRight | Qt::AlignVCenter, _em_rising);
p.drawText(measure3_rect, Qt::AlignRight | Qt::AlignVCenter, _em_falling);
} else if (_measure_type == DSO_FREQ) {
const vector< boost::shared_ptr<Signal> > sigs(_view.session().get_signals());
BOOST_FOREACH(const boost::shared_ptr<Signal> s, sigs) {
......
......@@ -57,6 +57,8 @@ public:
enum MeasureType {
NO_MEASURE,
LOGIC_FREQ,
LOGIC_EDGE,
LOGIC_MOVE,
DSO_FREQ
};
......@@ -118,7 +120,7 @@ private:
bool _measure_en;
bool _measure_shown;
int _measure_type;
MeasureType _measure_type;
uint64_t _cur_sample;
uint64_t _nxt_sample;
uint64_t _thd_sample;
......@@ -131,6 +133,13 @@ private:
QString _mm_freq;
QString _mm_duty;
uint64_t _edge_rising;
uint64_t _edge_falling;
uint64_t _edge_start;
QString _em_rising;
QString _em_falling;
QString _em_edges;
QTimer trigger_timer;
bool triggered;
int timer_cnt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment