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