- ctx->num_samples += cur_buflen;
- if (ctx->limit_samples &&
- (unsigned int) ctx->num_samples > ctx->limit_samples) {
- abort_acquisition(ctx);
+ /*
+ * We had a match before, but not in the next sample. However, we may
+ * have a match on this stage in the next bit -- trigger on 0001 will
+ * fail on seeing 00001, so we need to go back to stage 0 -- but at
+ * the next sample from the one that matched originally, which the
+ * counter increment at the end of the loop takes care of.
+ */
+ if (ctx->trigger_stage > 0) {
+ i -= ctx->trigger_stage;
+ if (i < -1)
+ i = -1; /* Oops, went back past this buffer. */
+ /* Reset trigger stage. */
+ ctx->trigger_stage = 0;
+ }
+ }
+ }
+
+ if (ctx->trigger_stage == TRIGGER_FIRED) {
+ /* Send the incoming transfer to the session bus. */
+ packet.type = SR_DF_LOGIC;
+ packet.payload = &logic;
+ logic.length = cur_buflen - trigger_offset;
+ logic.unitsize = 1;
+ logic.data = cur_buf + trigger_offset;
+ sr_session_send(ctx->session_dev_id, &packet);
+ g_free(cur_buf);
+
+ ctx->num_samples += cur_buflen;
+ if (ctx->limit_samples &&
+ (unsigned int)ctx->num_samples > ctx->limit_samples) {
+ abort_acquisition(ctx);
+ }
+ } else {
+ /*
+ * TODO: Buffer pre-trigger data in capture
+ * ratio-sized buffer.
+ */