/* * This file is part of the PulseView project. * * Copyright (C) 2012-14 Joel Holdsworth * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #ifndef PULSEVIEW_PV_SESSION_HPP #define PULSEVIEW_PV_SESSION_HPP #ifdef ENABLE_FLOW #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef ENABLE_FLOW #include #include #endif #include "metadata_obj.hpp" #include "util.hpp" #include "views/viewbase.hpp" using std::deque; using std::function; using std::map; using std::mutex; using std::recursive_mutex; using std::shared_ptr; using std::string; using std::unordered_set; #ifdef ENABLE_FLOW using Glib::RefPtr; using Gst::AppSink; using Gst::Element; using Gst::Pipeline; #endif struct srd_decoder; struct srd_channel; namespace sigrok { class Analog; class Channel; class Device; class InputFormat; class Logic; class Meta; class Option; class OutputFormat; class Packet; class Session; } // namespace sigrok using sigrok::Option; namespace pv { class DeviceManager; namespace data { class Analog; class AnalogSegment; class DecodeSignal; class Logic; class LogicSegment; class SignalBase; class SignalData; class SignalGroup; } namespace devices { class Device; } namespace toolbars { class MainBar; } namespace views { class ViewBase; } using pv::views::ViewType; class Session : public QObject { Q_OBJECT public: enum capture_state { Stopped, AwaitingTrigger, Running }; static shared_ptr sr_context; public: Session(DeviceManager &device_manager, QString name); ~Session(); DeviceManager& device_manager(); const DeviceManager& device_manager() const; shared_ptr session() const; shared_ptr device() const; QString name() const; void set_name(QString name); QString save_path() const; void set_save_path(QString path); const vector< shared_ptr > views() const; shared_ptr main_view() const; shared_ptr main_bar() const; void set_main_bar(shared_ptr main_bar); /** * Indicates whether the captured data was saved to disk already or not */ bool data_saved() const; void save_setup(QSettings &settings) const; void save_settings(QSettings &settings) const; void restore_setup(QSettings &settings); void restore_settings(QSettings &settings); /** * Attempts to set device instance, may fall back to demo if needed */ void select_device(shared_ptr device); /** * Sets device instance that will be used in the next capture session. */ void set_device(shared_ptr device); void set_default_device(); bool using_file_device() const; void load_init_file(const string &file_name, const string &format, const string &setup_file_name); void load_file(QString file_name, QString setup_file_name = QString(), shared_ptr format = nullptr, const map &options = map()); capture_state get_capture_state() const; void start_capture(function error_handler); void stop_capture(); double get_samplerate() const; uint32_t get_segment_count() const; vector get_triggers(uint32_t segment_id) const; void register_view(shared_ptr view); void deregister_view(shared_ptr view); bool has_view(shared_ptr view); const vector< shared_ptr > signalbases() const; void add_generated_signal(shared_ptr signal); void remove_generated_signal(shared_ptr signal); #ifdef ENABLE_DECODE shared_ptr add_decode_signal(); void remove_decode_signal(shared_ptr signal); #endif bool all_segments_complete(uint32_t segment_id) const; MetadataObjManager* metadata_obj_manager(); private: void set_capture_state(capture_state state); void update_signals(); shared_ptr signalbase_from_channel( shared_ptr channel) const; static map input_format_options( vector user_spec, map> fmt_opts); void sample_thread_proc(function error_handler); void free_unused_memory(); void signal_new_segment(); void signal_segment_completed(); #ifdef ENABLE_FLOW bool on_gst_bus_message(const Glib::RefPtr& bus, const Glib::RefPtr& message); Gst::FlowReturn on_gst_new_sample(); #endif void feed_in_header(); void feed_in_meta(shared_ptr meta); void feed_in_trigger(); void feed_in_frame_begin(); void feed_in_frame_end(); void feed_in_logic(shared_ptr logic); void feed_in_analog(shared_ptr analog); void data_feed_in(shared_ptr device, shared_ptr packet); Q_SIGNALS: void capture_state_changed(int state); void device_changed(); void signals_changed(); void name_changed(); void trigger_event(int segment_id, util::Timestamp location); void new_segment(int new_segment_id); void segment_completed(int segment_id); void data_received(); void add_view(ViewType type, Session *session); public Q_SLOTS: void on_data_saved(); #ifdef ENABLE_DECODE void on_new_decoders_selected(vector decoders); #endif private: bool shutting_down_; DeviceManager &device_manager_; shared_ptr device_; QString default_name_, name_, save_path_; vector< shared_ptr > views_; shared_ptr main_view_; shared_ptr main_bar_; mutable mutex sampling_mutex_; //!< Protects access to capture_state_ capture_state capture_state_; vector< shared_ptr > signalbases_; unordered_set< shared_ptr > all_signal_data_; deque signal_groups_; /// trigger_list_ contains pairs of values vector< std::pair > trigger_list_; mutable recursive_mutex data_mutex_; shared_ptr logic_data_; uint64_t cur_samplerate_; shared_ptr cur_logic_segment_; map< shared_ptr, shared_ptr > cur_analog_segments_; int32_t highest_segment_id_; std::thread sampling_thread_; bool out_of_memory_; bool data_saved_; bool frame_began_; QElapsedTimer acq_time_; MetadataObjManager metadata_obj_manager_; #ifdef ENABLE_FLOW RefPtr pipeline_; RefPtr source_; RefPtr sink_; mutable mutex pipeline_done_mutex_; mutable condition_variable pipeline_done_cond_; atomic pipeline_done_interrupt_; #endif }; } // namespace pv #endif // PULSEVIEW_PV_SESSION_HPP