From 230430c4e9c8fcb27db7992a740106fc20bbbcab Mon Sep 17 00:00:00 2001 From: Jae Stutzman Date: Mon, 23 Jan 2017 22:21:49 -0600 Subject: [PATCH] Clears potential garbage data in read buffer prior to command being sent --- kenwood/kenwood.c | 9 ++++++++- src/network.c | 23 +++++++++++++++++++++++ src/network.h | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/kenwood/kenwood.c b/kenwood/kenwood.c index d047eac25..ebb3401fd 100644 --- a/kenwood/kenwood.c +++ b/kenwood/kenwood.c @@ -33,6 +33,7 @@ #include #include "hamlib/rig.h" +#include "network.h" #include "serial.h" #include "misc.h" #include "register.h" @@ -242,7 +243,13 @@ int kenwood_transaction(RIG *rig, const char *cmdstr, char *data, size_t datasiz len++; } - serial_flush(&rs->rigport); + /* flush anything in the read buffer before command is sent */ + if (rs->rigport.type.rig == RIG_PORT_NETWORK || rs->rigport.type.rig == RIG_PORT_UDP_NETWORK) { + network_flush(&rs->rigport); + } else { + serial_flush(&rs->rigport); + } + retval = write_block(&rs->rigport, cmd, len); free(cmd); diff --git a/src/network.c b/src/network.c index 9e939e4bf..3a48557f9 100644 --- a/src/network.c +++ b/src/network.c @@ -44,6 +44,7 @@ #include #include #include +#include #ifdef HAVE_NETINET_IN_H @@ -73,6 +74,8 @@ static int wsstarted; #endif +#define NET_BUFFER_SIZE 64 + static void handle_error (enum rig_debug_level_e lvl, const char *msg) { int e; @@ -103,6 +106,26 @@ static void handle_error (enum rig_debug_level_e lvl, const char *msg) #endif } +/** + * \brief Clears any data in the read buffer of the socket + * + * \param rp Port data structure + */ +void network_flush(hamlib_port_t* rp) +{ + int len = 0; + char buffer[NET_BUFFER_SIZE] = { 0 }; + for (;;) { + ioctl(rp->fd, FIONREAD, &len); + if (len > 0) { + len = read(rp->fd, &buffer, len < NET_BUFFER_SIZE ? len : NET_BUFFER_SIZE); + rig_debug(RIG_DEBUG_WARN, "Network data cleared: %s\n", buffer); + } else { + break; + } + } +} + /** * \brief Open network port using rig.state data * diff --git a/src/network.h b/src/network.h index c3cc6a8d9..1411d72a4 100644 --- a/src/network.h +++ b/src/network.h @@ -30,6 +30,7 @@ __BEGIN_DECLS /* Hamlib internal use, see rig.c */ int network_open(hamlib_port_t *p, int default_port); int network_close(hamlib_port_t *rp); +void network_flush(hamlib_port_t *rp); __END_DECLS