]> sigrok.org Git - libsigrok.git/commitdiff
asix-sigma: Enforce optionally specified sample count
authorGerhard Sittig <redacted>
Thu, 25 May 2017 21:43:04 +0000 (23:43 +0200)
committerUwe Hermann <redacted>
Fri, 26 May 2017 20:48:27 +0000 (22:48 +0200)
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.

src/hardware/asix-sigma/protocol.c
src/hardware/asix-sigma/protocol.h

index ab3342a0af0812b5b3ead235b3842e0cd2f3d5ba..e0709cae31b500ee63db69dabb4b353dba0d14c1 100644 (file)
@@ -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
index 52913da75dcbf99f8d47ca8654eb5bcb925f4bae..e4b3ea5f1106e994ccd9e81e90b436b475dd3931 100644 (file)
@@ -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;