X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=module_sigrokdecode.c;h=e92c9e75b5c7a6613b6cda04986e2b729958cae3;hp=b3bdafd792ce1c9ec0df73e5442ff1bf7ae9d8d3;hb=84b81f1df5a51285e55d808fdfb7968cd70711e9;hpb=0ee4dd54ce134158cd2068866ddc7d32c692d457 diff --git a/module_sigrokdecode.c b/module_sigrokdecode.c index b3bdafd..e92c9e7 100644 --- a/module_sigrokdecode.c +++ b/module_sigrokdecode.c @@ -95,14 +95,15 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args) PyObject *data; struct srd_decoder_instance *di; struct srd_pd_output *pdo; - uint64_t timeoffset, duration; - int output_id, annotation_format, i; - char **annotation, **ann_info; + struct srd_protocol_data *pdata; + uint64_t start_sample, end_sample; + int output_id; + void (*cb)(); if (!(di = get_di_by_decobject(self))) return NULL; - if (!PyArg_ParseTuple(args, "KKiO", &timeoffset, &duration, &output_id, &data)) + if (!PyArg_ParseTuple(args, "KKiO", &start_sample, &end_sample, &output_id, &data)) return NULL; if (!(l = g_slist_nth(di->pd_output, output_id))) { @@ -114,31 +115,35 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args) switch (pdo->output_type) { case SRD_OUTPUT_ANNOTATION: - if (convert_pyobj(di, data, &annotation_format, &annotation) != SRD_OK) - return NULL; - - /* TODO: SRD_OUTPUT_ANNOTATION should go back up to the caller */ - ann_info = g_slist_nth_data(pdo->decoder->annotation, annotation_format); - printf("annotation format %d (%s): ", annotation_format, ann_info[0]); - for (i = 0; annotation[i]; i++) - printf("\"%s\" ", annotation[i]); - printf("\n"); - break; - case SRD_OUTPUT_PROTOCOL: - - /* TODO: SRD_OUTPUT_PROTOCOL should go up the PD stack. */ - printf("%s protocol data: ", pdo->protocol_id); - PyObject_Print(data, stdout, Py_PRINT_RAW); - puts(""); + case SRD_OUTPUT_BINARY: break; - default: srd_err("Protocol decoder %s submitted invalid output type %d", di->decoder->name, pdo->output_type); + return NULL; break; } + if ((cb = srd_find_callback(pdo->output_type))) { + /* Something registered an interest in this output type. */ + if (!(pdata = g_try_malloc0(sizeof(struct srd_protocol_data)))) + return NULL; + pdata->start_sample = start_sample; + pdata->end_sample = end_sample; + pdata->pdo = pdo; + if (pdo->output_type == SRD_OUTPUT_ANNOTATION) { + /* annotations need converting from PyObject */ + if (convert_pyobj(di, data, &pdata->annotation_format, + (char ***)&pdata->data) != SRD_OK) + return NULL; + } else { + /* annotation_format is unused, data is an opaque blob. */ + pdata->data = data; + } + cb(pdata); + } + Py_RETURN_NONE; } @@ -220,6 +225,17 @@ PyMODINIT_FUNC PyInit_sigrokdecode(void) if (PyModule_AddObject(mod, "srd_logic", (PyObject *)&srd_logic_type) == -1) return NULL; + /* expose output types as symbols in the sigrokdecode module */ + if(PyModule_AddObject(mod, "SRD_OUTPUT_ANNOTATION", + PyLong_FromLong(SRD_OUTPUT_ANNOTATION)) == -1) + return NULL; + if(PyModule_AddObject(mod, "SRD_OUTPUT_PROTOCOL", + PyLong_FromLong(SRD_OUTPUT_PROTOCOL)) == -1) + return NULL; + if(PyModule_AddObject(mod, "SRD_OUTPUT_BINARY", + PyLong_FromLong(SRD_OUTPUT_BINARY)) == -1) + return NULL; + return mod; }