]> sigrok.org Git - libsigrokdecode.git/blob - instance.c
spi: Tell stacked decoders about missing CS# signal.
[libsigrokdecode.git] / instance.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-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
22 #include "libsigrokdecode.h"
23 #include "config.h"
24 #include <glib.h>
25 #include <inttypes.h>
26 #include <stdlib.h>
27 #include <stdint.h>
28
29 /** @cond PRIVATE */
30
31 extern SRD_PRIV GSList *sessions;
32
33 /* type_logic.c */
34 extern SRD_PRIV PyTypeObject srd_logic_type;
35
36 /** @endcond */
37
38 /**
39  * @file
40  *
41  * Decoder instance handling.
42  */
43
44 /**
45  * @defgroup grp_instances Decoder instances
46  *
47  * Decoder instance handling.
48  *
49  * @{
50  */
51
52 /**
53  * Set one or more options in a decoder instance.
54  *
55  * Handled options are removed from the hash.
56  *
57  * @param di Decoder instance.
58  * @param options A GHashTable of options to set.
59  *
60  * @return SRD_OK upon success, a (negative) error code otherwise.
61  *
62  * @since 0.1.0
63  */
64 SRD_API int srd_inst_option_set(struct srd_decoder_inst *di,
65                 GHashTable *options)
66 {
67         struct srd_decoder_option *sdo;
68         PyObject *py_di_options, *py_optval;
69         GVariant *value;
70         GSList *l;
71         double val_double;
72         gint64 val_int;
73         int ret;
74         const char *val_str;
75
76         if (!di) {
77                 srd_err("Invalid decoder instance.");
78                 return SRD_ERR_ARG;
79         }
80
81         if (!options) {
82                 srd_err("Invalid options GHashTable.");
83                 return SRD_ERR_ARG;
84         }
85
86         if (!PyObject_HasAttrString(di->decoder->py_dec, "options")) {
87                 /* Decoder has no options. */
88                 if (g_hash_table_size(options) == 0) {
89                         /* No options provided. */
90                         return SRD_OK;
91                 } else {
92                         srd_err("Protocol decoder has no options.");
93                         return SRD_ERR_ARG;
94                 }
95                 return SRD_OK;
96         }
97
98         ret = SRD_ERR_PYTHON;
99         py_optval = NULL;
100
101         /*
102          * The 'options' tuple is a class variable, but we need to
103          * change it. Changing it directly will affect the entire class,
104          * so we need to create a new object for it, and populate that
105          * instead.
106          */
107         if (!(py_di_options = PyObject_GetAttrString(di->py_inst, "options")))
108                 goto err_out;
109         Py_DECREF(py_di_options);
110         py_di_options = PyDict_New();
111         PyObject_SetAttrString(di->py_inst, "options", py_di_options);
112
113         for (l = di->decoder->options; l; l = l->next) {
114                 sdo = l->data;
115                 if ((value = g_hash_table_lookup(options, sdo->id))) {
116                         /* A value was supplied for this option. */
117                         if (!g_variant_type_equal(g_variant_get_type(value),
118                                   g_variant_get_type(sdo->def))) {
119                                 srd_err("Option '%s' should have the same type "
120                                         "as the default value.", sdo->id);
121                                 goto err_out;
122                         }
123                 } else {
124                         /* Use default for this option. */
125                         value = sdo->def;
126                 }
127                 if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
128                         val_str = g_variant_get_string(value, NULL);
129                         if (!(py_optval = PyUnicode_FromString(val_str))) {
130                                 /* Some UTF-8 encoding error. */
131                                 PyErr_Clear();
132                                 srd_err("Option '%s' requires a UTF-8 string value.", sdo->id);
133                                 goto err_out;
134                         }
135                 } else if (g_variant_is_of_type(value, G_VARIANT_TYPE_INT64)) {
136                         val_int = g_variant_get_int64(value);
137                         if (!(py_optval = PyLong_FromLong(val_int))) {
138                                 /* ValueError Exception */
139                                 PyErr_Clear();
140                                 srd_err("Option '%s' has invalid integer value.", sdo->id);
141                                 goto err_out;
142                         }
143                 } else if (g_variant_is_of_type(value, G_VARIANT_TYPE_DOUBLE)) {
144                         val_double = g_variant_get_double(value);
145                         if (!(py_optval = PyFloat_FromDouble(val_double))) {
146                                 /* ValueError Exception */
147                                 PyErr_Clear();
148                                 srd_err("Option '%s' has invalid float value.",
149                                         sdo->id);
150                                 goto err_out;
151                         }
152                 }
153                 if (PyDict_SetItemString(py_di_options, sdo->id, py_optval) == -1)
154                         goto err_out;
155                 /* Not harmful even if we used the default. */
156                 g_hash_table_remove(options, sdo->id);
157         }
158         if (g_hash_table_size(options) != 0)
159                 srd_warn("Unknown options specified for '%s'", di->inst_id);
160
161         ret = SRD_OK;
162
163 err_out:
164         Py_XDECREF(py_optval);
165         if (PyErr_Occurred()) {
166                 srd_exception_catch("Stray exception in srd_inst_option_set().");
167                 ret = SRD_ERR_PYTHON;
168         }
169
170         return ret;
171 }
172
173 /* Helper GComparefunc for g_slist_find_custom() in srd_inst_channel_set_all() */
174 static gint compare_channel_id(const struct srd_channel *pdch,
175                         const char *channel_id)
176 {
177         return strcmp(pdch->id, channel_id);
178 }
179
180 /**
181  * Set all channels in a decoder instance.
182  *
183  * This function sets _all_ channels for the specified decoder instance, i.e.,
184  * it overwrites any channels that were already defined (if any).
185  *
186  * @param di Decoder instance.
187  * @param new_channels A GHashTable of channels to set. Key is channel name,
188  *                     value is the channel number. Samples passed to this
189  *                     instance will be arranged in this order.
190  * @param unit_size Number of bytes per sample in the data stream to be passed
191  *                  to the decoder. The highest channel index specified in the
192  *                  channel map must lie within a sample unit.
193  *
194  * @return SRD_OK upon success, a (negative) error code otherwise.
195  *
196  * @since 0.3.0
197  */
198 SRD_API int srd_inst_channel_set_all(struct srd_decoder_inst *di,
199                 GHashTable *new_channels, int unit_size)
200 {
201         GVariant *channel_val;
202         GList *l;
203         GSList *sl;
204         struct srd_channel *pdch;
205         int *new_channelmap, new_channelnum, num_required_channels, i;
206         char *channel_id;
207
208         srd_dbg("Setting channels for instance %s with list of %d channels, "
209                 "unitsize %d.", di->inst_id, g_hash_table_size(new_channels),
210                 unit_size);
211
212         if (g_hash_table_size(new_channels) == 0)
213                 /* No channels provided. */
214                 return SRD_OK;
215
216         if (di->dec_num_channels == 0) {
217                 /* Decoder has no channels. */
218                 srd_err("Protocol decoder %s has no channels to define.",
219                         di->decoder->name);
220                 return SRD_ERR_ARG;
221         }
222
223         new_channelmap = NULL;
224
225         if (!(new_channelmap = g_try_malloc(sizeof(int) * di->dec_num_channels))) {
226                 srd_err("Failed to g_malloc() new channel map.");
227                 return SRD_ERR_MALLOC;
228         }
229
230         /*
231          * For now, map all indexes to channel -1 (can be overridden later).
232          * This -1 is interpreted as an unspecified channel later.
233          */
234         for (i = 0; i < di->dec_num_channels; i++)
235                 new_channelmap[i] = -1;
236
237         for (l = g_hash_table_get_keys(new_channels); l; l = l->next) {
238                 channel_id = l->data;
239                 channel_val = g_hash_table_lookup(new_channels, channel_id);
240                 if (!g_variant_is_of_type(channel_val, G_VARIANT_TYPE_INT32)) {
241                         /* Channel name was specified without a value. */
242                         srd_err("No channel number was specified for %s.",
243                                         channel_id);
244                         g_free(new_channelmap);
245                         return SRD_ERR_ARG;
246                 }
247                 new_channelnum = g_variant_get_int32(channel_val);
248                 if (new_channelnum >= 8 * unit_size) {
249                         srd_err("Channel index %d not within data unit (%d bit).",
250                                 new_channelnum, 8 * unit_size);
251                         g_free(new_channelmap);
252                         return SRD_ERR_ARG;
253                 }
254                 if (!(sl = g_slist_find_custom(di->decoder->channels, channel_id,
255                                 (GCompareFunc)compare_channel_id))) {
256                         /* Fall back on optional channels. */
257                         if (!(sl = g_slist_find_custom(di->decoder->opt_channels,
258                              channel_id, (GCompareFunc)compare_channel_id))) {
259                                 srd_err("Protocol decoder %s has no channel "
260                                         "'%s'.", di->decoder->name, channel_id);
261                                 g_free(new_channelmap);
262                                 return SRD_ERR_ARG;
263                         }
264                 }
265                 pdch = sl->data;
266                 new_channelmap[pdch->order] = new_channelnum;
267                 srd_dbg("Setting channel mapping: %s (index %d) = channel %d.",
268                         pdch->id, pdch->order, new_channelnum);
269         }
270         di->data_unitsize = unit_size;
271
272         srd_dbg("Final channel map:");
273         num_required_channels = g_slist_length(di->decoder->channels);
274         for (i = 0; i < di->dec_num_channels; i++) {
275                 srd_dbg(" - index %d = channel %d (%s)", i, new_channelmap[i],
276                         (i < num_required_channels) ? "required" : "optional");
277         }
278
279         /* Report an error if not all required channels were specified. */
280         for (i = 0; i < num_required_channels; i++) {
281                 if (new_channelmap[i] != -1)
282                         continue;
283                 pdch = g_slist_nth(di->decoder->channels, i)->data;
284                 srd_err("Required channel '%s' (index %d) was not specified.",
285                         pdch->id, i);
286                 return SRD_ERR;
287         }
288
289         g_free(di->dec_channelmap);
290         di->dec_channelmap = new_channelmap;
291
292         return SRD_OK;
293 }
294
295 /**
296  * Create a new protocol decoder instance.
297  *
298  * @param sess The session holding the protocol decoder instance.
299  * @param decoder_id Decoder 'id' field.
300  * @param options GHashtable of options which override the defaults set in
301  *                the decoder class. May be NULL.
302  *
303  * @return Pointer to a newly allocated struct srd_decoder_inst, or
304  *         NULL in case of failure.
305  *
306  * @since 0.3.0
307  */
308 SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess,
309                 const char *decoder_id, GHashTable *options)
310 {
311         int i;
312         struct srd_decoder *dec;
313         struct srd_decoder_inst *di;
314         char *inst_id;
315
316         srd_dbg("Creating new %s instance.", decoder_id);
317
318         if (session_is_valid(sess) != SRD_OK) {
319                 srd_err("Invalid session.");
320                 return NULL;
321         }
322
323         if (!(dec = srd_decoder_get_by_id(decoder_id))) {
324                 srd_err("Protocol decoder %s not found.", decoder_id);
325                 return NULL;
326         }
327
328         if (!(di = g_try_malloc0(sizeof(struct srd_decoder_inst)))) {
329                 srd_err("Failed to g_malloc() instance.");
330                 return NULL;
331         }
332
333         di->decoder = dec;
334         di->sess = sess;
335         if (options) {
336                 inst_id = g_hash_table_lookup(options, "id");
337                 di->inst_id = g_strdup(inst_id ? inst_id : decoder_id);
338                 g_hash_table_remove(options, "id");
339         } else
340                 di->inst_id = g_strdup(decoder_id);
341
342         /*
343          * Prepare a default channel map, where samples come in the
344          * order in which the decoder class defined them.
345          */
346         di->dec_num_channels = g_slist_length(di->decoder->channels) +
347                         g_slist_length(di->decoder->opt_channels);
348         if (di->dec_num_channels) {
349                 if (!(di->dec_channelmap =
350                                 g_try_malloc(sizeof(int) * di->dec_num_channels))) {
351                         srd_err("Failed to g_malloc() channel map.");
352                         g_free(di);
353                         return NULL;
354                 }
355                 for (i = 0; i < di->dec_num_channels; i++)
356                         di->dec_channelmap[i] = i;
357                 di->data_unitsize = (di->dec_num_channels + 7) / 8;
358                 /*
359                  * Will be used to prepare a sample at every iteration
360                  * of the instance's decode() method.
361                  */
362                 if (!(di->channel_samples = g_try_malloc(di->dec_num_channels))) {
363                         srd_err("Failed to g_malloc() sample buffer.");
364                         g_free(di->dec_channelmap);
365                         g_free(di);
366                         return NULL;
367                 }
368         }
369
370         /* Create a new instance of this decoder class. */
371         if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) {
372                 if (PyErr_Occurred())
373                         srd_exception_catch("failed to create %s instance: ",
374                                         decoder_id);
375                 g_free(di->dec_channelmap);
376                 g_free(di);
377                 return NULL;
378         }
379
380         if (options && srd_inst_option_set(di, options) != SRD_OK) {
381                 g_free(di->dec_channelmap);
382                 g_free(di);
383                 return NULL;
384         }
385
386         /* Instance takes input from a frontend by default. */
387         sess->di_list = g_slist_append(sess->di_list, di);
388
389         return di;
390 }
391
392 /**
393  * Stack a decoder instance on top of another.
394  *
395  * @param sess The session holding the protocol decoder instances.
396  * @param di_bottom The instance on top of which di_top will be stacked.
397  * @param di_top The instance to go on top.
398  *
399  * @return SRD_OK upon success, a (negative) error code otherwise.
400  *
401  * @since 0.3.0
402  */
403 SRD_API int srd_inst_stack(struct srd_session *sess,
404                 struct srd_decoder_inst *di_bottom,
405                 struct srd_decoder_inst *di_top)
406 {
407
408         if (session_is_valid(sess) != SRD_OK) {
409                 srd_err("Invalid session.");
410                 return SRD_ERR_ARG;
411         }
412
413         if (!di_bottom || !di_top) {
414                 srd_err("Invalid from/to instance pair.");
415                 return SRD_ERR_ARG;
416         }
417
418         if (g_slist_find(sess->di_list, di_top)) {
419                 /* Remove from the unstacked list. */
420                 sess->di_list = g_slist_remove(sess->di_list, di_top);
421         }
422
423         /* Stack on top of source di. */
424         di_bottom->next_di = g_slist_append(di_bottom->next_di, di_top);
425
426         srd_dbg("Stacked %s onto %s.", di_top->inst_id, di_bottom->inst_id);
427
428         return SRD_OK;
429 }
430
431 /**
432  * Find a decoder instance by its instance ID.
433  *
434  * Only the bottom level of instances are searched -- instances already stacked
435  * on top of another one will not be found.
436  *
437  * @param sess The session holding the protocol decoder instance.
438  * @param inst_id The instance ID to be found.
439  *
440  * @return Pointer to struct srd_decoder_inst, or NULL if not found.
441  *
442  * @since 0.3.0
443  */
444 SRD_API struct srd_decoder_inst *srd_inst_find_by_id(struct srd_session *sess,
445                 const char *inst_id)
446 {
447         GSList *l;
448         struct srd_decoder_inst *tmp, *di;
449
450         if (session_is_valid(sess) != SRD_OK) {
451                 srd_err("Invalid session.");
452                 return NULL;
453         }
454
455         di = NULL;
456         for (l = sess->di_list; l; l = l->next) {
457                 tmp = l->data;
458                 if (!strcmp(tmp->inst_id, inst_id)) {
459                         di = tmp;
460                         break;
461                 }
462         }
463
464         return di;
465 }
466
467 static struct srd_decoder_inst *srd_sess_inst_find_by_obj(
468                 struct srd_session *sess, const GSList *stack,
469                 const PyObject *obj)
470 {
471         const GSList *l;
472         struct srd_decoder_inst *tmp, *di;
473
474         if (session_is_valid(sess) != SRD_OK) {
475                 srd_err("Invalid session.");
476                 return NULL;
477         }
478
479         di = NULL;
480         for (l = stack ? stack : sess->di_list; di == NULL && l != NULL; l = l->next) {
481                 tmp = l->data;
482                 if (tmp->py_inst == obj)
483                         di = tmp;
484                 else if (tmp->next_di)
485                         di = srd_sess_inst_find_by_obj(sess, tmp->next_di, obj);
486         }
487
488         return di;
489 }
490
491 /**
492  * Find a decoder instance by its Python object.
493  *
494  * I.e. find that instance's instantiation of the sigrokdecode.Decoder class.
495  * This will recurse to find the instance anywhere in the stack tree of all
496  * sessions.
497  *
498  * @param stack Pointer to a GSList of struct srd_decoder_inst, indicating the
499  *              stack to search. To start searching at the bottom level of
500  *              decoder instances, pass NULL.
501  * @param obj The Python class instantiation.
502  *
503  * @return Pointer to struct srd_decoder_inst, or NULL if not found.
504  *
505  * @private
506  *
507  * @since 0.1.0
508  */
509 SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj(const GSList *stack,
510                 const PyObject *obj)
511 {
512         struct srd_decoder_inst *di;
513         struct srd_session *sess;
514         GSList *l;
515
516         di = NULL;
517         for (l = sessions; di == NULL && l != NULL; l = l->next) {
518                 sess = l->data;
519                 di = srd_sess_inst_find_by_obj(sess, stack, obj);
520         }
521
522         return di;
523 }
524
525 /** @private */
526 SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di)
527 {
528         PyObject *py_res;
529         GSList *l;
530         struct srd_decoder_inst *next_di;
531         int ret;
532
533         srd_dbg("Calling start() method on protocol decoder instance %s.",
534                         di->inst_id);
535
536         if (!(py_res = PyObject_CallMethod(di->py_inst, "start", NULL))) {
537                 srd_exception_catch("Protocol decoder instance %s: ",
538                                 di->inst_id);
539                 return SRD_ERR_PYTHON;
540         }
541         Py_DecRef(py_res);
542
543         /* Start all the PDs stacked on top of this one. */
544         for (l = di->next_di; l; l = l->next) {
545                 next_di = l->data;
546                 if ((ret = srd_inst_start(next_di)) != SRD_OK)
547                         return ret;
548         }
549
550         return SRD_OK;
551 }
552
553 /**
554  * Run the specified decoder function.
555  *
556  * @param di The decoder instance to call. Must not be NULL.
557  * @param start_samplenum The starting sample number for the buffer's sample
558  *                        set, relative to the start of capture.
559  * @param end_samplenum The ending sample number for the buffer's sample
560  *                        set, relative to the start of capture.
561  * @param inbuf The buffer to decode. Must not be NULL.
562  * @param inbuflen Length of the buffer. Must be > 0.
563  *
564  * @return SRD_OK upon success, a (negative) error code otherwise.
565  *
566  * @private
567  *
568  * @since 0.1.0
569  */
570 SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di,
571                 uint64_t start_samplenum, uint64_t end_samplenum,
572                 const uint8_t *inbuf, uint64_t inbuflen)
573 {
574         PyObject *py_res;
575         srd_logic *logic;
576
577         srd_dbg("Calling decode() on instance %s with %" PRIu64 " bytes "
578                 "starting at sample %" PRIu64 ".", di->inst_id, inbuflen,
579                 start_samplenum);
580
581         /* Return an error upon unusable input. */
582         if (!di) {
583                 srd_dbg("empty decoder instance");
584                 return SRD_ERR_ARG;
585         }
586         if (!inbuf) {
587                 srd_dbg("NULL buffer pointer");
588                 return SRD_ERR_ARG;
589         }
590         if (inbuflen == 0) {
591                 srd_dbg("empty buffer");
592                 return SRD_ERR_ARG;
593         }
594
595         /*
596          * Create new srd_logic object. Each iteration around the PD's loop
597          * will fill one sample into this object.
598          */
599         logic = PyObject_New(srd_logic, &srd_logic_type);
600         Py_INCREF(logic);
601         logic->di = (struct srd_decoder_inst *)di;
602         logic->start_samplenum = start_samplenum;
603         logic->itercnt = 0;
604         logic->inbuf = (uint8_t *)inbuf;
605         logic->inbuflen = inbuflen;
606         logic->sample = PyList_New(2);
607         Py_INCREF(logic->sample);
608
609         Py_IncRef(di->py_inst);
610         if (!(py_res = PyObject_CallMethod(di->py_inst, "decode",
611                         "KKO", start_samplenum, end_samplenum, logic))) {
612                 srd_exception_catch("Protocol decoder instance %s: ",
613                                 di->inst_id);
614                 return SRD_ERR_PYTHON;
615         }
616         Py_DecRef(py_res);
617
618         return SRD_OK;
619 }
620
621 /** @private */
622 SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di)
623 {
624         GSList *l;
625         struct srd_pd_output *pdo;
626
627         srd_dbg("Freeing instance %s", di->inst_id);
628
629         Py_DecRef(di->py_inst);
630         g_free(di->inst_id);
631         g_free(di->dec_channelmap);
632         g_slist_free(di->next_di);
633         for (l = di->pd_output; l; l = l->next) {
634                 pdo = l->data;
635                 g_free(pdo->proto_id);
636                 g_free(pdo);
637         }
638         g_slist_free(di->pd_output);
639         g_free(di);
640 }
641
642 /** @private */
643 SRD_PRIV void srd_inst_free_all(struct srd_session *sess, GSList *stack)
644 {
645         GSList *l;
646         struct srd_decoder_inst *di;
647
648         if (session_is_valid(sess) != SRD_OK) {
649                 srd_err("Invalid session.");
650                 return;
651         }
652
653         di = NULL;
654         for (l = stack ? stack : sess->di_list; di == NULL && l != NULL; l = l->next) {
655                 di = l->data;
656                 if (di->next_di)
657                         srd_inst_free_all(sess, di->next_di);
658                 srd_inst_free(di);
659         }
660         if (!stack) {
661                 g_slist_free(sess->di_list);
662                 sess->di_list = NULL;
663         }
664 }
665
666 /** @} */