File 0008-fix-ensure-data-are-fully-handled-before-be-triggere.patch of Package libsigrok

From 178919f15b8160208a7c743d0f486eb09020e6ea Mon Sep 17 00:00:00 2001
From: taorye <taorye@outlook.com>
Date: Wed, 10 Dec 2025 11:36:30 +0800
Subject: [PATCH 08/17] fix: ensure data are fully handled before be triggered

---
 src/hardware/sipeed-slogic-analyzer/api.c     | 40 ++++++++++++++-----
 .../sipeed-slogic-analyzer/protocol.c         | 11 ++---
 2 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/src/hardware/sipeed-slogic-analyzer/api.c b/src/hardware/sipeed-slogic-analyzer/api.c
index cbd4db154..683d8f7c0 100644
--- a/src/hardware/sipeed-slogic-analyzer/api.c
+++ b/src/hardware/sipeed-slogic-analyzer/api.c
@@ -722,21 +722,41 @@ int slogic_soft_trigger_raw_data(void *data, size_t len,
 		len *= nsp_in_bytes; // need reshape
 	}
 
+	// // debug raw data
+	// sr_session_send(sdi, &(struct sr_datafeed_packet){
+	// 				.type = SR_DF_LOGIC,
+	// 				.payload = &(struct sr_datafeed_logic){
+	// 					.length = len,
+	// 					.unitsize = (nCh + 7) / 8,
+	// 					.data = ptr,
+	// 				} });
+
 	int pre_trigger_samples;
 	devc->stl->unitsize = uintsize;
 	int64_t trigger_offset = soft_trigger_logic_check(devc->stl, ptr, len, &pre_trigger_samples);
 	if (trigger_offset > -1) {
-		ret += pre_trigger_samples;
-
-		sr_session_send(sdi, &(struct sr_datafeed_packet){
-				     .type = SR_DF_LOGIC,
-				     .payload = &(struct sr_datafeed_logic){
-					     .length = len - trigger_offset * uintsize,
-					     .unitsize = uintsize,
-					     .data = ptr + trigger_offset * uintsize,
-				     } });
+		ret += pre_trigger_samples * uintsize;
+		if (ret) {
+			int need = devc->samples_need_nbytes - devc->samples_got_nbytes - ret;
+
+			if (need > 0) {
+				int remain = len - trigger_offset * uintsize;
+				if (need < remain)
+					remain = need;
+
+				sr_session_send(sdi, &(struct sr_datafeed_packet){
+							.type = SR_DF_LOGIC,
+							.payload = &(struct sr_datafeed_logic){
+								.length = remain,
+								.unitsize = uintsize,
+								.data = ptr + trigger_offset * uintsize,
+							} });
+
+				ret += remain;
+			}
 
-		ret += len / uintsize - trigger_offset;
+			devc->samples_got_nbytes += ret;
+		}
 	}
 
 	if (nCh < 8)
diff --git a/src/hardware/sipeed-slogic-analyzer/protocol.c b/src/hardware/sipeed-slogic-analyzer/protocol.c
index 4f3979172..ba04f6de9 100644
--- a/src/hardware/sipeed-slogic-analyzer/protocol.c
+++ b/src/hardware/sipeed-slogic-analyzer/protocol.c
@@ -58,7 +58,7 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
 		devc->transfers_reached_nbytes +=
 			devc->transfers_reached_nbytes_latest;
 
-		if (transfer->actual_length >
+		if (devc->trigger_fired && transfer->actual_length >
 		    devc->samples_need_nbytes - devc->samples_got_nbytes)
 			transfer->actual_length = devc->samples_need_nbytes -
 						  devc->samples_got_nbytes;
@@ -99,7 +99,10 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
 			g_async_queue_push(devc->raw_data_queue, array);
 		}
 
-		if (!devc->trigger_fired || devc->samples_got_nbytes +
+		if (!devc->trigger_fired)
+			devc->samples_got_nbytes = 0;
+
+		if (devc->samples_got_nbytes +
 			    devc->num_transfers_used *
 				    devc->per_transfer_nbytes <
 		    devc->samples_need_nbytes) {
@@ -126,7 +129,7 @@ static void LIBUSB_CALL receive_transfer(struct libusb_transfer *transfer)
 		break;
 	}
 
-	if (devc->trigger_fired && devc->num_transfers_completed &&
+	if (devc->num_transfers_completed &&
 	    (double)transfers_reached_duration / SR_KHZ(1) >
 		    (TRANSFERS_DURATION_TOLERANCE + 1) *
 			    devc->per_transfer_duration) {
@@ -230,11 +233,9 @@ static int handle_events(int fd, int revents, void *cb_data)
 				devc->model->submit_raw_data(
 					array->data, array->len, sdi);
 			} else if (devc->stl) {
-				devc->samples_got_nbytes = 0;
 				extern int slogic_soft_trigger_raw_data(void *data, size_t len, const struct sr_dev_inst *sdi);
 				int sent_samples = slogic_soft_trigger_raw_data(array->data, array->len, sdi);
 				if (sent_samples) {
-					devc->samples_got_nbytes += sent_samples * devc->cur_samplechannel / 8;
 					devc->trigger_fired = TRUE;
 				}
 			}
-- 
2.52.0

openSUSE Build Service is sponsored by