From 6c13951da8928e8201cc59f9db3ff1dbfe71db9b Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Tue, 27 Apr 2021 10:32:12 -0500 Subject: [PATCH] Add satmode to rig_get_vfo_info Add prototype for rig_get_rig_info https://github.com/Hamlib/Hamlib/issues/682 --- include/hamlib/rig.h | 10 +- src/rig.c | 21 +++- tests/rigctl_parse.c | 7 +- tests/simicom.c | 288 ------------------------------------------- 4 files changed, 33 insertions(+), 293 deletions(-) delete mode 100644 tests/simicom.c diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 17dcf6181..ada3cdbc0 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2376,7 +2376,12 @@ rig_get_vfo HAMLIB_PARAMS((RIG *rig, extern HAMLIB_EXPORT(int) rig_get_vfo_info HAMLIB_PARAMS((RIG *rig, - vfo_t vfo, freq_t *freq, rmode_t *mode, pbwidth_t *width, split_t *split)); + vfo_t vfo, + freq_t *freq, + rmode_t *mode, + pbwidth_t *width, + split_t *split, + int *satmode)); extern HAMLIB_EXPORT(int) rig_get_vfo_list HAMLIB_PARAMS((RIG *rig, char *buf, int buflen)); @@ -3017,7 +3022,8 @@ extern HAMLIB_EXPORT(int) rig_get_cache_timeout_ms(RIG *rig, hamlib_cache_t sele extern HAMLIB_EXPORT(int) rig_set_cache_timeout_ms(RIG *rig, hamlib_cache_t selection, int ms); extern HAMLIB_EXPORT(int) rig_set_vfo_opt(RIG *rig, int status); -extern HAMLIB_EXPORT(int) rig_get_vfo_info(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *mode, pbwidth_t *width, split_t *split); +extern HAMLIB_EXPORT(int) rig_get_vfo_info(RIG *rig, vfo_t vfo, freq_t *freq, rmode_t *mode, pbwidth_t *width, split_t *split, int *satmode); +extern int HAMLIB_API rig_get_rig_info(RIG *rig, char *response, int max_response_len); extern HAMLIB_EXPORT(int) rig_get_cache(RIG *rig, vfo_t vfo, freq_t *freq, int * cache_ms_freq, rmode_t *mode, int *cache_ms_mode, pbwidth_t *width, int *cache_ms_width); diff --git a/src/rig.c b/src/rig.c index 0e12870ca..7e734a08e 100644 --- a/src/rig.c +++ b/src/rig.c @@ -6201,6 +6201,24 @@ const char *HAMLIB_API rig_get_info(RIG *rig) return (rig->caps->get_info(rig)); } +/** + * \brief get freq/mode/width for requested VFO + * \param rig The rig handle + * + * returns a string for all known VFOs plus rig split status and satellite mode status + */ +int HAMLIB_API rig_get_rig_info(RIG *rig, char *response, int max_response_len) +{ + vfo_t vfoA; + freq_t freqA; + rmode_t modeA; + pbwidth_t widthA; + split_t split; + int satmode; + response[0] = 0; + RETURNFUNC(-RIG_ENIMPL); +} + /** * \brief get freq/mode/width for requested VFO * \param rig The rig handle @@ -6219,7 +6237,7 @@ const char *HAMLIB_API rig_get_info(RIG *rig) * */ int HAMLIB_API rig_get_vfo_info(RIG *rig, vfo_t vfo, freq_t *freq, - rmode_t *mode, pbwidth_t *width, split_t *split) + rmode_t *mode, pbwidth_t *width, split_t *split, int *satmode) { int retval; @@ -6262,6 +6280,7 @@ int HAMLIB_API rig_get_vfo_info(RIG *rig, vfo_t vfo, freq_t *freq, *width = rig->state.cache.widthMainA; } + *satmode = rig->state.cache.satmode; // we should only need to ask for VFO_CURR to minimize display swapping TRACE; retval = rig_get_split(rig, RIG_VFO_CURR, split); diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 860586d70..888cf05e4 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -134,6 +134,7 @@ struct test_table const char *arg2; const char *arg3; const char *arg4; + const char *arg5; }; @@ -331,7 +332,7 @@ static struct test_table test_list[] = { 0x8f, "dump_state", ACTION(dump_state), ARG_OUT | ARG_NOVFO }, { 0xf0, "chk_vfo", ACTION(chk_vfo), ARG_NOVFO, "ChkVFO" }, /* rigctld only--check for VFO mode */ { 0xf2, "set_vfo_opt", ACTION(set_vfo_opt), ARG_NOVFO | ARG_IN, "Status" }, /* turn vfo option on/off */ - { 0xf3, "get_vfo_info", ACTION(get_vfo_info), ARG_NOVFO | ARG_IN1 | ARG_OUT3, "Freq", "Mode", "Width", "Split" }, /* get several vfo parameters at once */ + { 0xf3, "get_vfo_info", ACTION(get_vfo_info), ARG_NOVFO | ARG_IN1 | ARG_OUT4, "Freq", "Mode", "Width", "Split", "SatMode" }, /* get several vfo parameters at once */ { 0xf4, "get_vfo_list", ACTION(get_vfo_list), ARG_OUT | ARG_NOVFO, "VFOs" }, { 0xf1, "halt", ACTION(halt), ARG_NOVFO }, /* rigctld only--halt the daemon */ { 0x8c, "pause", ACTION(pause), ARG_IN, "Seconds" }, @@ -2232,7 +2233,8 @@ declare_proto_rig(get_vfo_info) rmode_t mode = RIG_MODE_NONE; pbwidth_t width = 0; split_t split; - retval = rig_get_vfo_info(rig, vfo, &freq, &mode, &width, &split); + int satmode = 0; + retval = rig_get_vfo_info(rig, vfo, &freq, &mode, &width, &split, &satmode); if (retval != RIG_OK) { @@ -2249,6 +2251,7 @@ declare_proto_rig(get_vfo_info) fprintf(fout, "%s: %s\n", cmd->arg2, modestr); fprintf(fout, "%s: %d\n", cmd->arg3, (int)width); fprintf(fout, "%s: %d\n", cmd->arg4, (int)split); + fprintf(fout, "%s: %d\n", cmd->arg5, (int)satmode); } else { diff --git a/tests/simicom.c b/tests/simicom.c deleted file mode 100644 index 87fcc76d8..000000000 --- a/tests/simicom.c +++ /dev/null @@ -1,288 +0,0 @@ -// simicom will show the pts port to use for rigctl on Unix -// using virtual serial ports on Windows is to be developed yet -// gcc -g -Wall -o simicom simicom.c -lhamlib -// On mingw in the hamlib src directory -// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 -#define _XOPEN_SOURCE 600 -#include -#include -#include -#include -#include -#include -#include -#include "../src/misc.h" - -#define BUFSIZE 256 - -int civ_731_mode = 0; -vfo_t current_vfo = RIG_VFO_A; -int split = 0; - -// we make B different from A to ensure we see a difference at startup -float freqA = 14074000; -float freqB = 14074500; -mode_t modeA = RIG_MODE_CW; -mode_t modeB = RIG_MODE_USB; -pbwidth_t widthA = 0; -pbwidth_t widthB = 1; - -void dumphex(unsigned char *buf, int n) -{ - for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } - - printf("\n"); -} - -int -frameGet(int fd, unsigned char *buf) -{ - int i = 0; - memset(buf, 0, BUFSIZE); - unsigned char c; - - while (read(fd, &c, 1) > 0) - { - buf[i++] = c; - //printf("i=%d, c=0x%02x\n",i,c); - - if (c == 0xfd) - { - dumphex(buf, i); - return i; - } - } - - printf("Error???\n"); - - return 0; -} - -void frameParse(int fd, unsigned char *frame, int len) -{ - double freq; - - dumphex(frame, len); - - if (frame[0] != 0xfe && frame[1] != 0xfe) - { - printf("expected fe fe, got "); - dumphex(frame, len); - return; - } - - switch (frame[4]) - { - case 0x03: - - //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); - if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) - { - printf("get_freqA\n"); - to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); - } - else - { - printf("get_freqB\n"); - to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); - } - - frame[10] = 0xfd; - write(fd, frame, 11); - break; - - case 0x04: - if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) - { - printf("get_modeA\n"); - frame[5] = modeA; - frame[6] = widthA; - } - else - { - printf("get_modeB\n"); - frame[5] = modeB; - frame[6] = widthB; - } - - frame[7] = 0xfd; - write(fd, frame, 8); - break; - - case 0x05: - freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); - printf("set_freq to %.0f\n", freq); - - if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } - else { freqB = freq; } - -// case 0x06: - - - case 0x07: - - switch (frame[5]) - { - case 0x00: current_vfo = RIG_VFO_A; break; - - case 0x01: current_vfo = RIG_VFO_B; break; - - case 0xd0: current_vfo = RIG_VFO_MAIN; break; - - case 0xd1: current_vfo = RIG_VFO_SUB; break; - } - - printf("set_vfo to %s\n", rig_strvfo(current_vfo)); - - frame[4] = 0xfb; - frame[5] = 0xfd; - write(fd, frame, 6); - break; - - case 0x0f: - if (frame[5] == 0) { split = 0; } - else { split = 1; } - - printf("set split %d\n", 1); - frame[4] = 0xfb; - frame[5] = 0xfd; - write(fd, frame, 6); - break; - - case 0x1a: // miscellaneous things - switch (frame[5]) - { - case 0x03: // width - if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } - else { frame[6] = widthB; } - - frame[7] = 0xfd; - write(fd, frame, 8); - break; - } - - break; - -#if 0 - case 0x25: - if (frame[6] == 0xfd) - { - if (frame[5] == 0x00) - { - to_bcd(&frame[6], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); - printf("get_freqA=%.0f\n", freqA); - } - else - { - to_bcd(&frame[6], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); - printf("get_freqB=%.0f\n", freqB); - } - - frame[11] = 0xfd; - write(fd, frame, 12); - } - else - { - freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); - printf("set_freq to %.0f\n", freq); - - if (frame[5] == 0x00) { freqA = freq; } - else { freqB = freq; } - - frame[4] = 0xfb; - frame[5] = 0xfd; - } - - break; -#endif - - default: printf("cmd 0x%02x unknown\n", frame[4]); - } - - // don't care about the rig type yet - -} - -#if defined(WIN32) || defined(_WIN32) -int openPort(char *comport) // doesn't matter for using pts devices -{ - int fd; - fd = open(comport, O_RDWR); - - if (fd < 0) - { - perror(comport); - } - - return fd; -} - -#else -int openPort(char *comport) // doesn't matter for using pts devices -{ - int fd = posix_openpt(O_RDWR); - char *name = ptsname(fd); - - if (name == NULL) - { - perror("pstname"); - return -1; - } - - printf("name=%s\n", name); - - if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) - { - perror("posix_openpt"); - return -1; - } - - return fd; -} -#endif - -void rigStatus() -{ - char vfoa = current_vfo == RIG_VFO_A ? '*' : ' '; - char vfob = current_vfo == RIG_VFO_B ? '*' : ' '; - printf("%cVFOA: mode=%s width=%ld freq=%.0f\n", vfoa, rig_strrmode(modeA), - widthA, - freqA); - printf("%cVFOB: mode=%s width=%ld freq=%.0f\n", vfob, rig_strrmode(modeB), - widthB, - freqB); -} - -int main(int argc, char **argv) -{ - unsigned char buf[256]; - int fd = openPort(argv[1]); - - printf("%s: %s\n", argv[0], rig_version()); -#if defined(WIN32) || defined(_WIN32) - - if (argc != 2) - { - printf("Missing comport argument\n"); - printf("%s [comport]\n", argv[0]); - exit(1); - } - -#endif - - while (1) - { - int len = frameGet(fd, buf); - - if (len <= 0) - { - close(fd); - fd = openPort(argv[1]); - } - - frameParse(fd, buf, len); - rigStatus(); - } - - return 0; -}