X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fsysclk-lwla%2Fapi.c;h=43ab370b38e2f1216c0729aeca6a84f06a29823d;hb=2b399703d10dedfbed1f6b13070e0c3f5fd9938b;hp=e20564a56232cee28ceb13e590f6bf67a56dc4cb;hpb=7ebe9b9e7e8649fa592527d7cba2cf49804c3652;p=libsigrok.git diff --git a/hardware/sysclk-lwla/api.c b/hardware/sysclk-lwla/api.c index e20564a5..43ab370b 100644 --- a/hardware/sysclk-lwla/api.c +++ b/hardware/sysclk-lwla/api.c @@ -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,23 @@ 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); + 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 +369,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;