26 #include "libsigrok-internal.h"
29 #define LOG_PREFIX "session: "
30 #define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args)
31 #define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args)
32 #define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args)
33 #define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args)
34 #define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args)
35 #define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args)
62 struct datafeed_callback {
81 if (!(session = g_try_malloc0(
sizeof(
struct sr_session)))) {
82 sr_err(
"Session malloc failed.");
103 sr_err(
"%s: session was NULL", __func__);
130 sr_err(
"%s: session was NULL", __func__);
134 g_slist_free(session->
devs);
135 session->
devs = NULL;
153 sr_err(
"%s: sdi was NULL", __func__);
158 sr_err(
"%s: session was NULL", __func__);
164 sr_dbg(
"%s: sdi->driver was NULL, this seems to be "
165 "a virtual device; continuing", __func__);
167 session->
devs = g_slist_append(session->
devs, (gpointer)sdi);
173 sr_err(
"%s: sdi->driver->dev_open was NULL", __func__);
177 session->
devs = g_slist_append(session->
devs, (gpointer)sdi);
190 sr_err(
"%s: session was NULL", __func__);
211 struct datafeed_callback *cb_struct;
214 sr_err(
"%s: session was NULL", __func__);
219 sr_err(
"%s: cb was NULL", __func__);
223 if (!(cb_struct = g_try_malloc0(
sizeof(
struct datafeed_callback))))
227 cb_struct->cb_data = cb_data;
235 static int sr_session_run_poll(
void)
244 if (session->
pollfds[i].revents > 0 || (ret == 0
289 sr_err(
"%s: session was NULL; a session must be "
290 "created before starting it.", __func__);
294 if (!session->
devs) {
295 sr_err(
"%s: session->devs was NULL; a session "
296 "cannot be started without devices.", __func__);
303 for (l = session->
devs; l; l = l->next) {
306 sr_err(
"%s: could not start an acquisition "
307 "(%d)", __func__, ret);
325 sr_err(
"%s: session was NULL; a session must be "
326 "created first, before running it.", __func__);
330 if (!session->
devs) {
332 sr_err(
"%s: session->devs was NULL; a session "
333 "cannot be run without devices.", __func__);
346 sr_session_run_poll();
369 sr_err(
"%s: session was NULL", __func__);
375 for (l = session->
devs; l; l = l->next) {
402 sr_err(
"%s: session was NULL", __func__);
423 switch (packet->
type) {
425 sr_dbg(
"bus: Received SR_DF_HEADER packet.");
428 sr_dbg(
"bus: Received SR_DF_TRIGGER packet.");
431 sr_dbg(
"bus: Received SR_DF_META packet.");
435 sr_dbg(
"bus: Received SR_DF_LOGIC packet (%" PRIu64
" bytes).",
440 sr_dbg(
"bus: Received SR_DF_ANALOG packet (%d samples).",
444 sr_dbg(
"bus: Received SR_DF_END packet.");
447 sr_dbg(
"bus: Received SR_DF_FRAME_BEGIN packet.");
450 sr_dbg(
"bus: Received SR_DF_FRAME_END packet.");
453 sr_dbg(
"bus: Received unknown packet type: %d.", packet->
type);
474 struct datafeed_callback *cb_struct;
477 sr_err(
"%s: sdi was NULL", __func__);
482 sr_err(
"%s: packet was NULL", __func__);
488 datafeed_dump(packet);
490 cb_struct->cb(sdi, packet, cb_struct->cb_data);
508 static int _sr_session_source_add(GPollFD *pollfd,
int timeout,
511 struct source *new_sources, *s;
512 GPollFD *new_pollfds;
515 sr_err(
"%s: cb was NULL", __func__);
521 new_pollfds = g_try_realloc(session->
pollfds,
524 sr_err(
"%s: new_pollfds malloc failed", __func__);
528 new_sources = g_try_realloc(session->
sources,
sizeof(
struct source) *
531 sr_err(
"%s: new_sources malloc failed", __func__);
537 s->timeout = timeout;
539 s->cb_data = cb_data;
540 s->poll_object = poll_object;
541 session->
pollfds = new_pollfds;
542 session->
sources = new_sources;
545 && (session->
source_timeout == -1 || timeout < session->source_timeout))
571 return _sr_session_source_add(&p, timeout, cb, cb_data, (gintptr)fd);
588 return _sr_session_source_add(pollfd, timeout, cb,
589 cb_data, (gintptr)pollfd);
610 g_io_channel_win32_make_pollfd(channel, events, &p);
612 p.fd = g_io_channel_unix_get_fd(channel);
616 return _sr_session_source_add(&p, timeout, cb, cb_data, (gintptr)channel);
630 static int _sr_session_source_remove(gintptr poll_object)
632 struct source *new_sources;
633 GPollFD *new_pollfds;
637 sr_err(
"%s: sources was NULL", __func__);
642 if (session->
sources[old].poll_object == poll_object)
656 (session->
num_sources - old) *
sizeof(
struct source));
659 new_pollfds = g_try_realloc(session->
pollfds,
sizeof(GPollFD) * session->
num_sources);
661 sr_err(
"%s: new_pollfds malloc failed", __func__);
665 new_sources = g_try_realloc(session->
sources,
sizeof(
struct source) * session->
num_sources);
667 sr_err(
"%s: new_sources malloc failed", __func__);
671 session->
pollfds = new_pollfds;
672 session->
sources = new_sources;
688 return _sr_session_source_remove((gintptr)fd);
702 return _sr_session_source_remove((gintptr)pollfd);
716 return _sr_session_source_remove((gintptr)channel);