kopia lustrzana https://github.com/Hamlib/Hamlib
Fix flrig when WSJT-X startup causes rig mode change
Increase flrig timeout value Add USB mode to flrig Fix flrig memory leak Fix bug where constant value was being trashedpull/78/head
rodzic
772b1ba2c1
commit
3b5dd2e884
|
@ -53,7 +53,7 @@
|
||||||
#define FLRIG_MODES (RIG_MODE_AM | RIG_MODE_PKTAM | RIG_MODE_CW | RIG_MODE_CWR |\
|
#define FLRIG_MODES (RIG_MODE_AM | RIG_MODE_PKTAM | RIG_MODE_CW | RIG_MODE_CWR |\
|
||||||
RIG_MODE_RTTY | RIG_MODE_RTTYR |\
|
RIG_MODE_RTTY | RIG_MODE_RTTYR |\
|
||||||
RIG_MODE_PKTLSB | RIG_MODE_PKTUSB |\
|
RIG_MODE_PKTLSB | RIG_MODE_PKTUSB |\
|
||||||
RIG_MODE_SSB | RIG_MODE_LSB |\
|
RIG_MODE_SSB | RIG_MODE_LSB | RIG_MODE_USB |\
|
||||||
RIG_MODE_FM | RIG_MODE_WFM | RIG_MODE_FMN |RIG_MODE_PKTFM )
|
RIG_MODE_FM | RIG_MODE_WFM | RIG_MODE_FMN |RIG_MODE_PKTFM )
|
||||||
|
|
||||||
#define streq(s1,s2) (strcmp(s1,s2)==0)
|
#define streq(s1,s2) (strcmp(s1,s2)==0)
|
||||||
|
@ -113,7 +113,7 @@ const struct rig_caps flrig_caps = {
|
||||||
.port_type = RIG_PORT_NETWORK,
|
.port_type = RIG_PORT_NETWORK,
|
||||||
.write_delay = 0,
|
.write_delay = 0,
|
||||||
.post_write_delay = 0,
|
.post_write_delay = 0,
|
||||||
.timeout = 1000,
|
.timeout = 2000,
|
||||||
.retry = 5,
|
.retry = 5,
|
||||||
|
|
||||||
.has_get_func = RIG_FUNC_NONE,
|
.has_get_func = RIG_FUNC_NONE,
|
||||||
|
@ -291,6 +291,7 @@ static char *xml_parse2(char *xml, char *value, int valueLen)
|
||||||
if (rig_need_debug(RIG_DEBUG_WARN) && value != NULL && strlen(value)==0) {
|
if (rig_need_debug(RIG_DEBUG_WARN) && value != NULL && strlen(value)==0) {
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s: xml='%s'\n", __FUNCTION__,xml);
|
rig_debug(RIG_DEBUG_ERR, "%s: xml='%s'\n", __FUNCTION__,xml);
|
||||||
}
|
}
|
||||||
|
free(xmltmp);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,7 +442,7 @@ static int flrig_init(RIG *rig)
|
||||||
* Assumes mode!=NULL
|
* Assumes mode!=NULL
|
||||||
* Return the string for FLRig for the given hamlib mode
|
* Return the string for FLRig for the given hamlib mode
|
||||||
*/
|
*/
|
||||||
static char * modeMapGetFLRig(unsigned int modeHamlib)
|
static const char * modeMapGetFLRig(unsigned int modeHamlib)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0; modeMap[i].mode_hamlib!=0; ++i) {
|
for(i=0; modeMap[i].mode_hamlib!=0; ++i) {
|
||||||
|
@ -463,10 +464,9 @@ static unsigned int modeMapGetHamlib(const char *modeFLRig)
|
||||||
int i;
|
int i;
|
||||||
char modeFLRigCheck[64];
|
char modeFLRigCheck[64];
|
||||||
snprintf(modeFLRigCheck,sizeof(modeFLRigCheck),"|%.32s|",modeFLRig);
|
snprintf(modeFLRigCheck,sizeof(modeFLRigCheck),"|%.32s|",modeFLRig);
|
||||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: get hamlib mode from %s\n",__FUNCTION__,modeFLRig);
|
|
||||||
for(i=0; modeMap[i].mode_hamlib!=0; ++i) {
|
for(i=0; modeMap[i].mode_hamlib!=0; ++i) {
|
||||||
|
if (modeMap[i].mode_flrig)
|
||||||
if (modeMap[i].mode_flrig && strstr(modeMap[i].mode_flrig,modeFLRigCheck)) {
|
if (modeMap[i].mode_flrig && strstr(modeMap[i].mode_flrig,modeFLRigCheck)) {
|
||||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: got hamlib mode %s\n",__FUNCTION__,rig_strrmode(modeMap[i].mode_hamlib));
|
|
||||||
return modeMap[i].mode_hamlib;
|
return modeMap[i].mode_hamlib;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -904,7 +904,10 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv;
|
struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv;
|
||||||
|
|
||||||
// if ptt is on do not set mode
|
// if ptt is on do not set mode
|
||||||
if (priv->ptt) return RIG_OK;
|
if (priv->ptt) {
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: returning because priv->ptt=%d\n",priv->ptt);
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
if (vfo == RIG_VFO_CURR) {
|
if (vfo == RIG_VFO_CURR) {
|
||||||
vfo = priv->curr_vfo;
|
vfo = priv->curr_vfo;
|
||||||
|
@ -924,6 +927,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
// MDB
|
// MDB
|
||||||
int vfoSwitched = 0;
|
int vfoSwitched = 0;
|
||||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: curr_vfo = %s\n",__FUNCTION__,rig_strvfo(priv->curr_vfo));
|
rig_debug(RIG_DEBUG_VERBOSE,"%s: curr_vfo = %s\n",__FUNCTION__,rig_strvfo(priv->curr_vfo));
|
||||||
|
// If we don't have the get_bwA call we have to switch VFOs ourself
|
||||||
if (!priv->has_get_bwA && 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;
|
vfoSwitched = 1;
|
||||||
rig_debug(RIG_DEBUG_VERBOSE,"%s: switch to VFOB = %d\n",__FUNCTION__,vfoSwitched);
|
rig_debug(RIG_DEBUG_VERBOSE,"%s: switch to VFOB = %d\n",__FUNCTION__,vfoSwitched);
|
||||||
|
@ -938,10 +942,14 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the mode
|
// Set the mode
|
||||||
char *ttmode = modeMapGetFLRig(mode);
|
char *ttmode = strdup(modeMapGetFLRig(mode));
|
||||||
|
if (ttmode[0]=='|') ttmode = &ttmode[1]; // remove first pipe symbol
|
||||||
|
char *p=strchr(ttmode,'|');
|
||||||
|
if (p) *p=0; // remove any other pipe
|
||||||
|
|
||||||
char cmd_buf[MAXCMDLEN];
|
char cmd_buf[MAXCMDLEN];
|
||||||
sprintf(cmd_buf, "<params><param><value>%s</value></param></params>", ttmode);
|
sprintf(cmd_buf, "<params><param><value>%s</value></param></params>", ttmode);
|
||||||
|
free(ttmode);
|
||||||
char xml[MAXXMLLEN];
|
char xml[MAXXMLLEN];
|
||||||
char *pxml=NULL;
|
char *pxml=NULL;
|
||||||
if (!priv->has_get_modeA) {
|
if (!priv->has_get_modeA) {
|
||||||
|
@ -966,9 +974,17 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
|
|
||||||
// Determine if we need to update the bandwidth
|
// Determine if we need to update the bandwidth
|
||||||
int needBW=0;
|
int needBW=0;
|
||||||
if (vfo == RIG_VFO_A) needBW = priv->curr_widthA != width;
|
if (vfo == RIG_VFO_A) {
|
||||||
else if (vfo == RIG_VFO_B) needBW = priv->curr_widthB != width;
|
needBW = priv->curr_widthA != width;
|
||||||
else rig_debug(RIG_DEBUG_ERR,"%s: needBW unknown vfo=%s\n",__FUNCTION__,rig_strvfo(vfo));
|
rig_debug(RIG_DEBUG_TRACE,"%s: bw change on VFOA, curr width=%d needBW=%d\n",__FUNCTION__, width, needBW);
|
||||||
|
}
|
||||||
|
else if (vfo == RIG_VFO_B) {
|
||||||
|
needBW = priv->curr_widthB != width;
|
||||||
|
rig_debug(RIG_DEBUG_TRACE,"%s: bw change on VFOB, curr width=%d needBW=%d\n",__FUNCTION__, width, needBW);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rig_debug(RIG_DEBUG_TRACE,"%s: needBW unknown vfo=%s\n",__FUNCTION__,rig_strvfo(vfo));
|
||||||
|
}
|
||||||
// Need to update the bandwidth
|
// Need to update the bandwidth
|
||||||
if (width > 0 && needBW) {
|
if (width > 0 && needBW) {
|
||||||
sprintf(cmd_buf, "<params><param><value><i4>%ld</i4></value></param></params>", width);
|
sprintf(cmd_buf, "<params><param><value><i4>%ld</i4></value></param></params>", width);
|
||||||
|
@ -981,8 +997,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
read_transaction(rig, xml, sizeof(xml));
|
read_transaction(rig, xml, sizeof(xml));
|
||||||
if (!vfoSwitched && vfo==RIG_VFO_B) flrig_set_vfo(rig,RIG_VFO_A);
|
flrig_set_vfo(rig,vfo); // ensure reset to our initial vfo
|
||||||
if (!vfoSwitched && vfo==RIG_VFO_A) flrig_set_vfo(rig,RIG_VFO_B);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return to VFOA if needed
|
// Return to VFOA if needed
|
||||||
|
@ -1003,7 +1018,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
priv->curr_modeB = mode;
|
priv->curr_modeB = mode;
|
||||||
priv->curr_widthB = width;
|
priv->curr_widthB = width;
|
||||||
}
|
}
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: return modeA=%s, widthA=%d\n,modeB=%s, widthB=%d\n", __FUNCTION__,rig_strrmode(priv->curr_modeA),priv->curr_widthA,rig_strrmode(priv->curr_modeB),priv->curr_widthB);
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue