X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=session.c;h=742619a684272115729d428679794ce7b62c672c;hp=0540942f5f53ea053391e495595505f255a9a77a;hb=7b5e6d2978b9fe7afa952b7fa9f8837c87e8ed26;hpb=f66d45806fb6f9757343db72664ab2b058c75985 diff --git a/session.c b/session.c index 0540942f..742619a6 100644 --- a/session.c +++ b/session.c @@ -292,6 +292,18 @@ SR_API int sr_session_datafeed_callback_add(sr_datafeed_callback cb, void *cb_da return SR_OK; } +SR_PRIV struct sr_trigger *sr_session_trigger_get(void) +{ + return session->trigger; +} + +SR_API int sr_session_trigger_set(struct sr_trigger *trig) +{ + session->trigger = trig; + + return SR_OK; +} + /** * Call every device in the session's callback. * @@ -347,6 +359,42 @@ static int sr_session_iteration(gboolean block) return SR_OK; } + +static int verify_trigger(struct sr_trigger *trigger) +{ + struct sr_trigger_stage *stage; + struct sr_trigger_match *match; + GSList *l, *m; + + if (!trigger->stages) { + sr_err("No trigger stages defined."); + return SR_ERR; + } + + sr_spew("Checking trigger:"); + for (l = trigger->stages; l; l = l->next) { + stage = l->data; + if (!stage->matches) { + sr_err("Stage %d has no matches defined.", stage->stage); + return SR_ERR; + } + for (m = stage->matches; m; m = m->next) { + match = m->data; + if (!match->channel) { + sr_err("Stage %d match has no channel.", stage->stage); + return SR_ERR; + } + if (!match->match) { + sr_err("Stage %d match is not defined.", stage->stage); + return SR_ERR; + } + sr_spew("Stage %d match on channel %s, match %d", stage->stage, + match->channel->name, match->match); + } + } + + return SR_OK; +} /** * Start a session. * @@ -375,6 +423,9 @@ SR_API int sr_session_start(void) return SR_ERR_BUG; } + if (session->trigger && verify_trigger(session->trigger) != SR_OK) + return SR_ERR; + sr_info("Starting."); ret = SR_OK;