Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package hamlib for openSUSE:Factory checked in at 2022-12-27 11:55:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hamlib (Old)
and /work/SRC/openSUSE:Factory/.hamlib.new.1563 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hamlib"
Tue Dec 27 11:55:03 2022 rev:14 rq:1045466 version:4.5.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/hamlib/hamlib.changes 2022-12-10 21:18:53.801931299 +0100
+++ /work/SRC/openSUSE:Factory/.hamlib.new.1563/hamlib.changes 2022-12-27 11:55:14.175372757 +0100
@@ -1,0 +2,19 @@
+Tue Dec 27 08:52:30 UTC 2022 - Wojciech Kazubski
+
+- Update to version 4.5.2 (2022-12-23)
+ * Fix PowerSDR ability to do commands while powered off
+ * Fix TX-500 operations
+ * Fix FTDX5000 to return to MIC input on closing
+ * Fix rig.c calling rig_get_mode when backend does not have get_mode
+ * Fix kenwood_ts890_get_level
+ * Add Prosistel D elevation CBOX az to fix problem with azimuth
+ control
+ * Fix FT736R gpredict usage by adding cached get_freq
+ * Fix get_powerstat problem with Log4OM/Flex and others
+ * Fix -R option to not need argument
+ * Fix -R option to close rig on last rigctld client disconnect
+ * Add FTDX1200 to rigs that need to ensure PTT is off before
+ changing frequency
+ * Add --disable-parallel configure option for mingw builds on Linux
+
+-------------------------------------------------------------------
Old:
----
Hamlib-4.5.1.tar.gz
New:
----
Hamlib-4.5.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ hamlib.spec ++++++
--- /var/tmp/diff_new_pack.Tapotq/_old 2022-12-27 11:55:14.683375583 +0100
+++ /var/tmp/diff_new_pack.Tapotq/_new 2022-12-27 11:55:14.691375627 +0100
@@ -18,7 +18,7 @@
%define sover 4
Name: hamlib
-Version: 4.5.1
+Version: 4.5.2
Release: 0
Summary: Run-time library to control radio transcievers and receivers
License: LGPL-2.1-only
++++++ Hamlib-4.5.1.tar.gz -> Hamlib-4.5.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/NEWS new/Hamlib-4.5.2/NEWS
--- old/Hamlib-4.5.1/NEWS 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/NEWS 2022-12-24 00:04:12.000000000 +0100
@@ -14,12 +14,33 @@
Version 4.6
* 2023-11-XX -- Planned for Nov 2023
+ * Add --set-conf=tuner_control_pathname=hamlib_tuner_control (default)
+ If file exists then it will be called with 0/1 (Off/On) argument
+ with 'U TUNER 0' or 'U TUNER 1"
+ Default path is for current directory
* Add MDS 4710/9710 rigs
+ * Add FLIR PTU-D48, E46, D100, D300 rotors
+ * Fix FTDX3000 rig split
+
+Version 4.5.2
+ * 2022-12-23
+ * Fix PowerSDR ability to do commands while powered off
+ * Fix TX-500 operations
+ * Fix FTDX5000 to return to MIC input on closing
+ * Fix rig.c calling rig_get_mode when backend does not have get_mode
+ * Fix kenwood_ts890_get_level
+ * Add Prosistel D elevation CBOX az to fix problem with azimuth control
+ * Fix FT736R gpredict usage by adding cached get_freq
+ * Fix get_powerstat problem with Log4OM/Flex and others
+ * Fix -R option to not need argument
+ * Fix -R option to close rig on last rigctld client disconnect
+ * Add FTDX1200 to rigs that need to ensure PTT is off before changing frequency
+ * Add --disable-parallel configure option for mingw builds on Linux
Version 4.5.1
* 2022-12-08
* FT2000, FTDX3000/D, FT891, FT991, FT950, FTDX5000 now set CAT TOT to 100ms
- * Add missing NB2 setting to FT-950, FTDX-1200, FTDX-3000, FTDX-5000, FTDX-9000
+ * Add missing NB2 setting to FT-950, FTDX-1200, FT-2000, FTDX-3000, FTDX-5000, FTDX-9000
* Add missing meter reading to TS-890S -- thanks to Geore Baltz N3GB
* Fix FT736 VFOB freq and mode set
* Added send_raw to rigctl -- see rigctl man page
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/Segfault-award new/Hamlib-4.5.2/Segfault-award
--- old/Hamlib-4.5.1/Segfault-award 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/Segfault-award 2022-12-24 00:04:12.000000000 +0100
@@ -7,6 +7,8 @@
Here is the list of the brave fellows:
+* Saku Nyland OH1KH v4.5.1, 10/2022, rigctld.c using ptt_type=RTS
+
* David Kjellquist WB5NHL, v1.1.3, 09/2002, kenwood/ts570.c
caught on TS570D backend startup.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/configure.ac new/Hamlib-4.5.2/configure.ac
--- old/Hamlib-4.5.1/configure.ac 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/configure.ac 2022-12-24 00:04:12.000000000 +0100
@@ -14,7 +14,7 @@
dnl however, the use of '~' should be fine as apt (others?) will treat
dnl it as an earlier version than the actual release. TNX KA6MAL
dnl PACKAGE_NAME + " " + PACKAGE_VERSION must not exceed 20 chars!
-AC_INIT([Hamlib],[4.5.1],[hamlib-developer@lists.sourceforge.net],[hamlib],[http://www.hamlib.org])
+AC_INIT([Hamlib],[4.5.2],[hamlib-developer@lists.sourceforge.net],[hamlib],[http://www.hamlib.org])
AC_CONFIG_SRCDIR([include/hamlib/rig.h])
AC_CONFIG_MACRO_DIR([macros])
@@ -694,6 +694,15 @@
[cf_with_winradio="yes" AC_DEFINE([HAVE_WINRADIO],[1],[Define if winradio backend is built])])
AC_MSG_RESULT([$cf_with_winradio])
+dnl Parallel port device disable
+AC_MSG_CHECKING([whether to build parallel port devices])
+AC_ARG_ENABLE([parallel],
+ [AS_HELP_STRING([--disable-parallel],
+ [do not build parallel devices @<:@default=yes@:>@])],
+ [cf_with_parallel="no"],
+ [cf_with_parallel="yes" AC_DEFINE([HAVE_PARALLEL],[1],[Define if parallel devices are to be built])])
+AC_MSG_RESULT([$cf_with_parallel])
+
DL_LIBS=""
AS_IF([test x"${cf_with_winradio}" = "xyes"],
@@ -912,6 +921,7 @@
Enable HTML rig feature matrix ${cf_enable_html_matrix}
Enable WinRadio ${cf_with_winradio}
+ Enable Parallel ${cf_with_parallel}
Enable USRP ${cf_with_usrp}
Enable USB backends ${cf_with_libusb}
Enable shared libs ${enable_shared}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/doc/man1/rigctl.1 new/Hamlib-4.5.2/doc/man1/rigctl.1
--- old/Hamlib-4.5.1/doc/man1/rigctl.1 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/doc/man1/rigctl.1 2022-12-24 00:04:12.000000000 +0100
@@ -1289,7 +1289,7 @@
Returns current lock mode status 1=On, 2=Off (only useful when using rigctld)
.
.TP
-.BR send_raw " \(aq" \fITerminator\fP "\(aq \(aq" \fIString\fp \(aq
+.BR send_raw " \(aq" \fITerminator\fP "\(aq \(aq" \fIString\fP \(aq
.EX
Can send ASCII string or 0xnn values -- there can be no spaces in the command string.
Possible terminator values are CR, LF, ;, ICOM, 0-100 (bytes to read), or -1 meaning unknown (will timeout on read)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/include/hamlib/rig.h new/Hamlib-4.5.2/include/hamlib/rig.h
--- old/Hamlib-4.5.1/include/hamlib/rig.h 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/include/hamlib/rig.h 2022-12-24 00:04:12.000000000 +0100
@@ -3396,6 +3396,7 @@
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 HAMLIB_EXPORT(int) 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);
+extern HAMLIB_EXPORT(int) rig_get_cache_freq(RIG *rig, vfo_t vfo, freq_t *freq, int * cache_ms_freq);
extern HAMLIB_EXPORT(int) rig_set_clock(RIG *rig, int year, int month, int day, int hour, int min, int sec, double msec, int utc_offset);
extern HAMLIB_EXPORT(int) rig_get_clock(RIG *rig, int *year, int *month, int *day, int *hour, int *min, int *sec, double *msec, int *utc_offset);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/include/hamlib/rotlist.h new/Hamlib-4.5.2/include/hamlib/rotlist.h
--- old/Hamlib-4.5.1/include/hamlib/rotlist.h 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/include/hamlib/rotlist.h 2022-12-24 00:04:12.000000000 +0100
@@ -557,6 +557,7 @@
#define ROT_MODEL_PROSISTEL_D_AZ ROT_MAKE_MODEL(ROT_PROSISTEL, 1)
#define ROT_MODEL_PROSISTEL_D_EL ROT_MAKE_MODEL(ROT_PROSISTEL, 2)
#define ROT_MODEL_PROSISTEL_COMBI_TRACK_AZEL ROT_MAKE_MODEL(ROT_PROSISTEL, 3)
+#define ROT_MODEL_PROSISTEL_D_EL_CBOXAZ ROT_MAKE_MODEL(ROT_PROSISTEL, 4)
/**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rigs/dummy/netrigctl.c new/Hamlib-4.5.2/rigs/dummy/netrigctl.c
--- old/Hamlib-4.5.1/rigs/dummy/netrigctl.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rigs/dummy/netrigctl.c 2022-12-24 00:04:12.000000000 +0100
@@ -2052,14 +2052,22 @@
ret = netrigctl_transaction(rig, cmd, strlen(cmd), buf);
- if (ret <= 0)
+ if (ret == 0)
{
- return (ret < 0) ? ret : -RIG_EPROTO;
+ *status = atoi(buf);
+ }
+ else
+ {
+ // was causing problems with sdr++ since it does not have PS command
+ // a return of 1 should indicate there is no powerstat command available
+ // so we fake the ON status
+ // also a problem with Flex 6xxx and Log4OM not working due to lack of PS command
+ rig_debug(RIG_DEBUG_VERBOSE,
+ "%s: PS command failed (ret=%d) so returning RIG_POWER_ON\n", __func__, ret);
+ *status = RIG_POWER_ON;
}
- *status = atoi(buf);
-
- return RIG_OK;
+ return RIG_OK; // always return RIG_OK
}
@@ -2726,7 +2734,7 @@
RIG_MODEL(RIG_MODEL_NETRIGCTL),
.model_name = "NET rigctl",
.mfg_name = "Hamlib",
- .version = "20221201.0",
+ .version = "20221214.0",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_OTHER,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rigs/kenwood/ts890s.c new/Hamlib-4.5.2/rigs/kenwood/ts890s.c
--- old/Hamlib-4.5.1/rigs/kenwood/ts890s.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rigs/kenwood/ts890s.c 2022-12-24 00:04:12.000000000 +0100
@@ -305,7 +305,7 @@
if (rig->caps->swr_cal.size)
{
- val->f = rig_raw2val_float(val->i, &rig->caps->swr_cal);
+ val->f = rig_raw2val_float(levelint, &rig->caps->swr_cal);
}
else
{
@@ -432,7 +432,7 @@
RIG_MODEL(RIG_MODEL_TS890S),
.model_name = "TS-890S",
.mfg_name = "Kenwood",
- .version = BACKEND_VER ".9",
+ .version = BACKEND_VER ".10",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rigs/kenwood/tx500.c new/Hamlib-4.5.2/rigs/kenwood/tx500.c
--- old/Hamlib-4.5.1/rigs/kenwood/tx500.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rigs/kenwood/tx500.c 2022-12-24 00:04:12.000000000 +0100
@@ -127,15 +127,15 @@
RIG_MODEL(RIG_MODEL_LAB599_TX500),
.model_name = "TX-500",
.mfg_name = "Lab599",
- .version = BACKEND_VER ".1",
+ .version = BACKEND_VER ".3",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
.ptt_type = RIG_PTT_RIG,
.dcd_type = RIG_DCD_RIG,
.port_type = RIG_PORT_SERIAL,
- .serial_rate_min = 1200,
- .serial_rate_max = 57600,
+ .serial_rate_min = 9600,
+ .serial_rate_max = 9600,
.serial_data_bits = 8,
.serial_stop_bits = 1,
.serial_parity = RIG_PARITY_NONE,
@@ -318,8 +318,8 @@
.set_channel = ts2000_set_channel,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
- .set_powerstat = kenwood_set_powerstat,
- .get_powerstat = kenwood_get_powerstat,
+ //.set_powerstat = kenwood_set_powerstat,
+ //.get_powerstat = kenwood_get_powerstat,
.get_info = kenwood_get_info,
.reset = kenwood_reset,
.hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rigs/yaesu/ft736.c new/Hamlib-4.5.2/rigs/yaesu/ft736.c
--- old/Hamlib-4.5.1/rigs/yaesu/ft736.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rigs/yaesu/ft736.c 2022-12-24 00:04:12.000000000 +0100
@@ -31,6 +31,7 @@
#include "misc.h"
#include "yaesu.h"
#include "tones.h"
+#include "cache.h"
@@ -58,6 +59,7 @@
static int ft736_close(RIG *rig);
static int ft736_set_freq(RIG *rig, vfo_t vfo, freq_t freq);
+static int ft736_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); // cached answer
static int ft736_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
static int ft736_set_split_vfo(RIG *rig, vfo_t vfo, split_t split,
vfo_t tx_vfo);
@@ -98,7 +100,7 @@
RIG_MODEL(RIG_MODEL_FT736R),
.model_name = "FT-736R",
.mfg_name = "Yaesu",
- .version = "20211271.0",
+ .version = "20221218.0",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -195,6 +197,7 @@
.rig_close = ft736_close,
.set_freq = ft736_set_freq,
+ .get_freq = ft736_get_freq,
.set_mode = ft736_set_mode,
.set_ptt = ft736_set_ptt,
.get_dcd = ft736_get_dcd,
@@ -268,6 +271,7 @@
{
unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x01};
struct ft736_priv_data *priv = (struct ft736_priv_data *)rig->state.priv;
+ int retval;
// we will assume requesting to set VFOB is split mode
if (vfo == RIG_VFO_B) { return rig_set_split_freq(rig, vfo, freq); }
@@ -286,10 +290,24 @@
cmd[0] = (cmd[0] & 0x0f) | 0xc0;
}
- /* Frequency set */
- return write_block(&rig->state.rigport, cmd, YAESU_CMD_LENGTH);
+ retval = write_block(&rig->state.rigport, cmd, YAESU_CMD_LENGTH);
+
+ if (retval == RIG_OK) { rig_set_cache_freq(rig, vfo, freq); }
+
+ return retval;
}
+int ft736_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
+{
+ rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__);
+
+ if (vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN) { *freq = rig->state.cache.freqMainA; }
+ else { rig_get_cache_freq(rig, vfo, freq, NULL); }
+
+ return RIG_OK;
+}
+
+
#define MD_LSB 0x00
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rigs/yaesu/newcat.c new/Hamlib-4.5.2/rigs/yaesu/newcat.c
--- old/Hamlib-4.5.1/rigs/yaesu/newcat.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rigs/yaesu/newcat.c 2022-12-24 00:04:12.000000000 +0100
@@ -604,12 +604,18 @@
char *cmd = "EX0291;EX029;"; // FT2000/D
if (priv->rig_id == NC_RIGID_FT950 || rig->caps->rig_model == RIG_MODEL_FT950) { cmd = "EX0271;EX027;"; }
- else if (priv->rig_id == NC_RIGID_FT891 || rig->caps->rig_model == RIG_MODEL_FT891) { cmd = "EX05071;EX0507;"; }
- else if (priv->rig_id == NC_RIGID_FT991 || rig->caps->rig_model == RIG_MODEL_FT991) { cmd = "EX0321;EX032;"; }
- else if (priv->rig_id == NC_RIGID_FT991A || rig->caps->rig_model == RIG_MODEL_FT991) { cmd = "EX0321;EX032;"; }
- else if (priv->rig_id == NC_RIGID_FTDX3000 || rig->caps->rig_model == RIG_MODEL_FTDX3000) { cmd = "EX0391;EX039;"; }
- else if (priv->rig_id == NC_RIGID_FTDX3000DM || rig->caps->rig_model == RIG_MODEL_FTDX3000) { cmd = "EX0391;EX039;"; }
- else if (priv->rig_id == NC_RIGID_FTDX5000 || rig->caps->rig_model == RIG_MODEL_FTDX5000) { cmd = "EX0331;EX033"; }
+ else if (priv->rig_id == NC_RIGID_FT891
+ || rig->caps->rig_model == RIG_MODEL_FT891) { cmd = "EX05071;EX0507;"; }
+ else if (priv->rig_id == NC_RIGID_FT991
+ || rig->caps->rig_model == RIG_MODEL_FT991) { cmd = "EX0321;EX032;"; }
+ else if (priv->rig_id == NC_RIGID_FT991A
+ || rig->caps->rig_model == RIG_MODEL_FT991) { cmd = "EX0321;EX032;"; }
+ else if (priv->rig_id == NC_RIGID_FTDX3000
+ || rig->caps->rig_model == RIG_MODEL_FTDX3000) { cmd = "EX0391;EX039;"; }
+ else if (priv->rig_id == NC_RIGID_FTDX3000DM
+ || rig->caps->rig_model == RIG_MODEL_FTDX3000) { cmd = "EX0391;EX039;"; }
+ else if (priv->rig_id == NC_RIGID_FTDX5000
+ || rig->caps->rig_model == RIG_MODEL_FTDX5000) { cmd = "EX0331;EX033"; }
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "%s", cmd);
@@ -656,6 +662,14 @@
priv->poweron = 0;
}
+ if (is_ftdx5000)
+ {
+ // Ensure FT5000 is back to MIC input
+ SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX1030;");
+ rig_debug(RIG_DEBUG_TRACE, "%s: cmd_str = %s\n", __func__, priv->cmd_str);
+ newcat_set_cmd(rig); // don't care about the return
+ }
+
RETURNFUNC(RIG_OK);
}
@@ -880,7 +894,7 @@
if (vfo != rig->state.tx_vfo) { return -RIG_ENTARGET; }
}
- if (is_ftdx3000 || is_ftdx3000dm || is_ftdx5000)
+ if (is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx1200)
{
// we have a few rigs that can't set freq while PTT_ON
// so we'll try a few times to see if we just need to wait a bit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rigs/yaesu/newcat.h new/Hamlib-4.5.2/rigs/yaesu/newcat.h
--- old/Hamlib-4.5.1/rigs/yaesu/newcat.h 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rigs/yaesu/newcat.h 2022-12-24 00:04:12.000000000 +0100
@@ -50,7 +50,7 @@
typedef char ncboolean;
/* shared function version */
-#define NEWCAT_VER "20221204"
+#define NEWCAT_VER "20221223"
/* Hopefully large enough for future use, 128 chars plus '\0' */
#define NEWCAT_DATA_LEN 129
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rotators/fodtrack/fodtrack.c new/Hamlib-4.5.2/rotators/fodtrack/fodtrack.c
--- old/Hamlib-4.5.1/rotators/fodtrack/fodtrack.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rotators/fodtrack/fodtrack.c 2022-12-24 00:04:12.000000000 +0100
@@ -26,9 +26,11 @@
#include
#endif
+#ifdef HAVE_PARALLEL
#ifdef HAVE_LINUX_PARPORT_H
#include
#endif
+#endif
#include "hamlib/rotator.h"
#include "parallel.h"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rotators/prosistel/prosistel.c new/Hamlib-4.5.2/rotators/prosistel/prosistel.c
--- old/Hamlib-4.5.1/rotators/prosistel/prosistel.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rotators/prosistel/prosistel.c 2022-12-24 00:04:12.000000000 +0100
@@ -379,6 +379,15 @@
};
+// Elevation rotator with Control box D using azimuth logic
+static const struct prosistel_rot_priv_caps prosistel_rot_el_cboxaz =
+{
+ .angle_multiplier = 1.0f,
+ .stop_angle = 997,
+ .elevation_id = 'A',
+};
+
+
/*
* Prosistel rotator capabilities
*/
@@ -486,6 +495,43 @@
.get_position = prosistel_rot_get_position,
};
+
+// Elevation rotator with Control box D using azimuth logic
+const struct rot_caps prosistel_d_el_cboxaz_rot_caps =
+{
+ ROT_MODEL(ROT_MODEL_PROSISTEL_D_EL_CBOXAZ),
+ .model_name = "D elevation CBOX az",
+ .mfg_name = "Prosistel",
+ .version = "20221215.0",
+ .copyright = "LGPL",
+ .status = RIG_STATUS_STABLE,
+ .rot_type = ROT_TYPE_ELEVATION,
+ .port_type = RIG_PORT_SERIAL,
+ .serial_rate_min = 9600,
+ .serial_rate_max = 9600,
+ .serial_data_bits = 8,
+ .serial_stop_bits = 1,
+ .serial_parity = RIG_PARITY_NONE,
+ .serial_handshake = RIG_HANDSHAKE_NONE,
+ .write_delay = 0,
+ .post_write_delay = 0,
+ .timeout = 3000,
+ .retry = 3,
+
+ .min_az = 0.0,
+ .max_az = 0.0,
+ .min_el = 0.0,
+ .max_el = 90.0,
+
+ .priv = &prosistel_rot_el_cboxaz,
+
+ .rot_open = prosistel_rot_open,
+ .stop = prosistel_rot_stop,
+ .set_position = prosistel_rot_set_position,
+ .get_position = prosistel_rot_get_position,
+};
+
+
DECLARE_INITROT_BACKEND(prosistel)
{
rig_debug(RIG_DEBUG_VERBOSE, "%s: _init called\n", __func__);
@@ -493,6 +539,7 @@
rot_register(&prosistel_d_az_rot_caps);
rot_register(&prosistel_d_el_rot_caps);
rot_register(&prosistel_combi_track_azel_rot_caps);
+ rot_register(&prosistel_d_el_cboxaz_rot_caps);
return RIG_OK;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/rotators/prosistel/prosistel.h new/Hamlib-4.5.2/rotators/prosistel/prosistel.h
--- old/Hamlib-4.5.1/rotators/prosistel/prosistel.h 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/rotators/prosistel/prosistel.h 2022-12-24 00:04:12.000000000 +0100
@@ -25,5 +25,6 @@
extern const struct rot_caps prosistel_d_az_rot_caps;
extern const struct rot_caps prosistel_d_el_rot_caps;
extern const struct rot_caps prosistel_combi_track_azel_rot_caps;
+extern const struct rot_caps prosistel_d_el_cboxaz_rot_caps;
#endif /* _ROT_PROSISTEL_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/simulators/simftdx1200.c new/Hamlib-4.5.2/simulators/simftdx1200.c
--- old/Hamlib-4.5.1/simulators/simftdx1200.c 1970-01-01 01:00:00.000000000 +0100
+++ new/Hamlib-4.5.2/simulators/simftdx1200.c 2022-12-24 00:04:12.000000000 +0100
@@ -0,0 +1,309 @@
+// can run this using rigctl/rigctld and socat pty devices
+// gcc -o simyaesu simyaesu.c
+#define _XOPEN_SOURCE 600
+#include
+#include
+#include
+#include
+#include
+#include "../include/hamlib/rig.h"
+
+#define BUFSIZE 256
+
+float freqA = 14074000;
+float freqB = 14074500;
+int vfo = 0;
+int ft = 0;
+int md = 1;
+int vs = 0;
+int tx = 0;
+int ai = 0;
+int sh = 25;
+int na = 0;
+int ex039 = 0;
+
+// ID 0310 == 310, Must drop leading zero
+typedef enum nc_rigid_e
+{
+ NC_RIGID_NONE = 0,
+ NC_RIGID_FT450 = 241,
+ NC_RIGID_FT450D = 244,
+ NC_RIGID_FT950 = 310,
+ NC_RIGID_FT891 = 135,
+ NC_RIGID_FT991 = 135,
+ NC_RIGID_FT2000 = 251,
+ NC_RIGID_FT2000D = 252,
+ NC_RIGID_FTDX1200 = 583,
+ NC_RIGID_FTDX9000D = 101,
+ NC_RIGID_FTDX9000Contest = 102,
+ NC_RIGID_FTDX9000MP = 103,
+ NC_RIGID_FTDX5000 = 362,
+ NC_RIGID_FTDX3000 = 460,
+ NC_RIGID_FTDX101D = 681,
+ NC_RIGID_FTDX101MP = 682
+} nc_rigid_t;
+
+int
+getmyline(int fd, char *buf)
+{
+ char c;
+ int i = 0;
+ memset(buf, 0, BUFSIZE);
+
+ while (read(fd, &c, 1) > 0)
+ {
+ buf[i++] = c;
+
+ if (c == ';') { return strlen(buf); }
+ }
+
+ return strlen(buf);
+}
+
+#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
+
+
+
+int main(int argc, char *argv[])
+{
+ char buf[256];
+ char *pbuf;
+ int n;
+ int fd = openPort(argv[1]);
+
+ while (1)
+ {
+ if (getmyline(fd, buf))
+ {
+ printf("Cmd:%s\n", buf);
+ }
+ else { continue; }
+
+ if (strcmp(buf, "RM5;") == 0)
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ pbuf = "RM5100000;";
+ n = write(fd, pbuf, strlen(pbuf));
+ printf("n=%d\n", n);
+
+ if (n <= 0) { perror("RM5"); }
+ }
+
+ if (strcmp(buf, "AN0;") == 0)
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ pbuf = "AN030;";
+ n = write(fd, pbuf, strlen(pbuf));
+ printf("n=%d\n", n);
+
+ if (n <= 0) { perror("AN"); }
+ }
+ else if (strcmp(buf, "IF;") == 0)
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ pbuf = "IF059014200000+000000700000;";
+ n = write(fd, pbuf, strlen(pbuf));
+ printf("n=%d\n", n);
+
+ if (n <= 0) { perror("IF"); }
+ }
+ else if (strcmp(buf, "ID;") == 0)
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ int id = NC_RIGID_FTDX3000;
+ SNPRINTF(buf, sizeof(buf), "ID%03d;", id);
+ n = write(fd, buf, strlen(buf));
+ printf("n=%d\n", n);
+
+ if (n <= 0) { perror("ID"); }
+ }
+ else if (strcmp(buf, "AI;") == 0)
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ SNPRINTF(buf, sizeof(buf), "AI0;");
+ n = write(fd, buf, strlen(buf));
+ printf("n=%d\n", n);
+
+ if (n <= 0) { perror("ID"); }
+ }
+
+#if 0
+ else if (strncmp(buf, "AI", 2) == 0)
+ {
+ if (strcmp(buf, "AI;"))
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ n = fprintf(fp, "%s", "AI0;");
+ printf("n=%d\n", n);
+
+ if (n <= 0) { perror("AI"); }
+ }
+ }
+
+#endif
+ else if (strcmp(buf, "VS;") == 0)
+ {
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ pbuf = "VS0;";
+ n = write(fd, pbuf, strlen(pbuf));
+ printf("n=%d\n", n);
+
+ if (n < 0) { perror("VS"); }
+ }
+ else if (strcmp(buf, "EX032;") == 0)
+ {
+ static int ant = 0;
+ ant = (ant + 1) % 3;
+ printf("%s\n", buf);
+ usleep(50 * 1000);
+ SNPRINTF(buf, sizeof(buf), "EX032%1d;", ant);
+ n = write(fd, buf, strlen(buf));
+ printf("n=%d\n", n);
+
+ if (n < 0) { perror("EX032"); }
+ }
+
+ else if (strcmp(buf, "FA;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "FA%08.0f;", freqA);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "FA", 2) == 0)
+ {
+ sscanf(buf, "FA%f", &freqA);
+ }
+ else if (strcmp(buf, "FB;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "FB%08.0f;", freqB);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "FB", 2) == 0)
+ {
+ sscanf(buf, "FB%f", &freqB);
+ }
+ else if (strcmp(buf, "VS;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "VS%c;", vfo == 0 ? '0' : '1');
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strcmp(buf, "FT;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "FT%d;", ft);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strcmp(buf, "MD0;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "MD0%d;", md);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strcmp(buf, "VS;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "VS%d;", vs);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "VS", 2) == 0)
+ {
+ sscanf(buf, "VS%d", &vs);
+ }
+ else if (strcmp(buf, "TX;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "TX%d;", tx);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "TX", 2) == 0)
+ {
+ sscanf(buf, "TX%d", &tx);
+ }
+ else if (strcmp(buf, "AI;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "AI%d;", ai);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "AI", 2) == 0)
+ {
+ sscanf(buf, "AI%d", &ai);
+ }
+ else if (strcmp(buf, "SH0;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "SH0%d;", sh);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "SH0", 3) == 0)
+ {
+ sscanf(buf, "SH0%d", &sh);
+ }
+ else if (strcmp(buf, "NA0;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "NA0%d;", na);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "NA0", 3) == 0)
+ {
+ sscanf(buf, "NA0%d", &na);
+ }
+ else if (strcmp(buf, "EX039;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "EX039%d;", ex039);
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strncmp(buf, "EX039", 3) == 0)
+ {
+ sscanf(buf, "EX039%d", &ex039);
+ }
+ else if (strcmp(buf,"PS;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "PS1;");
+ n = write(fd, buf, strlen(buf));
+ }
+ else if (strlen(buf) > 0)
+ {
+ fprintf(stderr, "Unknown command: %s\n", buf);
+ }
+
+ }
+
+ return 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/simulators/simftdx3000.c new/Hamlib-4.5.2/simulators/simftdx3000.c
--- old/Hamlib-4.5.1/simulators/simftdx3000.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/simulators/simftdx3000.c 2022-12-24 00:04:12.000000000 +0100
@@ -252,6 +252,11 @@
{
sscanf(buf, "MD0%d", &md);
}
+ else if (strcmp(buf, "PS;") == 0)
+ {
+ SNPRINTF(buf, sizeof(buf), "PS1;");
+ n = write(fd, buf, strlen(buf));
+ }
else if (strcmp(buf, "VS;") == 0)
{
SNPRINTF(buf, sizeof(buf), "VS%d;", vs);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/src/cache.c new/Hamlib-4.5.2/src/cache.c
--- old/Hamlib-4.5.1/src/cache.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/src/cache.c 2022-12-24 00:04:12.000000000 +0100
@@ -442,6 +442,41 @@
return RIG_OK;
}
+/**
+ * \brief get cached values for a VFO
+ * \param rig The rig handle
+ * \param vfo The VFO to get information from
+ * \param freq The frequency is stored here
+ * \param cache_ms_freq The age of the last frequency update in ms -- NULL if you don't want it
+
+ * Use this to query the frequency cache and then determine to actually fetch data from
+ * the rig.
+ *
+ * \return RIG_OK if the operation has been successful, otherwise
+ * a negative value if an error occurred (in which case, cause is
+ * set appropriately).
+ *
+ */
+int rig_get_cache_freq(RIG *rig, vfo_t vfo, freq_t *freq, int *cache_ms_freq_p)
+{
+ rmode_t mode;
+ int cache_ms_freq;
+ int cache_ms_mode;
+ pbwidth_t width;
+ int cache_ms_width;
+ int retval;
+ retval = rig_get_cache(rig, vfo, freq, &cache_ms_freq, &mode, &cache_ms_mode,
+ &width, &cache_ms_width);
+
+ if (retval == RIG_OK)
+ {
+ if (cache_ms_freq_p) { *cache_ms_freq_p = cache_ms_freq; }
+ }
+
+ return retval;
+}
+
+
void rig_cache_show(RIG *rig, const char *func, int line)
{
rig_debug(RIG_DEBUG_CACHE,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/src/parallel.h new/Hamlib-4.5.2/src/parallel.h
--- old/Hamlib-4.5.1/src/parallel.h 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/src/parallel.h 2022-12-24 00:04:12.000000000 +0100
@@ -26,9 +26,11 @@
#include
#include "iofunc.h"
+#ifdef HAVE_PARALLEL
#ifdef HAVE_LINUX_PARPORT_H
# include
#endif
+#endif
#ifndef PARPORT_CONTROL_STROBE
# define PARPORT_CONTROL_STROBE 0x1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/src/rig.c new/Hamlib-4.5.2/src/rig.c
--- old/Hamlib-4.5.1/src/rig.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/src/rig.c 2022-12-24 00:04:12.000000000 +0100
@@ -1346,14 +1346,18 @@
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Current split=%d, tx_vfo=%s\n", __func__,
__LINE__, split, rig_strvfo(tx_vfo));
rmode_t mode;
- pbwidth_t width;
- rig_get_mode(rig, RIG_VFO_A, &mode, &width);
+ pbwidth_t width = 2400; // we'll use 2400Hz as default width
- if (split)
+ if (rig->caps->get_mode)
{
- rig_debug(RIG_DEBUG_VERBOSE, "xxxsplit=%d\n", split);
- HAMLIB_TRACE;
- rig_get_mode(rig, RIG_VFO_B, &mode, &width);
+ rig_get_mode(rig, RIG_VFO_A, &mode, &width);
+
+ if (split)
+ {
+ rig_debug(RIG_DEBUG_VERBOSE, "xxxsplit=%d\n", split);
+ HAMLIB_TRACE;
+ rig_get_mode(rig, RIG_VFO_B, &mode, &width);
+ }
}
}
}
@@ -1516,6 +1520,8 @@
remove_opened_rig(rig);
+ // zero split so it will allow it to be set again on open for rigctld
+ rig->state.cache.split = 0;
rs->comm_state = 0;
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): %p rs->comm_state==0?=%d\n", __func__,
__LINE__, &rs->comm_state,
@@ -1802,7 +1808,11 @@
if (retcode != RIG_OK) { RETURNFUNC(retcode); }
- rig_set_cache_freq(rig, vfo, (freq_t)0);
+ // Unidirectional rigs do not reset cache
+ if (rig->caps->rig_model != RIG_MODEL_FT736R)
+ {
+ rig_set_cache_freq(rig, vfo, (freq_t)0);
+ }
#if 0 // this verification seems to be causing bad behavior on some rigs
@@ -1893,7 +1903,12 @@
#endif
)
{
- rig_set_cache_freq(rig, RIG_VFO_ALL, (freq_t)0);
+ // Unidirectional rigs do not reset cache
+ if (rig->caps->rig_model != RIG_MODEL_FT736R)
+ {
+ rig_set_cache_freq(rig, RIG_VFO_ALL, (freq_t)0);
+ }
+
HAMLIB_TRACE;
retcode = rig_get_freq(rig, vfo, &freq_new);
@@ -2892,8 +2907,9 @@
if (cache_ms < rig->state.cache.timeout_ms)
{
- rig_debug(RIG_DEBUG_TRACE, "%s: cache hit age=%dms\n", __func__, cache_ms);
*vfo = rig->state.cache.vfo;
+ rig_debug(RIG_DEBUG_TRACE, "%s: cache hit age=%dms, vfo=%s\n", __func__,
+ cache_ms, rig_strvfo(*vfo));
ELAPSED2;
RETURNFUNC(RIG_OK);
}
@@ -6020,7 +6036,7 @@
if (rig->caps->get_powerstat == NULL)
{
*status = RIG_POWER_ON; // default to power if not available
- RETURNFUNC(-RIG_ENAVAIL);
+ RETURNFUNC(RIG_OK);
}
*status = RIG_POWER_OFF; // default now to power off until proven otherwise in get_powerstat
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/tests/rigctl_parse.c new/Hamlib-4.5.2/tests/rigctl_parse.c
--- old/Hamlib-4.5.1/tests/rigctl_parse.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/tests/rigctl_parse.c 2022-12-24 00:04:12.000000000 +0100
@@ -1752,7 +1752,8 @@
&& cmd_entry->cmd != '3' // dump_conf
&& cmd_entry->cmd != 0x8f // dump_state
&& cmd_entry->cmd != 0xf0 // chk_vfo
- && cmd_entry->cmd != 0x87) // set_powerstat
+ && cmd_entry->cmd != 0x87 // set_powerstat
+ && my_rig->caps->rig_model != RIG_MODEL_POWERSDR) // some rigs can do stuff when powered off
{
rig_debug(RIG_DEBUG_WARN,
"%s: command %s not allowed when rig is powered off\n", __func__,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Hamlib-4.5.1/tests/rigctld.c new/Hamlib-4.5.2/tests/rigctld.c
--- old/Hamlib-4.5.1/tests/rigctld.c 2022-12-08 16:11:46.000000000 +0100
+++ new/Hamlib-4.5.2/tests/rigctld.c 2022-12-24 00:04:12.000000000 +0100
@@ -83,7 +83,7 @@
* keep up to date SHORT_OPTIONS, usage()'s output and man page. thanks.
* TODO: add an option to read from a file
*/
-#define SHORT_OPTIONS "m:r:R:p:d:P:D:s:S:c:T:t:C:W:w:x:z:lLuovhVZMA:n:"
+#define SHORT_OPTIONS "m:r:p:d:P:D:s:S:c:T:t:C:W:w:x:z:lLuovhVZMRA:n:"
static struct option long_options[] =
{
{"model", 1, 0, 'm'},
@@ -154,6 +154,8 @@
char resp_sep = '\n';
extern int lock_mode;
extern powerstat_t rig_powerstat;
+static int rigctld_idle =
+ 0; // if true then rig will close when no clients are connected
#define MAXCONFLEN 1024
@@ -262,8 +264,6 @@
int twiddle_timeout = 0;
int twiddle_rit = 0;
int uplink = 0;
- int rigctld_idle =
- 0; // if true then rig will close when no clients are connected
char host[NI_MAXHOST];
char serv[NI_MAXSERV];
char rigstartup[1024];
@@ -701,7 +701,9 @@
{
my_rig->state.pttport.type.ptt = ptt_type;
my_rig->state.pttport_deprecated.type.ptt = ptt_type;
- my_rig->caps->ptt_type = ptt_type;
+ // This causes segfault since backend rig_caps are const
+ // rigctld will use the rig->state version of this for clients
+ //my_rig->caps->ptt_type = ptt_type;
}
if (dcd_type != RIG_DCD_NONE)
@@ -1195,7 +1197,7 @@
#ifdef HAVE_PTHREAD
mutex_rigctld(1);
-// ++client_count;
+ ++client_count;
#if 0
if (!client_count++)
@@ -1311,7 +1313,19 @@
}
while (!ctrl_c && (retcode == RIG_OK || RIG_IS_SOFT_ERRCODE(-retcode)));
+ if (rigctld_idle && client_count == 1)
+ {
+ rig_close(my_rig);
+
+ if (verbose > RIG_DEBUG_ERR) { printf("Closed rig model %s. Will reopen for new clients\n", my_rig->caps->model_name); }
+ }
+
+
#ifdef HAVE_PTHREAD
+ --client_count;
+
+ if (rigctld_idle && client_count > 0) { printf("%d client%s still connected so rig remains open\n", client_count, client_count > 1 ? "s" : ""); }
+
#if 0
mutex_rigctld(1);