From: Joel Holdsworth Date: Sat, 3 Mar 2012 15:18:19 +0000 (+0000) Subject: saleae-logic: Moved num_samples into context struct X-Git-Tag: libsigrok-0.1.0~60 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=266784d5947137040b4a72d0e00dc97c0c8b40ba;p=libsigrok.git saleae-logic: Moved num_samples into context struct --- diff --git a/hardware/saleae-logic/saleae-logic.c b/hardware/saleae-logic/saleae-logic.c index 140af8b9..d33a5cc0 100644 --- a/hardware/saleae-logic/saleae-logic.c +++ b/hardware/saleae-logic/saleae-logic.c @@ -672,26 +672,33 @@ static int receive_data(int fd, int revents, void *cb_data) return TRUE; } +static void abort_acquisition(struct context *ctx) +{ + struct sr_datafeed_packet packet; + + packet.type = SR_DF_END; + sr_session_send(ctx->session_dev_id, &packet); + + ctx->num_samples = -1; + + /* TODO: Need to cancel and free any queued up transfers. */ +} + static void receive_transfer(struct libusb_transfer *transfer) { /* TODO: These statics have to move to the ctx struct. */ - static int num_samples = 0; static int empty_transfer_count = 0; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; - struct context *ctx; + struct context *ctx = transfer->user_data; int cur_buflen, trigger_offset, i; unsigned char *cur_buf, *new_buf; - /* hw_dev_acquisition_stop() is telling us to stop. */ - if (transfer == NULL) - num_samples = -1; - /* * If acquisition has already ended, just free any queued up * transfer that come in. */ - if (num_samples == -1) { + if (ctx->num_samples == -1) { if (transfer) libusb_free_transfer(transfer); return; @@ -726,7 +733,7 @@ static void receive_transfer(struct libusb_transfer *transfer) * The FX2 gave up. End the acquisition, the frontend * will work out that the samplecount is short. */ - hw_dev_acquisition_stop(-1, ctx->session_dev_id); + abort_acquisition(ctx); } return; } else { @@ -798,9 +805,9 @@ static void receive_transfer(struct libusb_transfer *transfer) sr_session_send(ctx->session_dev_id, &packet); g_free(cur_buf); - num_samples += cur_buflen; - if (ctx->limit_samples && (unsigned int) num_samples > ctx->limit_samples) { - hw_dev_acquisition_stop(-1, ctx->session_dev_id); + ctx->num_samples += cur_buflen; + if (ctx->limit_samples && (unsigned int)ctx->num_samples > ctx->limit_samples) { + abort_acquisition(ctx); } } else { /* @@ -825,6 +832,7 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) return SR_ERR; ctx = sdi->priv; ctx->session_dev_id = cb_data; + ctx->num_samples = 0; if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) { sr_err("logic: %s: packet malloc failed", __func__); @@ -878,17 +886,15 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) /* TODO: This stops acquisition on ALL devices, ignoring dev_index. */ static int hw_dev_acquisition_stop(int dev_index, void *cb_data) { - struct sr_datafeed_packet packet; - - /* Avoid compiler warnings. */ - (void)dev_index; + struct sr_dev_inst *sdi; - packet.type = SR_DF_END; - sr_session_send(cb_data, &packet); + /* unused parameter */ + (void)cb_data; - receive_transfer(NULL); + if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) + return SR_ERR; - /* TODO: Need to cancel and free any queued up transfers. */ + abort_acquisition(sdi->priv); return SR_OK; } diff --git a/hardware/saleae-logic/saleae-logic.h b/hardware/saleae-logic/saleae-logic.h index 5c0b34a2..5378616e 100644 --- a/hardware/saleae-logic/saleae-logic.h +++ b/hardware/saleae-logic/saleae-logic.h @@ -65,6 +65,7 @@ struct context { uint8_t trigger_value[NUM_TRIGGER_STAGES]; int trigger_stage; uint8_t trigger_buffer[NUM_TRIGGER_STAGES]; + int num_samples; /* * opaque session data passed in by the frontend, will be passed back * on the session bus along with samples.