summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert Vermeulen <bert@biot.com>2011-12-15 03:31:31 +0100
committerUwe Hermann <uwe@hermann-uwe.de>2011-12-28 12:17:13 +0100
commit1aef2f93a29f01168c04fd0478b29af290d8756b (patch)
treea82ddaa52862dcb8302d58b9b902f7d38b0b1c57
parente508088229e96423854ba6db63084c9bb18eeb34 (diff)
downloadlibsigrokdecode-1aef2f93a29f01168c04fd0478b29af290d8756b.tar.gz
libsigrokdecode-1aef2f93a29f01168c04fd0478b29af290d8756b.zip
make time/duration work, at least when loading from a session file
PD decode() call now takes 3 arguments: timeoffset, duration, data as per the current API specification.
-rw-r--r--controller.c31
-rw-r--r--decoders/i2c.py19
-rw-r--r--sigrokdecode.h5
3 files changed, 36 insertions, 19 deletions
diff --git a/controller.c b/controller.c
index efeef28..140f664 100644
--- a/controller.c
+++ b/controller.c
@@ -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;
}
diff --git a/decoders/i2c.py b/decoders/i2c.py
index 9ff89c9..c57dd33 100644
--- a/decoders/i2c.py
+++ b/decoders/i2c.py
@@ -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)
diff --git a/sigrokdecode.h b/sigrokdecode.h
index 053a7a1..6005ad9 100644
--- a/sigrokdecode.h
+++ b/sigrokdecode.h
@@ -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);