X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=session.c;h=1cf4170e220a1904ee798cb0161a29e67fcbef90;hb=568dcacc1a43f5bfb5a103e6e9b6a5ad50ea2d08;hp=720b5ae10819908b63018e1c8095cbfceed5bc49;hpb=b483be7456fbc2e29efa50a49f6e8d60a8107527;p=libsigrok.git diff --git a/session.c b/session.c index 720b5ae1..1cf4170e 100644 --- a/session.c +++ b/session.c @@ -84,6 +84,7 @@ SR_API struct sr_session *sr_session_new(void) } session->source_timeout = -1; + session->running = FALSE; session->abort_session = FALSE; g_mutex_init(&session->stop_mutex); @@ -148,6 +149,7 @@ SR_API int sr_session_dev_remove_all(void) */ SR_API int sr_session_dev_add(const struct sr_dev_inst *sdi) { + int ret; if (!sdi) { sr_err("%s: sdi was NULL", __func__); @@ -176,6 +178,40 @@ SR_API int sr_session_dev_add(const struct sr_dev_inst *sdi) session->devs = g_slist_append(session->devs, (gpointer)sdi); + if (session->running) { + /* Adding a device to a running session. Start acquisition + * on that device now. */ + if ((ret = sdi->driver->dev_acquisition_start(sdi, + (void *)sdi)) != SR_OK) + sr_err("Failed to start acquisition of device in " + "running session: %d", ret); + } + + return SR_OK; +} + +/** + * List all device instances attached to the current session. + * + * @param devlist A pointer where the device instance list will be + * stored on return. If no devices are in the session, + * this will be NULL. Each element in the list points + * to a struct sr_dev_inst *. + * The list must be freed by the caller, but not the + * elements pointed to. + * + * @return SR_OK upon success, SR_ERR upon invalid arguments. + */ +SR_API int sr_session_dev_list(GSList **devlist) +{ + + *devlist = NULL; + + if (!session) + return SR_ERR; + + *devlist = g_slist_copy(session->devs); + return SR_OK; } @@ -239,9 +275,16 @@ SR_API int sr_session_datafeed_callback_add(sr_datafeed_callback_t cb, void *cb_ * but driven by another scheduler, this can be used to poll the devices * from within that scheduler. * + * @param block If TRUE, this call will wait for any of the session's + * sources to fire an event on the file descriptors, or + * any of their timeouts to activate. In other words, this + * can be used as a select loop. + * If FALSE, all sources have their callback run, regardless + * of file descriptor or timeout status. + * * @return SR_OK upon success, SR_ERR on errors. */ -SR_API int sr_session_iteration(gboolean block) +static int sr_session_iteration(gboolean block) { unsigned int i; int ret; @@ -311,7 +354,7 @@ SR_API int sr_session_start(void) sdi = l->data; if ((ret = sdi->driver->dev_acquisition_start(sdi, sdi)) != SR_OK) { sr_err("%s: could not start an acquisition " - "(%d)", __func__, ret); + "(%s)", __func__, sr_strerror(ret)); break; } } @@ -340,6 +383,7 @@ SR_API int sr_session_run(void) "cannot be run without devices.", __func__); return SR_ERR_BUG; } + session->running = TRUE; sr_info("Running."); @@ -367,6 +411,8 @@ SR_API int sr_session_run(void) * resources that the session thread will try to use. * * @return SR_OK upon success, SR_ERR_BUG if no session exists. + * + * @private */ SR_PRIV int sr_session_stop_sync(void) { @@ -387,6 +433,7 @@ SR_PRIV int sr_session_stop_sync(void) sdi->driver->dev_acquisition_stop(sdi, sdi); } } + session->running = FALSE; return SR_OK; }