kopia lustrzana https://github.com/Hamlib/Hamlib
Changes to remove unnecessary VFO swaps
rodzic
52ddbfd574
commit
6fbe4a5faa
|
@ -96,6 +96,8 @@ struct flrig_priv_data {
|
|||
freq_t curr_freqB;
|
||||
pbwidth_t curr_widthA;
|
||||
pbwidth_t curr_widthB;
|
||||
int has_get_modeA; /* True if this function is available */
|
||||
int has_get_bwA; /* True if this function is available */
|
||||
};
|
||||
|
||||
const struct rig_caps flrig_caps = {
|
||||
|
@ -104,9 +106,9 @@ const struct rig_caps flrig_caps = {
|
|||
.mfg_name = "FLRig",
|
||||
.version = BACKEND_VER,
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_BETA,
|
||||
.status = RIG_STATUS_STABLE,
|
||||
.rig_type = RIG_TYPE_TRANSCEIVER,
|
||||
.targetable_vfo = RIG_TARGETABLE_FREQ,
|
||||
.targetable_vfo = RIG_TARGETABLE_FREQ|RIG_TARGETABLE_MODE,
|
||||
.ptt_type = RIG_PTT_RIG,
|
||||
.port_type = RIG_PORT_NETWORK,
|
||||
.write_delay = 0,
|
||||
|
@ -318,6 +320,10 @@ static char *xml_parse(char *xml, char *value, int value_len)
|
|||
if (value != NULL) {
|
||||
xml_parse2(next, value, value_len);
|
||||
}
|
||||
if (strstr(value,"faultString")) {
|
||||
rig_debug(RIG_DEBUG_ERR, "%s error:\n%s\n", __FUNCTION__, value);
|
||||
value[0]=0; /* truncate to give empty response */
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
@ -333,7 +339,7 @@ static int read_transaction(RIG *rig, char *xml, int xml_len)
|
|||
rig_debug(RIG_DEBUG_TRACE, "%s\n", __FUNCTION__);
|
||||
|
||||
struct rig_state *rs = &rig->state;
|
||||
rs->rigport.timeout = 4000; // 3 second read string timeout
|
||||
rs->rigport.timeout = 1000; // 2 second read string timeout
|
||||
|
||||
int retry=5;
|
||||
char *delims="\n";
|
||||
|
@ -354,7 +360,7 @@ static int read_transaction(RIG *rig, char *xml, int xml_len)
|
|||
}
|
||||
if (strstr(xml,terminator)) {
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: got %s\n",__FUNCTION__,terminator);
|
||||
// Testing slowing down 3 of commands per second
|
||||
// Slow down just a bit -- not sure this is needed anymore but not a big deal here
|
||||
usleep(2*1000);
|
||||
retval = RIG_OK;
|
||||
}
|
||||
|
@ -508,6 +514,31 @@ static int flrig_open(RIG *rig) {
|
|||
strncpy(priv->info,value,sizeof(priv->info));
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"Transceiver=%s\n", value);
|
||||
|
||||
/* see if get_modeA is available */
|
||||
pxml = xml_build("rig.get_modeA", NULL, xml, sizeof(xml));
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
read_transaction(rig, xml, sizeof(xml));
|
||||
xml_parse(xml, value, sizeof(value));
|
||||
if (strlen(value)>0) { /* must have it since we got an answer */
|
||||
priv->has_get_modeA = 1;
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: getmodeA is available=%s\n", __FUNCTION__, value);
|
||||
}
|
||||
else {
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: getmodeA is not available\n",__FUNCTION__);
|
||||
}
|
||||
/* see if get_bwA is available */
|
||||
pxml = xml_build("rig.get_bwA", NULL, xml, sizeof(xml));
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
read_transaction(rig, xml, sizeof(xml));
|
||||
xml_parse(xml, value, sizeof(value));
|
||||
if (strlen(value)>0) { /* must have it since we got an answer */
|
||||
priv->has_get_bwA = 1;
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: get_bwA is available=%s\n", __FUNCTION__, value);
|
||||
}
|
||||
else {
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: get_bwA is not available\n",__FUNCTION__);
|
||||
}
|
||||
|
||||
pxml = xml_build("rig.get_AB", value, xml, sizeof(xml));
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
read_transaction(rig, xml, sizeof(xml));
|
||||
|
@ -837,7 +868,7 @@ static int flrig_set_split_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t wid
|
|||
// save some VFO swapping .. may replace with VFO specific calls that won't cause VFO change
|
||||
if (vfo==RIG_VFO_A && mode==priv->curr_modeA) return RIG_OK;
|
||||
if (vfo==RIG_VFO_B && mode==priv->curr_modeB) return RIG_OK;
|
||||
retval = flrig_set_mode(rig,RIG_VFO_B,mode,width);
|
||||
retval = flrig_set_mode(rig,vfo,mode,width);
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s: set mode=%s\n",__FUNCTION__,rig_strrmode(mode));
|
||||
return retval;
|
||||
}
|
||||
|
@ -876,7 +907,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
|||
// MDB
|
||||
int vfoSwitched = 0;
|
||||
rig_debug(RIG_DEBUG_WARN,"%s: curr_vfo = %s\n",__FUNCTION__,rig_strvfo(priv->curr_vfo));
|
||||
if (vfo == RIG_VFO_B && priv->curr_vfo != RIG_VFO_B) {
|
||||
if (!priv->has_get_bwA && vfo == RIG_VFO_B && priv->curr_vfo != RIG_VFO_B) {
|
||||
vfoSwitched = 1;
|
||||
rig_debug(RIG_DEBUG_WARN,"%s: switch to VFOB = %d\n",__FUNCTION__,vfoSwitched);
|
||||
}
|
||||
|
@ -895,7 +926,17 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
|||
char cmd_buf[MAXCMDLEN];
|
||||
sprintf(cmd_buf, "<params><param><value>%s</value></param></params>", ttmode);
|
||||
char xml[MAXXMLLEN];
|
||||
char *pxml = xml_build("rig.set_mode", cmd_buf, xml, sizeof(xml));
|
||||
char *pxml=NULL;
|
||||
if (!priv->has_get_modeA) {
|
||||
pxml = xml_build("rig.set_mode", cmd_buf, xml, sizeof(xml));
|
||||
}
|
||||
else {
|
||||
char *cmd="rig.set_modeA";
|
||||
if (vfo==RIG_VFO_B) {
|
||||
cmd="rig.set_modeB";
|
||||
}
|
||||
pxml = xml_build(cmd, cmd_buf, xml, sizeof(xml));
|
||||
}
|
||||
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
if (retval < 0) {
|
||||
|
@ -906,15 +947,25 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
|||
read_transaction(rig, xml, sizeof(xml));
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: response=%s\n", __FUNCTION__,xml);
|
||||
|
||||
// Need to update the available bandwidths for this mode
|
||||
if (width > 0) {
|
||||
// Determine if we need to update the bandwidth
|
||||
int needBW=0;
|
||||
if (vfo == RIG_VFO_A) needBW = priv->curr_widthA != width;
|
||||
else if (vfo == RIG_VFO_B) needBW = priv->curr_widthB != width;
|
||||
else rig_debug(RIG_DEBUG_ERR,"%s: needBW unknown vfo=%s\n",__FUNCTION__,rig_strvfo(vfo));
|
||||
// Need to update the bandwidth
|
||||
if (width > 0 && needBW) {
|
||||
sprintf(cmd_buf, "<params><param><value><i4>%ld</i4></value></param></params>", width);
|
||||
// if we're not on VFOB but asking for VFOB still have to switch VFOS
|
||||
if (!vfoSwitched && vfo==RIG_VFO_B) flrig_set_vfo(rig,RIG_VFO_B);
|
||||
if (!vfoSwitched && vfo==RIG_VFO_A) flrig_set_vfo(rig,RIG_VFO_A);
|
||||
pxml = xml_build("rig.set_bandwidth", cmd_buf, xml, sizeof(xml));
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
if (retval < 0) {
|
||||
return retval;
|
||||
}
|
||||
read_transaction(rig, xml, sizeof(xml));
|
||||
if (!vfoSwitched && vfo==RIG_VFO_B) flrig_set_vfo(rig,RIG_VFO_A);
|
||||
if (!vfoSwitched && vfo==RIG_VFO_A) flrig_set_vfo(rig,RIG_VFO_B);
|
||||
}
|
||||
|
||||
// Return to VFOA if needed
|
||||
|
@ -973,11 +1024,13 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
|||
|
||||
// Switch to VFOB if appropriate
|
||||
int vfoSwitched=0;
|
||||
if (vfo == RIG_VFO_B && curr_vfo != RIG_VFO_B) {
|
||||
rig_debug(RIG_DEBUG_ERR,"%s has_get_modeA=%d\n",__FUNCTION__,priv->has_get_modeA);
|
||||
if (priv->has_get_modeA == 0 && vfo == RIG_VFO_B && curr_vfo != RIG_VFO_B) {
|
||||
vfoSwitched = 1;
|
||||
}
|
||||
|
||||
if (vfoSwitched) {
|
||||
rig_debug(RIG_DEBUG_VERBOSE,"%s switch to VFOB=%d\n",__FUNCTION__,priv->has_get_modeA);
|
||||
retval = flrig_set_vfo(rig, RIG_VFO_B);
|
||||
if (retval < 0) {
|
||||
return retval;
|
||||
|
@ -985,7 +1038,16 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
|||
}
|
||||
|
||||
char xml[MAXXMLLEN];
|
||||
char *pxml = xml_build("rig.get_mode", NULL, xml, sizeof(xml));
|
||||
char *cmdp="rig.get_mode"; /* default to old way */
|
||||
if (priv->has_get_modeA) { /* change to new way if we can */
|
||||
/* calling this way reduces VFO swapping */
|
||||
/* we get the cached value in flrig */
|
||||
/* vfo B may not be getting polled though in FLRig */
|
||||
/* so we may not be 100% accurate if op is twiddling knobs */
|
||||
cmdp = "rig.get_modeA";
|
||||
if (vfo==RIG_VFO_B) cmdp = "rig.get_modeB";
|
||||
}
|
||||
char *pxml = xml_build(cmdp, NULL, xml, sizeof(xml));
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
if (retval < 0) {
|
||||
return retval;
|
||||
|
@ -1008,8 +1070,17 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
|||
}
|
||||
|
||||
|
||||
// Get the bandwidth
|
||||
pxml = xml_build("rig.get_bw", NULL, xml, sizeof(xml));
|
||||
/* Get the bandwidth */
|
||||
cmdp="rig.get_bw"; /* default to old way */
|
||||
if (priv->has_get_bwA) { /* change to new way if we can */
|
||||
/* calling this way reduces VFO swapping */
|
||||
/* we get the cached value in flrig */
|
||||
/* vfo B may not be getting polled though in FLRig */
|
||||
/* so we may not be 100% accurate if op is twiddling knobs */
|
||||
cmdp = "rig.get_bwA";
|
||||
if (vfo==RIG_VFO_B) cmdp = "rig.get_bwB";
|
||||
}
|
||||
pxml = xml_build(cmdp, NULL, xml, sizeof(xml));
|
||||
retval = write_transaction(rig, pxml, strlen(pxml));
|
||||
if (retval < 0) {
|
||||
return retval;
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#define BACKEND_VER "1.1"
|
||||
#define BACKEND_VER "1.3"
|
||||
|
||||
#define EOM "\r"
|
||||
#define TRUE 1
|
||||
|
|
Ładowanie…
Reference in New Issue