]> sigrok.org Git - libsigrokdecode.git/blobdiff - controller.c
Doxygen: Add @since markers to API functions.
[libsigrokdecode.git] / controller.c
index cabca3b5edbf5a6acb57243d684291013142d7aa..e023b7151dddd07d15f29a42efd10abde0b72ffb 100644 (file)
@@ -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 <uwe@hermann-uwe.de>
  * Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
@@ -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)