]> sigrok.org Git - libsigrokdecode.git/commitdiff
make time/duration work, at least when loading from a session file
authorBert Vermeulen <redacted>
Thu, 15 Dec 2011 02:31:31 +0000 (03:31 +0100)
committerUwe Hermann <redacted>
Wed, 28 Dec 2011 11:17:13 +0000 (12:17 +0100)
PD decode() call now takes 3 arguments: timeoffset, duration, data
as per the current API specification.

controller.c
decoders/i2c.py
sigrokdecode.h

index efeef2808e70c56fe074f9309a8f389acf160d20..140f664f1a2166992095a23459195993e939308b 100644 (file)
@@ -21,6 +21,7 @@
 #include "config.h"
 #include <sigrokdecode.h> /* First, so we avoid a _POSIX_C_SOURCE warning. */
 #include <glib.h>
+#include <inttypes.h>
 
 /* TODO: this should probably be in sigrokdecode.h */
 /* Re-define some string functions for Python >= 3.0. */
@@ -63,23 +64,25 @@ 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;
 
        if (!(di = get_di_by_decobject(self)))
                return NULL;
 
-       printf("put: %s instance %x: ", di->decoder->name, (unsigned int) di);
-
-       if (!PyArg_ParseTuple(args, "iO", &output_id, &data))
+       if (!PyArg_ParseTuple(args, "KKiO", &timeoffset, &duration, &output_id, &data))
                return NULL;
 
+       printf("put: %s instance %p time %" PRIu64 " duration %" PRIu64 " ",
+                       di->decoder->name, di, timeoffset, duration);
+
        if (!(l = g_slist_nth(di->pd_output, output_id)))
                /* PD supplied invalid output id */
                /* TODO: better error message */
                return NULL;
        pdo = l->data;
 
-       printf("output type %d: ", pdo->output_type);
+       printf("stream %d: ", pdo->output_type);
        PyObject_Print(data, stdout, Py_PRINT_RAW);
        puts("");
 
@@ -357,16 +360,13 @@ int srd_session_start(const char *driver, int unitsize, uint64_t starttime,
  *
  * @return SRD_OK upon success, a (negative) error code otherwise.
  */
-int srd_run_decoder(struct srd_decoder_instance *dec,
-                   uint8_t *inbuf, uint64_t inbuflen)
+int srd_run_decoder(uint64_t timeoffset, uint64_t duration,
+               struct srd_decoder_instance *dec, uint8_t *inbuf, uint64_t inbuflen)
 {
        PyObject *py_instance, *py_res;
-       /* FIXME: Don't have a timebase available here. Make one up. */
-       static int _timehack = 0;
-
-       _timehack += inbuflen;
 
 //     fprintf(stdout, "%s: %s\n", __func__, dec->decoder->name);
+//     printf("to %u du %u len %d\n", timeoffset, duration, inbuflen);
 
        /* Return an error upon unusable input. */
        if (dec == NULL)
@@ -381,10 +381,7 @@ int srd_run_decoder(struct srd_decoder_instance *dec,
        Py_XINCREF(py_instance);
 
        if (!(py_res = PyObject_CallMethod(py_instance, "decode",
-                                          "{s:i,s:i,s:s#}",
-                                          "time", _timehack,
-                                          "duration", 10,
-                                          "data", inbuf, inbuflen))) { /* NEWREF */
+                       "KKs#", timeoffset, duration, inbuf, inbuflen))) {
                if (PyErr_Occurred())
                        PyErr_Print(); /* Returns void. */
 
@@ -397,7 +394,8 @@ int srd_run_decoder(struct srd_decoder_instance *dec,
 
 
 /* Feed logic samples to decoder session. */
-int srd_session_feed(uint8_t *inbuf, uint64_t inbuflen)
+int srd_session_feed(uint64_t timeoffset, uint64_t duration, uint8_t *inbuf,
+               uint64_t inbuflen)
 {
        GSList *d;
        int ret;
@@ -405,7 +403,8 @@ int srd_session_feed(uint8_t *inbuf, uint64_t inbuflen)
 //     fprintf(stdout, "%s: %d bytes\n", __func__, inbuflen);
 
        for (d = di_list; d; d = d->next) {
-               if ((ret = srd_run_decoder(d->data, inbuf, inbuflen)) != SRD_OK)
+               if ((ret = srd_run_decoder(timeoffset, duration, d->data, inbuf,
+                               inbuflen)) != SRD_OK)
                        return ret;
        }
 
index 9ff89c9755993c797fc54ee9e34f475c92a525e0..c57dd334198ea53ffd1494d435a6a2db1fe5692d 100644 (file)
@@ -313,11 +313,26 @@ class Decoder(sigrok.Decoder):
         self.is_repeat_start = 0
         self.wr = -1
 
-    def decode(self, data):
+    def put(self, output_id, data):
+        timeoffset = self.timeoffset + ((self.samplenum - self.bitcount) * self.period)
+        if self.bitcount > 0:
+            duration = self.bitcount * self.period
+        else:
+            duration = self.period
+        print "**", timeoffset, duration
+        super(Decoder, self).put(timeoffset, duration, output_id, data)
+
+    def decode(self, timeoffset, duration, data):
         """I2C protocol decoder"""
 
+        self.timeoffset = timeoffset
+        self.duration = duration
+        print "++", timeoffset, duration, len(data)
+        # duration of one bit in ps, only valid for this call to decode()
+        self.period = duration / len(data)
+
         # We should accept a list of samples and iterate...
-        for sample in sampleiter(data['data'], self.unitsize):
+        for sample in sampleiter(data, self.unitsize):
 
             # TODO: Eliminate the need for ord().
             s = ord(sample.data)
index 053a7a1ae5362f0c259d59b081a66824c9f33239..6005ad984613d7872f719ae77861ae9153091149 100644 (file)
@@ -134,7 +134,10 @@ int srd_instance_start(struct srd_decoder_instance *di,
                        const char *driver, int unitsize, uint64_t starttime);
 int srd_session_start(const char *driver, int unitsize, uint64_t starttime,
                uint64_t samplerate);
-int srd_session_feed(uint8_t *inbuf, uint64_t inbuflen);
+int srd_run_decoder(uint64_t timeoffset, uint64_t duration,
+               struct srd_decoder_instance *dec, uint8_t *inbuf, uint64_t inbuflen);
+int srd_session_feed(uint64_t timeoffset, uint64_t duration, uint8_t *inbuf,
+               uint64_t inbuflen);
 int pd_output_new(struct srd_decoder_instance *di, int output_type,
                char *output_id, char *description);