X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fasix-sigma%2Fprotocol.c;h=e0709cae31b500ee63db69dabb4b353dba0d14c1;hb=735ed8a18e958456b714004408fad3c7f7d72a4c;hp=ab3342a0af0812b5b3ead235b3842e0cd2f3d5ba;hpb=22f64ed88c2128ebadf09eafa3e12c8ed76cff7f;p=libsigrok.git 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