summaryrefslogtreecommitdiff
path: root/decoder.c
diff options
context:
space:
mode:
authorBert Vermeulen <bert@biot.com>2013-11-10 12:42:11 +0100
committerBert Vermeulen <bert@biot.com>2013-11-15 22:20:52 +0100
commitd75d8a7c40011cdc15be8330b5efbdf812c4fe27 (patch)
tree8c420e631fb9ef51d1818b5084c0466ee86ff2f3 /decoder.c
parent0169f19c53e195df2f96c4df731ad3214c59e20a (diff)
downloadlibsigrokdecode-d75d8a7c40011cdc15be8330b5efbdf812c4fe27.tar.gz
libsigrokdecode-d75d8a7c40011cdc15be8330b5efbdf812c4fe27.zip
Implement OUTPUT_BINARY
This requires the PD to have a tuple in its class called 'binary', which contains a list of strings describing the different binary classes it can output. For the SPI decoder this might be 'MOSI' and 'MISO', for example. The data is submitted to the frontend as struct srd_proto_data_binary, which contains the class that data belongs to.
Diffstat (limited to 'decoder.c')
-rw-r--r--decoder.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/decoder.c b/decoder.c
index 01dcf0a..ef7e15d 100644
--- a/decoder.c
+++ b/decoder.c
@@ -245,10 +245,11 @@ err_out:
*/
SRD_API int srd_decoder_load(const char *module_name)
{
- PyObject *py_basedec, *py_method, *py_attr, *py_annlist, *py_ann;
+ PyObject *py_basedec, *py_method, *py_attr, *py_annlist, *py_ann, \
+ *py_bin_classes, *py_bin_class;
struct srd_decoder *d;
- int alen, ret, i;
- char **ann;
+ int len, ret, i;
+ char **ann, *bin;
struct srd_probe *p;
GSList *l;
@@ -362,7 +363,7 @@ SRD_API int srd_decoder_load(const char *module_name)
if (py_attr_as_str(d->py_dec, "license", &(d->license)) != SRD_OK)
goto err_out;
- /* Convert class annotation attribute to GSList of **char. */
+ /* Convert annotation class attribute to GSList of char **. */
d->annotations = NULL;
if (PyObject_HasAttrString(d->py_dec, "annotations")) {
py_annlist = PyObject_GetAttrString(d->py_dec, "annotations");
@@ -371,8 +372,8 @@ SRD_API int srd_decoder_load(const char *module_name)
"should be a list.", module_name);
goto err_out;
}
- alen = PyList_Size(py_annlist);
- for (i = 0; i < alen; i++) {
+ len = PyList_Size(py_annlist);
+ for (i = 0; i < len; i++) {
py_ann = PyList_GetItem(py_annlist, i);
if (!PyList_Check(py_ann) || PyList_Size(py_ann) != 2) {
srd_err("Protocol decoder module %s "
@@ -388,6 +389,31 @@ SRD_API int srd_decoder_load(const char *module_name)
}
}
+ /* Convert binary class to GSList of char *. */
+ d->binary = NULL;
+ if (PyObject_HasAttrString(d->py_dec, "binary")) {
+ py_bin_classes = PyObject_GetAttrString(d->py_dec, "binary");
+ if (!PyTuple_Check(py_bin_classes)) {
+ srd_err("Protocol decoder module %s binary classes "
+ "should be a tuple.", module_name);
+ goto err_out;
+ }
+ len = PyTuple_Size(py_bin_classes);
+ for (i = 0; i < len; i++) {
+ py_bin_class = PyTuple_GetItem(py_bin_classes, i);
+ if (!PyUnicode_Check(py_bin_class)) {
+ srd_err("Protocol decoder module %s binary "
+ "class should be a string.", module_name);
+ goto err_out;
+ }
+
+ if (py_str_as_str(py_bin_class, &bin) != SRD_OK) {
+ goto err_out;
+ }
+ d->binary = g_slist_append(d->binary, bin);
+ }
+ }
+
/* Append it to the list of supported/loaded decoders. */
pd_list = g_slist_append(pd_list, d);