/* List of decoder instances. */
static GSList *di_list = NULL;
-/* List of frontend callbacks to receive PD output. */
+/* List of frontend callbacks to receive decoder output. */
static GSList *callbacks = NULL;
/* decoder.c */
* Initialize libsigrokdecode.
*
* This initializes the Python interpreter, and creates and initializes
- * a "sigrok" Python module with a single put() method.
+ * a "sigrokdecode" Python module.
*
* Then, it searches for sigrok protocol decoder files (*.py) in the
* "decoders" subdirectory of the the sigrok installation directory.
* are not allowed.
*
* @param path Path to an extra directory containing protocol decoders
- * which will be added to the python sys.path, or NULL.
+ * which will be added to the Python sys.path, or NULL.
*
* @return SRD_OK upon success, a (negative) error code otherwise.
* Upon Python errors, return SRD_ERR_PYTHON. If the sigrok decoders
* Python modules which have the same name as a sigrok protocol decoder in
* sys.path or in the current working directory.
*
- * @param path Path to an extra directory containing protocol decoders
- * which will be added to the python sys.path, or NULL.
+ * @param path Path to the directory containing protocol decoders which shall
+ * be added to the Python sys.path, or NULL.
*
* @return SRD_OK upon success, a (negative) error code otherwise.
*/
/**
* Set options in a decoder instance.
*
+ * Handled options are removed from the hash.
+ *
* @param di Decoder instance.
* @param options A GHashTable of options to set.
*
- * Handled options are removed from the hash.
- *
* @return SRD_OK upon success, a (negative) error code otherwise.
*/
SRD_API int srd_inst_options_set(struct srd_decoder_inst *di,
- GHashTable *options)
+ GHashTable *options)
{
PyObject *py_dec_options, *py_dec_optkeys, *py_di_options, *py_optval;
PyObject *py_optlist, *py_classval;
}
}
- /* If we got here, py_optval holds a known good new reference
+ /*
+ * If we got here, py_optval holds a known good new reference
* to the instance option to set.
*/
if (PyDict_SetItemString(py_di_options, key, py_optval) == -1)
* @return SRD_OK upon success, a (negative) error code otherwise.
*/
SRD_API int srd_inst_probes_set(struct srd_decoder_inst *di,
- GHashTable *new_probes)
+ GHashTable *new_probes)
{
GList *l;
GSList *sl;
* NULL in case of failure.
*/
SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id,
- GHashTable *options)
+ GHashTable *options)
{
int i;
struct srd_decoder *dec;
di->inst_id = g_strdup(inst_id ? inst_id : decoder_id);
g_hash_table_remove(options, "id");
- /* Prepare a default probe map, where samples come in the
+ /*
+ * Prepare a default probe map, where samples come in the
* order in which the decoder class defined them.
*/
di->dec_num_probes = g_slist_length(di->decoder->probes) +
}
/**
- * Finds a decoder instance by its instance ID, but only in the bottom
- * level of instances -- instances already stacked on top of another one
- * will not be found.
+ * Find a decoder instance by its instance ID.
+ *
+ * Only the bottom level of instances are searched -- instances already stacked
+ * on top of another one will not be found.
*
* @param inst_id The instance ID to be found.
*
}
/**
- * Finds a decoder instance by its Python object, i.e. that instance's
- * instantiation of the sigrokdecode.Decoder class. This will recurse
- * to find the instance anywhere in the stack tree.
+ * Find a decoder instance by its Python object.
+ *
+ * I.e. find that instance's instantiation of the sigrokdecode.Decoder class.
+ * This will recurse to find the instance anywhere in the stack tree.
*
- * @param stack Pointer to a GSList of struct srd_decoder_inst,
- * indicating the stack to search. To start searching at the bottom
- * level of decoder instances, pass NULL.
+ * @param stack Pointer to a GSList of struct srd_decoder_inst, indicating the
+ * stack to search. To start searching at the bottom level of
+ * decoder instances, pass NULL.
* @param obj The Python class instantiation.
*
* @return Pointer to struct srd_decoder_inst, or NULL if not found.
*/
SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj(GSList *stack,
- PyObject *obj)
+ PyObject *obj)
{
GSList *l;
struct srd_decoder_inst *tmp, *di;
Py_DecRef(py_res);
Py_DecRef(py_name);
- /* Start all the PDs stacked on top of this one. Pass along the
+ /*
+ * Start all the PDs stacked on top of this one. Pass along the
* metadata all the way from the bottom PD, even though it's only
* applicable to logic data for now.
*/
return SRD_ERR_ARG;
}
- /* Create new srd_logic object. Each iteration around the PD's loop
+ /*
+ * Create new srd_logic object. Each iteration around the PD's loop
* will fill one sample into this object.
*/
logic = PyObject_New(srd_logic, &srd_logic_type);
*
* @param num_probes The number of probes which the incoming feed will contain.
* @param unitsize The number of bytes per sample in the incoming feed.
- * @param The samplerate of the incoming feed.
+ * @param samplerate The samplerate of the incoming feed.
*
* @return SRD_OK upon success, a (negative) error code otherwise.
*/
srd_dbg("Calling start() on all instances with %d probes, "
"unitsize %d samplerate %d.", num_probes, unitsize, samplerate);
- /* Currently only one item of metadata is passed along to decoders,
+ /*
+ * Currently only one item of metadata is passed along to decoders,
* samplerate. This can be extended as needed.
*/
if (!(args = Py_BuildValue("{s:l}", "samplerate", (long)samplerate))) {
for (d = di_list; d; d = d->next) {
if ((ret = srd_inst_decode(start_samplenum, d->data, inbuf,
- inbuflen)) != SRD_OK)
+ inbuflen)) != SRD_OK)
return ret;
}
*
* @param output_type The output type this callback will receive. Only one
* callback per output type can be registered.
- * @param cb The function to call.
- * @param cb_data Unused.
+ * @param cb The function to call. Must not be NULL.
+ * @param cb_data Private data for the callback function. Can be NULL.
*/
SRD_API int srd_register_callback(int output_type,
srd_pd_output_callback_t cb, void *cb_data)
/* Import the Python module. */
if (!(d->py_mod = PyImport_ImportModule(module_name))) {
- catch_exception("import of '%s' failed.", module_name);
+ catch_exception("Import of '%s' failed.", module_name);
goto err_out;
}
if (!(d->py_dec = PyObject_GetAttrString(d->py_mod, "Decoder"))) {
/* This generated an AttributeError exception. */
PyErr_Clear();
- srd_err("Decoder class not found in protocol decoder %s.", module_name);
+ srd_err("Decoder class not found in protocol decoder %s.",
+ module_name);
goto err_out;
}
d->inputformats = NULL;
d->outputformats = NULL;
- /* Convert class annotation attribute to GSList of **char */
+ /* Convert class annotation attribute to GSList of **char. */
d->annotations = NULL;
if (PyObject_HasAttrString(d->py_dec, "annotations")) {
py_annlist = PyObject_GetAttrString(d->py_dec, "annotations");
*
* @param dec The loaded protocol decoder.
*
- * @return A newly allocated buffer containing the docstring. The caller should
- * free this after use.
+ * @return A newly allocated buffer containing the protocol decoder's
+ * documentation. The caller is responsible for free'ing this after use.
*/
SRD_API char *srd_decoder_doc(struct srd_decoder *dec)
{
g_free(p);
}
g_slist_free(probelist);
-
}
/**
*/
SRD_API int srd_decoder_unload(struct srd_decoder *dec)
{
- srd_dbg("unloading decoder %s", dec->name);
+ srd_dbg("Unloading decoder '%s'.", dec->name);
- /* Since any instances of this decoder need to be released as well,
+ /*
+ * Since any instances of this decoder need to be released as well,
* but they could be anywhere in the stack, just free the entire
* stack. A frontend reloading a decoder thus has to restart all
- * instances, and rebuild the stack. */
+ * instances, and rebuild the stack.
+ */
srd_inst_free_all(NULL);
free_probes(dec->probes);
/* Send a more precise error location to srd_dbg(), if we have it. */
if (etb && etb != Py_None) {
tracestr = NULL;
- py_tb = (PyTracebackObject *) etb;
+ py_tb = (PyTracebackObject *)etb;
py_str = PyUnicode_FromFormat("%U:%d in %U",
py_tb->tb_frame->f_code->co_filename,
py_tb->tb_frame->f_lineno,
{
PyObject *mod;
- /* tp_new needs to be assigned here for compiler portability */
+ /* tp_new needs to be assigned here for compiler portability. */
srd_Decoder_type.tp_new = PyType_GenericNew;
if (PyType_Ready(&srd_Decoder_type) < 0)
return NULL;
SRD_PRIV int add_modulepath(const char *path);
SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, PyObject *args);
SRD_PRIV int srd_inst_decode(uint64_t start_samplenum,
- struct srd_decoder_inst *dec,
- uint8_t *inbuf, uint64_t inbuflen);
+ struct srd_decoder_inst *dec,
+ uint8_t *inbuf, uint64_t inbuflen);
SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di);
SRD_PRIV void srd_inst_free_all(GSList *stack);
SRD_PRIV int pd_add(struct srd_decoder_inst *di, int output_type,
char *output_id);
/*--- decoder.c -------------------------------------------------------------*/
+
SRD_PRIV void *srd_find_callback(int output_type);
/*--- exception.c -----------------------------------------------------------*/
SRD_PRIV int py_str_as_str(PyObject *py_str, char **outstr);
SRD_PRIV int py_strlist_to_char(PyObject *py_strlist, char ***outstr);
SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj(GSList *stack,
- PyObject *obj);
+ PyObject *obj);
#endif
/** The decoder ID. Must be non-NULL and unique for all decoders. */
char *id;
- /** The (short) decoder name. */
+ /** The (short) decoder name. Must be non-NULL. */
char *name;
/** The (long) decoder name. May be NULL. */
char *longname;
- /** A (short, one-line) description of the decoder. */
+ /** A (short, one-line) description of the decoder. Must be non-NULL. */
char *desc;
- /** The license of the decoder. Valid values: "gplv2+", "gplv3+". */
+ /**
+ * The license of the decoder. Valid values: "gplv2+", "gplv3+".
+ * Other values are currently not allowed. Must be non-NULL.
+ */
char *license;
/** TODO */
/** TODO */
GSList *outputformats;
- /** Probes */
+ /** List of probes required by this decoder. */
GSList *probes;
- /** Optional probes */
+ /** List of optional probes for this decoder. */
GSList *opt_probes;
- /*
+ /**
* List of NULL-terminated char[], containing descriptions of the
* supported annotation output.
*/
GSList *annotations;
- /** Python module */
+ /** Python module. */
PyObject *py_mod;
- /** sigrokdecode.Decoder class */
+ /** sigrokdecode.Decoder class. */
PyObject *py_dec;
};
+/**
+ * Structure which contains information about one protocol decoder probe.
+ * For example, I2C has two probes, SDA and SCL.
+ */
struct srd_probe {
+ /** The ID of the probe. Must be non-NULL. */
char *id;
+ /** The name of the probe. Must not be NULL. */
char *name;
+ /** The description of the probe. Must not be NULL. */
char *desc;
+ /** The index of the probe, i.e. its order in the list of probes. */
int order;
};
void *cb_data;
};
-/* custom python types */
+/* Custom Python types: */
+
typedef struct {
PyObject_HEAD
} srd_Decoder;
SRD_API int srd_init(char *path);
SRD_API int srd_exit(void);
SRD_API int srd_inst_options_set(struct srd_decoder_inst *di,
- GHashTable *options);
+ GHashTable *options);
SRD_API int srd_inst_probes_set(struct srd_decoder_inst *di,
- GHashTable *probes);
+ GHashTable *probes);
SRD_API struct srd_decoder_inst *srd_inst_new(const char *id,
- GHashTable *options);
+ GHashTable *options);
SRD_API int srd_inst_stack(struct srd_decoder_inst *di_from,
- struct srd_decoder_inst *di_to);
+ struct srd_decoder_inst *di_to);
SRD_API struct srd_decoder_inst *srd_inst_find_by_id(char *inst_id);
SRD_API int srd_session_start(int num_probes, int unitsize,
uint64_t samplerate);
struct srd_pd_output *pdo;
int ann_id;
- /* Should be a list of [annotation format, [string, ...]] */
+ /* Should be a list of [annotation format, [string, ...]]. */
if (!PyList_Check(obj) && !PyTuple_Check(obj)) {
srd_err("Protocol decoder %s submitted %s instead of list.",
di->decoder->name, obj->ob_type->tp_name);
return SRD_ERR_PYTHON;
}
- /* Should have 2 elements... */
+ /* Should have 2 elements. */
if (PyList_Size(obj) != 2) {
srd_err("Protocol decoder %s submitted annotation list with "
"%d elements instead of 2", di->decoder->name,
}
*ann_format = ann_id;
- /* Second element must be a list */
+ /* Second element must be a list. */
py_tmp = PyList_GetItem(obj, 1);
if (!PyList_Check(py_tmp)) {
srd_err("Protocol decoder %s submitted annotation list, but "
case SRD_OUTPUT_PROTO:
for (l = di->next_di; l; l = l->next) {
next_di = l->data;
- /* TODO: is this needed? */
+ /* TODO: Is this needed? */
Py_XINCREF(next_di->py_inst);
srd_spew("Sending %d-%d to instance %s",
start_sample, end_sample,
if (!(py_res = PyObject_CallMethod(
next_di->py_inst, "decode", "KKO", start_sample,
end_sample, data))) {
- catch_exception("calling %s decode(): ",
+ catch_exception("Calling %s decode(): ",
next_di->inst_id);
}
Py_XDECREF(py_res);
.tp_name = "sigrokdecode.Decoder",
.tp_basicsize = sizeof(srd_Decoder),
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- .tp_doc = "Sigrok Decoder base class",
+ .tp_doc = "sigrok Decoder base class",
.tp_methods = Decoder_methods,
};