2 * This file is part of the PulseView project.
4 * Copyright (C) 2020 Soeren Apel <soeren@apelpie.net>
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.
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.
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/>.
20 #ifndef PULSEVIEW_PV_DATA_MATHSIGNAL_HPP
21 #define PULSEVIEW_PV_DATA_MATHSIGNAL_HPP
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' */
31 #include <pv/exprtk.hpp>
32 #include <pv/util.hpp>
33 #include <pv/data/analog.hpp>
34 #include <pv/data/signalbase.hpp>
37 using std::condition_variable
;
39 using std::numeric_limits
;
40 using std::shared_ptr
;
53 signal_data(const shared_ptr
<SignalBase
> _sb
) :
54 sb(_sb
), sample_num(numeric_limits
<uint64_t>::max()), sample_value(0), ref(nullptr)
57 const shared_ptr
<SignalBase
> sb
;
63 class MathSignal
: public SignalBase
66 Q_PROPERTY(QString expression READ get_expression WRITE set_expression NOTIFY expression_changed
)
69 static const int64_t ChunkLength
;
72 MathSignal(pv::Session
&session
);
73 virtual ~MathSignal();
75 virtual void save_settings(QSettings
&settings
) const;
76 virtual void restore_settings(QSettings
&settings
);
78 QString
get_expression() const;
79 void set_expression(QString expression
);
82 void set_error(uint8_t type
, QString msg
);
85 * Returns the number of samples that can be worked on,
86 * i.e. the number of samples where samples are available
87 * for all connected channels.
88 * If the math signal uses no input channels, this is the
89 * number of samples in the session.
91 uint64_t get_working_sample_count(uint32_t segment_id
) const;
93 void update_completeness(uint32_t segment_id
, uint64_t output_sample_count
);
95 void reset_generation();
96 virtual void begin_generation();
98 uint64_t generate_samples(uint32_t segment_id
, const uint64_t start_sample
,
99 const int64_t sample_count
);
100 void generation_proc();
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
);
105 bool all_input_signals_enabled(QString
&disabled_signals
) const;
108 void expression_changed(QString expression
);
111 void on_capture_state_changed(int state
);
112 void on_data_received();
114 void on_enabled_changed();
117 pv::Session
&session_
;
119 uint64_t custom_sample_rate_
;
120 uint64_t custom_sample_count_
;
121 bool use_custom_sample_rate_
, use_custom_sample_count_
;
122 uint64_t generation_chunk_size_
;
123 map
<std::string
, signal_data
> input_signals_
;
129 mutable mutex input_mutex_
;
130 mutable condition_variable gen_input_cond_
;
132 std::thread gen_thread_
;
133 atomic
<bool> gen_interrupt_
;
135 exprtk::symbol_table
<double> *exprtk_unknown_symbol_table_
, *exprtk_symbol_table_
;
136 exprtk::expression
<double> *exprtk_expression_
;
137 exprtk::parser
<double> *exprtk_parser_
;
138 double exprtk_current_time_
, exprtk_current_sample_
;
140 fnc_sample
<double>* fnc_sample_
;
142 // Give sig_sample access to the private helper functions
143 friend struct fnc_sample
<double>;
149 #endif // PULSEVIEW_PV_DATA_MATHSIGNAL_HPP