kopia lustrzana https://github.com/Hamlib/Hamlib
Merge pull request #1568 from GeoBaltz/fix14
Fix rotators that want to do I/O before port is openpull/1570/head
commit
a462bc19ae
|
@ -1853,6 +1853,22 @@ struct rig_spectrum_line
|
||||||
unsigned char *spectrum_data; /*!< 8-bit spectrum data covering bandwidth of either the span_freq in center mode or from low edge to high edge in fixed mode. A higher value represents higher signal strength. */
|
unsigned char *spectrum_data; /*!< 8-bit spectrum data covering bandwidth of either the span_freq in center mode or from low edge to high edge in fixed mode. A higher value represents higher signal strength. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config item for deferred processing
|
||||||
|
**/
|
||||||
|
struct deferred_config_item {
|
||||||
|
struct deferred_config_item *next;
|
||||||
|
hamlib_token_t token;
|
||||||
|
char *value; // strdup'ed, must be freed
|
||||||
|
};
|
||||||
|
typedef struct deferred_config_item deferred_config_item_t;
|
||||||
|
|
||||||
|
struct deferred_config_header {
|
||||||
|
struct deferred_config_item *first; // NULL if none
|
||||||
|
struct deferred_config_item *last;
|
||||||
|
};
|
||||||
|
typedef struct deferred_config_header deferred_config_header_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Rig data structure.
|
* \brief Rig data structure.
|
||||||
*
|
*
|
||||||
|
|
|
@ -629,6 +629,7 @@ struct rot_state {
|
||||||
hamlib_port_t rotport; /*!< Rotator port (internal use). */
|
hamlib_port_t rotport; /*!< Rotator port (internal use). */
|
||||||
hamlib_port_t rotport2; /*!< 2nd Rotator port (internal use). */
|
hamlib_port_t rotport2; /*!< 2nd Rotator port (internal use). */
|
||||||
rig_ptr_t *pstrotator_handler_priv_data;
|
rig_ptr_t *pstrotator_handler_priv_data;
|
||||||
|
deferred_config_header_t config_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "register.h"
|
#include "register.h"
|
||||||
#include "idx_builtin.h"
|
#include "idx_builtin.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#include "easycomm.h"
|
#include "easycomm.h"
|
||||||
|
|
||||||
|
@ -508,6 +509,11 @@ static int easycomm_rot_set_conf(ROT *rot, hamlib_token_t token, const char *val
|
||||||
rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s, *val = %c\n", __func__, cmdstr,
|
rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s, *val = %c\n", __func__, cmdstr,
|
||||||
*val);
|
*val);
|
||||||
|
|
||||||
|
if (!ROTSTATE(rot)->comm_state)
|
||||||
|
{
|
||||||
|
return queue_deferred_config(&ROTSTATE(rot)->config_queue, token, val);
|
||||||
|
}
|
||||||
|
|
||||||
retval = easycomm_transaction(rot, cmdstr, NULL, 0);
|
retval = easycomm_transaction(rot, cmdstr, NULL, 0);
|
||||||
|
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
|
|
||||||
#include "hamlib/rotator.h"
|
#include "hamlib/rotator.h"
|
||||||
#include "hamlib/rig.h"
|
#include "hamlib/rig.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "token.h"
|
#include "token.h"
|
||||||
|
@ -419,6 +420,11 @@ grbltrk_rot_set_conf(ROT *rot, hamlib_token_t token, const char *val)
|
||||||
char req[RSIZE] = {0};
|
char req[RSIZE] = {0};
|
||||||
char rsp[RSIZE];
|
char rsp[RSIZE];
|
||||||
|
|
||||||
|
if (!ROTSTATE(rot)->comm_state)
|
||||||
|
{
|
||||||
|
return queue_deferred_config(&ROTSTATE(rot)->config_queue, token, val);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -493,9 +493,6 @@ const struct rot_caps meade_caps =
|
||||||
.move = meade_move,
|
.move = meade_move,
|
||||||
|
|
||||||
.get_info = meade_get_info,
|
.get_info = meade_get_info,
|
||||||
|
|
||||||
.get_conf = rot_get_conf,
|
|
||||||
.set_conf = rot_set_conf,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_INITROT_BACKEND(meade)
|
DECLARE_INITROT_BACKEND(meade)
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h> /* Standard library definitions */
|
#include <stdlib.h> /* Standard library definitions */
|
||||||
|
@ -39,6 +40,7 @@
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "register.h"
|
#include "register.h"
|
||||||
#include "iofunc.h"
|
#include "iofunc.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#include "rotorez.h"
|
#include "rotorez.h"
|
||||||
|
|
||||||
|
@ -1087,12 +1089,21 @@ static int rotorez_rot_set_conf(ROT *rot, hamlib_token_t token, const char *val)
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_TRACE, "%s: c = %c, *val = %c\n", __func__, c, *val);
|
|
||||||
SNPRINTF(cmdstr, sizeof(cmdstr), "%c", c);
|
SNPRINTF(cmdstr, sizeof(cmdstr), "%c", c);
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s, *val = %c\n",
|
rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s, *val = %c\n",
|
||||||
__func__, cmdstr, *val);
|
__func__, cmdstr, *val);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We cannot send anything to the rotator if it isn't open yet.
|
||||||
|
* Queue any set_conf commands and let rot_open reprocess them
|
||||||
|
* after it has done it's job.
|
||||||
|
*/
|
||||||
|
if (!ROTSTATE(rot)->comm_state)
|
||||||
|
{
|
||||||
|
err = queue_deferred_config(&ROTSTATE(rot)->config_queue, token, val);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
err = rotorez_send_priv_cmd(rot, cmdstr);
|
err = rotorez_send_priv_cmd(rot, cmdstr);
|
||||||
|
|
||||||
if (err != RIG_OK)
|
if (err != RIG_OK)
|
||||||
|
|
34
src/misc.c
34
src/misc.c
|
@ -3125,4 +3125,38 @@ int rig_test_2038(RIG *rig)
|
||||||
|
|
||||||
//! @endcond
|
//! @endcond
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add item to be sent to device after it is opened
|
||||||
|
* (currently only used by rotators)
|
||||||
|
**/
|
||||||
|
int queue_deferred_config(deferred_config_header_t *head, hamlib_token_t token, const char *val)
|
||||||
|
{
|
||||||
|
deferred_config_item_t *item;
|
||||||
|
|
||||||
|
if (!(item = malloc(sizeof(deferred_config_item_t))))
|
||||||
|
{
|
||||||
|
return -RIG_ENOMEM;
|
||||||
|
}
|
||||||
|
if (!(item->value = strdup(val)))
|
||||||
|
{
|
||||||
|
free(item);
|
||||||
|
return -RIG_ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->token = token;
|
||||||
|
item->next = NULL;
|
||||||
|
|
||||||
|
if (!head->first)
|
||||||
|
{
|
||||||
|
head->first = item;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
head->last->next = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
head->last = item;
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -211,6 +211,8 @@ extern HAMLIB_EXPORT(int) rig_settings_load_all(char *settings_file);
|
||||||
|
|
||||||
extern int check_level_param(RIG *rig, setting_t level, value_t val, gran_t **gran);
|
extern int check_level_param(RIG *rig, setting_t level, value_t val, gran_t **gran);
|
||||||
|
|
||||||
|
extern int queue_deferred_config(deferred_config_header_t *head, hamlib_token_t token, const char *val);
|
||||||
|
|
||||||
// Takes rig-specific band result and maps it the bandlist int the rig's backend
|
// Takes rig-specific band result and maps it the bandlist int the rig's backend
|
||||||
extern HAMLIB_EXPORT(hamlib_band_t) rig_get_band(RIG *rig, freq_t freq, int band);
|
extern HAMLIB_EXPORT(hamlib_band_t) rig_get_band(RIG *rig, freq_t freq, int band);
|
||||||
extern HAMLIB_EXPORT(const char*) rig_get_band_str(RIG *rig, hamlib_band_t band, int which);
|
extern HAMLIB_EXPORT(const char*) rig_get_band_str(RIG *rig, hamlib_band_t band, int which);
|
||||||
|
|
|
@ -377,6 +377,7 @@ int HAMLIB_API rot_open(ROT *rot)
|
||||||
hamlib_port_t *rotp2 = ROTPORT2(rot);
|
hamlib_port_t *rotp2 = ROTPORT2(rot);
|
||||||
int status;
|
int status;
|
||||||
int net1, net2, net3, net4, port;
|
int net1, net2, net3, net4, port;
|
||||||
|
deferred_config_item_t *item;
|
||||||
|
|
||||||
rot_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
rot_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
@ -520,24 +521,6 @@ int HAMLIB_API rot_open(ROT *rot)
|
||||||
|
|
||||||
add_opened_rot(rot);
|
add_opened_rot(rot);
|
||||||
|
|
||||||
rs->comm_state = 1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Maybe the backend has something to initialize
|
|
||||||
* In case of failure, just close down and report error code.
|
|
||||||
*/
|
|
||||||
if (caps->rot_open != NULL)
|
|
||||||
{
|
|
||||||
status = caps->rot_open(rot);
|
|
||||||
|
|
||||||
if (status != RIG_OK)
|
|
||||||
{
|
|
||||||
memcpy(&rs->rotport_deprecated, rotp,
|
|
||||||
sizeof(rs->rotport_deprecated));
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rotp->type.rig != RIG_PORT_NETWORK && rotp->type.rig != RIG_PORT_UDP_NETWORK)
|
if (rotp->type.rig != RIG_PORT_NETWORK && rotp->type.rig != RIG_PORT_UDP_NETWORK)
|
||||||
{
|
{
|
||||||
if (rotp->parm.serial.dtr_state == RIG_SIGNAL_ON)
|
if (rotp->parm.serial.dtr_state == RIG_SIGNAL_ON)
|
||||||
|
@ -559,6 +542,40 @@ int HAMLIB_API rot_open(ROT *rot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rs->comm_state = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now that the rotator port is officially opened, we can
|
||||||
|
* send the deferred configuration info.
|
||||||
|
*/
|
||||||
|
while ((item = rs->config_queue.first))
|
||||||
|
{
|
||||||
|
rs->config_queue.first = item->next;
|
||||||
|
status = rot_set_conf(rot, item->token, item->value);
|
||||||
|
free(item->value);
|
||||||
|
free(item);
|
||||||
|
if (status != RIG_OK)
|
||||||
|
{
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maybe the backend has something to initialize
|
||||||
|
* In case of failure, just close down and report error code.
|
||||||
|
*/
|
||||||
|
if (caps->rot_open != NULL)
|
||||||
|
{
|
||||||
|
status = caps->rot_open(rot);
|
||||||
|
|
||||||
|
if (status != RIG_OK)
|
||||||
|
{
|
||||||
|
memcpy(&rs->rotport_deprecated, rotp,
|
||||||
|
sizeof(rs->rotport_deprecated));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(&rs->rotport_deprecated, rotp,
|
memcpy(&rs->rotport_deprecated, rotp,
|
||||||
sizeof(rs->rotport_deprecated));
|
sizeof(rs->rotport_deprecated));
|
||||||
|
|
||||||
|
|
|
@ -341,8 +341,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
char *token = strtok(conf_parms, ",");
|
char *token = strtok(conf_parms, ",");
|
||||||
|
|
||||||
// ROTOREZ set_conf needs to be done after rot_open
|
while (token)
|
||||||
while (token && my_rot->caps->rot_model != ROT_MODEL_ROTOREZ)
|
|
||||||
{
|
{
|
||||||
char mytoken[100], myvalue[100];
|
char mytoken[100], myvalue[100];
|
||||||
hamlib_token_t lookup;
|
hamlib_token_t lookup;
|
||||||
|
@ -407,34 +406,6 @@ int main(int argc, char *argv[])
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ROTOREZ set_conf needs to be done after rot_open
|
|
||||||
while (token && my_rot->caps->rot_model == ROT_MODEL_ROTOREZ)
|
|
||||||
{
|
|
||||||
char mytoken[100], myvalue[100];
|
|
||||||
hamlib_token_t lookup;
|
|
||||||
sscanf(token, "%99[^=]=%99s", mytoken, myvalue);
|
|
||||||
//printf("mytoken=%s,myvalue=%s\n",mytoken, myvalue);
|
|
||||||
lookup = rot_token_lookup(my_rot, mytoken);
|
|
||||||
|
|
||||||
if (lookup == 0)
|
|
||||||
{
|
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s: no such token as '%s', use -L switch to see\n",
|
|
||||||
__func__, mytoken);
|
|
||||||
token = strtok(NULL, ",");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = rot_set_conf(my_rot, rot_token_lookup(my_rot, mytoken), myvalue);
|
|
||||||
|
|
||||||
if (retcode != RIG_OK)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Config parameter error: %s\n", rigerror(retcode));
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
token = strtok(NULL, ",");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print out capabilities, and exits immediately as we may be interested
|
* Print out capabilities, and exits immediately as we may be interested
|
||||||
* only in caps, and rig_open may fail.
|
* only in caps, and rig_open may fail.
|
||||||
|
|
|
@ -347,8 +347,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
char *token = strtok(conf_parms, ",");
|
char *token = strtok(conf_parms, ",");
|
||||||
|
|
||||||
// ROTOREZ set_conf needs to be done after rot_open
|
while (token)
|
||||||
while (token && my_rot->caps->rot_model != ROT_MODEL_ROTOREZ)
|
|
||||||
{
|
{
|
||||||
char mytoken[100], myvalue[100];
|
char mytoken[100], myvalue[100];
|
||||||
hamlib_token_t lookup;
|
hamlib_token_t lookup;
|
||||||
|
@ -418,35 +417,6 @@ int main(int argc, char *argv[])
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ROTOREZ set_conf needs to be done after rot_open
|
|
||||||
while (token && my_rot->caps->rot_model == ROT_MODEL_ROTOREZ)
|
|
||||||
{
|
|
||||||
char mytoken[100], myvalue[100];
|
|
||||||
hamlib_token_t lookup;
|
|
||||||
sscanf(token, "%99[^=]=%99s", mytoken, myvalue);
|
|
||||||
//printf("mytoken=%s,myvalue=%s\n",mytoken, myvalue);
|
|
||||||
lookup = rot_token_lookup(my_rot, mytoken);
|
|
||||||
|
|
||||||
if (lookup == 0)
|
|
||||||
{
|
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s: no such token as '%s', use -L switch to see\n",
|
|
||||||
__func__, mytoken);
|
|
||||||
token = strtok(NULL, ",");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = rot_set_conf(my_rot, rot_token_lookup(my_rot, mytoken), myvalue);
|
|
||||||
|
|
||||||
if (retcode != RIG_OK)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Config parameter error: %s\n", rigerror(retcode));
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
token = strtok(NULL, ",");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
my_rot->state.az_offset = az_offset;
|
my_rot->state.az_offset = az_offset;
|
||||||
my_rot->state.el_offset = el_offset;
|
my_rot->state.el_offset = el_offset;
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue