22 #include "libsigrokdecode-internal.h"
52 if (!sess || sess->session_id < 1)
75 srd_err(
"Invalid session pointer.");
79 *sess = g_malloc(
sizeof(
struct srd_session));
80 (*sess)->session_id = ++max_session_id;
81 (*sess)->di_list = (*sess)->callbacks = NULL;
84 sessions = g_slist_append(sessions, *sess);
86 srd_dbg(
"Created session %d.", (*sess)->session_id);
109 if (session_is_valid(sess) !=
SRD_OK) {
110 srd_err(
"Invalid session pointer.");
114 srd_dbg(
"Calling start() on all instances in session %d.", sess->session_id);
118 for (d = sess->di_list; d; d = d->next) {
120 if ((ret = srd_inst_start(di)) !=
SRD_OK)
136 if (!PyObject_HasAttrString(di->
py_inst,
"metadata"))
140 py_ret = PyObject_CallMethod(di->
py_inst,
"metadata",
"lK",
142 (
unsigned long long)g_variant_get_uint64(data));
167 if (session_is_valid(sess) !=
SRD_OK) {
168 srd_err(
"Invalid session.");
173 srd_err(
"Invalid key.");
178 srd_err(
"Invalid value.");
185 srd_err(
"Unknown config key %d.", key);
188 if (!g_variant_is_of_type(data, G_VARIANT_TYPE_UINT64)) {
189 srd_err(
"Invalid value type: expected uint64, got %s",
190 g_variant_get_type_string(data));
194 srd_dbg(
"Setting session %d samplerate to %"PRIu64
".",
195 sess->session_id, g_variant_get_uint64(data));
198 for (l = sess->di_list; l; l = l->next) {
199 if ((ret = srd_inst_send_meta(l->data, key, data)) !=
SRD_OK)
203 g_variant_unref(data);
231 uint64_t start_samplenum, uint64_t end_samplenum,
232 const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize)
237 if (session_is_valid(sess) !=
SRD_OK) {
238 srd_err(
"Invalid session.");
242 for (d = sess->di_list; d; d = d->next) {
243 if ((ret = srd_inst_decode(d->data, start_samplenum,
244 end_samplenum, inbuf, inbuflen, unitsize)) !=
SRD_OK)
267 srd_err(
"Invalid session.");
271 session_id = sess->session_id;
273 srd_inst_free_all(sess, NULL);
275 g_slist_free_full(sess->callbacks, g_free);
276 sessions = g_slist_remove(sessions, sess);
279 srd_dbg(
"Destroyed session %d.", session_id);
304 if (session_is_valid(sess) !=
SRD_OK) {
305 srd_err(
"Invalid session.");
309 srd_dbg(
"Registering new callback for output type %d.", output_type);
315 sess->callbacks = g_slist_append(sess->callbacks, pd_cb);
327 if (session_is_valid(sess) !=
SRD_OK) {
328 srd_err(
"Invalid session.");
333 for (l = sess->callbacks; l; l = l->next) {
int srd_session_send(struct srd_session *sess, uint64_t start_samplenum, uint64_t end_samplenum, const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize)
Send a chunk of logic sample data to a running decoder session.
int srd_session_destroy(struct srd_session *sess)
Destroy a decoding session.
int srd_session_new(struct srd_session **sess)
Create a decoding session.
The public libsigrokdecode header file to be used by frontends.
srd_pd_output_callback cb
int srd_pd_output_callback_add(struct srd_session *sess, int output_type, srd_pd_output_callback cb, void *cb_data)
Register/add a decoder output callback function.
void(* srd_pd_output_callback)(struct srd_proto_data *pdata, void *cb_data)
int srd_session_metadata_set(struct srd_session *sess, int key, GVariant *data)
Set a metadata configuration key in a session.
int srd_session_start(struct srd_session *sess)
Start a decoding session.
Generic/unspecified error.
struct srd_session * sess