X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fbeaglelogic%2Fprotocol.c;h=053daad9176e7b4390faf522a285bec4c5f949aa;hb=HEAD;hp=55e2b647deefd5f11dcbb86da9483a08e1beaeac;hpb=6ec6c43b4738dbc7091f4a49a4ec80ea6102cb52;p=libsigrok.git diff --git a/src/hardware/beaglelogic/protocol.c b/src/hardware/beaglelogic/protocol.c index 55e2b647..053daad9 100644 --- a/src/hardware/beaglelogic/protocol.c +++ b/src/hardware/beaglelogic/protocol.c @@ -1,7 +1,7 @@ /* * This file is part of the libsigrok project. * - * Copyright (C) 2014 Kumar Abhishek + * Copyright (C) 2014-2017 Kumar Abhishek * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,16 @@ #include #include #include +#ifdef _WIN32 +#define _WIN32_WINNT 0x0501 +#include +#include +#else +#include +#endif +#include #include "protocol.h" +#include "beaglelogic.h" /* Define data packet size independent of packet (bufunitsize bytes) size * from the BeagleLogic kernel module */ @@ -32,7 +41,7 @@ * kernel buffers appropriately. It is up to the application which is * using libsigrok to decide how to deal with the data. */ -SR_PRIV int beaglelogic_receive_data(int fd, int revents, void *cb_data) +SR_PRIV int beaglelogic_native_receive_data(int fd, int revents, void *cb_data) { const struct sr_dev_inst *sdi; struct dev_context *devc; @@ -64,7 +73,7 @@ SR_PRIV int beaglelogic_receive_data(int fd, int revents, void *cb_data) if (devc->trigger_fired) { /* Send the incoming transfer to the session bus. */ - sr_session_send(devc->cb_data, &packet); + sr_session_send(sdi, &packet); } else { /* Check for trigger */ trigger_offset = soft_trigger_logic_check(devc->stl, @@ -76,7 +85,7 @@ SR_PRIV int beaglelogic_receive_data(int fd, int revents, void *cb_data) bytes_remaining); logic.data += trigger_offset; - sr_session_send(devc->cb_data, &packet); + sr_session_send(sdi, &packet); devc->trigger_fired = TRUE; } @@ -90,7 +99,7 @@ SR_PRIV int beaglelogic_receive_data(int fd, int revents, void *cb_data) if ((devc->offset += packetsize) >= devc->buffersize) { /* One shot capture, we abort and settle with less than * the required number of samples */ - if (devc->triggerflags) + if (devc->triggerflags == BL_TRIGGERFLAGS_CONTINUOUS) devc->offset = 0; else packetsize = 0; @@ -101,9 +110,93 @@ SR_PRIV int beaglelogic_receive_data(int fd, int revents, void *cb_data) if (devc->bytes_read >= devc->limit_samples * logic.unitsize || packetsize == 0) { /* Send EOA Packet, stop polling */ - packet.type = SR_DF_END; - packet.payload = NULL; - sr_session_send(devc->cb_data, &packet); + std_session_send_df_end(sdi); + sr_session_source_remove_pollfd(sdi->session, &devc->pollfd); + } + + return TRUE; +} + +SR_PRIV int beaglelogic_tcp_receive_data(int fd, int revents, void *cb_data) +{ + const struct sr_dev_inst *sdi; + struct dev_context *devc; + struct sr_datafeed_packet packet; + struct sr_datafeed_logic logic; + + int len; + int pre_trigger_samples; + int trigger_offset; + uint32_t packetsize; + uint64_t bytes_remaining; + + if (!(sdi = cb_data) || !(devc = sdi->priv)) + return TRUE; + + packetsize = TCP_BUFFER_SIZE; + logic.unitsize = SAMPLEUNIT_TO_BYTES(devc->sampleunit); + + if (revents == G_IO_IN) { + sr_info("In callback G_IO_IN"); + + len = recv(fd, devc->tcp_buffer, TCP_BUFFER_SIZE, 0); + if (len < 0) { + sr_err("Receive error: %s", g_strerror(errno)); + return SR_ERR; + } + + packetsize = len; + + bytes_remaining = (devc->limit_samples * logic.unitsize) - + devc->bytes_read; + + /* Configure data packet */ + packet.type = SR_DF_LOGIC; + packet.payload = &logic; + logic.data = devc->tcp_buffer; + logic.length = MIN(packetsize, bytes_remaining); + + if (devc->trigger_fired) { + /* Send the incoming transfer to the session bus. */ + sr_session_send(sdi, &packet); + } else { + /* Check for trigger */ + trigger_offset = soft_trigger_logic_check(devc->stl, + logic.data, packetsize, &pre_trigger_samples); + if (trigger_offset > -1) { + devc->bytes_read += pre_trigger_samples * logic.unitsize; + trigger_offset *= logic.unitsize; + logic.length = MIN(packetsize - trigger_offset, + bytes_remaining); + logic.data += trigger_offset; + + sr_session_send(sdi, &packet); + + devc->trigger_fired = TRUE; + } + } + + /* Update byte count and offset (roll over if needed) */ + devc->bytes_read += logic.length; + if ((devc->offset += packetsize) >= devc->buffersize) { + /* One shot capture, we abort and settle with less than + * the required number of samples */ + if (devc->triggerflags == BL_TRIGGERFLAGS_CONTINUOUS) + devc->offset = 0; + else + packetsize = 0; + } + } + + /* EOF Received or we have reached the limit */ + if (devc->bytes_read >= devc->limit_samples * logic.unitsize || + packetsize == 0) { + /* Send EOA Packet, stop polling */ + std_session_send_df_end(sdi); + devc->beaglelogic->stop(devc); + + /* Drain the receive buffer */ + beaglelogic_tcp_drain(devc); sr_session_source_remove_pollfd(sdi->session, &devc->pollfd); }