33 #include <libsigrokcxx/libsigrokcxx.hpp>
38 using std::shared_ptr;
41 using sigrok::Channel;
49 QColor(0xC4, 0xA0, 0x00),
50 QColor(0x87, 0x20, 0x7A),
51 QColor(0x20, 0x4A, 0x87),
52 QColor(0x4E, 0x9A, 0x06)
59 shared_ptr<Channel> channel,
60 shared_ptr<data::Analog> data) :
64 scale_index_drag_offset_(0)
86 return make_pair(-h, h);
124 const deque< shared_ptr<pv::data::AnalogSegment> > &segments =
125 data_->analog_segments();
126 if (segments.empty())
129 const shared_ptr<pv::data::AnalogSegment> &segment =
133 const double samplerate = max(1.0, segment->samplerate());
135 const int64_t last_sample = segment->get_sample_count() - 1;
136 const double samples_per_pixel = samplerate * pp.
scale();
140 const int64_t start_sample = min(max(floor(start).convert_to<int64_t>(),
141 (int64_t)0), last_sample);
142 const int64_t end_sample = min(max((ceil(end) + 1).convert_to<int64_t>(),
143 (int64_t)0), last_sample);
147 start_sample, end_sample,
148 pixels_offset, samples_per_pixel);
151 start_sample, end_sample,
152 pixels_offset, samples_per_pixel);
156 const shared_ptr<pv::data::AnalogSegment> &segment,
157 int y,
int left,
const int64_t start,
const int64_t end,
158 const double pixels_offset,
const double samples_per_pixel)
161 const int64_t sample_count = end - start;
163 const float *
const samples = segment->get_samples(start, end);
168 QPointF *points =
new QPointF[sample_count];
169 QPointF *
point = points;
171 for (int64_t sample = start; sample !=
end; sample++) {
172 const float x = (sample / samples_per_pixel -
173 pixels_offset) + left;
174 *point++ = QPointF(x,
175 y - samples[sample - start] * scale);
178 p.drawPolyline(points, point - points);
185 const shared_ptr<pv::data::AnalogSegment> &segment,
186 int y,
int left,
const int64_t start,
const int64_t end,
187 const double pixels_offset,
const double samples_per_pixel)
193 AnalogSegment::EnvelopeSection e;
194 segment->get_envelope_section(e, start, end, samples_per_pixel);
199 p.setPen(QPen(Qt::NoPen));
202 QRectF *
const rects =
new QRectF[e.length];
203 QRectF *rect = rects;
205 for (uint64_t sample = 0; sample < e.length-1; sample++) {
206 const float x = ((e.scale * sample + e.start) /
207 samples_per_pixel - pixels_offset) + left;
208 const AnalogSegment::EnvelopeSample *
const s =
213 const float b = y - max(s->max, (s+1)->min) *
scale;
214 const float t = y - min(s->min, (s+1)->max) *
scale;
217 if (h >= 0.0f && h <= 1.0f)
219 if (h <= 0.0f && h >= -1.0f)
222 *rect++ = QRectF(x, t, 1.0f, h);
225 p.drawRects(rects, e.length);
233 const float seq[] = {1.0f, 2.0f, 5.0f};
234 const int offset = std::numeric_limits<int>::max() / (2 *
countof(seq));
235 const std::div_t d = std::div(
238 return powf(10.0f, d.quot - offset) * seq[d.rem];
QPoint point(const QRect &rect) const
static const int NominalHeight
int scale_handle_offset() const
std::shared_ptr< pv::data::Analog > analog_data() const
std::shared_ptr< pv::data::Analog > data_
static const QColor SignalColours[4]
void paint_mid(QPainter &p, const ViewItemPaintParams &pp)
void paint_axis(QPainter &p, const ViewItemPaintParams &pp, int y)
std::shared_ptr< pv::data::SignalData > data() const
const pv::util::Timestamp & offset() const
void paint_envelope(QPainter &p, const std::shared_ptr< pv::data::AnalogSegment > &segment, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel)
void scale_handle_dragged(int offset)
double pixels_offset() const
void paint_trace(QPainter &p, const std::shared_ptr< pv::data::AnalogSegment > &segment, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel)
void scale_handle_drag_release()
AnalogSignal(pv::Session &session, std::shared_ptr< sigrok::Channel > channel, std::shared_ptr< pv::data::Analog > data)
std::shared_ptr< sigrok::Channel > channel_
std::pair< int, int > v_extents() const
int scale_index_drag_offset_
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 24 >, boost::multiprecision::et_off > Timestamp
Timestamp type providing yoctosecond resolution.
void paint_back(QPainter &p, const ViewItemPaintParams &pp)
TraceTreeItemOwner * owner_
static const float EnvelopeThreshold
void set_colour(QColor colour)
virtual void paint_back(QPainter &p, const ViewItemPaintParams &pp)