]> sigrok.org Git - libsigrok.git/blobdiff - hardware/sysclk-lwla/api.c
sysclk-lwla: Implement SR_CONF_LIMIT_MSEC.
[libsigrok.git] / hardware / sysclk-lwla / api.c
index e20564a56232cee28ceb13e590f6bf67a56dc4cb..5b9f4330b75682271b82eb44ff23a27a07733c1f 100644 (file)
@@ -30,6 +30,7 @@ static const int32_t hwcaps[] = {
        SR_CONF_SAMPLERATE,
        SR_CONF_EXTERNAL_CLOCK,
        SR_CONF_TRIGGER_TYPE,
+       SR_CONF_LIMIT_MSEC,
        SR_CONF_LIMIT_SAMPLES,
 };
 
@@ -65,7 +66,7 @@ static GSList *gen_probe_list(int num_probes)
 
        for (i = num_probes; i > 0; --i) {
                /* The LWLA series simply number probes from CH1 to CHxx. */
-               g_ascii_formatd(name, sizeof name, "CH%.0f", i);
+               g_snprintf(name, sizeof(name), "CH%d", i);
 
                probe = sr_probe_new(i - 1, SR_PROBE_LOGIC, TRUE, name);
                list = g_slist_prepend(list, probe);
@@ -254,6 +255,9 @@ static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi,
        case SR_CONF_SAMPLERATE:
                *data = g_variant_new_uint64(devc->samplerate);
                break;
+       case SR_CONF_LIMIT_MSEC:
+               *data = g_variant_new_uint64(devc->limit_msec);
+               break;
        case SR_CONF_LIMIT_SAMPLES:
                *data = g_variant_new_uint64(devc->limit_samples);
                break;
@@ -271,8 +275,8 @@ static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi,
 static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi,
                      const struct sr_probe_group *probe_group)
 {
+       uint64_t value;
        struct dev_context *devc;
-       uint64_t rate;
 
        (void)probe_group;
 
@@ -282,15 +286,24 @@ static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi,
 
        switch (key) {
        case SR_CONF_SAMPLERATE:
-               rate = g_variant_get_uint64(data);
-               sr_info("Setting samplerate %" G_GUINT64_FORMAT, rate);
-               if (rate > samplerates[0]
-                   || rate < samplerates[G_N_ELEMENTS(samplerates) - 1])
+               value = g_variant_get_uint64(data);
+               sr_info("Setting samplerate %" PRIu64, value);
+               if (value < samplerates[G_N_ELEMENTS(samplerates) - 1]
+                               || value > samplerates[0])
                        return SR_ERR_SAMPLERATE;
-               devc->samplerate = rate;
+               devc->samplerate = value;
+               break;
+       case SR_CONF_LIMIT_MSEC:
+               value = g_variant_get_uint64(data);
+               if (value > MAX_LIMIT_MSEC)
+                       return SR_ERR_ARG;
+               devc->limit_msec = value;
                break;
        case SR_CONF_LIMIT_SAMPLES:
-               devc->limit_samples = g_variant_get_uint64(data);
+               value = g_variant_get_uint64(data);
+               if (value > MAX_LIMIT_SAMPLES)
+                       return SR_ERR_ARG;
+               devc->limit_samples = value;
                break;
        case SR_CONF_EXTERNAL_CLOCK:
                if (g_variant_get_boolean(data)) {
@@ -357,18 +370,17 @@ static int configure_probes(const struct sr_dev_inst *sdi)
        devc->trigger_edge_mask = 0;
        devc->trigger_values = 0;
 
-       for (node = sdi->probes, probe_bit = 1;
-                       node != NULL;
-                       node = node->next, probe_bit <<= 1) {
-
-               if (probe_bit >= ((uint64_t)1 << NUM_PROBES)) {
-                       sr_err("Channels over the limit of %d.", NUM_PROBES);
-                       return SR_ERR;
-               }
+       for (node = sdi->probes; node != NULL; node = node->next) {
                probe = node->data;
                if (!probe || !probe->enabled)
                        continue;
 
+               if (probe->index >= NUM_PROBES) {
+                       sr_err("Channel index %d out of range.", probe->index);
+                       return SR_ERR_BUG;
+               }
+               probe_bit = (uint64_t)1 << probe->index;
+
                /* Enable input channel for this probe. */
                devc->channel_mask |= probe_bit;