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)
139 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));
147 for (l = di->
next_di; l; l = l->next) {
149 if ((ret = srd_inst_send_meta(next_di, key, data)) !=
SRD_OK)
175 if (session_is_valid(sess) !=
SRD_OK) {
176 srd_err(
"Invalid session.");
181 srd_err(
"Invalid key.");
186 srd_err(
"Invalid value.");
193 srd_err(
"Unknown config key %d.", key);
196 if (!g_variant_is_of_type(data, G_VARIANT_TYPE_UINT64)) {
197 srd_err(
"Invalid value type: expected uint64, got %s",
198 g_variant_get_type_string(data));
202 srd_dbg(
"Setting session %d samplerate to %"PRIu64
".",
203 sess->session_id, g_variant_get_uint64(data));
206 for (l = sess->di_list; l; l = l->next) {
207 if ((ret = srd_inst_send_meta(l->data, key, data)) !=
SRD_OK)
211 g_variant_unref(data);
239 uint64_t start_samplenum, uint64_t end_samplenum,
240 const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize)
245 if (session_is_valid(sess) !=
SRD_OK) {
246 srd_err(
"Invalid session.");
250 for (d = sess->di_list; d; d = d->next) {
251 if ((ret = srd_inst_decode(d->data, start_samplenum,
252 end_samplenum, inbuf, inbuflen, unitsize)) !=
SRD_OK)
275 srd_err(
"Invalid session.");
279 session_id = sess->session_id;
281 srd_inst_free_all(sess, NULL);
283 g_slist_free_full(sess->callbacks, g_free);
284 sessions = g_slist_remove(sessions, sess);
287 srd_dbg(
"Destroyed session %d.", session_id);
312 if (session_is_valid(sess) !=
SRD_OK) {
313 srd_err(
"Invalid session.");
317 srd_dbg(
"Registering new callback for output type %d.", output_type);
323 sess->callbacks = g_slist_append(sess->callbacks, pd_cb);
335 if (session_is_valid(sess) !=
SRD_OK) {
336 srd_err(
"Invalid session.");
341 for (l = sess->callbacks; l; l = l->next) {
struct srd_session * sess
srd_pd_output_callback cb
int srd_session_start(struct srd_session *sess)
Start a decoding session.
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.
Generic/unspecified error.
int srd_session_destroy(struct srd_session *sess)
Destroy a decoding session.
int srd_session_new(struct srd_session **sess)
Create a decoding session.
int srd_session_metadata_set(struct srd_session *sess, int key, GVariant *data)
Set a metadata configuration key in a session.
The public libsigrokdecode header file to be used by frontends.
void(* srd_pd_output_callback)(struct srd_proto_data *pdata, void *cb_data)
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.