X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=controller.c;h=c9825b95cfc70c8fd6448f9001e851bd6957be3b;hb=c1f86f02a149f46609273e1bd5b42696d544727a;hp=cabca3b5edbf5a6acb57243d684291013142d7aa;hpb=0ff2d191726ef2e5a30ce697c7c93e4b0b1605f3;p=libsigrokdecode.git diff --git a/controller.c b/controller.c index cabca3b..c9825b9 100644 --- a/controller.c +++ b/controller.c @@ -1,5 +1,5 @@ /* - * This file is part of the sigrok project. + * This file is part of the libsigrokdecode project. * * Copyright (C) 2010 Uwe Hermann * Copyright (C) 2012 Bert Vermeulen @@ -18,8 +18,8 @@ * along with this program. If not, see . */ -#include "sigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ -#include "sigrokdecode-internal.h" +#include "libsigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#include "libsigrokdecode-internal.h" #include "config.h" #include #include @@ -130,6 +130,8 @@ extern SRD_PRIV PyTypeObject srd_logic_type; * Upon Python errors, return SRD_ERR_PYTHON. If the sigrok decoders * directory cannot be accessed, return SRD_ERR_DECODERS_DIR. * If not enough memory could be allocated, return SRD_ERR_MALLOC. + * + * @since 0.1.0 */ SRD_API int srd_init(const char *path) { @@ -180,6 +182,8 @@ SRD_API int srd_init(const char *path) * any successful srd_init() calls in between, is not allowed. * * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @since 0.1.0 */ SRD_API int srd_exit(void) { @@ -211,6 +215,8 @@ SRD_API int srd_exit(void) * @return SRD_OK upon success, a (negative) error code otherwise. * * @private + * + * @since 0.1.0 */ SRD_PRIV int srd_decoder_searchpath_add(const char *path) { @@ -284,6 +290,8 @@ SRD_PRIV int srd_decoder_searchpath_add(const char *path) * @param options A GHashTable of options to set. * * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @since 0.1.0 */ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, GHashTable *options) @@ -291,9 +299,12 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, PyObject *py_dec_options, *py_dec_optkeys, *py_di_options, *py_optval; PyObject *py_optlist, *py_classval; Py_UNICODE *py_ustr; + GVariant *value; unsigned long long int val_ull; + gint64 val_int; int num_optkeys, ret, size, i; - char *key, *value; + const char *val_str; + char *dbg, *key; if (!PyObject_HasAttrString(di->decoder->py_dec, "options")) { /* Decoder has no options. */ @@ -332,20 +343,32 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, } if ((value = g_hash_table_lookup(options, key))) { + dbg = g_variant_print(value, TRUE); + srd_dbg("got option '%s' = %s", key, dbg); + g_free(dbg); /* An override for this option was provided. */ if (PyUnicode_Check(py_classval)) { - if (!(py_optval = PyUnicode_FromString(value))) { + if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + srd_err("Option '%s' requires a string value.", key); + goto err_out; + } + val_str = g_variant_get_string(value, NULL); + if (!(py_optval = PyUnicode_FromString(val_str))) { /* Some UTF-8 encoding error. */ PyErr_Clear(); + srd_err("Option '%s' requires a UTF-8 string value.", key); goto err_out; } } else if (PyLong_Check(py_classval)) { - if (!(py_optval = PyLong_FromString(value, NULL, 0))) { + if (!g_variant_is_of_type(value, G_VARIANT_TYPE_INT64)) { + srd_err("Option '%s' requires an integer value.", key); + goto err_out; + } + val_int = g_variant_get_int64(value); + if (!(py_optval = PyLong_FromLong(val_int))) { /* ValueError Exception */ PyErr_Clear(); - srd_err("Option %s has invalid value " - "%s: expected integer.", - key, value); + srd_err("Option '%s' has invalid integer value.", key); goto err_out; } } @@ -412,15 +435,18 @@ static gint compare_probe_id(const struct srd_probe *a, const char *probe_id) * arranged in this order. * * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @since 0.1.0 */ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, GHashTable *new_probes) { + GVariant *probe_val; GList *l; GSList *sl; struct srd_probe *p; int *new_probemap, new_probenum; - char *probe_id, *probenum_str; + char *probe_id; int i, num_required_probes; srd_dbg("set probes called for instance %s with list of %d probes", @@ -453,22 +479,22 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, for (l = g_hash_table_get_keys(new_probes); l; l = l->next) { probe_id = l->data; - probenum_str = g_hash_table_lookup(new_probes, probe_id); - if (!probenum_str) { + probe_val= g_hash_table_lookup(new_probes, probe_id); + if (!g_variant_is_of_type(probe_val, G_VARIANT_TYPE_INT32)) { /* Probe name was specified without a value. */ srd_err("No probe number was specified for %s.", - probe_id); + probe_id); g_free(new_probemap); return SRD_ERR_ARG; } - new_probenum = strtol(probenum_str, NULL, 10); + new_probenum = g_variant_get_int32(probe_val); if (!(sl = g_slist_find_custom(di->decoder->probes, probe_id, (GCompareFunc)compare_probe_id))) { /* Fall back on optional probes. */ if (!(sl = g_slist_find_custom(di->decoder->opt_probes, probe_id, (GCompareFunc) compare_probe_id))) { srd_err("Protocol decoder %s has no probe " - "'%s'.", di->decoder->name, probe_id); + "'%s'.", di->decoder->name, probe_id); g_free(new_probemap); return SRD_ERR_ARG; } @@ -501,6 +527,8 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, * * @return Pointer to a newly allocated struct srd_decoder_inst, or * NULL in case of failure. + * + * @since 0.1.0 */ SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id, GHashTable *options) @@ -576,6 +604,8 @@ SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id, * @param di_to The instance on top of which di_from will be stacked. * * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @since 0.1.0 */ SRD_API int srd_inst_stack(struct srd_decoder_inst *di_from, struct srd_decoder_inst *di_to) @@ -605,6 +635,8 @@ SRD_API int srd_inst_stack(struct srd_decoder_inst *di_from, * @param inst_id The instance ID to be found. * * @return Pointer to struct srd_decoder_inst, or NULL if not found. + * + * @since 0.1.0 */ SRD_API struct srd_decoder_inst *srd_inst_find_by_id(const char *inst_id) { @@ -637,6 +669,8 @@ SRD_API struct srd_decoder_inst *srd_inst_find_by_id(const char *inst_id) * @return Pointer to struct srd_decoder_inst, or NULL if not found. * * @private + * + * @since 0.1.0 */ SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj(const GSList *stack, const PyObject *obj) @@ -708,6 +742,8 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, PyObject *args) * @return SRD_OK upon success, a (negative) error code otherwise. * * @private + * + * @since 0.1.0 */ SRD_PRIV int srd_inst_decode(uint64_t start_samplenum, const struct srd_decoder_inst *di, const uint8_t *inbuf, @@ -821,6 +857,8 @@ SRD_PRIV void srd_inst_free_all(GSList *stack) * @param samplerate The samplerate of the incoming feed. * * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @since 0.1.0 */ SRD_API int srd_session_start(int num_probes, int unitsize, uint64_t samplerate) { @@ -866,6 +904,8 @@ SRD_API int srd_session_start(int num_probes, int unitsize, uint64_t samplerate) * @param inbuflen Length in bytes of the buffer. * * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @since 0.1.0 */ SRD_API int srd_session_send(uint64_t start_samplenum, const uint8_t *inbuf, uint64_t inbuflen) @@ -897,6 +937,8 @@ SRD_API int srd_session_send(uint64_t start_samplenum, const uint8_t *inbuf, * callback per output type can be registered. * @param cb The function to call. Must not be NULL. * @param cb_data Private data for the callback function. Can be NULL. + * + * @since 0.1.0 */ SRD_API int srd_pd_output_callback_add(int output_type, srd_pd_output_callback_t cb, void *cb_data)