]> sigrok.org Git - sigrok-cli.git/blobdiff - session.c
README: Update build requirements list.
[sigrok-cli.git] / session.c
index fb9ebb6d4def3d4a384b8847f60b9bcf510408f9..2c2f478365469effabd1c3513c2ef76de606127c 100644 (file)
--- a/session.c
+++ b/session.c
@@ -45,13 +45,14 @@ static int set_limit_time(const struct sr_dev_inst *sdi)
                return SR_ERR;
        }
 
-       if (sr_dev_has_option(sdi, SR_CONF_LIMIT_MSEC)) {
+       if (config_key_has_cap(driver, sdi, NULL, SR_CONF_LIMIT_MSEC, SR_CONF_SET)) {
                gvar = g_variant_new_uint64(time_msec);
                if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_MSEC, gvar) != SR_OK) {
                        g_critical("Failed to configure time limit.");
                        return SR_ERR;
                }
-       } else if (sr_dev_has_option(sdi, SR_CONF_SAMPLERATE)) {
+       } else if (config_key_has_cap(driver, sdi, NULL, SR_CONF_SAMPLERATE,
+                       SR_CONF_GET | SR_CONF_SET)) {
                /* Convert to samples based on the samplerate.  */
                sr_config_get(driver, sdi, NULL, SR_CONF_SAMPLERATE, &gvar);
                samplerate = g_variant_get_uint64(gvar);
@@ -159,7 +160,7 @@ void datafeed_in(const struct sr_dev_inst *sdi,
 
                rcvd_samples_logic = rcvd_samples_analog = 0;
 
-               if (sr_config_get(driver, sdi, NULL, SR_CONF_SAMPLERATE,
+               if (maybe_config_get(driver, sdi, NULL, SR_CONF_SAMPLERATE,
                                &gvar) == SR_OK) {
                        samplerate = g_variant_get_uint64(gvar);
                        g_variant_unref(gvar);
@@ -325,7 +326,9 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
        double tmp_double, dlow, dhigh;
        uint64_t tmp_u64, p, q, low, high;
        GVariant *rational[2], *range[2];
+       GVariantBuilder *vbl;
        gboolean tmp_bool;
+       gchar **keyval;
        int ret;
 
        if (!(srci = sr_config_info_name_get(key))) {
@@ -334,7 +337,7 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
        }
        src->key = srci->key;
 
-       if ((value == NULL) &&
+       if ((value == NULL || strlen(value) == 0) &&
                (srci->datatype != SR_T_BOOL)) {
                g_critical("Option '%s' needs a value.", (char *)key);
                return -1;
@@ -402,10 +405,30 @@ int opt_to_gvar(char *key, char *value, struct sr_config *src)
                        src->data = g_variant_new_tuple(range, 2);
                }
                break;
+       case SR_T_KEYVALUE:
+               /* Expects the argument to be in the form of key=value. */
+               keyval = g_strsplit(value, "=", 2);
+               if (!keyval[0] || !keyval[1]) {
+                       g_strfreev(keyval);
+                       ret = -1;
+                       break;
+               } else {
+                       vbl = g_variant_builder_new(G_VARIANT_TYPE_DICTIONARY);
+                       g_variant_builder_add(vbl, "{ss}",
+                                             keyval[0], keyval[1]);
+                       src->data = g_variant_builder_end(vbl);
+                       g_strfreev(keyval);
+               }
+               break;
        default:
+               g_critical("Unknown data type specified for option '%s' "
+                          "(driver implementation bug?).", key);
                ret = -1;
        }
 
+       if (ret < 0)
+               g_critical("Invalid value: '%s' for option '%s'", value, key);
+
        return ret;
 }
 
@@ -422,8 +445,8 @@ int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args)
                if ((ret = opt_to_gvar(key, value, &src)) != 0)
                        return ret;
                cg = select_channel_group(sdi);
-               ret = sr_config_set(sdi, cg, src.key, src.data);
-               if (ret != SR_OK) {
+               if ((ret = maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, cg,
+                               src.key, src.data)) != SR_OK) {
                        g_critical("Failed to set device option '%s'.", (char *)key);
                        return ret;
                }
@@ -459,7 +482,7 @@ void run_session(void)
                driver = sr_dev_inst_driver_get(sdi);
 
                if (sr_config_list(driver, sdi, NULL, SR_CONF_DEVICE_OPTIONS, &gvar) != SR_OK) {
-                       g_critical("Failed to query sr_config_list(SR_CONF_DEVICE_OPTIONS).");
+                       g_critical("Failed to query list device options.");
                        return;
                }
 
@@ -553,8 +576,8 @@ void run_session(void)
                        sr_session_destroy(session);
                        return;
                }
-               if (sr_config_list(driver, sdi, NULL,
-                               SR_CONF_LIMIT_SAMPLES, &gvar) == SR_OK) {
+               if (maybe_config_list(driver, sdi, NULL, SR_CONF_LIMIT_SAMPLES,
+                               &gvar) == SR_OK) {
                        /* The device has no compression, or compression is turned
                         * off, and publishes its sample memory size. */
                        g_variant_get(gvar, "(tt)", &min_samples, &max_samples);
@@ -569,7 +592,7 @@ void run_session(void)
                        }
                }
                gvar = g_variant_new_uint64(limit_samples);
-               if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_SAMPLES, gvar) != SR_OK) {
+               if (maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, NULL, SR_CONF_LIMIT_SAMPLES, gvar) != SR_OK) {
                        g_critical("Failed to configure sample limit.");
                        sr_session_destroy(session);
                        return;
@@ -583,7 +606,7 @@ void run_session(void)
                        return;
                }
                gvar = g_variant_new_uint64(limit_frames);
-               if (sr_config_set(sdi, NULL, SR_CONF_LIMIT_FRAMES, gvar) != SR_OK) {
+               if (maybe_config_set(sr_dev_inst_driver_get(sdi), sdi, NULL, SR_CONF_LIMIT_FRAMES, gvar) != SR_OK) {
                        g_critical("Failed to configure frame limit.");
                        sr_session_destroy(session);
                        return;