From cc6c663a969c1598838e1fbbc18898ec9e1f9c3f Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Wed, 11 Nov 2015 21:22:03 +0800 Subject: [PATCH] Fix trigger time delay @ osc mode --- DSView/pv/data/dsosnapshot.cpp | 11 +++++++---- DSView/pv/data/dsosnapshot.h | 2 +- DSView/pv/view/dsosignal.cpp | 15 ++++++++++----- DSView/pv/view/trace.cpp | 2 +- libsigrok4DSL/hardware/DSL/dscope.c | 8 ++++++-- libsigrok4DSL/hardware/DSL/dslogic.c | 4 +++- libsigrok4DSL/libsigrok.h | 4 ++++ 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/DSView/pv/data/dsosnapshot.cpp b/DSView/pv/data/dsosnapshot.cpp index 8cb95f6e..4e0e1b26 100644 --- a/DSView/pv/data/dsosnapshot.cpp +++ b/DSView/pv/data/dsosnapshot.cpp @@ -75,14 +75,14 @@ void DsoSnapshot::append_payload(const sr_datafeed_dso &dso) // Generate the first mip-map from the data if (_envelope_en) - append_payload_to_envelope_levels(); + append_payload_to_envelope_levels(dso.samplerate_tog); } } void DsoSnapshot::enable_envelope(bool enable) { if (!_envelope_done && enable) - append_payload_to_envelope_levels(); + append_payload_to_envelope_levels(true); _envelope_en = enable; } @@ -146,14 +146,17 @@ void DsoSnapshot::reallocate_envelope(Envelope &e) } } -void DsoSnapshot::append_payload_to_envelope_levels() +void DsoSnapshot::append_payload_to_envelope_levels(bool header) { for (unsigned int i = 0; i < _channel_num; i++) { Envelope &e0 = _envelope_levels[i][0]; uint64_t prev_length; EnvelopeSample *dest_ptr; - prev_length = e0.length; + if (header) + prev_length = 0; + else + prev_length = e0.length; e0.length = _sample_count / EnvelopeScaleFactor; if (e0.length == 0) diff --git a/DSView/pv/data/dsosnapshot.h b/DSView/pv/data/dsosnapshot.h index 06474564..eb3788bc 100644 --- a/DSView/pv/data/dsosnapshot.h +++ b/DSView/pv/data/dsosnapshot.h @@ -90,7 +90,7 @@ public: private: void reallocate_envelope(Envelope &l); - void append_payload_to_envelope_levels(); + void append_payload_to_envelope_levels(bool header); private: struct Envelope _envelope_levels[2*DS_MAX_DSO_PROBES_NUM][ScaleStepCount]; diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index b6118c64..11dff4d3 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -409,10 +409,10 @@ bool DsoSignal::go_hDialNext(bool setted) return true; } if (!setted) { - const double scale = _hDial->get_value() * std::pow(10.0, -9.0) * DS_CONF_DSO_HDIVS / get_view_rect().width(); - _view->set_scale_offset(scale, _view->offset()); - _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, - g_variant_new_uint64(_hDial->get_value())); + const double scale = _hDial->get_value() * std::pow(10.0, -9.0) * DS_CONF_DSO_HDIVS / get_view_rect().width(); + _view->set_scale_offset(scale, _view->offset()); + _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, + g_variant_new_uint64(_hDial->get_value())); } return true; } else { @@ -927,7 +927,6 @@ void DsoSignal::paint_trace(QPainter &p, QColor trace_colour = _colour; trace_colour.setAlpha(150); p.setPen(trace_colour); - //p.setPen(QPen(_colour, 3, Qt::SolidLine)); QPointF *points = new QPointF[sample_count]; QPointF *point = points; @@ -955,6 +954,8 @@ void DsoSignal::paint_trace(QPainter &p, } p.drawPolyline(points, point - points); + p.eraseRect(get_view_rect().right(), get_view_rect().top(), + _view->viewport()->width() - get_view_rect().width(), get_view_rect().height()); //delete[] samples; delete[] points; @@ -1422,6 +1423,10 @@ bool DsoSignal::measure(const QPointF &p) if (!enabled()) return false; + const QRectF window = get_view_rect(); + if (!window.contains(p)) + return false; + const deque< boost::shared_ptr > &snapshots = _data->get_snapshots(); if (snapshots.empty()) diff --git a/DSView/pv/view/trace.cpp b/DSView/pv/view/trace.cpp index f6304741..92b4f210 100644 --- a/DSView/pv/view/trace.cpp +++ b/DSView/pv/view/trace.cpp @@ -42,7 +42,7 @@ const QColor Trace::dsYellow = QColor(238, 178, 17, 255); const QColor Trace::dsRed = QColor(213, 15, 37, 255); const QColor Trace::dsGreen = QColor(0, 153, 37, 200); const QColor Trace::dsGray = QColor(0x88, 0x8A, 0x85, 60); -const QColor Trace::dsFore = QColor(0xff, 0xff, 0xff, 100); +const QColor Trace::dsFore = QColor(0xff, 0xff, 0xff, 60); const QColor Trace::dsBack = QColor(0x16, 0x18, 0x23, 180); const QColor Trace::dsDisable = QColor(0x88, 0x8A, 0x85, 200); const QColor Trace::dsActive = QColor(17, 133, 209, 255); diff --git a/libsigrok4DSL/hardware/DSL/dscope.c b/libsigrok4DSL/hardware/DSL/dscope.c index 7d3fa6e8..3d7971d0 100644 --- a/libsigrok4DSL/hardware/DSL/dscope.c +++ b/libsigrok4DSL/hardware/DSL/dscope.c @@ -1938,7 +1938,8 @@ static void receive_transfer(struct libusb_transfer *transfer) mstatus.ch1_pcnt = *((const uint32_t*)cur_buf + mstatus_offset/2 + 14/2); mstatus.vlen = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x7fffffff; mstatus.stream_mode = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x80000000; - mstatus.sample_divider = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2); + mstatus.sample_divider = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2) & 0x7fffffff; + mstatus.sample_divider_tog = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2) & 0x80000000; mstatus.zeroing = (*((const uint16_t*)cur_buf + mstatus_offset + 128) & 0x8000) != 0; mstatus.ch0_vpos_mid = *((const uint16_t*)cur_buf + mstatus_offset + 128) & 0x7fff; mstatus.ch0_voff_mid = *((const uint16_t*)cur_buf + mstatus_offset + 129); @@ -1972,8 +1973,10 @@ static void receive_transfer(struct libusb_transfer *transfer) dso.mq = SR_MQ_VOLTAGE; dso.unit = SR_UNIT_VOLT; dso.mqflags = SR_MQFLAG_AC; + dso.samplerate_tog = mstatus.sample_divider_tog; dso.data = cur_buf + trigger_offset_bytes; } else { + packet.type = SR_DF_ABANDON; mstatus_valid = FALSE; } } else { @@ -2028,7 +2031,8 @@ static void receive_transfer(struct libusb_transfer *transfer) } /* send data to session bus */ - sr_session_send(devc->cb_data, &packet); + if (packet.type != SR_DF_ABANDON) + sr_session_send(devc->cb_data, &packet); } devc->num_samples += cur_sample_count; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index d87e870e..1b2b6ccb 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -2202,7 +2202,8 @@ static void receive_transfer(struct libusb_transfer *transfer) mstatus.ch1_pcnt = *((const uint32_t*)cur_buf + mstatus_offset/2 + 14/2); mstatus.vlen = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x7fffffff; mstatus.stream_mode = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x80000000; - mstatus.sample_divider = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2); + mstatus.sample_divider = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2) & 0x7fffffff; + mstatus.sample_divider_tog = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2) & 0x80000000; mstatus.zeroing = (*((const uint16_t*)cur_buf + mstatus_offset + 128) & 0x8000) != 0; mstatus.ch0_adc_off = *((const uint8_t*)cur_buf + mstatus_offset*2 + 131*2); mstatus.ch0_adc_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 131*2+1); @@ -2229,6 +2230,7 @@ static void receive_transfer(struct libusb_transfer *transfer) dso.mq = SR_MQ_VOLTAGE; dso.unit = SR_UNIT_VOLT; dso.mqflags = SR_MQFLAG_AC; + dso.samplerate_tog = mstatus.sample_divider_tog; dso.data = cur_buf + trigger_offset_bytes; } else { devc->mstatus_valid = FALSE; diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index 477d3646..4062a61a 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -176,6 +176,7 @@ enum { SR_DF_ANALOG, SR_DF_FRAME_BEGIN, SR_DF_FRAME_END, + SR_DF_ABANDON, }; /** Values for sr_datafeed_analog.mq. */ @@ -322,6 +323,8 @@ struct sr_datafeed_dso { int unit; /** Bitmap with extra information about the MQ. */ uint64_t mqflags; + /** samplerate different from last packet */ + gboolean samplerate_tog; /** The analog value(s). The data is interleaved according to * the probes list. */ void *data; @@ -624,6 +627,7 @@ struct sr_status { uint32_t vlen; gboolean stream_mode; uint32_t sample_divider; + gboolean sample_divider_tog; gboolean zeroing; uint16_t ch0_vpos_mid;