PulseView  unreleased development snapshot
A Qt-based sigrok GUI
mathsignal.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2020 Soeren Apel <soeren@apelpie.net>
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_DATA_MATHSIGNAL_HPP
21 #define PULSEVIEW_PV_DATA_MATHSIGNAL_HPP
22 
23 #define exprtk_disable_rtl_io_file /* Potential security issue, doubt anyone would use those anyway */
24 #define exprtk_disable_rtl_vecops /* Vector ops are rather useless for math channels */
25 #define exprtk_disable_caseinsensitivity /* So that we can have both 't' and 'T' */
26 
27 #include <limits>
28 
29 #include <QString>
30 
31 #include <pv/exprtk.hpp>
32 #include <pv/util.hpp>
33 #include <pv/data/analog.hpp>
34 #include <pv/data/signalbase.hpp>
35 
36 using std::atomic;
37 using std::condition_variable;
38 using std::mutex;
39 using std::numeric_limits;
40 using std::shared_ptr;
41 
42 namespace pv {
43 class Session;
44 
45 namespace data {
46 
47 class SignalBase;
48 
49 template<typename T>
50 struct fnc_sample;
51 
52 struct signal_data {
53  signal_data(const shared_ptr<SignalBase> _sb) :
54  sb(_sb), sample_num(numeric_limits<uint64_t>::max()), sample_value(0), ref(nullptr)
55  {}
56 
57  const shared_ptr<SignalBase> sb;
58  uint64_t sample_num;
59  double sample_value;
60  double* ref;
61 };
62 
63 class MathSignal : public SignalBase
64 {
65  Q_OBJECT
66  Q_PROPERTY(QString expression READ get_expression WRITE set_expression NOTIFY expression_changed)
67 
68 private:
69  static const int64_t ChunkLength;
70 
71 public:
72  MathSignal(pv::Session &session);
73  virtual ~MathSignal();
74 
75  virtual void save_settings(QSettings &settings) const;
76  virtual void restore_settings(QSettings &settings);
77 
78  QString get_expression() const;
79  void set_expression(QString expression);
80 
81 private:
82  void set_error(uint8_t type, QString msg);
83 
91  uint64_t get_working_sample_count(uint32_t segment_id) const;
92 
93  void update_completeness(uint32_t segment_id, uint64_t output_sample_count);
94 
95  void reset_generation();
96  virtual void begin_generation();
97 
98  uint64_t generate_samples(uint32_t segment_id, const uint64_t start_sample,
99  const int64_t sample_count);
100  void generation_proc();
101 
102  signal_data* signal_from_name(const std::string& name);
103  void update_signal_sample(signal_data* sig_data, uint32_t segment_id, uint64_t sample_num);
104 
105  bool all_input_signals_enabled(QString &disabled_signals) const;
106 
107 Q_SIGNALS:
108  void expression_changed(QString expression);
109 
110 private Q_SLOTS:
111  void on_capture_state_changed(int state);
112  void on_data_received();
113 
114  void on_enabled_changed();
115 
116 private:
118 
121  bool use_custom_sample_rate_, use_custom_sample_count_;
123  map<std::string, signal_data> input_signals_;
124 
125  QString expression_;
126 
127  uint8_t error_type_;
128 
129  mutable mutex input_mutex_;
130  mutable condition_variable gen_input_cond_;
131 
132  std::thread gen_thread_;
133  atomic<bool> gen_interrupt_;
134 
138  double exprtk_current_time_, exprtk_current_sample_;
139 
141 
142  // Give sig_sample access to the private helper functions
143  friend struct fnc_sample<double>;
144 };
145 
146 } // namespace data
147 } // namespace pv
148 
149 #endif // PULSEVIEW_PV_DATA_MATHSIGNAL_HPP
exprtk::symbol_table< double > * exprtk_unknown_symbol_table_
Definition: mathsignal.hpp:135
exprtk::parser< double > * exprtk_parser_
Definition: mathsignal.hpp:137
const shared_ptr< SignalBase > sb
Definition: mathsignal.hpp:57
pv::Session & session_
Definition: mathsignal.hpp:117
uint64_t custom_sample_count_
Definition: mathsignal.hpp:120
condition_variable gen_input_cond_
Definition: mathsignal.hpp:130
T max(const T v0, const T v1)
Definition: exprtk.hpp:1411
atomic< bool > gen_interrupt_
Definition: mathsignal.hpp:133
static std::string data()
Definition: exprtk.hpp:39024
map< std::string, signal_data > input_signals_
Definition: mathsignal.hpp:123
uint64_t generation_chunk_size_
Definition: mathsignal.hpp:122
exprtk::expression< double > * exprtk_expression_
Definition: mathsignal.hpp:136
signal_data(const shared_ptr< SignalBase > _sb)
Definition: mathsignal.hpp:53
fnc_sample< double > * fnc_sample_
Definition: mathsignal.hpp:140
std::thread gen_thread_
Definition: mathsignal.hpp:132
uint64_t custom_sample_rate_
Definition: mathsignal.hpp:119
static const int64_t ChunkLength
Definition: mathsignal.hpp:69