From: Gerhard Sittig Date: Thu, 25 May 2017 21:43:04 +0000 (+0200) Subject: asix-sigma: Enforce optionally specified sample count X-Git-Tag: libsigrok-0.5.0~38 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=735ed8a18e958456b714004408fad3c7f7d72a4c asix-sigma: Enforce optionally specified sample count The Asix Sigma hardware does not support a sample count limit. Instead this optional input parameter gets mapped to a sample time, and some slack for hardware pipelines and compression gets added. When data acquisition completes and sample data gets downloaded, chances are that there is more data than requested by the user. Do enforce the optional sample count limit. Stop sending data to the sigrok session when the configured number of samples was sent. This commit is based on work done by jry@. This fixes bug #838. --- diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index ab3342a0..e0709cae 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -797,6 +797,34 @@ static void store_sr_sample(uint8_t *samples, int idx, uint16_t data) samples[2 * idx + 1] = (data >> 8) & 0xff; } +/* + * Local wrapper around sr_session_send() calls. Make sure to not send + * more samples to the session's datafeed than what was requested by a + * previously configured (optional) sample count. + */ +static void sigma_session_send(struct sr_dev_inst *sdi, + struct sr_datafeed_packet *packet) +{ + struct dev_context *devc; + struct sr_datafeed_logic *logic; + uint64_t send_now; + + devc = sdi->priv; + if (devc->limit_samples) { + logic = (void *)packet->payload; + send_now = logic->length / logic->unitsize; + if (devc->sent_samples + send_now > devc->limit_samples) { + send_now = devc->limit_samples - devc->sent_samples; + logic->length = send_now * logic->unitsize; + } + if (!send_now) + return; + devc->sent_samples += send_now; + } + + sr_session_send(sdi, packet); +} + /* * This size translates to: event count (1K events per cluster), times * the sample width (unitsize, 16bits per event), times the maximum @@ -854,7 +882,7 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, if ((i == 1023) || (ts == tsdiff - 1)) { logic.length = (i + 1) * logic.unitsize; for (j = 0; j < devc->samples_per_event; j++) - sr_session_send(sdi, &packet); + sigma_session_send(sdi, &packet); } } @@ -908,7 +936,7 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, trig_count = trigger_offset * devc->samples_per_event; packet.type = SR_DF_LOGIC; logic.length = trig_count * logic.unitsize; - sr_session_send(sdi, &packet); + sigma_session_send(sdi, &packet); send_ptr += trig_count * logic.unitsize; send_count -= trig_count; } @@ -928,7 +956,7 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, packet.type = SR_DF_LOGIC; logic.length = send_count * logic.unitsize; logic.data = send_ptr; - sr_session_send(sdi, &packet); + sigma_session_send(sdi, &packet); } ss->lastsample = sample; @@ -1042,6 +1070,8 @@ static int download_capture(struct sr_dev_inst *sdi) trg_event = triggerpos & 0x1ff; } + devc->sent_samples = 0; + /* * Determine how many 1024b "DRAM lines" do we need to read from the * Sigma so we have a complete set of samples. Note that the last diff --git a/src/hardware/asix-sigma/protocol.h b/src/hardware/asix-sigma/protocol.h index 52913da7..e4b3ea5f 100644 --- a/src/hardware/asix-sigma/protocol.h +++ b/src/hardware/asix-sigma/protocol.h @@ -239,6 +239,7 @@ struct dev_context { uint64_t period_ps; uint64_t limit_msec; uint64_t limit_samples; + uint64_t sent_samples; struct timeval start_tv; int cur_firmware; int num_channels;