]> sigrok.org Git - libsigrok.git/blobdiff - hardware/fx2lafw/fx2lafw.c
sr: fx2lafw: Set correct unitsize for trigger buffer
[libsigrok.git] / hardware / fx2lafw / fx2lafw.c
index 2c0c6360164a70f37a59aedd93950a154dec298a..76c5019d1da3929e455699f380aa4f25e04bba63 100644 (file)
@@ -328,7 +328,7 @@ static int configure_probes(struct context *ctx, GSList *probes)
                        continue;
 
                if (probe->index > 8)
-                       ctx->sample_wide = true;
+                       ctx->sample_wide = TRUE;
 
                probe_bit = 1 << (probe->index - 1);
                if (!(probe->trigger))
@@ -706,6 +706,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
        /* Fire off a new request. */
        if (!(new_buf = g_try_malloc(4096))) {
                sr_err("fx2lafw: %s: new_buf malloc failed.", __func__);
+               libusb_free_transfer(transfer);
                return; /* TODO: SR_ERR_MALLOC */
        }
 
@@ -726,6 +727,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
                         */
                        abort_acquisition(ctx);
                }
+               g_free(cur_buf);
                return;
        } else {
                empty_transfer_count = 0;
@@ -764,25 +766,22 @@ static void receive_transfer(struct libusb_transfer *transfer)
                                         */
                                        packet.type = SR_DF_LOGIC;
                                        packet.payload = &logic;
-                                       logic.length = ctx->trigger_stage;
-                                       logic.unitsize = 1;
+                                       logic.unitsize = sizeof(*ctx->trigger_buffer);
+                                       logic.length = ctx->trigger_stage * logic.unitsize;
                                        logic.data = ctx->trigger_buffer;
                                        sr_session_send(ctx->session_dev_id, &packet);
 
                                        ctx->trigger_stage = TRIGGER_FIRED;
                                        break;
                                }
-                               return;
-                       }
-
-                       /*
-                        * 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) {
+                       } else if (ctx->trigger_stage > 0) {
+                               /*
+                                * 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.
+                                */
                                i -= ctx->trigger_stage;
                                if (i < -1)
                                        i = -1; /* Oops, went back past this buffer. */
@@ -794,14 +793,13 @@ static void receive_transfer(struct libusb_transfer *transfer)
 
        if (ctx->trigger_stage == TRIGGER_FIRED) {
                /* Send the incoming transfer to the session bus. */
-               const trigger_offset_bytes = trigger_offset * sample_width;
+               const int trigger_offset_bytes = trigger_offset * sample_width;
                packet.type = SR_DF_LOGIC;
                packet.payload = &logic;
                logic.length = transfer->actual_length - trigger_offset_bytes;
                logic.unitsize = sample_width;
                logic.data = cur_buf + trigger_offset_bytes;
                sr_session_send(ctx->session_dev_id, &packet);
-               g_free(cur_buf);
 
                ctx->num_samples += cur_sample_count;
                if (ctx->limit_samples &&
@@ -814,6 +812,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
                 * ratio-sized buffer.
                 */
        }
+       g_free(cur_buf);
 }
 
 static int hw_dev_acquisition_start(int dev_index, void *cb_data)