]> sigrok.org Git - pulseview.git/blob - pv/session.hpp
d6cfdd302c97815daec25bcf19b62e12008c96e2
[pulseview.git] / pv / session.hpp
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2012-14 Joel Holdsworth <joel@airwebreathe.org.uk>
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, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #ifndef PULSEVIEW_PV_SESSION_HPP
22 #define PULSEVIEW_PV_SESSION_HPP
23
24 #include <map>
25 #include <memory>
26 #include <mutex>
27 #include <set>
28 #include <string>
29 #include <thread>
30 #include <unordered_set>
31 #include <vector>
32
33 #ifdef _WIN32
34 // Windows: Avoid boost/thread namespace pollution (which includes windows.h).
35 #define NOGDI
36 #define NORESOURCE
37 #endif
38 #include <boost/thread/shared_mutex.hpp>
39
40 #include <QObject>
41 #include <QString>
42
43 #include "util.hpp"
44
45 struct srd_decoder;
46 struct srd_channel;
47
48 namespace sigrok {
49 class Analog;
50 class Channel;
51 class Device;
52 class Logic;
53 class Meta;
54 class Packet;
55 class Session;
56 }
57
58 namespace pv {
59
60 class DeviceManager;
61
62 namespace data {
63 class Analog;
64 class AnalogSegment;
65 class Logic;
66 class LogicSegment;
67 class SignalBase;
68 class SignalData;
69 }
70
71 namespace devices {
72 class Device;
73 }
74
75 namespace toolbars {
76 class MainBar;
77 }
78
79 namespace view {
80 class View;
81 }
82
83 class Session : public QObject
84 {
85         Q_OBJECT
86
87 public:
88         enum capture_state {
89                 Stopped,
90                 AwaitingTrigger,
91                 Running
92         };
93
94 public:
95         Session(DeviceManager &device_manager);
96
97         ~Session();
98
99         DeviceManager& device_manager();
100
101         const DeviceManager& device_manager() const;
102
103         std::shared_ptr<sigrok::Session> session() const;
104
105         std::shared_ptr<devices::Device> device() const;
106
107         std::shared_ptr<pv::view::View> main_view() const;
108
109         void set_main_bar(std::shared_ptr<pv::toolbars::MainBar> main_bar);
110
111         std::shared_ptr<pv::toolbars::MainBar> main_bar() const;
112
113         /**
114          * Sets device instance that will be used in the next capture session.
115          */
116         void set_device(std::shared_ptr<devices::Device> device);
117
118         void set_default_device();
119
120         capture_state get_capture_state() const;
121
122         void start_capture(std::function<void (const QString)> error_handler);
123
124         void stop_capture();
125
126         double get_samplerate() const;
127
128         void register_view(std::shared_ptr<pv::view::View> view);
129
130         void deregister_view(std::shared_ptr<pv::view::View> view);
131
132         const std::unordered_set< std::shared_ptr<data::SignalBase> >
133                 signalbases() const;
134
135 #ifdef ENABLE_DECODE
136         bool add_decoder(srd_decoder *const dec);
137
138         void remove_decode_signal(std::shared_ptr<data::SignalBase> signalbase);
139 #endif
140
141 private:
142         void set_capture_state(capture_state state);
143
144         void update_signals();
145
146         std::shared_ptr<data::SignalBase> signalbase_from_channel(
147                 std::shared_ptr<sigrok::Channel> channel) const;
148
149 private:
150         void sample_thread_proc(std::function<void (const QString)> error_handler);
151
152         void feed_in_header();
153
154         void feed_in_meta(std::shared_ptr<sigrok::Meta> meta);
155
156         void feed_in_trigger();
157
158         void feed_in_frame_begin();
159
160         void feed_in_logic(std::shared_ptr<sigrok::Logic> logic);
161
162         void feed_in_analog(std::shared_ptr<sigrok::Analog> analog);
163
164         void data_feed_in(std::shared_ptr<sigrok::Device> device,
165                 std::shared_ptr<sigrok::Packet> packet);
166
167 private:
168         DeviceManager &device_manager_;
169         std::shared_ptr<devices::Device> device_;
170
171         std::unordered_set< std::shared_ptr<pv::view::View> > views_;
172         std::shared_ptr<pv::view::View> main_view_;
173
174         std::shared_ptr<pv::toolbars::MainBar> main_bar_;
175
176         mutable std::mutex sampling_mutex_; //!< Protects access to capture_state_.
177         capture_state capture_state_;
178
179
180         std::unordered_set< std::shared_ptr<data::SignalBase> > signalbases_;
181         std::unordered_set< std::shared_ptr<data::SignalData> > all_signal_data_;
182
183         mutable std::recursive_mutex data_mutex_;
184         std::shared_ptr<data::Logic> logic_data_;
185         uint64_t cur_samplerate_;
186         std::shared_ptr<data::LogicSegment> cur_logic_segment_;
187         std::map< std::shared_ptr<sigrok::Channel>, std::shared_ptr<data::AnalogSegment> >
188                 cur_analog_segments_;
189
190         std::thread sampling_thread_;
191
192         bool out_of_memory_;
193
194 Q_SIGNALS:
195         void capture_state_changed(int state);
196         void device_selected();
197
198         void signals_changed();
199
200         void trigger_event(util::Timestamp location);
201
202         void frame_began();
203
204         void data_received();
205
206         void frame_ended();
207 };
208
209 } // namespace pv
210
211 #endif // PULSEVIEW_PV_SESSION_HPP