From ad2f5047e0fdfdf41c547721d5d16a318e5bbea1 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Mon, 6 Jun 2022 22:54:10 -0500 Subject: [PATCH] Fix rig_set_lock_mode and rig_get_lock_mode https://github.com/Hamlib/Hamlib/issues/1044 --- rigs/dummy/netrigctl.c | 34 +++++++++++++++++++++++++--------- src/rig.c | 6 +++++- tests/rigctl_parse.c | 35 +++++++++++++++++++++++++++++++++-- tests/rigctld.c | 1 + 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/rigs/dummy/netrigctl.c b/rigs/dummy/netrigctl.c index cf5827669..348374508 100644 --- a/rigs/dummy/netrigctl.c +++ b/rigs/dummy/netrigctl.c @@ -2649,19 +2649,35 @@ int netrigctl_password(RIG *rig, const char *key1) RETURNFUNC(retval); } -int lock_mode; - -int netrigctl_set_lock_mode(RIG *rig, int mode) +int netrigctl_set_lock_mode(RIG *rig, int lock) { - //rig->state.lock_mode = mode; - lock_mode = mode; + char cmdbuf[256]; + char buf[BUF_MAX]; + int ret; + + SNPRINTF(cmdbuf, sizeof(cmdbuf), "\\set_lock_mode %d\n", lock); + + ret = netrigctl_transaction(rig, cmdbuf, strlen(cmdbuf), buf); + + if (ret > 0) + { + return -RIG_EPROTO; + } return (RIG_OK); } -int netrigctl_get_lock_mode(RIG *rig, int *mode) +int netrigctl_get_lock_mode(RIG *rig, int *lock) { - //*mode = rig->state.lock_mode; - *mode = lock_mode; + char cmdbuf[256]; + char buf[BUF_MAX]; + int ret; + SNPRINTF(cmdbuf, sizeof(cmdbuf), "\\get_lock_mode\n"); + ret = netrigctl_transaction(rig, cmdbuf, strlen(cmdbuf), buf); + if (ret == 0) + { + return -RIG_EPROTO; + } + sscanf(buf,"%d", lock); return (RIG_OK); } @@ -2674,7 +2690,7 @@ struct rig_caps netrigctl_caps = RIG_MODEL(RIG_MODEL_NETRIGCTL), .model_name = "NET rigctl", .mfg_name = "Hamlib", - .version = "20211123.0", + .version = "20220606.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_OTHER, diff --git a/src/rig.c b/src/rig.c index f9b711378..8cd7dabd3 100644 --- a/src/rig.c +++ b/src/rig.c @@ -93,6 +93,7 @@ const char *hamlib_license = "LGPL"; const char hamlib_version[21] = "Hamlib " PACKAGE_VERSION; const char *hamlib_version2 = "Hamlib " PACKAGE_VERSION " " HAMLIBDATETIME; HAMLIB_EXPORT_VAR(int) cookie_use; +int lock_mode; // for use by rigctld //! @endcond struct rig_caps caps_test; @@ -2153,6 +2154,7 @@ int HAMLIB_API rig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { const struct rig_caps *caps; int retcode; + int locked_mode; ELAPSED1; @@ -2161,12 +2163,14 @@ int HAMLIB_API rig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) rig_strvfo(vfo), rig_strrmode(mode), (int)width, rig_strvfo(rig->state.current_vfo)); - if (rig->state.lock_mode) { return(RIG_OK); } if (CHECK_RIG_ARG(rig)) { RETURNFUNC2(-RIG_EINVAL); } + rig_get_lock_mode(rig, &locked_mode); + if (locked_mode) { return(RIG_OK); } + // do not mess with mode while PTT is on if (rig->state.cache.ptt) { diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index e1f2e8269..d452a9a75 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -99,6 +99,8 @@ static int chk_vfo_executed; char rigctld_password[64]; int is_passwordOK; int is_rigctld; +extern int lock_mode; // used by rigctld + /* variables for readline support */ @@ -2166,6 +2168,8 @@ declare_proto_rig(set_mode) ENTERFUNC; + if (rig->state.lock_mode || lock_mode) { RETURNFUNC(RIG_OK); } + if (!strcmp(arg1, "?")) { char s[SPRINTF_MAX_SIZE]; @@ -5222,8 +5226,23 @@ declare_proto_rig(get_separator) declare_proto_rig(set_lock_mode) { int lock; + int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n", __func__); CHKSCN1ARG(sscanf(arg1, "%d", &lock)); - return (rig_set_lock_mode(rig, lock)); + + if (is_rigctld) + { + rig_debug(RIG_DEBUG_ERR, "%s: rigctld lock\n", __func__); + lock_mode = lock; + retval = RIG_OK; + } + else + { + rig_debug(RIG_DEBUG_ERR, "%s: rig lock\n", __func__); + retval = rig_set_lock_mode(rig, lock); + } + + return retval; } /* '0xa3' */ @@ -5232,12 +5251,24 @@ declare_proto_rig(get_lock_mode) int retval; int lock; + rig_debug(RIG_DEBUG_TRACE, "%s:\n", __func__); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) { fprintf(fout, "%s: ", cmd->arg1); } - retval = rig_get_lock_mode(rig, &lock); + if (is_rigctld) + { + rig_debug(RIG_DEBUG_ERR, "%s: rigctld lock\n", __func__); + lock = lock_mode; + retval = RIG_OK; + } + else + { + rig_debug(RIG_DEBUG_ERR, "%s: rig lock\n", __func__); + retval = rig_get_lock_mode(rig, &lock); + } if (retval != RIG_OK) { diff --git a/tests/rigctld.c b/tests/rigctld.c index 1766b806b..395aff002 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -152,6 +152,7 @@ const char *multicast_addr = "0.0.0.0"; int multicast_port = 4532; extern char rigctld_password[65]; char resp_sep = '\n'; +extern int lock_mode; #define MAXCONFLEN 1024