From d0c615ae437a75f4f80925ccc67cfa3665d4ddf1 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Fri, 15 Jul 2022 15:41:23 -0500 Subject: [PATCH] Added EPOWER error return when rig is powered off Only set_powerstat will be accepted and rig will be polled for powerstat https://github.com/Hamlib/Hamlib/issues/1085 --- include/hamlib/rig.h | 4 +++- rigs/dummy/dummy.c | 3 ++- src/misc.c | 4 ++++ src/rig.c | 3 ++- tests/rigctl_parse.c | 19 ++++++++++++++++++- tests/rigctld.c | 4 ++++ 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 920cbb678..7934eccee 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -157,7 +157,8 @@ enum rig_errcode_e { RIG_EVFO, /*!< 16 Invalid VFO */ RIG_EDOM, /*!< 17 Argument out of domain of func */ RIG_EDEPRECATED,/*!< 18 Function deprecated */ - RIG_ESECURITY /*!< 19 Security error */ + RIG_ESECURITY, /*!< 19 Security error */ + RIG_EPOWER /*!< 20 Rig not powered on */ }; /** @@ -2575,6 +2576,7 @@ struct rig_state { int use_cached_ptt; /*ptt = RIG_PTT_OFF; priv->powerstat = RIG_POWER_ON; + rig->state.powerstat = priv->powerstat; priv->bank = 0; memset(priv->parms, 0, RIG_SETTING_MAX * sizeof(value_t)); @@ -2260,7 +2261,7 @@ struct rig_caps dummy_caps = RIG_MODEL(RIG_MODEL_DUMMY), .model_name = "Dummy", .mfg_name = "Hamlib", - .version = "20220510.0", + .version = "20220715.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_OTHER, diff --git a/src/misc.c b/src/misc.c index 78d546b72..15c0b9b0b 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2091,6 +2091,10 @@ int HAMLIB_API rig_flush(hamlib_port_t *port) rig_debug(RIG_DEBUG_TRACE, "%s: called for %s device\n", __func__, port->type.rig == RIG_PORT_SERIAL ? "serial" : "network"); + if (port->type.rig == RIG_PORT_NONE) + { + return RIG_OK; + } if (port->type.rig == RIG_PORT_NETWORK || port->type.rig == RIG_PORT_UDP_NETWORK) { diff --git a/src/rig.c b/src/rig.c index fe3c48076..6f81f0c3b 100644 --- a/src/rig.c +++ b/src/rig.c @@ -207,7 +207,8 @@ static const char *const rigerror_table[] = "Invalid VFO", "Argument out of domain of func", "Function deprecated", - "Security error password not provided or crypto failure" + "Security error password not provided or crypto failure", + "Rig is not powered on" }; diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index f5c54fc66..3402ca8a4 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -1723,7 +1723,21 @@ readline_repeat: } else - { + { + if ((my_rig->state.powerstat == RIG_POWER_OFF || my_rig->state.powerstat == RIG_POWER_STANDBY)) + { + // Update power status + powerstat_t stat; + rig_get_powerstat(my_rig, &stat); + } + // only command allows when powered off is 135=set_powerstat + if ((my_rig->state.powerstat == RIG_POWER_OFF || my_rig->state.powerstat == RIG_POWER_STANDBY) && cmd_entry->cmd != 135) + { + //rig_debug(RIG_DEBUG_WARN, "%s: %s - only \\set_powerstat can be run \n", __func__, rigerror(-RIG_EPOWER)); + rig_debug(RIG_DEBUG_WARN, "%s: only \\set_powerstat can be run when rig powered off\n", __func__); + retcode = -RIG_EPOWER; + } + else { retcode = (*cmd_entry->rig_routine)(my_rig, fout, fin, @@ -1738,6 +1752,7 @@ readline_repeat: p1, p2 ? p2 : "", p3 ? p3 : ""); + } } @@ -4659,6 +4674,7 @@ declare_proto_rig(set_powerstat) CHKSCN1ARG(sscanf(arg1, "%d", &stat)); retval = rig_set_powerstat(rig, (powerstat_t) stat); + rig->state.powerstat = stat; fflush(fin); RETURNFUNC(retval); } @@ -4685,6 +4701,7 @@ declare_proto_rig(get_powerstat) } fprintf(fout, "%d\n", stat); + rig->state.powerstat = stat; RETURNFUNC(status); } diff --git a/tests/rigctld.c b/tests/rigctld.c index 98d678c3b..b92fe0cf8 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -1150,6 +1150,7 @@ void *handle_socket(void *arg) char serv[NI_MAXSERV]; char send_cmd_term = '\r'; /* send_cmd termination char */ int ext_resp = 0; + powerstat_t powerstat = RIG_POWER_ON; // defaults to power on fsockin = get_fsockin(handle_data_arg); @@ -1205,6 +1206,9 @@ void *handle_socket(void *arg) #endif + rig_get_powerstat(my_rig, &powerstat); + my_rig->state.powerstat = powerstat; + do { mutex_rigctld(1);