]> sigrok.org Git - pulseview.git/blob - sigsession.cpp
Added missing delete to pulses test
[pulseview.git] / sigsession.cpp
1 /*
2  * This file is part of the sigrok project.
3  *
4  * Copyright (C) 2012 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 #include "sigsession.h"
22
23 #include "logicdata.h"
24 #include "logicdatasnapshot.h"
25 #include "logicsignal.h"
26
27 #include <QDebug>
28
29 #include <assert.h>
30
31 using namespace boost;
32 using namespace std;
33
34 // TODO: This should not be necessary
35 SigSession* SigSession::_session = NULL;
36
37 SigSession::SigSession()
38 {
39         // TODO: This should not be necessary
40         _session = this;
41 }
42
43 SigSession::~SigSession()
44 {
45         // TODO: This should not be necessary
46         _session = NULL;
47 }
48
49 void SigSession::load_file(const std::string &name)
50 {
51         if (sr_session_load(name.c_str()) == SR_OK) {
52                 /* sigrok session file */
53                 sr_session_datafeed_callback_add(data_feed_in_proc);
54                 sr_session_start();
55                 sr_session_run();
56                 sr_session_stop();
57         }
58 }
59
60 void SigSession::start_capture(struct sr_dev_inst *sdi,
61         uint64_t record_length, uint64_t sample_rate)
62 {
63         sr_session_new();
64         sr_session_datafeed_callback_add(data_feed_in_proc);
65
66         if (sr_session_dev_add(sdi) != SR_OK) {
67                 qDebug() << "Failed to use device.";
68                 sr_session_destroy();
69                 return;
70         }
71
72         if (sr_dev_config_set(sdi, SR_HWCAP_LIMIT_SAMPLES,
73                 &record_length) != SR_OK) {
74                 qDebug() << "Failed to configure time-based sample limit.";
75                 sr_session_destroy();
76                 return;
77         }
78
79         if (sr_dev_config_set(sdi, SR_HWCAP_SAMPLERATE,
80                 &sample_rate) != SR_OK) {
81                 qDebug() << "Failed to configure samplerate.";
82                 sr_session_destroy();
83                 return;
84         }
85
86         if (sr_session_start() != SR_OK) {
87                 qDebug() << "Failed to start session.";
88                 return;
89         }
90
91         sr_session_run();
92         sr_session_destroy();
93 }
94
95 vector< shared_ptr<Signal> >& SigSession::get_signals()
96 {
97         return _signals;
98 }
99
100 boost::shared_ptr<LogicData> SigSession::get_data()
101 {
102         return _logic_data;
103 }
104
105 void SigSession::data_feed_in(const struct sr_dev_inst *sdi,
106         struct sr_datafeed_packet *packet)
107 {
108         assert(sdi);
109         assert(packet);
110
111         switch (packet->type) {
112         case SR_DF_HEADER:
113                 _signals.clear();
114                 break;
115
116         case SR_DF_META_LOGIC:
117                 {
118                         assert(packet->payload);
119
120                         const sr_datafeed_meta_logic &meta_logic =
121                                 *(sr_datafeed_meta_logic*)packet->payload;
122
123                         // Create an empty LogiData for coming data snapshots
124                         _logic_data.reset(new LogicData(meta_logic));
125                         assert(_logic_data);
126                         if(!_logic_data)
127                                 break;
128
129                         // Add the signals
130                         for (int i = 0; i < meta_logic.num_probes; i++)
131                         {
132                                 const sr_probe *const probe =
133                                         (const sr_probe*)g_slist_nth_data(
134                                                 sdi->probes, i);
135                                 if(probe->enabled)
136                                 {
137                                         boost::shared_ptr<LogicSignal> signal(
138                                                 new LogicSignal(probe->name,
139                                                         _logic_data,
140                                                         probe->index));
141                                         _signals.push_back(signal);
142                                 }
143                         }
144
145                         break;
146                 }
147
148         case SR_DF_LOGIC:
149
150                 assert(packet->payload);
151                 if(!_cur_logic_snapshot)
152                 {
153                         // Create a new data snapshot
154                         _cur_logic_snapshot = shared_ptr<LogicDataSnapshot>(
155                                 new LogicDataSnapshot(
156                                 *(sr_datafeed_logic*)packet->payload));
157                         _logic_data->push_snapshot(_cur_logic_snapshot);
158                 }
159                 else
160                 {
161                         // Append to the existing data snapshot
162                         _cur_logic_snapshot->append_payload(
163                                 *(sr_datafeed_logic*)packet->payload);
164                 }
165
166                 break;
167
168         case SR_DF_END:
169                 _cur_logic_snapshot.reset();
170                 data_updated();
171                 break;
172         }
173 }
174
175 void SigSession::data_feed_in_proc(const struct sr_dev_inst *sdi,
176         struct sr_datafeed_packet *packet)
177 {
178         assert(_session);
179         _session->data_feed_in(sdi, packet);
180 }