From 27767fcfc1ce18ee06276d76f14decc569ba236c Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Fri, 1 Nov 2024 15:36:16 -0400 Subject: [PATCH 1/4] Add traffic tracing to simts890.c --- simulators/simts890.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/simulators/simts890.c b/simulators/simts890.c index 58d39557e..8f41bff99 100644 --- a/simulators/simts890.c +++ b/simulators/simts890.c @@ -1,3 +1,4 @@ +//#define TRACE /* Full traffic trace if enabled */ // can run this using rigctl/rigctld and socat pty devices // gcc -o simts890 -l hamlib simts890.c #define _XOPEN_SOURCE 700 @@ -30,7 +31,11 @@ struct ip_mreq * This will allow us to reroute output to a buffering routine * Needed to handle multiple commands in a single message */ +#if defined(TRACE) +#define OUTPUT(s) {printf("Resp:\"%s\"\n", s); write(fd, s, strlen(s)); } +#else #define OUTPUT(s) write(fd, s, strlen(s)) +#endif int mysleep = 20; @@ -296,7 +301,9 @@ int main(int argc, char *argv[]) if (getmyline(fd, buf) > 0) { -// printf("Cmd:\"%s\"\n", buf); +#if defined(TRACE) + printf("Cmd:\"%s\"\n", buf); +#endif } // else { return 0; } From d0b19252343ab4c584db3467b39de5dcce701309 Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Mon, 4 Nov 2024 16:09:24 -0500 Subject: [PATCH 2/4] Annotate legacy (undocumented) commands in simts890.c Allow them to be disabled Relevant to issues #1380 and #899 --- simulators/simts890.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/simulators/simts890.c b/simulators/simts890.c index 8f41bff99..f1ab8f6c3 100644 --- a/simulators/simts890.c +++ b/simulators/simts890.c @@ -21,7 +21,16 @@ struct ip_mreq #include //#include +/* Definitions */ +/* The TS-890S has some undocumented commands, left over from older + * Kenwood models. They have newer counterparts with more functionality, + * but are still around for legacy software. If you want to see if your + * app is only using the latest-and-greatest, comment out the next define. + */ +#define LEGACY +// Size of command buffer #define BUFSIZE 256 +// Number of selectable bands #define NBANDS 11 /* Type we're emulating - K=The Americas(default), E=Europe */ #if !defined(TYPE) @@ -30,6 +39,7 @@ struct ip_mreq /* Define a macro for sending response back to the app * This will allow us to reroute output to a buffering routine * Needed to handle multiple commands in a single message + * Also makes it easy to trace */ #if defined(TRACE) #define OUTPUT(s) {printf("Resp:\"%s\"\n", s); write(fd, s, strlen(s)); } @@ -251,6 +261,7 @@ int main(int argc, char *argv[]) kvfop_t *const vfoAB[2] = {&vfoA, &vfoB}; // 0=A, 1=B, fixed kvfop_t *vfoLR[2] = {&vfoA, &vfoB}; // 0=Left, 1=Right, can change +#if defined(LEGACY) /* The IF command is not documented for the TS-890S, and is supposed * to be supplanted by SF. However, it is still there for legacy S/W. * This description is taken from the TS-590S/SG manual, with values @@ -312,12 +323,16 @@ int main(int argc, char *argv[]) buf[1] = toupper(buf[1]); if (strcmp(buf, "IF;") == 0) - { + { // Reads the tranceiver status +#if defined(LEGACY) char ifbuf[256]; hl_usleep(mysleep * 1000); sprintf(ifbuf, IFformat, (*vfoLR[0])->freq, (ptt + ptt_mic + ptt_data + ptt_tune) > 0 ? 1 : 0, (*vfoLR[0])->mode, sp); OUTPUT(ifbuf); +#else + cmd_err = 1; +#endif } else if (strncmp(buf, "AN", 2) == 0) { @@ -938,6 +953,22 @@ int main(int argc, char *argv[]) sscanf(&buf[3], "%1X", &(*vfoLR[idx])->mode); } } + else if (strncmp(buf, "MD", 2) == 0) + { // Sets and reads the operating mode status +#if defined(LEGACY) + if (buf[2] == ';') + { + snprintf(buf, sizeof(buf), "MD%X;", (*vfoLR[0])->mode); + OUTPUT(buf); + } + else + { + sscanf(buf, "MD%1X", &(*vfoLR[0])->mode); + } +#else + cmd_err = 1; +#endif + } else if (strncmp(buf, "RM", 2) == 0) { // Meter From dd9696cf2dc72d9397d290c3986d6b63a3cf7061 Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Tue, 5 Nov 2024 17:09:31 -0500 Subject: [PATCH 3/4] Add RIT/XIT commands (FS, RC, RD/RU, RF, RT, XT) to simts890.c Add RIT/XIT data to IF command. FS probably affects more places, TBD Constify some strings --- simulators/simts890.c | 86 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/simulators/simts890.c b/simulators/simts890.c index f1ab8f6c3..e99107bf7 100644 --- a/simulators/simts890.c +++ b/simulators/simts890.c @@ -70,6 +70,8 @@ int rl = 0; int is = 0; int sp = 0; // Split OFF/ON int split_op = 0; // Split frequency setting operation in progress +int rit=0, xit=0, rxit=0; // RIT off/on, XIT off/on, Offset freq(-9999<=rxit<=+9999) +int fine = 0; // Fine tuning - step size off=10hz, on=1hz // Clock data int autoset = 1; int tzs[2] = {36, 56}; // 0=primary(EST), 1=auxiliary(UTC) @@ -270,9 +272,9 @@ int main(int argc, char *argv[]) char IFformat[] = "IF" // Output only "%011d" // P1 freq(Hz) " " // P2 ?? - " 0000" // P3 RIT/XIT freq(Hz) - "0" // P4 RIT on/off - "0" // P5 XIT on/off + "% 05d" // P3 RIT/XIT freq(Hz) + "%1d" // P4 RIT on/off + "%1d" // P5 XIT on/off "000" // P6,P7 mem channel "%1d" // P8 RX/TX "%1X" // P9 Operating mode (See OM command) @@ -282,6 +284,7 @@ int main(int argc, char *argv[]) "0" // P13 Tone/CTCSS (not on TS-890S) "00" // P14 Tone/CTCSS freq (not on TS-890S) "0;"; // P15 Always zero +#endif char SFformat[] = "SF" // Input/Output "%1d" // P1 VFOA/VFOB "%011d" // P2 Freq(Hz) @@ -327,8 +330,9 @@ int main(int argc, char *argv[]) #if defined(LEGACY) char ifbuf[256]; hl_usleep(mysleep * 1000); - sprintf(ifbuf, IFformat, (*vfoLR[0])->freq, - (ptt + ptt_mic + ptt_data + ptt_tune) > 0 ? 1 : 0, (*vfoLR[0])->mode, sp); + sprintf(ifbuf, IFformat, (*vfoLR[0])->freq, rxit, rit, xit, + (ptt + ptt_mic + ptt_data + ptt_tune) > 0 ? 1 : 0, + (*vfoLR[0])->mode, sp); OUTPUT(ifbuf); #else cmd_err = 1; @@ -1123,6 +1127,78 @@ int main(int argc, char *argv[]) puts(buf); sscanf(buf, "RL1%d", &rl); } + else if (strncmp(buf, "FS", 2) == 0) + { // FINE Function + if (buf[2] == ';') + { + snprintf(buf, sizeof buf, "FS%d%d;", fine, fine); // For now + OUTPUT(buf); + } + else + { + if (buf[2] == '0' || buf[2] == '1') + { fine = buf[2] - '0'; } + else + { cmd_err = 1; } + } + } + else if (strcmp(buf, "RC;") == 0) + { // RIT/XIT Frequency Clear + rxit = 0; + } + else if (buf[0] == 'R' && (buf[1] =='D' || buf[1] == 'U')) // RD/RU + { // RIT/XIT Frequency Up/Down + int dir = buf[1] == 'D' ? -1 : +1; + int tempit; + if (buf[2] == ';') + { + tempit = rxit + (dir * (fine ? 1 : 10)); + } + else + { + tempit = rxit + dir * atoi(buf + 2); + } + if (abs(tempit) > 9999) {cmd_err = 1; continue;} + /* Some weird rounding going on here - TBD */ + rxit = tempit; + } + else if (strcmp(buf, "RF;") == 0) + { // RIT/XIT Frequency + snprintf(buf, sizeof buf, "RF%1d%04d;", rxit < 0 ? 1 : 0, abs(rxit)); + OUTPUT(buf); + } + else if (strncmp(buf, "RT", 2) == 0) + { // RIT Function State, RIT Shift + switch(buf[2]) { + case ';': // Read + snprintf(buf, sizeof buf, "RT%d;", rit); + OUTPUT(buf); + break; + case '0': // Set + case '1': + rit = buf[2] - '0'; + break; + case '2': // Shift + //TODO: set recv freq to vfo+rxit, clear rxit and rit + break; + default: + cmd_err = 1; + } + } + else if (strncmp(buf, "XT", 2) == 0) + { // XIT Function State, XIT Shift + switch(buf[2]) { + case '0': // Set + case '1': + xit = buf[2] - '0'; + break; + case '2': // Shift + //TODO: set xmit freq to vfo+rxit(Which vfo?), set split, clear rxit and xit + break; + default: + cmd_err = 1; + } + } else if (strncmp(buf, "CK", 2) == 0) { // All the clock functions From 10292fd3383ff28b384ab7c42c63c19733c0e121 Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Wed, 6 Nov 2024 10:19:40 -0500 Subject: [PATCH 4/4] Astyle simts890.c Man, this is ugly! --- simulators/simts890.c | 88 ++++++++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/simulators/simts890.c b/simulators/simts890.c index e99107bf7..a3c513d21 100644 --- a/simulators/simts890.c +++ b/simulators/simts890.c @@ -70,7 +70,8 @@ int rl = 0; int is = 0; int sp = 0; // Split OFF/ON int split_op = 0; // Split frequency setting operation in progress -int rit=0, xit=0, rxit=0; // RIT off/on, XIT off/on, Offset freq(-9999<=rxit<=+9999) +int rit = 0, xit = 0, rxit = + 0; // RIT off/on, XIT off/on, Offset freq(-9999<=rxit<=+9999) int fine = 0; // Fine tuning - step size off=10hz, on=1hz // Clock data int autoset = 1; @@ -269,26 +270,26 @@ int main(int argc, char *argv[]) * This description is taken from the TS-590S/SG manual, with values * reflecting a real TS-890S. */ - char IFformat[] = "IF" // Output only - "%011d" // P1 freq(Hz) - " " // P2 ?? - "% 05d" // P3 RIT/XIT freq(Hz) - "%1d" // P4 RIT on/off - "%1d" // P5 XIT on/off - "000" // P6,P7 mem channel - "%1d" // P8 RX/TX - "%1X" // P9 Operating mode (See OM command) - "0" // P10 Function? - "0" // P11 Scan status? - "%1d" // P12 Simplex=0/Split=1 - "0" // P13 Tone/CTCSS (not on TS-890S) - "00" // P14 Tone/CTCSS freq (not on TS-890S) - "0;"; // P15 Always zero + const char IFformat[] = "IF" // Output only + "%011d" // P1 freq(Hz) + " " // P2 ?? + "% 05d" // P3 RIT/XIT freq(Hz) + "%1d" // P4 RIT on/off + "%1d" // P5 XIT on/off + "000" // P6,P7 mem channel + "%1d" // P8 RX/TX + "%1X" // P9 Operating mode (See OM command) + "0" // P10 Function? + "0" // P11 Scan status? + "%1d" // P12 Simplex=0/Split=1 + "0" // P13 Tone/CTCSS (not on TS-890S) + "00" // P14 Tone/CTCSS freq (not on TS-890S) + "0;"; // P15 Always zero #endif - char SFformat[] = "SF" // Input/Output - "%1d" // P1 VFOA/VFOB - "%011d" // P2 Freq(Hz) - "%1X;"; // P3 Mode + const char SFformat[] = "SF" // Input/Output + "%1d" // P1 VFOA/VFOB + "%011d" // P2 Freq(Hz) + "%1X;"; // P3 Mode /* Initialization */ for (int i = 0; i < NBANDS; i++) @@ -326,7 +327,8 @@ int main(int argc, char *argv[]) buf[1] = toupper(buf[1]); if (strcmp(buf, "IF;") == 0) - { // Reads the tranceiver status + { + // Reads the tranceiver status #if defined(LEGACY) char ifbuf[256]; hl_usleep(mysleep * 1000); @@ -958,7 +960,8 @@ int main(int argc, char *argv[]) } } else if (strncmp(buf, "MD", 2) == 0) - { // Sets and reads the operating mode status + { + // Sets and reads the operating mode status #if defined(LEGACY) if (buf[2] == ';') { @@ -969,6 +972,7 @@ int main(int argc, char *argv[]) { sscanf(buf, "MD%1X", &(*vfoLR[0])->mode); } + #else cmd_err = 1; #endif @@ -1128,7 +1132,8 @@ int main(int argc, char *argv[]) sscanf(buf, "RL1%d", &rl); } else if (strncmp(buf, "FS", 2) == 0) - { // FINE Function + { + // FINE Function if (buf[2] == ';') { snprintf(buf, sizeof buf, "FS%d%d;", fine, fine); // For now @@ -1137,19 +1142,22 @@ int main(int argc, char *argv[]) else { if (buf[2] == '0' || buf[2] == '1') - { fine = buf[2] - '0'; } + { fine = buf[2] - '0'; } else - { cmd_err = 1; } + { cmd_err = 1; } } } else if (strcmp(buf, "RC;") == 0) - { // RIT/XIT Frequency Clear + { + // RIT/XIT Frequency Clear rxit = 0; } - else if (buf[0] == 'R' && (buf[1] =='D' || buf[1] == 'U')) // RD/RU - { // RIT/XIT Frequency Up/Down + else if (buf[0] == 'R' && (buf[1] == 'D' || buf[1] == 'U')) // RD/RU + { + // RIT/XIT Frequency Up/Down int dir = buf[1] == 'D' ? -1 : +1; - int tempit; + int tempit; + if (buf[2] == ';') { tempit = rxit + (dir * (fine ? 1 : 10)); @@ -1158,43 +1166,55 @@ int main(int argc, char *argv[]) { tempit = rxit + dir * atoi(buf + 2); } + if (abs(tempit) > 9999) {cmd_err = 1; continue;} + /* Some weird rounding going on here - TBD */ rxit = tempit; } else if (strcmp(buf, "RF;") == 0) - { // RIT/XIT Frequency + { + // RIT/XIT Frequency snprintf(buf, sizeof buf, "RF%1d%04d;", rxit < 0 ? 1 : 0, abs(rxit)); OUTPUT(buf); } else if (strncmp(buf, "RT", 2) == 0) - { // RIT Function State, RIT Shift - switch(buf[2]) { + { + // RIT Function State, RIT Shift + switch (buf[2]) + { case ';': // Read snprintf(buf, sizeof buf, "RT%d;", rit); OUTPUT(buf); break; + case '0': // Set case '1': rit = buf[2] - '0'; break; + case '2': // Shift //TODO: set recv freq to vfo+rxit, clear rxit and rit break; + default: cmd_err = 1; } } else if (strncmp(buf, "XT", 2) == 0) - { // XIT Function State, XIT Shift - switch(buf[2]) { + { + // XIT Function State, XIT Shift + switch (buf[2]) + { case '0': // Set case '1': xit = buf[2] - '0'; break; + case '2': // Shift //TODO: set xmit freq to vfo+rxit(Which vfo?), set split, clear rxit and xit break; + default: cmd_err = 1; }