22 #include "libsigrokdecode-internal.h"
52 if (!sess || sess->session_id < 1)
75 srd_err(
"Invalid session pointer.");
79 if (!(*sess = g_try_malloc(
sizeof(
struct srd_session))))
81 (*sess)->session_id = ++max_session_id;
82 (*sess)->di_list = (*sess)->callbacks = NULL;
85 sessions = g_slist_append(sessions, *sess);
87 srd_dbg(
"Created session %d.", (*sess)->session_id);
110 if (session_is_valid(sess) !=
SRD_OK) {
111 srd_err(
"Invalid session pointer.");
115 srd_dbg(
"Calling start() on all instances in session %d.", sess->session_id);
119 for (d = sess->di_list; d; d = d->next) {
121 if ((ret = srd_inst_start(di)) !=
SRD_OK)
137 if (!PyObject_HasAttrString(di->
py_inst,
"metadata"))
141 py_ret = PyObject_CallMethod(di->
py_inst,
"metadata",
"lK",
143 (
unsigned long long)g_variant_get_uint64(data));
168 if (session_is_valid(sess) !=
SRD_OK) {
169 srd_err(
"Invalid session.");
174 srd_err(
"Invalid key.");
179 srd_err(
"Invalid value.");
186 srd_err(
"Unknown config key %d.", key);
189 if (!g_variant_is_of_type(data, G_VARIANT_TYPE_UINT64)) {
190 srd_err(
"Invalid value type: expected uint64, got %s",
191 g_variant_get_type_string(data));
195 srd_dbg(
"Setting session %d samplerate to %"PRIu64
".",
196 sess->session_id, g_variant_get_uint64(data));
199 for (l = sess->di_list; l; l = l->next) {
200 if ((ret = srd_inst_send_meta(l->data, key, data)) !=
SRD_OK)
204 g_variant_unref(data);
231 uint64_t start_samplenum, uint64_t end_samplenum,
232 const uint8_t *inbuf, uint64_t inbuflen)
237 if (session_is_valid(sess) !=
SRD_OK) {
238 srd_err(
"Invalid session.");
242 srd_dbg(
"Calling decode() on all instances with starting sample "
243 "number %" PRIu64
", %" PRIu64
" bytes at 0x%p",
244 start_samplenum, inbuflen, inbuf);
246 for (d = sess->di_list; d; d = d->next) {
247 if ((ret = srd_inst_decode(d->data, start_samplenum,
248 end_samplenum, inbuf, inbuflen)) !=
SRD_OK)
271 srd_err(
"Invalid session.");
275 session_id = sess->session_id;
277 srd_inst_free_all(sess, NULL);
279 g_slist_free_full(sess->callbacks, g_free);
280 sessions = g_slist_remove(sessions, sess);
283 srd_dbg(
"Destroyed session %d.", session_id);
308 if (session_is_valid(sess) !=
SRD_OK) {
309 srd_err(
"Invalid session.");
313 srd_dbg(
"Registering new callback for output type %d.", output_type);
316 srd_err(
"Failed to g_malloc() struct srd_pd_callback.");
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) {
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.
int srd_session_metadata_set(struct srd_session *sess, int key, GVariant *data)
Set a metadata configuration key in a session.
srd_pd_output_callback cb
int srd_session_start(struct srd_session *sess)
Start a decoding session.
int srd_session_send(struct srd_session *sess, uint64_t start_samplenum, uint64_t end_samplenum, const uint8_t *inbuf, uint64_t inbuflen)
Send a chunk of logic sample data to a running decoder session.
Generic/unspecified error.
void(* srd_pd_output_callback)(struct srd_proto_data *pdata, void *cb_data)
Malloc/calloc/realloc error.
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.
struct srd_session * sess