PulseView  unreleased development snapshot
A Qt-based sigrok GUI
signalbase.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  * Copyright (C) 2016 Soeren Apel <soeren@apelpie.net>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef PULSEVIEW_PV_DATA_SIGNALBASE_HPP
22 #define PULSEVIEW_PV_DATA_SIGNALBASE_HPP
23 
24 #include <atomic>
25 #include <deque>
26 #include <condition_variable>
27 #include <thread>
28 #include <vector>
29 
30 #include <QColor>
31 #include <QObject>
32 #include <QSettings>
33 #include <QString>
34 #include <QTimer>
35 #include <QVariant>
36 
37 #include <libsigrokcxx/libsigrokcxx.hpp>
38 
39 #include "segment.hpp"
40 
41 using std::atomic;
42 using std::condition_variable;
43 using std::deque;
44 using std::enable_shared_from_this;
45 using std::map;
46 using std::mutex;
47 using std::pair;
48 using std::shared_ptr;
49 using std::vector;
50 
51 namespace sigrok {
52 class Channel;
53 }
54 
55 namespace pv {
56 namespace data {
57 
58 class Analog;
59 class AnalogSegment;
60 class DecoderStack;
61 class Logic;
62 class LogicSegment;
63 class Segment;
64 class SignalBase;
65 class SignalData;
66 
67 class SignalGroup : public QObject
68 {
69  Q_OBJECT
70 
71 public:
72  SignalGroup(const QString& name);
73 
74  void append_signal(shared_ptr<SignalBase> signal);
75  void remove_signal(shared_ptr<SignalBase> signal);
76  deque<shared_ptr<SignalBase>> signals() const;
77  void clear();
78 
79  const QString name() const;
80 
81 private:
82  deque<shared_ptr<SignalBase>> signals_;
83  QString name_;
84 };
85 
86 
87 class SignalBase : public QObject, public enable_shared_from_this<SignalBase>
88 {
89  Q_OBJECT
90  Q_PROPERTY(QString error_message READ get_error_message NOTIFY error_message_changed)
91 
92 public:
93  enum ChannelType {
94  AnalogChannel = 1,
97  MathChannel
98  };
99 
101  NoConversion = 0,
102  A2LConversionByThreshold = 1,
103  A2LConversionBySchmittTrigger = 2
104  };
105 
112  NoPreset = -1,
113  DynamicPreset = 0
114  };
115 
116  static const QColor AnalogSignalColors[8];
117  static const QColor LogicSignalColors[10];
118 
119 private:
120  static const int ColorBGAlpha;
121  static const uint64_t ConversionBlockSize;
122  static const uint32_t ConversionDelay;
123 
124 public:
125  SignalBase(shared_ptr<sigrok::Channel> channel, ChannelType channel_type);
126  virtual ~SignalBase();
127 
128 public:
133  shared_ptr<sigrok::Channel> channel() const;
134 
138  bool is_generated() const;
139 
143  bool enabled() const;
144 
149  void set_enabled(bool value);
150 
154  ChannelType type() const;
155 
160  unsigned int index() const;
161 
167  void set_index(unsigned int index);
168 
175  unsigned int logic_bit_index() const;
176 
180  void set_group(SignalGroup* group);
181 
185  SignalGroup* group() const;
186 
190  QString name() const;
191 
195  QString internal_name() const;
196 
201  void set_internal_name(QString internal_name);
202 
207  QString display_name() const;
208 
212  virtual void set_name(QString name);
213 
217  QColor color() const;
218 
222  virtual void set_color(QColor color);
223 
227  QColor bgcolor() const;
228 
232  virtual QString get_error_message() const;
233 
237  void set_data(shared_ptr<pv::data::SignalData> data);
238 
242  void clear_sample_data();
243 
247  shared_ptr<pv::data::Analog> analog_data() const;
248 
252  shared_ptr<pv::data::Logic> logic_data() const;
253 
257  shared_ptr<pv::data::SignalData> data() const;
258 
263  bool segment_is_complete(uint32_t segment_id) const;
264 
268  bool has_samples() const;
269 
273  virtual double get_samplerate() const;
274 
278  ConversionType get_conversion_type() const;
279 
285  void set_conversion_type(ConversionType t);
286 
290  map<QString, QVariant> get_conversion_options() const;
291 
301  bool set_conversion_option(QString key, QVariant value);
302 
321  vector<double> get_conversion_thresholds(
322  const ConversionType t = NoConversion, const bool always_custom=false) const;
323 
330  vector<pair<QString, int> > get_conversion_presets() const;
331 
340  ConversionPreset get_current_conversion_preset() const;
341 
349  void set_conversion_preset(ConversionPreset id);
350 
351 #ifdef ENABLE_DECODE
352  bool is_decode_signal() const;
353 #endif
354 
355  virtual void save_settings(QSettings &settings) const;
356  virtual void restore_settings(QSettings &settings);
357 
358  void start_conversion(bool delayed_start=false);
359 
360 protected:
361  virtual void set_error_message(QString msg);
362 
363 private:
364  void stop_conversion();
365 
366  bool conversion_is_a2l() const;
367 
368  uint8_t convert_a2l_threshold(float threshold, float value);
369  uint8_t convert_a2l_schmitt_trigger(float lo_thr, float hi_thr,
370  float value, uint8_t &state);
371 
372  void convert_single_segment_range(shared_ptr<AnalogSegment> asegment,
373  shared_ptr<LogicSegment> lsegment, uint64_t start_sample, uint64_t end_sample);
374  void convert_single_segment(shared_ptr<AnalogSegment> asegment,
375  shared_ptr<LogicSegment> lsegment);
376  void conversion_thread_proc();
377 
378 Q_SIGNALS:
379  void enabled_changed(const bool &value);
380  void name_changed(const QString &name);
381  void color_changed(const QColor &color);
382  void error_message_changed(QString msg);
383  void conversion_type_changed(const ConversionType t);
384 
385  void samples_cleared();
386  void samples_added(uint64_t segment_id, uint64_t start_sample,
387  uint64_t end_sample);
388 
389  void min_max_changed(float min, float max);
390 
391 private Q_SLOTS:
392  void on_samples_cleared();
393 
394  void on_samples_added(SharedPtrToSegment segment, uint64_t start_sample,
395  uint64_t end_sample);
396 
397  void on_input_segment_completed();
398 
399  void on_min_max_changed(float min, float max);
400 
401  void on_capture_state_changed(int state);
402 
403  void on_delayed_conversion_start();
404 
405 protected:
406  shared_ptr<sigrok::Channel> channel_;
409  shared_ptr<pv::data::SignalData> data_;
410  shared_ptr<pv::data::SignalData> converted_data_;
412  map<QString, QVariant> conversion_options_;
413 
414  float min_value_, max_value_;
415 
416  std::thread conversion_thread_;
417  atomic<bool> conversion_interrupt_;
419  condition_variable conversion_input_cond_;
421 
422  QString internal_name_, name_;
423  QColor color_, bgcolor_;
424  unsigned int index_;
425 
426  QString error_message_;
427 };
428 
429 } // namespace data
430 } // namespace pv
431 
432 Q_DECLARE_METATYPE(shared_ptr<pv::data::SignalBase>);
433 
434 #endif // PULSEVIEW_PV_DATA_SIGNALBASE_HPP
QTimer delayed_conversion_starter_
Definition: signalbase.hpp:420
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 t(t+t)") define_sfop3(16
shared_ptr< pv::data::SignalData > converted_data_
Definition: signalbase.hpp:410
std::shared_ptr< pv::data::Segment > SharedPtrToSegment
Definition: segment.hpp:131
shared_ptr< pv::data::SignalData > data_
Definition: signalbase.hpp:409
static const uint64_t ConversionBlockSize
Definition: signalbase.hpp:121
T value(details::expression_node< T > *n)
Definition: exprtk.hpp:12358
ChannelType channel_type_
Definition: signalbase.hpp:407
T max(const T v0, const T v1)
Definition: exprtk.hpp:1411
static std::string data()
Definition: exprtk.hpp:39024
map< QString, QVariant > conversion_options_
Definition: signalbase.hpp:412
Q_DECLARE_METATYPE(shared_ptr< pv::data::SignalBase >)
T min(const T v0, const T v1)
Definition: exprtk.hpp:1404
std::thread conversion_thread_
Definition: signalbase.hpp:416
SignalGroup * group_
Definition: signalbase.hpp:408
atomic< bool > conversion_interrupt_
Definition: signalbase.hpp:417
Protocol Decoder channel using libsigrokdecode.
Definition: signalbase.hpp:96
static const uint32_t ConversionDelay
Definition: signalbase.hpp:122
shared_ptr< sigrok::Channel > channel_
Definition: signalbase.hpp:406
static const int ColorBGAlpha
Definition: signalbase.hpp:120
condition_variable conversion_input_cond_
Definition: signalbase.hpp:419
deque< shared_ptr< SignalBase > > signals_
Definition: signalbase.hpp:82
unsigned int index_
Definition: signalbase.hpp:424
ConversionType conversion_type_
Definition: signalbase.hpp:411