X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fmathsignal.hpp;h=e40dbfb3cf61125643d945b2b760846f4069efee;hb=8ff61402dc4ac33630deeb077e8a744a7daba6a4;hp=f8e15d16261ba9ecbe74efe4015ba170241d00f4;hpb=4640a84e926ac4b82e2a1b6ef9fc80ef44c2bd3c;p=pulseview.git diff --git a/pv/data/mathsignal.hpp b/pv/data/mathsignal.hpp index f8e15d16..e40dbfb3 100644 --- a/pv/data/mathsignal.hpp +++ b/pv/data/mathsignal.hpp @@ -20,6 +20,12 @@ #ifndef PULSEVIEW_PV_DATA_MATHSIGNAL_HPP #define PULSEVIEW_PV_DATA_MATHSIGNAL_HPP +#define exprtk_disable_rtl_io_file /* Potential security issue, doubt anyone would use those anyway */ +#define exprtk_disable_rtl_vecops /* Vector ops are rather useless for math channels */ +#define exprtk_disable_caseinsensitivity /* So that we can have both 't' and 'T' */ + +#include + #include #include @@ -30,6 +36,7 @@ using std::atomic; using std::condition_variable; using std::mutex; +using std::numeric_limits; using std::shared_ptr; namespace pv { @@ -39,11 +46,24 @@ namespace data { class SignalBase; +template +struct fnc_sample; + +struct signal_data { + signal_data(const shared_ptr _sb) : + sb(_sb), sample_num(numeric_limits::max()), sample_value(0), ref(nullptr) + {} + + const shared_ptr sb; + uint64_t sample_num; + double sample_value; + double* ref; +}; + class MathSignal : public SignalBase { Q_OBJECT Q_PROPERTY(QString expression READ get_expression WRITE set_expression NOTIFY expression_changed) - Q_PROPERTY(QString error_message READ error_message) private: static const int64_t ChunkLength; @@ -55,13 +75,11 @@ public: virtual void save_settings(QSettings &settings) const; virtual void restore_settings(QSettings &settings); - QString error_message() const; - QString get_expression() const; void set_expression(QString expression); private: - void set_error_message(QString msg); + void set_error(uint8_t type, QString msg); /** * Returns the number of samples that can be worked on, @@ -72,13 +90,20 @@ private: */ uint64_t get_working_sample_count(uint32_t segment_id) const; + void update_completeness(uint32_t segment_id, uint64_t output_sample_count); + void reset_generation(); - void begin_generation(); + virtual void begin_generation(); - void generate_samples(uint32_t segment_id, const uint64_t start_sample, + uint64_t generate_samples(uint32_t segment_id, const uint64_t start_sample, const int64_t sample_count); void generation_proc(); + signal_data* signal_from_name(const std::string& name); + void update_signal_sample(signal_data* sig_data, uint32_t segment_id, uint64_t sample_num); + + bool all_input_signals_enabled(QString &disabled_signals) const; + Q_SIGNALS: void samples_cleared(); @@ -93,17 +118,20 @@ private Q_SLOTS: void on_capture_state_changed(int state); void on_data_received(); + void on_enabled_changed(); + private: pv::Session &session_; uint64_t custom_sample_rate_; uint64_t custom_sample_count_; bool use_custom_sample_rate_, use_custom_sample_count_; - vector< shared_ptr> input_signals_; + uint64_t generation_chunk_size_; + map input_signals_; QString expression_; - QString error_message_; + uint8_t error_type_; mutable mutex input_mutex_; mutable condition_variable gen_input_cond_; @@ -111,10 +139,15 @@ private: std::thread gen_thread_; atomic gen_interrupt_; - exprtk::symbol_table *exprtk_symbol_table_; + exprtk::symbol_table *exprtk_unknown_symbol_table_, *exprtk_symbol_table_; exprtk::expression *exprtk_expression_; exprtk::parser *exprtk_parser_; double exprtk_current_time_, exprtk_current_sample_; + + fnc_sample* fnc_sample_; + + // Give sig_sample access to the private helper functions + friend struct fnc_sample; }; } // namespace data