]> sigrok.org Git - libsigrokdecode.git/blob - controller.c
lpc: Add annotation helper method.
[libsigrokdecode.git] / controller.c
1 /*
2  * This file is part of the libsigrokdecode project.
3  *
4  * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
5  * Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "libsigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
22 #include "libsigrokdecode-internal.h"
23 #include "config.h"
24 #include <glib.h>
25 #include <inttypes.h>
26 #include <stdlib.h>
27
28 /**
29  * @mainpage libsigrokdecode API
30  *
31  * @section sec_intro Introduction
32  *
33  * The <a href="http://sigrok.org">sigrok</a> project aims at creating a
34  * portable, cross-platform, Free/Libre/Open-Source signal analysis software
35  * suite that supports various device types (such as logic analyzers,
36  * oscilloscopes, multimeters, and more).
37  *
38  * <a href="http://sigrok.org/wiki/Libsigrokdecode">libsigrokdecode</a> is a
39  * shared library written in C which provides the basic API for (streaming)
40  * protocol decoding functionality.
41  *
42  * The <a href="http://sigrok.org/wiki/Protocol_decoders">protocol decoders</a>
43  * are written in Python (>= 3.0).
44  *
45  * @section sec_api API reference
46  *
47  * See the "Modules" page for an introduction to various libsigrokdecode
48  * related topics and the detailed API documentation of the respective
49  * functions.
50  *
51  * You can also browse the API documentation by file, or review all
52  * data structures.
53  *
54  * @section sec_mailinglists Mailing lists
55  *
56  * There are two mailing lists for sigrok/libsigrokdecode: <a href="https://lists.sourceforge.net/lists/listinfo/sigrok-devel">sigrok-devel</a> and <a href="https://lists.sourceforge.net/lists/listinfo/sigrok-commits">sigrok-commits</a>.
57  *
58  * @section sec_irc IRC
59  *
60  * You can find the sigrok developers in the
61  * <a href="irc://chat.freenode.net/sigrok">\#sigrok</a>
62  * IRC channel on Freenode.
63  *
64  * @section sec_website Website
65  *
66  * <a href="http://sigrok.org/wiki/Libsigrokdecode">sigrok.org/wiki/Libsigrokdecode</a>
67  */
68
69 /**
70  * @file
71  *
72  * Initializing and shutting down libsigrokdecode.
73  */
74
75 /**
76  * @defgroup grp_init Initialization
77  *
78  * Initializing and shutting down libsigrokdecode.
79  *
80  * Before using any of the libsigrokdecode functionality, srd_init() must
81  * be called to initialize the library.
82  *
83  * When libsigrokdecode functionality is no longer needed, srd_exit() should
84  * be called.
85  *
86  * @{
87  */
88
89 /* List of decoder instances. */
90 static GSList *di_list = NULL;
91
92 /* List of frontend callbacks to receive decoder output. */
93 static GSList *callbacks = NULL;
94
95 /** @cond PRIVATE */
96
97 /* decoder.c */
98 extern SRD_PRIV GSList *pd_list;
99
100 /* module_sigrokdecode.c */
101 /* FIXME: SRD_PRIV causes issues on MinGW. Investigate. */
102 extern PyMODINIT_FUNC PyInit_sigrokdecode(void);
103
104 /* type_logic.c */
105 extern SRD_PRIV PyTypeObject srd_logic_type;
106
107 /** @endcond */
108
109 /**
110  * Initialize libsigrokdecode.
111  *
112  * This initializes the Python interpreter, and creates and initializes
113  * a "sigrokdecode" Python module.
114  *
115  * Then, it searches for sigrok protocol decoders in the "decoders"
116  * subdirectory of the the libsigrokdecode installation directory.
117  * All decoders that are found are loaded into memory and added to an
118  * internal list of decoders, which can be queried via srd_decoder_list().
119  *
120  * The caller is responsible for calling the clean-up function srd_exit(),
121  * which will properly shut down libsigrokdecode and free its allocated memory.
122  *
123  * Multiple calls to srd_init(), without calling srd_exit() in between,
124  * are not allowed.
125  *
126  * @param path Path to an extra directory containing protocol decoders
127  *             which will be added to the Python sys.path. May be NULL.
128  *
129  * @return SRD_OK upon success, a (negative) error code otherwise.
130  *         Upon Python errors, SRD_ERR_PYTHON is returned. If the decoders
131  *         directory cannot be accessed, SRD_ERR_DECODERS_DIR is returned.
132  *         If not enough memory could be allocated, SRD_ERR_MALLOC is returned.
133  *
134  * @since 0.1.0
135  */
136 SRD_API int srd_init(const char *path)
137 {
138         int ret;
139         char *env_path;
140
141         srd_dbg("Initializing libsigrokdecode.");
142
143         /* Add our own module to the list of built-in modules. */
144         PyImport_AppendInittab("sigrokdecode", PyInit_sigrokdecode);
145
146         /* Initialize the Python interpreter. */
147         Py_Initialize();
148
149         /* Installed decoders. */
150         if ((ret = srd_decoder_searchpath_add(DECODERS_DIR)) != SRD_OK) {
151                 Py_Finalize();
152                 return ret;
153         }
154
155         /* Path specified by the user. */
156         if (path) {
157                 if ((ret = srd_decoder_searchpath_add(path)) != SRD_OK) {
158                         Py_Finalize();
159                         return ret;
160                 }
161         }
162
163         /* Environment variable overrides everything, for debugging. */
164         if ((env_path = getenv("SIGROKDECODE_DIR"))) {
165                 if ((ret = srd_decoder_searchpath_add(env_path)) != SRD_OK) {
166                         Py_Finalize();
167                         return ret;
168                 }
169         }
170
171         return SRD_OK;
172 }
173
174 /**
175  * Shutdown libsigrokdecode.
176  *
177  * This frees all the memory allocated for protocol decoders and shuts down
178  * the Python interpreter.
179  *
180  * This function should only be called if there was a (successful!) invocation
181  * of srd_init() before. Calling this function multiple times in a row, without
182  * any successful srd_init() calls in between, is not allowed.
183  *
184  * @return SRD_OK upon success, a (negative) error code otherwise.
185  *
186  * @since 0.1.0
187  */
188 SRD_API int srd_exit(void)
189 {
190         srd_dbg("Exiting libsigrokdecode.");
191
192         srd_decoder_unload_all();
193         g_slist_free(pd_list);
194         pd_list = NULL;
195
196         /* Py_Finalize() returns void, any finalization errors are ignored. */
197         Py_Finalize();
198
199         return SRD_OK;
200 }
201
202 /**
203  * Add an additional search directory for the protocol decoders.
204  *
205  * The specified directory is prepended (not appended!) to Python's sys.path,
206  * in order to search for sigrok protocol decoders in the specified
207  * directories first, and in the generic Python module directories (and in
208  * the current working directory) last. This avoids conflicts if there are
209  * Python modules which have the same name as a sigrok protocol decoder in
210  * sys.path or in the current working directory.
211  *
212  * @param path Path to the directory containing protocol decoders which shall
213  *             be added to the Python sys.path, or NULL.
214  *
215  * @return SRD_OK upon success, a (negative) error code otherwise.
216  *
217  * @private
218  *
219  * @since 0.1.0
220  */
221 SRD_PRIV int srd_decoder_searchpath_add(const char *path)
222 {
223         PyObject *py_cur_path, *py_item;
224         GString *new_path;
225         int wc_len, i;
226         wchar_t *wc_new_path;
227         char *item;
228
229         srd_dbg("Adding '%s' to module path.", path);
230
231         new_path = g_string_sized_new(256);
232         g_string_assign(new_path, path);
233         py_cur_path = PySys_GetObject("path");
234         for (i = 0; i < PyList_Size(py_cur_path); i++) {
235                 g_string_append(new_path, G_SEARCHPATH_SEPARATOR_S);
236                 py_item = PyList_GetItem(py_cur_path, i);
237                 if (!PyUnicode_Check(py_item))
238                         /* Shouldn't happen. */
239                         continue;
240                 if (py_str_as_str(py_item, &item) != SRD_OK)
241                         continue;
242                 g_string_append(new_path, item);
243                 g_free(item);
244         }
245
246         /* Convert to wide chars. */
247         wc_len = sizeof(wchar_t) * (new_path->len + 1);
248         if (!(wc_new_path = g_try_malloc(wc_len))) {
249                 srd_dbg("malloc failed");
250                 return SRD_ERR_MALLOC;
251         }
252         mbstowcs(wc_new_path, new_path->str, wc_len);
253         PySys_SetPath(wc_new_path);
254         g_string_free(new_path, TRUE);
255         g_free(wc_new_path);
256
257 //#ifdef _WIN32
258 //      gchar **splitted;
259 //
260 //      /*
261 //       * On Windows/MinGW, Python's sys.path needs entries of the form
262 //       * 'C:\\foo\\bar' instead of '/foo/bar'.
263 //       */
264 //
265 //      splitted = g_strsplit(DECODERS_DIR, "/", 0);
266 //      path = g_build_pathv("\\\\", splitted);
267 //      g_strfreev(splitted);
268 //#else
269 //      path = g_strdup(DECODERS_DIR);
270 //#endif
271
272         return SRD_OK;
273 }
274
275 /** @} */
276
277 /**
278  * @defgroup grp_instances Decoder instances
279  *
280  * Decoder instance handling.
281  *
282  * @{
283  */
284
285 /**
286  * Set one or more options in a decoder instance.
287  *
288  * Handled options are removed from the hash.
289  *
290  * @param di Decoder instance.
291  * @param options A GHashTable of options to set.
292  *
293  * @return SRD_OK upon success, a (negative) error code otherwise.
294  *
295  * @since 0.1.0
296  */
297 SRD_API int srd_inst_option_set(struct srd_decoder_inst *di,
298                 GHashTable *options)
299 {
300         PyObject *py_dec_options, *py_dec_optkeys, *py_di_options, *py_optval;
301         PyObject *py_optlist, *py_classval;
302         Py_UNICODE *py_ustr;
303         GVariant *value;
304         unsigned long long int val_ull;
305         gint64 val_int;
306         int num_optkeys, ret, size, i;
307         const char *val_str;
308         char *dbg, *key;
309
310         if (!PyObject_HasAttrString(di->decoder->py_dec, "options")) {
311                 /* Decoder has no options. */
312                 if (g_hash_table_size(options) == 0) {
313                         /* No options provided. */
314                         return SRD_OK;
315                 } else {
316                         srd_err("Protocol decoder has no options.");
317                         return SRD_ERR_ARG;
318                 }
319                 return SRD_OK;
320         }
321
322         ret = SRD_ERR_PYTHON;
323         key = NULL;
324         py_dec_options = py_dec_optkeys = py_di_options = py_optval = NULL;
325         py_optlist = py_classval = NULL;
326         py_dec_options = PyObject_GetAttrString(di->decoder->py_dec, "options");
327
328         /* All of these are synthesized objects, so they're good. */
329         py_dec_optkeys = PyDict_Keys(py_dec_options);
330         num_optkeys = PyList_Size(py_dec_optkeys);
331         if (!(py_di_options = PyObject_GetAttrString(di->py_inst, "options")))
332                 goto err_out;
333         for (i = 0; i < num_optkeys; i++) {
334                 /* Get the default class value for this option. */
335                 py_str_as_str(PyList_GetItem(py_dec_optkeys, i), &key);
336                 if (!(py_optlist = PyDict_GetItemString(py_dec_options, key)))
337                         goto err_out;
338                 if (!(py_classval = PyList_GetItem(py_optlist, 1)))
339                         goto err_out;
340                 if (!PyUnicode_Check(py_classval) && !PyLong_Check(py_classval)) {
341                         srd_err("Options of type %s are not yet supported.",
342                                 Py_TYPE(py_classval)->tp_name);
343                         goto err_out;
344                 }
345
346                 if ((value = g_hash_table_lookup(options, key))) {
347                         dbg = g_variant_print(value, TRUE);
348                         srd_dbg("got option '%s' = %s", key, dbg);
349                         g_free(dbg);
350                         /* An override for this option was provided. */
351                         if (PyUnicode_Check(py_classval)) {
352                                 if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
353                                         srd_err("Option '%s' requires a string value.", key);
354                                         goto err_out;
355                                 }
356                                 val_str = g_variant_get_string(value, NULL);
357                                 if (!(py_optval = PyUnicode_FromString(val_str))) {
358                                         /* Some UTF-8 encoding error. */
359                                         PyErr_Clear();
360                                         srd_err("Option '%s' requires a UTF-8 string value.", key);
361                                         goto err_out;
362                                 }
363                         } else if (PyLong_Check(py_classval)) {
364                                 if (!g_variant_is_of_type(value, G_VARIANT_TYPE_INT64)) {
365                                         srd_err("Option '%s' requires an integer value.", key);
366                                         goto err_out;
367                                 }
368                                 val_int = g_variant_get_int64(value);
369                                 if (!(py_optval = PyLong_FromLong(val_int))) {
370                                         /* ValueError Exception */
371                                         PyErr_Clear();
372                                         srd_err("Option '%s' has invalid integer value.", key);
373                                         goto err_out;
374                                 }
375                         }
376                         g_hash_table_remove(options, key);
377                 } else {
378                         /* Use the class default for this option. */
379                         if (PyUnicode_Check(py_classval)) {
380                                 /* Make a brand new copy of the string. */
381                                 py_ustr = PyUnicode_AS_UNICODE(py_classval);
382                                 size = PyUnicode_GET_SIZE(py_classval);
383                                 py_optval = PyUnicode_FromUnicode(py_ustr, size);
384                         } else if (PyLong_Check(py_classval)) {
385                                 /* Make a brand new copy of the integer. */
386                                 val_ull = PyLong_AsUnsignedLongLong(py_classval);
387                                 if (val_ull == (unsigned long long)-1) {
388                                         /* OverFlowError exception */
389                                         PyErr_Clear();
390                                         srd_err("Invalid integer value for %s: "
391                                                 "expected integer.", key);
392                                         goto err_out;
393                                 }
394                                 if (!(py_optval = PyLong_FromUnsignedLongLong(val_ull)))
395                                         goto err_out;
396                         }
397                 }
398
399                 /*
400                  * If we got here, py_optval holds a known good new reference
401                  * to the instance option to set.
402                  */
403                 if (PyDict_SetItemString(py_di_options, key, py_optval) == -1)
404                         goto err_out;
405                 g_free(key);
406                 key = NULL;
407         }
408
409         ret = SRD_OK;
410
411 err_out:
412         Py_XDECREF(py_optlist);
413         Py_XDECREF(py_di_options);
414         Py_XDECREF(py_dec_optkeys);
415         Py_XDECREF(py_dec_options);
416         g_free(key);
417         if (PyErr_Occurred())
418                 srd_exception_catch("Stray exception in srd_inst_option_set().");
419
420         return ret;
421 }
422
423 /* Helper GComparefunc for g_slist_find_custom() in srd_inst_probe_set_all() */
424 static gint compare_probe_id(const struct srd_probe *a, const char *probe_id)
425 {
426         return strcmp(a->id, probe_id);
427 }
428
429 /**
430  * Set all probes in a decoder instance.
431  *
432  * This function sets _all_ probes for the specified decoder instance, i.e.,
433  * it overwrites any probes that were already defined (if any).
434  *
435  * @param di Decoder instance.
436  * @param new_probes A GHashTable of probes to set. Key is probe name, value is
437  *                   the probe number. Samples passed to this instance will be
438  *                   arranged in this order.
439  *
440  * @return SRD_OK upon success, a (negative) error code otherwise.
441  *
442  * @since 0.1.0
443  */
444 SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di,
445                 GHashTable *new_probes)
446 {
447         GVariant *probe_val;
448         GList *l;
449         GSList *sl;
450         struct srd_probe *p;
451         int *new_probemap, new_probenum;
452         char *probe_id;
453         int i, num_required_probes;
454
455         srd_dbg("set probes called for instance %s with list of %d probes",
456                 di->inst_id, g_hash_table_size(new_probes));
457
458         if (g_hash_table_size(new_probes) == 0)
459                 /* No probes provided. */
460                 return SRD_OK;
461
462         if (di->dec_num_probes == 0) {
463                 /* Decoder has no probes. */
464                 srd_err("Protocol decoder %s has no probes to define.",
465                         di->decoder->name);
466                 return SRD_ERR_ARG;
467         }
468
469         new_probemap = NULL;
470
471         if (!(new_probemap = g_try_malloc(sizeof(int) * di->dec_num_probes))) {
472                 srd_err("Failed to g_malloc() new probe map.");
473                 return SRD_ERR_MALLOC;
474         }
475
476         /*
477          * For now, map all indexes to probe -1 (can be overridden later).
478          * This -1 is interpreted as an unspecified probe later.
479          */
480         for (i = 0; i < di->dec_num_probes; i++)
481                 new_probemap[i] = -1;
482
483         for (l = g_hash_table_get_keys(new_probes); l; l = l->next) {
484                 probe_id = l->data;
485                 probe_val= g_hash_table_lookup(new_probes, probe_id);
486                 if (!g_variant_is_of_type(probe_val, G_VARIANT_TYPE_INT32)) {
487                         /* Probe name was specified without a value. */
488                         srd_err("No probe number was specified for %s.",
489                                         probe_id);
490                         g_free(new_probemap);
491                         return SRD_ERR_ARG;
492                 }
493                 new_probenum = g_variant_get_int32(probe_val);
494                 if (!(sl = g_slist_find_custom(di->decoder->probes, probe_id,
495                                 (GCompareFunc)compare_probe_id))) {
496                         /* Fall back on optional probes. */
497                         if (!(sl = g_slist_find_custom(di->decoder->opt_probes,
498                              probe_id, (GCompareFunc) compare_probe_id))) {
499                                 srd_err("Protocol decoder %s has no probe "
500                                                 "'%s'.", di->decoder->name, probe_id);
501                                 g_free(new_probemap);
502                                 return SRD_ERR_ARG;
503                         }
504                 }
505                 p = sl->data;
506                 new_probemap[p->order] = new_probenum;
507                 srd_dbg("Setting probe mapping: %s (index %d) = probe %d.",
508                         p->id, p->order, new_probenum);
509         }
510
511         srd_dbg("Final probe map:");
512         num_required_probes = g_slist_length(di->decoder->probes);
513         for (i = 0; i < di->dec_num_probes; i++) {
514                 srd_dbg(" - index %d = probe %d (%s)", i, new_probemap[i],
515                         (i < num_required_probes) ? "required" : "optional");
516         }
517
518         g_free(di->dec_probemap);
519         di->dec_probemap = new_probemap;
520
521         return SRD_OK;
522 }
523
524 /**
525  * Create a new protocol decoder instance.
526  *
527  * @param decoder_id Decoder 'id' field.
528  * @param options GHashtable of options which override the defaults set in
529  *                the decoder class. May be NULL.
530  *
531  * @return Pointer to a newly allocated struct srd_decoder_inst, or
532  *         NULL in case of failure.
533  *
534  * @since 0.1.0
535  */
536 SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id,
537                 GHashTable *options)
538 {
539         int i;
540         struct srd_decoder *dec;
541         struct srd_decoder_inst *di;
542         char *inst_id;
543
544         srd_dbg("Creating new %s instance.", decoder_id);
545
546         if (!(dec = srd_decoder_get_by_id(decoder_id))) {
547                 srd_err("Protocol decoder %s not found.", decoder_id);
548                 return NULL;
549         }
550
551         if (!(di = g_try_malloc0(sizeof(struct srd_decoder_inst)))) {
552                 srd_err("Failed to g_malloc() instance.");
553                 return NULL;
554         }
555
556         di->decoder = dec;
557         if (options) {
558                 inst_id = g_hash_table_lookup(options, "id");
559                 di->inst_id = g_strdup(inst_id ? inst_id : decoder_id);
560                 g_hash_table_remove(options, "id");
561         } else
562                 di->inst_id = g_strdup(decoder_id);
563
564         /*
565          * Prepare a default probe map, where samples come in the
566          * order in which the decoder class defined them.
567          */
568         di->dec_num_probes = g_slist_length(di->decoder->probes) +
569                              g_slist_length(di->decoder->opt_probes);
570         if (di->dec_num_probes) {
571                 if (!(di->dec_probemap =
572                      g_try_malloc(sizeof(int) * di->dec_num_probes))) {
573                         srd_err("Failed to g_malloc() probe map.");
574                         g_free(di);
575                         return NULL;
576                 }
577                 for (i = 0; i < di->dec_num_probes; i++)
578                         di->dec_probemap[i] = i;
579         }
580
581         /* Create a new instance of this decoder class. */
582         if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) {
583                 if (PyErr_Occurred())
584                         srd_exception_catch("failed to create %s instance: ",
585                                             decoder_id);
586                 g_free(di->dec_probemap);
587                 g_free(di);
588                 return NULL;
589         }
590
591         if (options && srd_inst_option_set(di, options) != SRD_OK) {
592                 g_free(di->dec_probemap);
593                 g_free(di);
594                 return NULL;
595         }
596
597         /* Instance takes input from a frontend by default. */
598         di_list = g_slist_append(di_list, di);
599
600         return di;
601 }
602
603 /**
604  * Stack a decoder instance on top of another.
605  *
606  * @param di_from The instance to move.
607  * @param di_to The instance on top of which di_from will be stacked.
608  *
609  * @return SRD_OK upon success, a (negative) error code otherwise.
610  *
611  * @since 0.1.0
612  */
613 SRD_API int srd_inst_stack(struct srd_decoder_inst *di_from,
614                 struct srd_decoder_inst *di_to)
615 {
616         if (!di_from || !di_to) {
617                 srd_err("Invalid from/to instance pair.");
618                 return SRD_ERR_ARG;
619         }
620
621         if (g_slist_find(di_list, di_to)) {
622                 /* Remove from the unstacked list. */
623                 di_list = g_slist_remove(di_list, di_to);
624         }
625
626         /* Stack on top of source di. */
627         di_from->next_di = g_slist_append(di_from->next_di, di_to);
628
629         return SRD_OK;
630 }
631
632 /**
633  * Find a decoder instance by its instance ID.
634  *
635  * Only the bottom level of instances are searched -- instances already stacked
636  * on top of another one will not be found.
637  *
638  * @param inst_id The instance ID to be found.
639  *
640  * @return Pointer to struct srd_decoder_inst, or NULL if not found.
641  *
642  * @since 0.1.0
643  */
644 SRD_API struct srd_decoder_inst *srd_inst_find_by_id(const char *inst_id)
645 {
646         GSList *l;
647         struct srd_decoder_inst *tmp, *di;
648
649         di = NULL;
650         for (l = di_list; l; l = l->next) {
651                 tmp = l->data;
652                 if (!strcmp(tmp->inst_id, inst_id)) {
653                         di = tmp;
654                         break;
655                 }
656         }
657
658         return di;
659 }
660
661 /**
662  * Find a decoder instance by its Python object.
663  *
664  * I.e. find that instance's instantiation of the sigrokdecode.Decoder class.
665  * This will recurse to find the instance anywhere in the stack tree.
666  *
667  * @param stack Pointer to a GSList of struct srd_decoder_inst, indicating the
668  *              stack to search. To start searching at the bottom level of
669  *              decoder instances, pass NULL.
670  * @param obj The Python class instantiation.
671  *
672  * @return Pointer to struct srd_decoder_inst, or NULL if not found.
673  *
674  * @private
675  *
676  * @since 0.1.0
677  */
678 SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj(const GSList *stack,
679                 const PyObject *obj)
680 {
681         const GSList *l;
682         struct srd_decoder_inst *tmp, *di;
683
684         di = NULL;
685         for (l = stack ? stack : di_list; di == NULL && l != NULL; l = l->next) {
686                 tmp = l->data;
687                 if (tmp->py_inst == obj)
688                         di = tmp;
689                 else if (tmp->next_di)
690                         di = srd_inst_find_by_obj(tmp->next_di, obj);
691         }
692
693         return di;
694 }
695
696 /** @private */
697 SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, PyObject *args)
698 {
699         PyObject *py_name, *py_res;
700         GSList *l;
701         struct srd_decoder_inst *next_di;
702
703         srd_dbg("Calling start() method on protocol decoder instance %s.",
704                 di->inst_id);
705
706         if (!(py_name = PyUnicode_FromString("start"))) {
707                 srd_err("Unable to build Python object for 'start'.");
708                 srd_exception_catch("Protocol decoder instance %s: ",
709                                     di->inst_id);
710                 return SRD_ERR_PYTHON;
711         }
712
713         if (!(py_res = PyObject_CallMethodObjArgs(di->py_inst,
714                                                   py_name, args, NULL))) {
715                 srd_exception_catch("Protocol decoder instance %s: ",
716                                     di->inst_id);
717                 return SRD_ERR_PYTHON;
718         }
719
720         Py_DecRef(py_res);
721         Py_DecRef(py_name);
722
723         /*
724          * Start all the PDs stacked on top of this one. Pass along the
725          * metadata all the way from the bottom PD, even though it's only
726          * applicable to logic data for now.
727          */
728         for (l = di->next_di; l; l = l->next) {
729                 next_di = l->data;
730                 srd_inst_start(next_di, args);
731         }
732
733         return SRD_OK;
734 }
735
736 /**
737  * Run the specified decoder function.
738  *
739  * @param start_samplenum The starting sample number for the buffer's sample
740  *                        set, relative to the start of capture.
741  * @param di The decoder instance to call. Must not be NULL.
742  * @param inbuf The buffer to decode. Must not be NULL.
743  * @param inbuflen Length of the buffer. Must be > 0.
744  *
745  * @return SRD_OK upon success, a (negative) error code otherwise.
746  *
747  * @private
748  *
749  * @since 0.1.0
750  */
751 SRD_PRIV int srd_inst_decode(uint64_t start_samplenum,
752                 const struct srd_decoder_inst *di, const uint8_t *inbuf,
753                 uint64_t inbuflen)
754 {
755         PyObject *py_res;
756         srd_logic *logic;
757         uint64_t end_samplenum;
758
759         srd_dbg("Calling decode() on instance %s with %d bytes starting "
760                 "at sample %d.", di->inst_id, inbuflen, start_samplenum);
761
762         /* Return an error upon unusable input. */
763         if (!di) {
764                 srd_dbg("empty decoder instance");
765                 return SRD_ERR_ARG;
766         }
767         if (!inbuf) {
768                 srd_dbg("NULL buffer pointer");
769                 return SRD_ERR_ARG;
770         }
771         if (inbuflen == 0) {
772                 srd_dbg("empty buffer");
773                 return SRD_ERR_ARG;
774         }
775
776         /*
777          * Create new srd_logic object. Each iteration around the PD's loop
778          * will fill one sample into this object.
779          */
780         logic = PyObject_New(srd_logic, &srd_logic_type);
781         Py_INCREF(logic);
782         logic->di = (struct srd_decoder_inst *)di;
783         logic->start_samplenum = start_samplenum;
784         logic->itercnt = 0;
785         logic->inbuf = (uint8_t *)inbuf;
786         logic->inbuflen = inbuflen;
787         logic->sample = PyList_New(2);
788         Py_INCREF(logic->sample);
789
790         Py_IncRef(di->py_inst);
791         end_samplenum = start_samplenum + inbuflen / di->data_unitsize;
792         if (!(py_res = PyObject_CallMethod(di->py_inst, "decode",
793                                            "KKO", logic->start_samplenum,
794                                            end_samplenum, logic))) {
795                 srd_exception_catch("Protocol decoder instance %s: ",
796                                     di->inst_id);
797                 return SRD_ERR_PYTHON;
798         }
799         Py_DecRef(py_res);
800
801         return SRD_OK;
802 }
803
804 /** @private */
805 SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di)
806 {
807         GSList *l;
808         struct srd_pd_output *pdo;
809
810         srd_dbg("Freeing instance %s", di->inst_id);
811
812         Py_DecRef(di->py_inst);
813         g_free(di->inst_id);
814         g_free(di->dec_probemap);
815         g_slist_free(di->next_di);
816         for (l = di->pd_output; l; l = l->next) {
817                 pdo = l->data;
818                 g_free(pdo->proto_id);
819                 g_free(pdo);
820         }
821         g_slist_free(di->pd_output);
822         g_free(di);
823 }
824
825 /** @private */
826 SRD_PRIV void srd_inst_free_all(GSList *stack)
827 {
828         GSList *l;
829         struct srd_decoder_inst *di;
830
831         di = NULL;
832         for (l = stack ? stack : di_list; di == NULL && l != NULL; l = l->next) {
833                 di = l->data;
834                 if (di->next_di)
835                         srd_inst_free_all(di->next_di);
836                 srd_inst_free(di);
837         }
838         if (!stack) {
839                 g_slist_free(di_list);
840                 di_list = NULL;
841         }
842 }
843
844 /** @} */
845
846 /**
847  * @defgroup grp_session Session handling
848  *
849  * Starting and handling decoding sessions.
850  *
851  * @{
852  */
853
854 /**
855  * Start a decoding session.
856  *
857  * Decoders, instances and stack must have been prepared beforehand.
858  *
859  * @param num_probes The number of probes which the incoming feed will contain.
860  * @param unitsize The number of bytes per sample in the incoming feed.
861  * @param samplerate The samplerate of the incoming feed.
862  *
863  * @return SRD_OK upon success, a (negative) error code otherwise.
864  *
865  * @since 0.1.0
866  */
867 SRD_API int srd_session_start(int num_probes, int unitsize, uint64_t samplerate)
868 {
869         PyObject *args;
870         GSList *d;
871         struct srd_decoder_inst *di;
872         int ret;
873
874         ret = SRD_OK;
875
876         srd_dbg("Calling start() on all instances with %d probes, "
877                 "unitsize %d samplerate %d.", num_probes, unitsize, samplerate);
878
879         /*
880          * Currently only one item of metadata is passed along to decoders,
881          * samplerate. This can be extended as needed.
882          */
883         if (!(args = Py_BuildValue("{s:l}", "samplerate", (long)samplerate))) {
884                 srd_err("Unable to build Python object for metadata.");
885                 return SRD_ERR_PYTHON;
886         }
887
888         /* Run the start() method on all decoders receiving frontend data. */
889         for (d = di_list; d; d = d->next) {
890                 di = d->data;
891                 di->data_num_probes = num_probes;
892                 di->data_unitsize = unitsize;
893                 di->data_samplerate = samplerate;
894                 if ((ret = srd_inst_start(di, args)) != SRD_OK)
895                         break;
896         }
897
898         Py_DecRef(args);
899
900         return ret;
901 }
902
903 /**
904  * Send a chunk of logic sample data to a running decoder session.
905  *
906  * @param start_samplenum The sample number of the first sample in this chunk.
907  * @param inbuf Pointer to sample data.
908  * @param inbuflen Length in bytes of the buffer.
909  *
910  * @return SRD_OK upon success, a (negative) error code otherwise.
911  *
912  * @since 0.1.0
913  */
914 SRD_API int srd_session_send(uint64_t start_samplenum, const uint8_t *inbuf,
915                 uint64_t inbuflen)
916 {
917         GSList *d;
918         int ret;
919
920         srd_dbg("Calling decode() on all instances with starting sample "
921                 "number %" PRIu64 ", %" PRIu64 " bytes at 0x%p",
922                 start_samplenum, inbuflen, inbuf);
923
924         for (d = di_list; d; d = d->next) {
925                 if ((ret = srd_inst_decode(start_samplenum, d->data, inbuf,
926                                            inbuflen)) != SRD_OK)
927                         return ret;
928         }
929
930         return SRD_OK;
931 }
932
933 /**
934  * Register/add a decoder output callback function.
935  *
936  * The function will be called when a protocol decoder sends output back
937  * to the PD controller (except for Python objects, which only go up the
938  * stack).
939  *
940  * @param output_type The output type this callback will receive. Only one
941  *                    callback per output type can be registered.
942  * @param cb The function to call. Must not be NULL.
943  * @param cb_data Private data for the callback function. Can be NULL.
944  *
945  * @since 0.1.0
946  */
947 SRD_API int srd_pd_output_callback_add(int output_type,
948                 srd_pd_output_callback_t cb, void *cb_data)
949 {
950         struct srd_pd_callback *pd_cb;
951
952         srd_dbg("Registering new callback for output type %d.", output_type);
953
954         if (!(pd_cb = g_try_malloc(sizeof(struct srd_pd_callback)))) {
955                 srd_err("Failed to g_malloc() struct srd_pd_callback.");
956                 return SRD_ERR_MALLOC;
957         }
958
959         pd_cb->output_type = output_type;
960         pd_cb->cb = cb;
961         pd_cb->cb_data = cb_data;
962         callbacks = g_slist_append(callbacks, pd_cb);
963
964         return SRD_OK;
965 }
966
967 /** @private */
968 SRD_PRIV struct srd_pd_callback *srd_pd_output_callback_find(int output_type)
969 {
970         GSList *l;
971         struct srd_pd_callback *tmp, *pd_cb;
972
973         pd_cb = NULL;
974         for (l = callbacks; l; l = l->next) {
975                 tmp = l->data;
976                 if (tmp->output_type == output_type) {
977                         pd_cb = tmp;
978                         break;
979                 }
980         }
981
982         return pd_cb;
983 }
984
985 /* This is the backend function to Python sigrokdecode.add() call. */
986 /** @private */
987 SRD_PRIV int srd_inst_pd_output_add(struct srd_decoder_inst *di,
988                                     int output_type, const char *proto_id)
989 {
990         struct srd_pd_output *pdo;
991
992         srd_dbg("Instance %s creating new output type %d for %s.",
993                 di->inst_id, output_type, proto_id);
994
995         if (!(pdo = g_try_malloc(sizeof(struct srd_pd_output)))) {
996                 srd_err("Failed to g_malloc() struct srd_pd_output.");
997                 return -1;
998         }
999
1000         /* pdo_id is just a simple index, nothing is deleted from this list anyway. */
1001         pdo->pdo_id = g_slist_length(di->pd_output);
1002         pdo->output_type = output_type;
1003         pdo->di = di;
1004         pdo->proto_id = g_strdup(proto_id);
1005         di->pd_output = g_slist_append(di->pd_output, pdo);
1006
1007         return pdo->pdo_id;
1008 }
1009
1010 /** @} */