kopia lustrzana https://github.com/Hamlib/Hamlib
Fix bugs in dummy rig. Report errors (incl. timeouts) from icom_get_powerstat(), because the timeout reason is often something else than rig being powered off. Check for power status changes in rigctld/rigctl command loops.
rodzic
b78fa43b56
commit
7d5f540b9c
|
@ -533,6 +533,8 @@ static int dummy_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
|
|
||||||
vfo = vfo_fixup(rig, vfo, rig->state.cache.split);
|
vfo = vfo_fixup(rig, vfo, rig->state.cache.split);
|
||||||
|
|
||||||
|
if (vfo == RIG_VFO_CURR) { vfo = rig->state.current_vfo; }
|
||||||
|
|
||||||
if (width == RIG_PASSBAND_NOCHANGE)
|
if (width == RIG_PASSBAND_NOCHANGE)
|
||||||
{
|
{
|
||||||
switch (vfo)
|
switch (vfo)
|
||||||
|
@ -613,12 +615,34 @@ static int dummy_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
||||||
switch (vfo)
|
switch (vfo)
|
||||||
{
|
{
|
||||||
case RIG_VFO_MAIN:
|
case RIG_VFO_MAIN:
|
||||||
case RIG_VFO_A: *mode = priv->vfo_a.mode; *width = priv->vfo_a.width; break;
|
case RIG_VFO_A:
|
||||||
|
*mode = priv->vfo_a.mode; *width = priv->vfo_a.width;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RIG_VFO_MAIN_A:
|
||||||
|
*mode = priv->vfo_maina.mode; *width = priv->vfo_maina.width;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RIG_VFO_MAIN_B:
|
||||||
|
*mode = priv->vfo_mainb.mode; *width = priv->vfo_mainb.width;
|
||||||
|
break;
|
||||||
|
|
||||||
case RIG_VFO_SUB:
|
case RIG_VFO_SUB:
|
||||||
case RIG_VFO_B: *mode = priv->vfo_b.mode; *width = priv->vfo_b.width; break;
|
case RIG_VFO_B:
|
||||||
|
*mode = priv->vfo_b.mode; *width = priv->vfo_b.width;
|
||||||
|
break;
|
||||||
|
|
||||||
case RIG_VFO_C: *mode = priv->vfo_c.mode; *width = priv->vfo_c.width; break;
|
case RIG_VFO_SUB_A:
|
||||||
|
*mode = priv->vfo_suba.mode; *width = priv->vfo_suba.width;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RIG_VFO_SUB_B:
|
||||||
|
*mode = priv->vfo_subb.mode; *width = priv->vfo_subb.width;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RIG_VFO_C:
|
||||||
|
*mode = priv->vfo_c.mode; *width = priv->vfo_c.width;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURNFUNC(RIG_OK);
|
RETURNFUNC(RIG_OK);
|
||||||
|
@ -636,9 +660,6 @@ static int dummy_set_vfo(RIG *rig, vfo_t vfo)
|
||||||
|
|
||||||
if (vfo == RIG_VFO_CURR) { vfo = rig->state.current_vfo; }
|
if (vfo == RIG_VFO_CURR) { vfo = rig->state.current_vfo; }
|
||||||
|
|
||||||
priv->last_vfo = priv->curr_vfo;
|
|
||||||
priv->curr_vfo = vfo;
|
|
||||||
|
|
||||||
switch (vfo)
|
switch (vfo)
|
||||||
{
|
{
|
||||||
case RIG_VFO_VFO: /* FIXME */
|
case RIG_VFO_VFO: /* FIXME */
|
||||||
|
@ -683,6 +704,8 @@ static int dummy_set_vfo(RIG *rig, vfo_t vfo)
|
||||||
RETURNFUNC(-RIG_EINVAL);
|
RETURNFUNC(-RIG_EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priv->last_vfo = priv->curr_vfo;
|
||||||
|
priv->curr_vfo = vfo;
|
||||||
rig->state.current_vfo = vfo;
|
rig->state.current_vfo = vfo;
|
||||||
|
|
||||||
RETURNFUNC(RIG_OK);
|
RETURNFUNC(RIG_OK);
|
||||||
|
|
|
@ -7799,26 +7799,27 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status)
|
||||||
freq_t freq;
|
freq_t freq;
|
||||||
short retry_save = rig->state.rigport.retry;
|
short retry_save = rig->state.rigport.retry;
|
||||||
short timeout_retry_save = rig->state.rigport.timeout_retry;
|
short timeout_retry_save = rig->state.rigport.timeout_retry;
|
||||||
HAMLIB_TRACE;
|
HAMLIB_TRACE;
|
||||||
|
|
||||||
rig->state.rigport.retry = 0;
|
rig->state.rigport.retry = 0;
|
||||||
rig->state.rigport.timeout_retry = 0;
|
rig->state.rigport.timeout_retry = 0;
|
||||||
|
|
||||||
retval = rig_get_freq(rig, RIG_VFO_A, &freq);
|
retval = rig_get_freq(rig, RIG_VFO_A, &freq);
|
||||||
|
|
||||||
if (retval == -RIG_ETIMEOUT)
|
if (retval != RIG_OK)
|
||||||
{ // then rig must be turned off
|
{
|
||||||
HAMLIB_TRACE;
|
rig_debug(RIG_DEBUG_WARN, "%s: get freq failed, assuming power is off\n", __func__);
|
||||||
rig_debug(RIG_DEBUG_WARN, "%s: get freq failed...assuming power is off\n", __func__);
|
|
||||||
rig->state.powerstat = RIG_POWER_OFF;
|
|
||||||
return RIG_OK; // returning RIG_OK here makes the rig->state reflect POWER_OFF
|
|
||||||
}
|
}
|
||||||
HAMLIB_TRACE;
|
HAMLIB_TRACE;
|
||||||
|
|
||||||
rig->state.rigport.retry = retry_save;
|
rig->state.rigport.retry = retry_save;
|
||||||
rig->state.rigport.timeout_retry = timeout_retry_save;
|
rig->state.rigport.timeout_retry = timeout_retry_save;
|
||||||
|
|
||||||
|
// Assume power is OFF if get_freq fails
|
||||||
*status = retval == RIG_OK ? RIG_POWER_ON : RIG_POWER_OFF;
|
*status = retval == RIG_OK ? RIG_POWER_ON : RIG_POWER_OFF;
|
||||||
|
|
||||||
|
// Modify rig_state powerstat directly to reflect power ON/OFF status, but return the result of rig_get_freq,
|
||||||
|
// because the error could indicate other connectivity issues too
|
||||||
rig->state.powerstat = *status;
|
rig->state.powerstat = *status;
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -7827,14 +7828,13 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status)
|
||||||
retval = icom_transaction(rig, C_SET_PWR, -1, NULL, 0,
|
retval = icom_transaction(rig, C_SET_PWR, -1, NULL, 0,
|
||||||
ackbuf, &ack_len);
|
ackbuf, &ack_len);
|
||||||
|
|
||||||
if (retval == -RIG_ETIMEOUT)
|
|
||||||
{ // then rig must be turned off
|
|
||||||
rig_debug(RIG_DEBUG_WARN, "%s: get powerstat failed...assuming power is off\n", __func__);
|
|
||||||
rig->state.powerstat = RIG_POWER_OFF;
|
|
||||||
return RIG_OK; // returning RIG_OK here makes the rig->state reflect POWER_OFF
|
|
||||||
}
|
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
{
|
{
|
||||||
|
// Assume power is OFF if getting power status fails
|
||||||
|
// Modify rig_state powerstat directly to reflect power ON/OFF status, but return the result of rig_get_freq,
|
||||||
|
// because the error could indicate other connectivity issues too
|
||||||
|
rig_debug(RIG_DEBUG_WARN, "%s: get powerstat failed, assuming power is off\n", __func__);
|
||||||
|
rig->state.powerstat = RIG_POWER_OFF;
|
||||||
RETURNFUNC(retval);
|
RETURNFUNC(retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ int main(int argc, char *argv[])
|
||||||
char rigstartup[1024];
|
char rigstartup[1024];
|
||||||
char vbuf[1024];
|
char vbuf[1024];
|
||||||
rig_powerstat = RIG_POWER_ON; // defaults to power on
|
rig_powerstat = RIG_POWER_ON; // defaults to power on
|
||||||
|
struct timespec powerstat_check_time;
|
||||||
#if HAVE_SIGACTION
|
#if HAVE_SIGACTION
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
#endif
|
#endif
|
||||||
|
@ -814,6 +815,8 @@ int main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
elapsed_ms(&powerstat_check_time, HAMLIB_ELAPSED_SET);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (!rig_opened)
|
if (!rig_opened)
|
||||||
|
@ -829,10 +832,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
// If we get a timeout, the rig might be powered off
|
// If we get a timeout, the rig might be powered off
|
||||||
// Update our power status in case power gets turned off
|
// Update our power status in case power gets turned off
|
||||||
if (retcode == -RIG_ETIMEOUT && my_rig->caps->get_powerstat)
|
// Check power status if rig is powered off, but not more often than once per second
|
||||||
|
if (my_rig->caps->get_powerstat && (retcode == -RIG_ETIMEOUT ||
|
||||||
|
(retcode == -RIG_EPOWER && elapsed_ms(&powerstat_check_time, HAMLIB_ELAPSED_GET) >= 1000)))
|
||||||
{
|
{
|
||||||
powerstat_t powerstat;
|
powerstat_t powerstat;
|
||||||
|
|
||||||
rig_get_powerstat(my_rig, &powerstat);
|
rig_get_powerstat(my_rig, &powerstat);
|
||||||
rig_powerstat = powerstat;
|
rig_powerstat = powerstat;
|
||||||
|
|
||||||
|
@ -840,6 +844,8 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
retcode = -RIG_EPOWER;
|
retcode = -RIG_EPOWER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elapsed_ms(&powerstat_check_time, HAMLIB_ELAPSED_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we get a hard error we try to reopen the rig again
|
// if we get a hard error we try to reopen the rig again
|
||||||
|
|
|
@ -1759,6 +1759,7 @@ readline_repeat:
|
||||||
&& cmd_entry->cmd != 0x87 // set_powerstat
|
&& cmd_entry->cmd != 0x87 // set_powerstat
|
||||||
&& cmd_entry->cmd != 0x88 // get_powerstat
|
&& cmd_entry->cmd != 0x88 // get_powerstat
|
||||||
&& cmd_entry->cmd != 0xa5 // client_version
|
&& cmd_entry->cmd != 0xa5 // client_version
|
||||||
|
&& cmd_entry->cmd != 0xf2 // set_vfo_opt
|
||||||
&& my_rig->caps->rig_model !=
|
&& my_rig->caps->rig_model !=
|
||||||
RIG_MODEL_POWERSDR) // some rigs can do stuff when powered off
|
RIG_MODEL_POWERSDR) // some rigs can do stuff when powered off
|
||||||
{
|
{
|
||||||
|
|
|
@ -1192,6 +1192,7 @@ void *handle_socket(void *arg)
|
||||||
char send_cmd_term = '\r'; /* send_cmd termination char */
|
char send_cmd_term = '\r'; /* send_cmd termination char */
|
||||||
int ext_resp = 0;
|
int ext_resp = 0;
|
||||||
rig_powerstat = RIG_POWER_ON; // defaults to power on
|
rig_powerstat = RIG_POWER_ON; // defaults to power on
|
||||||
|
struct timespec powerstat_check_time;
|
||||||
|
|
||||||
fsockin = get_fsockin(handle_data_arg);
|
fsockin = get_fsockin(handle_data_arg);
|
||||||
|
|
||||||
|
@ -1257,6 +1258,8 @@ void *handle_socket(void *arg)
|
||||||
my_rig->state.powerstat = rig_powerstat;
|
my_rig->state.powerstat = rig_powerstat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elapsed_ms(&powerstat_check_time, HAMLIB_ELAPSED_SET);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
mutex_rigctld(1);
|
mutex_rigctld(1);
|
||||||
|
@ -1273,7 +1276,6 @@ void *handle_socket(void *arg)
|
||||||
|
|
||||||
if (rig_opened) // only do this if rig is open
|
if (rig_opened) // only do this if rig is open
|
||||||
{
|
{
|
||||||
powerstat_t powerstat;
|
|
||||||
rig_debug(RIG_DEBUG_TRACE, "%s: doing rigctl_parse vfo_mode=%d, secure=%d\n",
|
rig_debug(RIG_DEBUG_TRACE, "%s: doing rigctl_parse vfo_mode=%d, secure=%d\n",
|
||||||
__func__,
|
__func__,
|
||||||
handle_data_arg->vfo_mode, handle_data_arg->use_password);
|
handle_data_arg->vfo_mode, handle_data_arg->use_password);
|
||||||
|
@ -1286,8 +1288,11 @@ void *handle_socket(void *arg)
|
||||||
|
|
||||||
// If we get a timeout, the rig might be powered off
|
// If we get a timeout, the rig might be powered off
|
||||||
// Update our power status in case power gets turned off
|
// Update our power status in case power gets turned off
|
||||||
if (retcode == -RIG_ETIMEOUT && my_rig->caps->get_powerstat)
|
// Check power status if rig is powered off, but not more often than once per second
|
||||||
|
if (my_rig->caps->get_powerstat && (retcode == -RIG_ETIMEOUT ||
|
||||||
|
(retcode == -RIG_EPOWER && elapsed_ms(&powerstat_check_time, HAMLIB_ELAPSED_GET) >= 1000)))
|
||||||
{
|
{
|
||||||
|
powerstat_t powerstat;
|
||||||
rig_get_powerstat(my_rig, &powerstat);
|
rig_get_powerstat(my_rig, &powerstat);
|
||||||
rig_powerstat = powerstat;
|
rig_powerstat = powerstat;
|
||||||
|
|
||||||
|
@ -1295,6 +1300,8 @@ void *handle_socket(void *arg)
|
||||||
{
|
{
|
||||||
retcode = -RIG_EPOWER;
|
retcode = -RIG_EPOWER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elapsed_ms(&powerstat_check_time, HAMLIB_ELAPSED_SET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Ładowanie…
Reference in New Issue