X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=session.c;h=1cf4170e220a1904ee798cb0161a29e67fcbef90;hb=568dcacc1a43f5bfb5a103e6e9b6a5ad50ea2d08;hp=15be92c8237a2b5a0c5627d250b9fadc4598995f;hpb=1861be0baf8792e48e0bc009a20074210b2c1370;p=libsigrok.git diff --git a/session.c b/session.c index 15be92c8..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; } @@ -318,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; } } @@ -347,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."); @@ -374,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) { @@ -394,6 +433,7 @@ SR_PRIV int sr_session_stop_sync(void) sdi->driver->dev_acquisition_stop(sdi, sdi); } } + session->running = FALSE; return SR_OK; }