PulseView  unreleased development snapshot
A Qt-based sigrok GUI
analogsignal.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef PULSEVIEW_PV_VIEWS_TRACE_ANALOGSIGNAL_HPP
21 #define PULSEVIEW_PV_VIEWS_TRACE_ANALOGSIGNAL_HPP
22 
23 #include <memory>
24 
25 #include <QColor>
26 #include <QComboBox>
27 #include <QSpinBox>
28 
31 
32 using std::pair;
33 using std::shared_ptr;
34 
35 namespace pv {
36 
37 namespace data {
38 class Analog;
39 class AnalogSegment;
40 class SignalBase;
41 }
42 
43 namespace views {
44 namespace trace {
45 
46 class AnalogSignal : public LogicSignal
47 {
48  Q_OBJECT
49 
50 private:
51  static const QPen AxisPen;
52  static const QColor GridMajorColor, GridMinorColor;
53  static const QColor SamplingPointColorLo;
54  static const QColor SamplingPointColorNe;
55  static const QColor SamplingPointColorHi;
56  static const QColor ThresholdColor;
57  static const QColor ThresholdColorLo;
58  static const QColor ThresholdColorNe;
59  static const QColor ThresholdColorHi;
60 
61  static const int64_t TracePaintBlockSize;
62  static const float EnvelopeThreshold;
63 
64  static const int MaximumVDivs;
65  static const int MaxScaleIndex, MinScaleIndex;
66  static const int InfoTextMarginRight, InfoTextMarginBottom;
67 
68  enum DisplayType {
69  DisplayAnalog = 0,
70  DisplayConverted = 1,
71  DisplayBoth = 2
72  };
73 
74 public:
75  AnalogSignal(pv::Session &session, shared_ptr<data::SignalBase> base);
76 
77  virtual std::map<QString, QVariant> save_settings() const;
78  virtual void restore_settings(std::map<QString, QVariant> settings);
79 
84  virtual pair<int, int> v_extents() const;
85 
91  virtual void paint_back(QPainter &p, ViewItemPaintParams &pp);
92 
98  virtual void paint_mid(QPainter &p, ViewItemPaintParams &pp);
99 
105  virtual void paint_fore(QPainter &p, ViewItemPaintParams &pp);
106 
107 private:
108  void paint_grid(QPainter &p, int y, int left, int right);
109 
110  void paint_trace(QPainter &p,
111  const shared_ptr<pv::data::AnalogSegment> &segment,
112  int y, int left, const int64_t start, const int64_t end,
113  const double pixels_offset, const double samples_per_pixel);
114 
115  void paint_envelope(QPainter &p,
116  const shared_ptr<pv::data::AnalogSegment> &segment,
117  int y, int left, const int64_t start, const int64_t end,
118  const double pixels_offset, const double samples_per_pixel);
119 
120  shared_ptr<pv::data::AnalogSegment> get_analog_segment_to_paint() const;
121 
125  float get_resolution(int scale_index);
126 
127  void update_scale();
128  virtual void update_logic_level_offsets();
129 
130  void update_conversion_widgets();
131 
139  virtual vector<data::LogicSegment::EdgePair> get_nearest_level_changes(uint64_t sample_pos);
140 
141  void perform_autoranging(bool keep_divs, bool force_update);
142 
143  void reset_pixel_values();
144  void process_next_sample_value(float x, float value);
145 
146 protected:
147  void populate_popup_form(QWidget *parent, QFormLayout *form);
148 
149  virtual void hover_point_changed(const QPoint &hp);
150 
151 private Q_SLOTS:
152  virtual void on_setting_changed(const QString &key, const QVariant &value);
153 
154  void on_min_max_changed(float min, float max);
155 
156  void on_pos_vdivs_changed(int vdivs);
157  void on_neg_vdivs_changed(int vdivs);
158  void on_div_height_changed(int height);
159 
160  void on_resolution_changed(int index);
161 
162  void on_autoranging_changed(int state);
163 
164  void on_conversion_changed(int index);
165  void on_conv_threshold_changed(int index=-1);
166  void on_delayed_conversion_starter();
167 
168  void on_display_type_changed(int index);
169 
170 private:
171  QComboBox *resolution_cb_, *conversion_cb_, *conv_threshold_cb_,
172  *display_type_cb_;
173  QSpinBox *pvdiv_sb_, *nvdiv_sb_, *div_height_sb_;
174 
175  double signal_min_, signal_max_; // Min/max values of this signal's analog data
176 
179  bool show_sampling_points_, fill_high_areas_;
180 
182 
183  vector<float> value_at_pixel_pos_;
185  float prev_value_at_pixel_; // Only used during lookup table update
186  float min_value_at_pixel_, max_value_at_pixel_; // Only used during lookup table update
187  int current_pixel_pos_; // Only used during lookup table update
188 
189  // ---------------------------------------------------------------------------
190  // Note: Make sure to update save_settings() and restore_settings() when
191  // adding a trace-configurable variable here
192  float scale_;
194 
196  int pos_vdivs_, neg_vdivs_; // divs per positive/negative side
197  float resolution_; // e.g. 10 for 10 V/div
198 
201 };
202 
203 } // namespace trace
204 } // namespace views
205 } // namespace pv
206 
207 #endif // PULSEVIEW_PV_VIEWS_TRACE_ANALOGSIGNAL_HPP
static const QColor ThresholdColorLo
T value(details::expression_node< T > *n)
Definition: exprtk.hpp:12358
static const float EnvelopeThreshold
static const int InfoTextMarginRight
T max(const T v0, const T v1)
Definition: exprtk.hpp:1411
static std::string data()
Definition: exprtk.hpp:39024
static const QColor ThresholdColorHi
T min(const T v0, const T v1)
Definition: exprtk.hpp:1404
static const int64_t TracePaintBlockSize
static const QColor SamplingPointColorNe
static const QColor ThresholdColor
static const QColor SamplingPointColorHi
x y t t *t x y t t t x y t t t x *y t *t t x *y t *t t x y t t t x y t t t x(y+z)
static const QColor SamplingPointColorLo
static const QColor ThresholdColorNe
static const QColor GridMinorColor