From: Gareth McMullin Date: Sun, 20 Nov 2011 05:39:50 +0000 (+1300) Subject: libsigrokdecode: Allow frontend to configure decoder probes. X-Git-Tag: libsigrokdecode-0.1.0~272 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=commitdiff_plain;h=f97f531c2d31b729afbf1c97a0d017526bf8e52a libsigrokdecode: Allow frontend to configure decoder probes. --- diff --git a/decode.c b/decode.c index 398a9f7..396cde8 100644 --- a/decode.c +++ b/decode.c @@ -284,6 +284,8 @@ static int srd_load_decoder(const char *name, struct srd_decoder_instance *srd_instance_new(const char *id) { struct srd_decoder *dec = srd_get_decoder_by_id(id); + if (!dec) + return NULL; struct srd_decoder_instance *di = g_malloc(sizeof(*di)); PyObject *py_args, *py_value; @@ -317,6 +319,26 @@ struct srd_decoder_instance *srd_instance_new(const char *id) return di; } +int srd_instance_set_probe(struct srd_decoder_instance *di, + const char *probename, int num) +{ + PyObject *probedict, *probenum; + probedict = PyObject_GetAttrString(di->py_instance, "probes"); /* NEWREF */ + if (!probedict) { + if (PyErr_Occurred()) + PyErr_Print(); /* Returns void. */ + + return SRD_ERR_PYTHON; /* TODO: More specific error? */ + } + + probenum = PyInt_FromLong(num); + PyMapping_SetItemString(probedict, (char*)probename, probenum); + + Py_XDECREF(probenum); + Py_XDECREF(probedict); + return SRD_OK; +} + /** * Run the specified decoder function. * @@ -333,7 +355,7 @@ int srd_run_decoder(struct srd_decoder_instance *dec, uint8_t **outbuf, uint64_t *outbuflen) { PyObject *py_instance, *py_value, *py_res; - int r, ret; + int ret; /* FIXME: Don't have a timebase available here. Make one up. */ static int _timehack = 0; diff --git a/decoders/spi.py b/decoders/spi.py index 0b688c8..0ac8b56 100644 --- a/decoders/spi.py +++ b/decoders/spi.py @@ -47,7 +47,7 @@ class Decoder(): #print kwargs self.unitsize = unitsize - self.probes = Decoder.probes + self.probes = Decoder.probes.copy() self.oldsck = True self.rxcount = 0 self.rxdata = 0 diff --git a/sigrokdecode.h b/sigrokdecode.h index 76b53f5..dabfd33 100644 --- a/sigrokdecode.h +++ b/sigrokdecode.h @@ -106,6 +106,8 @@ int srd_run_decoder(struct srd_decoder_instance *dec, uint8_t *inbuf, uint64_t inbuflen, uint8_t **outbuf, uint64_t *outbuflen); struct srd_decoder_instance *srd_instance_new(const char *id); +int srd_instance_set_probe(struct srd_decoder_instance *di, + const char *probename, int num); int srd_exit(void); #ifdef __cplusplus