X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fbeaglelogic%2Fprotocol.c;h=2787b9bac9ef56f7c043ab2974a085d45fc63819;hb=9b2b3ef93e9821ffc9edc1c8bdd929c0143939dd;hp=a0a784e874502d6ca5ef93498674ac241c331468;hpb=e743a47d6d23050c72aa1276c5df4a45a6bc5357;p=libsigrok.git diff --git a/src/hardware/beaglelogic/protocol.c b/src/hardware/beaglelogic/protocol.c index a0a784e8..2787b9ba 100644 --- a/src/hardware/beaglelogic/protocol.c +++ b/src/hardware/beaglelogic/protocol.c @@ -17,11 +17,20 @@ * along with this program. If not, see . */ -#include "protocol.h" -#include +#include #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; } @@ -101,10 +110,90 @@ 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) + 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); sr_session_source_remove_pollfd(sdi->session, &devc->pollfd); }