/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include "util.hpp" #include "views/viewbase.hpp" using std::function; using std::list; using std::map; using std::mutex; using std::recursive_mutex; using std::shared_ptr; using std::string; using std::unordered_set; 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; } namespace devices { class Device; } namespace toolbars { class MainBar; } namespace views { class ViewBase; } 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); const list< 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_settings(QSettings &settings) const; 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(); void load_init_file(const string &file_name, const string &format); void load_file(QString file_name, 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 unordered_set< shared_ptr > signalbases() const; bool all_segments_complete(uint32_t segment_id) const; #ifdef ENABLE_DECODE shared_ptr add_decode_signal(); void remove_decode_signal(shared_ptr signal); #endif 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(); 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(const QString &title, views::ViewType type, Session *session); public Q_SLOTS: void on_data_saved(); private: DeviceManager &device_manager_; shared_ptr device_; QString default_name_, name_; list< shared_ptr > views_; shared_ptr main_view_; shared_ptr main_bar_; mutable mutex sampling_mutex_; //!< Protects access to capture_state_. capture_state capture_state_; unordered_set< shared_ptr > signalbases_; unordered_set< shared_ptr > all_signal_data_; /// 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_; }; } // namespace pv #endif // PULSEVIEW_PV_SESSION_HPP