]> sigrok.org Git - libsigrokdecode.git/commitdiff
srd: Support for one or more optional probes.
authorUwe Hermann <redacted>
Thu, 10 May 2012 07:34:13 +0000 (09:34 +0200)
committerUwe Hermann <redacted>
Thu, 10 May 2012 07:34:13 +0000 (09:34 +0200)
In the protocol decoder you always get all required probes, then _all_
optional probes in the list of probes in the decode() call.

Example:

 (r1, r2, r3, o1, o2, o3, o4) = pins

In this case r1-r3 are required probes, o1-o4 are optional probes.
However, the value of valid/used/specified probes will be 0 or 1,
whereas the value of probes that were not specified/assigned by the user
will be (at the moment) 42.

The PD can check for a valid probe like this:

  if p in (0, 1):
    ...

Or check for an invalid probe:

  if (p > 1):
    ...

The value of 42 could change to be -1 or None later.

controller.c
decoder.c
type_logic.c

index 0d914c9f7590e48509824fc8cf7a83a54c5835a7..995ddd7f13667302a2c7cc271829aafb2148d9cb 100644 (file)
@@ -344,6 +344,7 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di,
        struct srd_probe *p;
        int *new_probemap, new_probenum;
        char *probe_id, *probenum_str;
+       int i, num_required_probes;
 
        srd_dbg("set probes called for instance %s with list of %d probes",
                di->inst_id, g_hash_table_size(new_probes));
@@ -366,6 +367,13 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di,
                return SRD_ERR_MALLOC;
        }
 
+       /*
+        * For now, map all indexes to probe -1 (can be overridden later).
+        * This -1 is interpreted as an unspecified probe later.
+        */
+       for (i = 0; i < di->dec_num_probes; i++)
+               new_probemap[i] = -1;
+
        for (l = g_hash_table_get_keys(new_probes); l; l = l->next) {
                probe_id = l->data;
                probenum_str = g_hash_table_lookup(new_probes, probe_id);
@@ -390,9 +398,17 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di,
                }
                p = sl->data;
                new_probemap[p->order] = new_probenum;
-               srd_dbg("setting probe mapping for %d = probe %d", p->order,
-                       new_probenum);
+               srd_dbg("Setting probe mapping: %s (index %d) = probe %d.",
+                       p->id, p->order, new_probenum);
        }
+
+       srd_dbg("Final probe map:");
+       num_required_probes = g_slist_length(di->decoder->probes);
+       for (i = 0; i < di->dec_num_probes; i++) {
+               srd_dbg(" - index %d = probe %d (%s)", i, new_probemap[i],
+                       (i < num_required_probes) ? "required" : "optional");
+       }
+
        g_free(di->dec_probemap);
        di->dec_probemap = new_probemap;
 
index 4cf419791fec21af4bbe6a3d25ddfdf2518d439f..6dfeecae7fa1fa5a5ca6e1c55eb7e27641ffcc49 100644 (file)
--- a/decoder.c
+++ b/decoder.c
@@ -134,6 +134,8 @@ SRD_API int srd_decoder_load(const char *module_name)
        struct srd_decoder *d;
        int alen, ret, i;
        char **ann;
+       struct srd_probe *p;
+       GSList *l;
 
        srd_dbg("Loading protocol decoder '%s'.", module_name);
 
@@ -222,6 +224,19 @@ SRD_API int srd_decoder_load(const char *module_name)
        if (get_probes(d, "optional_probes", &d->opt_probes) != SRD_OK)
                goto err_out;
 
+       /*
+        * Fix order numbers for the optional probes.
+        *
+        * Example:
+        * Required probes: r1, r2, r3. Optional: o1, o2, o3, o4.
+        * 'order' fields in the d->probes list = 0, 1, 2.
+        * 'order' fields in the d->opt_probes list = 3, 4, 5, 6.
+        */
+       for (l = d->opt_probes; l; l = l->next) {
+               p = l->data;
+               p->order += g_slist_length(d->probes);
+       }
+
        /* Store required fields in newly allocated strings. */
        if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK)
                goto err_out;
index b284ebf73d09744215a72784a5567dd246b78235..098e34d84d3af9d1471fa936ec17a0cec254efa2 100644 (file)
@@ -45,11 +45,26 @@ static PyObject *srd_logic_iternext(PyObject *self)
         * Convert the bit-packed sample to an array of bytes, with only 0x01
         * and 0x00 values, so the PD doesn't need to do any bitshifting.
         */
+
+       /* Get probe bits into the 'sample' variable. */
        memcpy(&sample,
               logic->inbuf + logic->itercnt * logic->di->data_unitsize,
               logic->di->data_unitsize);
-       for (i = 0; i < logic->di->dec_num_probes; i++)
+
+       /* All probe values (required + optional) are pre-set to 42. */
+       memset(probe_samples, 42, logic->di->dec_num_probes);
+       /* TODO: None or -1 in Python would be better. */
+
+       /*
+        * Set probe values of specified/used probes to their resp. values.
+        * Unused probe values (those not specified by the user) remain at 42.
+        */
+       for (i = 0; i < logic->di->dec_num_probes; i++) {
+               /* A probemap value of -1 means "unused optional probe". */
+               if (logic->di->dec_probemap[i] == -1)
+                       continue;
                probe_samples[i] = sample & (1 << logic->di->dec_probemap[i]) ? 1 : 0;
+       }
 
        /* Prepare the next samplenum/sample list in this iteration. */
        py_samplenum =