X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhardware%2Fipdbg-la%2Fprotocol.c;h=fc27f62df69c3cc190dd938c80ed98c7fe77c6f2;hb=f083ae63c7355b9b1d99775785b99b6fa91cd48a;hp=ac36b060839ab61c477506bff5e3fa5668060f82;hpb=c54ca323400bd03400e489cd5661bc28d81410c2;p=libsigrok.git diff --git a/src/hardware/ipdbg-la/protocol.c b/src/hardware/ipdbg-la/protocol.c index ac36b060..fc27f62d 100644 --- a/src/hardware/ipdbg-la/protocol.c +++ b/src/hardware/ipdbg-la/protocol.c @@ -67,10 +67,10 @@ static gboolean data_available(struct ipdbg_la_tcp *tcp) { #ifdef _WIN32 u_long bytes_available; - if(ioctlsocket(tcp->socket, FIONREAD, &bytes_available) != 0){ + if (ioctlsocket(tcp->socket, FIONREAD, &bytes_available) != 0) { #else int bytes_available; - if (ioctl(tcp->socket, FIONREAD, &bytes_available) < 0){ // TIOCMGET + if (ioctl(tcp->socket, FIONREAD, &bytes_available) < 0) { /* TIOCMGET */ #endif sr_err("FIONREAD failed: %s\n", g_strerror(errno)); return FALSE; @@ -143,12 +143,11 @@ SR_PRIV int ipdbg_la_tcp_close(struct ipdbg_la_tcp *tcp) int ret = SR_OK; #ifdef _WIN32 - if (shutdown(tcp->socket, SD_SEND) != SOCKET_ERROR) - { + if (shutdown(tcp->socket, SD_SEND) != SOCKET_ERROR) { char recvbuf[16]; int recvbuflen = 16; - // Receive until the peer closes the connection - while(recv(tcp->socket, recvbuf, recvbuflen, 0) > 0); + /* Receive until the peer closes the connection. */ + while (recv(tcp->socket, recvbuf, recvbuflen, 0) > 0); } #endif if (close(tcp->socket) < 0) @@ -181,14 +180,16 @@ static int tcp_receive_blocking(struct ipdbg_la_tcp *tcp, int received = 0; int error_count = 0; - /* Timeout after 500ms of not receiving data */ - while ((received < bufsize) && (error_count < 500)) { - if (ipdbg_la_tcp_receive(tcp, buf) > 0) { - buf++; - received++; + /* Timeout after 2s of not receiving data. */ + /* Increase timeout in case lab is not just beside the office. */ + while ((received < bufsize) && (error_count < 2000)) { + int recd = ipdbg_la_tcp_receive(tcp, buf, bufsize - received); + if (recd > 0) { + buf += recd; + received += recd; } else { error_count++; - g_usleep(1000); /* Sleep for 1ms */ + g_usleep(1000); } } @@ -196,24 +197,16 @@ static int tcp_receive_blocking(struct ipdbg_la_tcp *tcp, } SR_PRIV int ipdbg_la_tcp_receive(struct ipdbg_la_tcp *tcp, - uint8_t *buf) + uint8_t *buf, size_t bufsize) { int received = 0; - - if (data_available(tcp)) { - while (received < 1) { - int len = recv(tcp->socket, (char *)buf, 1, 0); - - if (len < 0) { - sr_err("Receive error: %s", g_strerror(errno)); - return SR_ERR; - } else - received += len; - } - - return received; - } else + if (data_available(tcp)) + received = recv(tcp->socket, (char *)buf, bufsize, 0); + if (received < 0) { + sr_err("Receive error: %s", g_strerror(errno)); return -1; + } else + return received; } SR_PRIV int ipdbg_la_convert_trigger(const struct sr_dev_inst *sdi) @@ -316,14 +309,22 @@ SR_PRIV int ipdbg_la_receive_data(int fd, int revents, void *cb_data) if (devc->num_transfers < (devc->limit_samples_max * devc->data_width_bytes)) { - uint8_t byte; - - if (ipdbg_la_tcp_receive(tcp, &byte) == 1) { - if (devc->num_transfers < - (devc->limit_samples * devc->data_width_bytes)) - devc->raw_sample_buf[devc->num_transfers] = byte; - - devc->num_transfers++; + const size_t bufsize = 1024; + uint8_t buffer[bufsize]; + + const int recd = ipdbg_la_tcp_receive(tcp, buffer, bufsize); + if ( recd > 0) { + int num_move = (((devc->num_transfers + recd) <= + (devc->limit_samples * devc->data_width_bytes)) + ? + recd + : + (int)((devc->limit_samples * devc->data_width_bytes) - + devc->num_transfers)); + if ( num_move > 0 ) + memcpy(&(devc->raw_sample_buf[devc->num_transfers]), + buffer, num_move); + devc->num_transfers += recd; } } else { if (devc->delay_value > 0) {