From 24b9c70dd12ca22ce21355c7ff8bcbeb1f208f2b Mon Sep 17 00:00:00 2001 From: Dennis Engdahl Date: Fri, 2 Aug 2013 08:05:26 -0500 Subject: [PATCH] RigCAT user commands * Added user definable RigCAT user strings as Macros where: hex hex ... are sequential hexadecimal values string is Ascii char sequence retnbr is number of bytes in xcvr response ':retnbr' is optional; retnbr set to 0 if missing --- src/include/rigio.h | 2 ++ src/misc/macroedit.cxx | 3 ++ src/misc/macros.cxx | 76 ++++++++++++++++++++++++++++++++++++++-- src/rigcontrol/rigio.cxx | 2 ++ 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/include/rigio.h b/src/include/rigio.h index 609c7efb..bc192218 100644 --- a/src/include/rigio.h +++ b/src/include/rigio.h @@ -9,6 +9,8 @@ extern Cserial rigio; extern bool hexout(const std::string&); +extern bool sendCommand(std::string, int retnbr); + extern long long rigCAT_getfreq(int retries, bool &failed); extern void rigCAT_setfreq(long long); diff --git a/src/misc/macroedit.cxx b/src/misc/macroedit.cxx index 7a4dd177..c3a07cb7 100644 --- a/src/misc/macroedit.cxx +++ b/src/misc/macroedit.cxx @@ -183,6 +183,9 @@ void loadBrowser(Fl_Widget *widget) { w->add(_("\tCW rise time")); w->add(_("\tCW WPM")); + w->add(LINE_SEP); + w->add(_("\tsend CAT cmd")); + w->add(LINE_SEP); w->add(_("\tAFC on,off,toggle")); w->add(_("\tLOCK on,off,toggle")); diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index bd521a60..66e4009c 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -845,6 +845,75 @@ static void pTXRX(std::string &s, size_t &i, size_t endbracket) ToggleTXRX = true; } +static std::string hexstr(std::string &s) +{ + static std::string hex; + static char val[3]; + hex.clear(); + for (size_t i = 0; i < s.length(); i++) { + snprintf(val, sizeof(val), "%02x", s[i] & 0xFF); + hex.append("<").append(val).append(">"); + } + return hex; +} + +static void pRIGCAT(std::string &s, size_t &i, size_t endbracket) +{ + if (within_exec) { + s.replace(i, endbracket - i + 1, ""); + return; + } + + LOG_INFO("cat cmd:retnbr %s", s.c_str()); + + size_t start = s.find(':', i); + std::basic_string buff; + + size_t val = 0; + int retnbr = 0; + char c, ch; + bool asciisw = false; + bool valsw = false; + + for (size_t j = start+1 ; j <= endbracket ; j++) { + ch = s[j]; + if (ch == '\"') { + asciisw = !asciisw; + continue; + } +// accumulate ascii string + if (asciisw) { + if (isprint(ch)) buff += ch; + continue; + } +// following digits is expected size of CAT response from xcvr + if (ch == ':' && s[j+1] != '>') { + sscanf(&s[j+1], "%d", &retnbr); + } +// accumulate hex string values + if ((ch == ' ' || ch == '>' || ch == ':') && valsw) { + c = char(val); +// LOG_INFO("c=%02x, val=%d", c, val); + buff += c; + val = 0; + valsw = false; + } else { + val *= 16; + ch = toupper(ch); + if (isdigit(ch)) val += ch - '0'; + else if (ch >= 'A' && ch <= 'F') val += ch - 'A' + 10; + valsw = true; + } + if (ch == ':') break; + } + + LOG_INFO("cat %s", hexstr(buff).c_str()); + + sendCommand(buff, retnbr); + + s.replace(i, endbracket - i + 1, ""); +} + static void pVER(std::string &s, size_t &i, size_t endbracket) { @@ -1739,15 +1808,15 @@ void set_macro_env(void) // frequencies char dial_freq[20]; - snprintf(dial_freq, sizeof(dial_freq), "%" PRId64, wf->rfcarrier()); + snprintf(dial_freq, sizeof(dial_freq), "%lld", (long long)wf->rfcarrier()); env[FLDIGI_DIAL_FREQUENCY].val = dial_freq; char audio_freq[6]; snprintf(audio_freq, sizeof(audio_freq), "%d", active_modem->get_freq()); env[FLDIGI_AUDIO_FREQUENCY].val = audio_freq; char freq[20]; - snprintf(freq, sizeof(freq), "%" PRId64, wf->rfcarrier() + (wf->USB() + snprintf(freq, sizeof(freq), "%lld", (long long)(wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() - : -active_modem->get_freq())); + : -active_modem->get_freq()))); env[FLDIGI_FREQUENCY].val = freq; // debugging vars @@ -2103,6 +2172,7 @@ static const MTAGS mtags[] = { {"", pTX}, {"", pTXRX}, {"", pVER}, +{"", pCNTR}, {"", pDECR}, {"", pINCR}, diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index 24af0ffd..9d0eab09 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -91,6 +91,8 @@ bool sendCommand (string s, int retnbr) if (retval <= 0) LOG_VERBOSE("Write error %d", retval); + if (retnbr == 0) return true; + memset(replybuff, 0, RXBUFFSIZE + 1); numread = 0; MilliSleep( readafter );