]> sigrok.org Git - libsigrokdecode.git/blobdiff - type_decoder.c
session: add "terminate and reset" support for protocol stacks
[libsigrokdecode.git] / type_decoder.c
index 0ac59c9fb41f7d51af8b162184f0e9d0a6ac4ecf..06842f9e9069230a44b03fef24e8cc5838a341c3 100644 (file)
@@ -361,6 +361,9 @@ static PyObject *Decoder_register(PyObject *self, PyObject *args,
        char *proto_id, *meta_name, *meta_descr;
        char *keywords[] = {"output_type", "proto_id", "meta", NULL};
        PyGILState_STATE gstate;
+       gboolean is_meta;
+       GSList *l;
+       struct srd_pd_output *cmp;
 
        gstate = PyGILState_Ensure();
 
@@ -383,7 +386,8 @@ static PyObject *Decoder_register(PyObject *self, PyObject *args,
        }
 
        /* Check if the meta value's type is supported. */
-       if (output_type == SRD_OUTPUT_META) {
+       is_meta = output_type == SRD_OUTPUT_META;
+       if (is_meta) {
                if (meta_type_py == &PyLong_Type)
                        meta_type_gv = G_VARIANT_TYPE_INT64;
                else if (meta_type_py == &PyFloat_Type)
@@ -394,6 +398,30 @@ static PyObject *Decoder_register(PyObject *self, PyObject *args,
                }
        }
 
+       srd_dbg("Instance %s checking registration type %d for %s.",
+               di->inst_id, output_type, proto_id);
+       pdo = NULL;
+       for (l = di->pd_output; l; l = l->next) {
+               cmp = l->data;
+               if (cmp->output_type != output_type)
+                       continue;
+               if (strcmp(cmp->proto_id, proto_id) != 0)
+                       continue;
+               if (is_meta && cmp->meta_type != meta_type_gv)
+                       continue;
+               if (is_meta && strcmp(cmp->meta_name, meta_name) != 0)
+                       continue;
+               if (is_meta && strcmp(cmp->meta_descr, meta_descr) != 0)
+                       continue;
+               pdo = cmp;
+               break;
+       }
+       if (pdo) {
+               py_new_output_id = Py_BuildValue("i", pdo->pdo_id);
+               PyGILState_Release(gstate);
+               return py_new_output_id;
+       }
+
        srd_dbg("Instance %s creating new output type %d for %s.",
                di->inst_id, output_type, proto_id);
 
@@ -798,7 +826,7 @@ static PyObject *Decoder_wait(PyObject *self, PyObject *args)
                        } else {
                                PyObject_SetAttrString(di->py_inst, "matched", Py_None);
                        }
-       
+
                        py_pinvalues = get_current_pinvalues(di);
 
                        g_mutex_unlock(&di->data_mutex);
@@ -855,9 +883,8 @@ err:
  */
 static PyObject *Decoder_has_channel(PyObject *self, PyObject *args)
 {
-       int idx, max_idx;
+       int idx, count;
        struct srd_decoder_inst *di;
-       PyObject *py_channel;
        PyGILState_STATE gstate;
 
        if (!self || !args)
@@ -870,24 +897,20 @@ static PyObject *Decoder_has_channel(PyObject *self, PyObject *args)
                goto err;
        }
 
-       /* Parse the argument of self.has_channel() into 'py_channel'. */
-       if (!PyArg_ParseTuple(args, "O", &py_channel)) {
+       /*
+        * Get the integer argument of self.has_channel(). Check for
+        * the range of supported PD input channel numbers.
+        */
+       if (!PyArg_ParseTuple(args, "i", &idx)) {
                /* Let Python raise this exception. */
                goto err;
        }
 
-       if (!PyLong_Check(py_channel)) {
-               PyErr_SetString(PyExc_Exception, "channel index not a number");
-               goto err;
-       }
-
-       idx = PyLong_AsLong(py_channel);
-       max_idx = g_slist_length(di->decoder->channels)
-               + g_slist_length(di->decoder->opt_channels) - 1;
-
-       if (idx < 0 || idx > max_idx) {
-               srd_err("Invalid channel index %d/%d.", idx, max_idx);
-               PyErr_SetString(PyExc_Exception, "invalid channel");
+       count = g_slist_length(di->decoder->channels) +
+               g_slist_length(di->decoder->opt_channels);
+       if (idx < 0 || idx >= count) {
+               srd_err("Invalid index %d, PD channel count %d.", idx, count);
+               PyErr_SetString(PyExc_IndexError, "invalid channel index");
                goto err;
        }