From 9531f730b13e3c4c462f1f9f9ec4653879b4de51 Mon Sep 17 00:00:00 2001 From: Michael Black Date: Fri, 6 Dec 2019 07:58:19 -0600 Subject: [PATCH] Change behavior of 'w' command in rigctld for binary commands Now responds with hex string just like the input and the # of bytes Will get hex string response for any binary data from rig from any command Next step is to implement W command for known # of bytes in response to avoid the timeout --- tests/rigctl_parse.c | 59 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 7bacd7cbd..b96fad8fb 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -4023,6 +4023,9 @@ declare_proto_rig(send_cmd) char bufcmd[BUFSZ]; char buf[BUFSZ]; char eom_buf[4] = { 0xa, 0xd, 0, 0 }; + int binary = 0; + + rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__); /* * binary protocols enter values as \0xZZ\0xYY.. @@ -4051,6 +4054,12 @@ declare_proto_rig(send_cmd) /* no End Of Message chars */ eom_buf[0] = '\0'; } + else if (rig->caps->rig_model == RIG_MODEL_NETRIGCTL) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: we're using netrigctl\n", __func__); + snprintf(bufcmd, sizeof(bufcmd), "w %s\n", arg1); + cmd_len = strlen(bufcmd); + } else { /* text protocol */ @@ -4078,9 +4087,10 @@ declare_proto_rig(send_cmd) return retval; } - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) { - fprintf(fout, "%s: ", cmd->arg2); + fwrite(cmd->arg1, 1, strlen(cmd->arg1), fout); /* i.e. "Frequency" */ + fwrite(":", 1, 1, fout); /* i.e. "Frequency" */ } do @@ -4102,13 +4112,52 @@ declare_proto_rig(send_cmd) buf[BUFSZ - 1] = '\0'; } - // we use fwrite in case of any nulls in binary return - fwrite(buf, 1, retval, fout); - fwrite("\n", 1, 1, fout); + if (rig->caps->rig_model != RIG_MODEL_NETRIGCTL) + { + // see if we have binary being returned + int i; + for (i = 0; i < retval; ++i) + { + if (!isprint(buf[i])) + { + binary = 1; + break; + } + } + } + + if (binary) // convert our buf to a hex representaion + { + int i; + char hex[64]; + rig_debug(RIG_DEBUG_VERBOSE, "%s: sending binary\n", __func__); + + for (i = 0; i < retval; ++i) + { + snprintf(hex, sizeof(hex), "\\0x%02X", (unsigned char)buf[i]); + fprintf(fout, "%s", hex); + } + + fprintf(fout, " %d\n", retval); + return RIG_OK; + } + else + { + fwrite(buf, 1, strlen(buf), fout); + } } while (retval > 0); +// we use fwrite in case of any nulls in binary return + if (binary) { fwrite(buf, 1, retval, fout); } + + if (binary) + { + fwrite("\n", 1, 1, fout); + } + + if (retval > 0 || retval == -RIG_ETIMEOUT) { retval = RIG_OK;