X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fbeaglelogic%2Fbeaglelogic_tcp.c;h=e06a19a82a8b5a76df44af8c0085b98f07272e63;hb=f2cd2debf9dcbf0e83ec70d8ea41d8421a400dfd;hp=8baf4eef055702dd23bc3e43b9fd8c2c89eaf534;hpb=9b2b3ef93e9821ffc9edc1c8bdd929c0143939dd;p=libsigrok.git diff --git a/src/hardware/beaglelogic/beaglelogic_tcp.c b/src/hardware/beaglelogic/beaglelogic_tcp.c index 8baf4eef..e06a19a8 100644 --- a/src/hardware/beaglelogic/beaglelogic_tcp.c +++ b/src/hardware/beaglelogic/beaglelogic_tcp.c @@ -2,7 +2,8 @@ * This file is part of the libsigrok project. * * Copyright (C) 2017 Kumar Abhishek - * Portions of the code are adopted from scpi_tcp.c and scpi.c + * Portions of the code are adapted from scpi_tcp.c and scpi.c, their + * copyright notices are listed below: * * Copyright (C) 2013 Martin Ling * Copyright (C) 2013 poljar (Damir Jelić) @@ -41,7 +42,8 @@ #include "protocol.h" #include "beaglelogic.h" -static int beaglelogic_tcp_open(struct dev_context *devc) { +static int beaglelogic_tcp_open(struct dev_context *devc) +{ struct addrinfo hints; struct addrinfo *results, *res; int err; @@ -83,7 +85,8 @@ static int beaglelogic_tcp_open(struct dev_context *devc) { } static int beaglelogic_tcp_send_cmd(struct dev_context *devc, - const char *format, ...) { + const char *format, ...) +{ int len, out; va_list args, args_copy; char *buf; @@ -104,22 +107,25 @@ static int beaglelogic_tcp_send_cmd(struct dev_context *devc, if (out < 0) { sr_err("Send error: %s", g_strerror(errno)); + g_free(buf); return SR_ERR; } if (out < (int)strlen(buf)) { - sr_dbg("Only sent %d/%d bytes of command: '%s'.", out, + sr_dbg("Only sent %d/%zu bytes of command: '%s'.", out, strlen(buf), buf); } sr_spew("Sent command: '%s'.", buf); + g_free(buf); return SR_OK; } static int beaglelogic_tcp_read_data(struct dev_context *devc, char *buf, - int maxlen) { + int maxlen) +{ int len; len = recv(devc->socket, buf, maxlen, 0); @@ -132,16 +138,44 @@ static int beaglelogic_tcp_read_data(struct dev_context *devc, char *buf, return len; } +SR_PRIV int beaglelogic_tcp_drain(struct dev_context *devc) +{ + char *buf = g_malloc(1024); + fd_set rset; + int ret, len = 0; + struct timeval tv; + + FD_ZERO(&rset); + FD_SET(devc->socket, &rset); + + /* 25ms timeout */ + tv.tv_sec = 0; + tv.tv_usec = 25 * 1000; + + do { + ret = select(devc->socket + 1, &rset, NULL, NULL, &tv); + if (ret > 0) + len += beaglelogic_tcp_read_data(devc, buf, 1024); + } while (ret > 0); + + sr_spew("Drained %d bytes of data.", len); + + g_free(buf); + + return SR_OK; +} + static int beaglelogic_tcp_get_string(struct dev_context *devc, const char *cmd, - char **tcp_resp) { + char **tcp_resp) +{ GString *response = g_string_sized_new(1024); int len; gint64 timeout; + *tcp_resp = NULL; if (cmd) { - if (beaglelogic_tcp_send_cmd(devc, cmd) != SR_OK) { + if (beaglelogic_tcp_send_cmd(devc, cmd) != SR_OK) return SR_ERR; - } } timeout = g_get_monotonic_time() + devc->read_timeout; @@ -153,9 +187,8 @@ static int beaglelogic_tcp_get_string(struct dev_context *devc, const char *cmd, return SR_ERR; } - if (len > 0) { + if (len > 0) g_string_set_size(response, len); - } if (g_get_monotonic_time() > timeout) { sr_err("Timed out waiting for response."); @@ -175,11 +208,13 @@ static int beaglelogic_tcp_get_string(struct dev_context *devc, const char *cmd, response->str, response->len); *tcp_resp = g_string_free(response, FALSE); + return SR_OK; } static int beaglelogic_tcp_get_int(struct dev_context *devc, - const char *cmd, int *response) { + const char *cmd, int *response) +{ int ret; char *resp = NULL; @@ -197,7 +232,8 @@ static int beaglelogic_tcp_get_int(struct dev_context *devc, return ret; } -SR_PRIV int beaglelogic_tcp_detect(struct dev_context *devc) { +SR_PRIV int beaglelogic_tcp_detect(struct dev_context *devc) +{ char *resp = NULL; int ret; @@ -208,33 +244,35 @@ SR_PRIV int beaglelogic_tcp_detect(struct dev_context *devc) { ret = SR_ERR; g_free(resp); + return ret; } -static int beaglelogic_open(struct dev_context *devc) { +static int beaglelogic_open(struct dev_context *devc) +{ return beaglelogic_tcp_open(devc); } -static int beaglelogic_close(struct dev_context *devc) { - g_free(devc->address); - g_free(devc->port); - +static int beaglelogic_close(struct dev_context *devc) +{ if (close(devc->socket) < 0) return SR_ERR; return SR_OK; } -static int beaglelogic_get_buffersize(struct dev_context *devc) { +static int beaglelogic_get_buffersize(struct dev_context *devc) +{ return beaglelogic_tcp_get_int(devc, "memalloc", (int *)&devc->buffersize); } -static int beaglelogic_set_buffersize(struct dev_context *devc) { +static int beaglelogic_set_buffersize(struct dev_context *devc) +{ int ret; char *resp; - beaglelogic_tcp_send_cmd(devc, "memalloc %lu", devc->buffersize); + beaglelogic_tcp_send_cmd(devc, "memalloc %" PRIu32, devc->buffersize); ret = beaglelogic_tcp_get_string(devc, NULL, &resp); if (ret == SR_OK && !g_ascii_strncasecmp(resp, "ok", 2)) ret = SR_OK; @@ -242,21 +280,28 @@ static int beaglelogic_set_buffersize(struct dev_context *devc) { ret = SR_ERR; g_free(resp); + return ret; } -static int beaglelogic_get_samplerate(struct dev_context *devc) { +static int beaglelogic_get_samplerate(struct dev_context *devc) +{ int arg, err; + err = beaglelogic_tcp_get_int(devc, "samplerate", &arg); + if (err) + return err; + devc->cur_samplerate = arg; - return err; + return SR_OK; } -static int beaglelogic_set_samplerate(struct dev_context *devc) { +static int beaglelogic_set_samplerate(struct dev_context *devc) +{ int ret; char *resp; - beaglelogic_tcp_send_cmd(devc, "samplerate %lu", + beaglelogic_tcp_send_cmd(devc, "samplerate %" PRIu32, (uint32_t)devc->cur_samplerate); ret = beaglelogic_tcp_get_string(devc, NULL, &resp); if (ret == SR_OK && !g_ascii_strncasecmp(resp, "ok", 2)) @@ -265,19 +310,22 @@ static int beaglelogic_set_samplerate(struct dev_context *devc) { ret = SR_ERR; g_free(resp); + return ret; } -static int beaglelogic_get_sampleunit(struct dev_context *devc) { +static int beaglelogic_get_sampleunit(struct dev_context *devc) +{ return beaglelogic_tcp_get_int(devc, "sampleunit", (int *)&devc->sampleunit); } -static int beaglelogic_set_sampleunit(struct dev_context *devc) { +static int beaglelogic_set_sampleunit(struct dev_context *devc) +{ int ret; char *resp; - beaglelogic_tcp_send_cmd(devc, "sampleunit %lu", devc->sampleunit); + beaglelogic_tcp_send_cmd(devc, "sampleunit %" PRIu32, devc->sampleunit); ret = beaglelogic_tcp_get_string(devc, NULL, &resp); if (ret == SR_OK && !g_ascii_strncasecmp(resp, "ok", 2)) ret = SR_OK; @@ -285,19 +333,22 @@ static int beaglelogic_set_sampleunit(struct dev_context *devc) { ret = SR_ERR; g_free(resp); + return ret; } -static int beaglelogic_get_triggerflags(struct dev_context *devc) { +static int beaglelogic_get_triggerflags(struct dev_context *devc) +{ return beaglelogic_tcp_get_int(devc, "triggerflags", (int *)&devc->triggerflags); } -static int beaglelogic_set_triggerflags(struct dev_context *devc) { +static int beaglelogic_set_triggerflags(struct dev_context *devc) +{ int ret; char *resp; - beaglelogic_tcp_send_cmd(devc, "triggerflags %lu", devc->triggerflags); + beaglelogic_tcp_send_cmd(devc, "triggerflags %" PRIu32, devc->triggerflags); ret = beaglelogic_tcp_get_string(devc, NULL, &resp); if (ret == SR_OK && !g_ascii_strncasecmp(resp, "ok", 2)) ret = SR_OK; @@ -305,32 +356,41 @@ static int beaglelogic_set_triggerflags(struct dev_context *devc) { ret = SR_ERR; g_free(resp); + return ret; } -static int beaglelogic_get_lasterror(struct dev_context *devc) { +static int beaglelogic_get_lasterror(struct dev_context *devc) +{ devc->last_error = 0; + return SR_OK; } -static int beaglelogic_start(struct dev_context *devc) { +static int beaglelogic_start(struct dev_context *devc) +{ + beaglelogic_tcp_drain(devc); + return beaglelogic_tcp_send_cmd(devc, "get"); } -static int beaglelogic_stop(struct dev_context *devc) { +static int beaglelogic_stop(struct dev_context *devc) +{ return beaglelogic_tcp_send_cmd(devc, "close"); } -static int beaglelogic_get_bufunitsize(struct dev_context *devc) { +static int beaglelogic_get_bufunitsize(struct dev_context *devc) +{ return beaglelogic_tcp_get_int(devc, "bufunitsize", (int *)&devc->bufunitsize); } -static int beaglelogic_set_bufunitsize(struct dev_context *devc) { +static int beaglelogic_set_bufunitsize(struct dev_context *devc) +{ int ret; char *resp; - beaglelogic_tcp_send_cmd(devc, "bufunitsize %ld", devc->bufunitsize); + beaglelogic_tcp_send_cmd(devc, "bufunitsize %" PRIu32, devc->bufunitsize); ret = beaglelogic_tcp_get_string(devc, NULL, &resp); if (ret == SR_OK && !g_ascii_strncasecmp(resp, "ok", 2)) ret = SR_OK; @@ -338,11 +398,14 @@ static int beaglelogic_set_bufunitsize(struct dev_context *devc) { ret = SR_ERR; g_free(resp); + return ret; } -static int dummy(struct dev_context *devc) { - (devc); +static int dummy(struct dev_context *devc) +{ + (void)devc; + return SR_ERR_NA; }