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 ab3342a..e0709ca 100644
--- a/src/hardware/asix-sigma/protocol.c
+++ b/src/hardware/asix-sigma/protocol.c
@@ -798,6 +798,34 @@
 }
 
 /*
+ * 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
  * number of samples per event.
@@ -854,7 +882,7 @@
 		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 @@
 			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 @@
 		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 @@
 		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 52913da..e4b3ea5 100644
--- a/src/hardware/asix-sigma/protocol.h
+++ b/src/hardware/asix-sigma/protocol.h
@@ -239,6 +239,7 @@
 	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;