kopia lustrzana https://github.com/Hamlib/Hamlib
fix Hold on decode, get out of remote mode for the I command
git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2032 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.5
rodzic
3772a75de1
commit
d82fdffd68
69
jrc/jrc.c
69
jrc/jrc.c
|
@ -2,7 +2,7 @@
|
||||||
* Hamlib JRC backend - main file
|
* Hamlib JRC backend - main file
|
||||||
* Copyright (c) 2001-2005 by Stephane Fillod
|
* Copyright (c) 2001-2005 by Stephane Fillod
|
||||||
*
|
*
|
||||||
* $Id: jrc.c,v 1.24 2005-04-13 22:31:46 fillods Exp $
|
* $Id: jrc.c,v 1.25 2005-04-20 16:43:29 fillods Exp $
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Library General Public License as
|
* it under the terms of the GNU Library General Public License as
|
||||||
|
@ -77,14 +77,23 @@ static int jrc_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, i
|
||||||
|
|
||||||
serial_flush(&rs->rigport);
|
serial_flush(&rs->rigport);
|
||||||
|
|
||||||
retval = write_block(&rs->rigport, cmd, cmd_len);
|
Hold_Decode(rig);
|
||||||
if (retval != RIG_OK)
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
if (!data || !data_len)
|
retval = write_block(&rs->rigport, cmd, cmd_len);
|
||||||
|
if (retval != RIG_OK) {
|
||||||
|
Unhold_Decode(rig);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data || !data_len) {
|
||||||
|
Unhold_Decode(rig);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
retval = read_string(&rs->rigport, data, BUFSZ, EOM, strlen(EOM));
|
retval = read_string(&rs->rigport, data, BUFSZ, EOM, strlen(EOM));
|
||||||
|
|
||||||
|
Unhold_Decode(rig);
|
||||||
|
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
return retval;
|
return retval;
|
||||||
*data_len = retval;
|
*data_len = retval;
|
||||||
|
@ -224,6 +233,22 @@ int jrc_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
|
||||||
return jrc_transaction (rig, freqbuf, freq_len, NULL, NULL);
|
return jrc_transaction (rig, freqbuf, freq_len, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_current_istate(RIG *rig, char *buf, int *buf_len)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JRCs use "I" to get information,
|
||||||
|
* but the command is not available in remote mode
|
||||||
|
*/
|
||||||
|
retval = jrc_transaction (rig, "H0"EOM "I1"EOM "I" EOM, 8, buf, buf_len);
|
||||||
|
|
||||||
|
/* and back to remote mode */
|
||||||
|
jrc_transaction (rig, "I0"EOM "H1"EOM, 6, NULL, NULL);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* jrc_get_freq
|
* jrc_get_freq
|
||||||
* Assumes rig!=NULL, freq!=NULL
|
* Assumes rig!=NULL, freq!=NULL
|
||||||
|
@ -235,7 +260,7 @@ int jrc_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
|
||||||
char freqbuf[BUFSZ];
|
char freqbuf[BUFSZ];
|
||||||
|
|
||||||
//note: JRCs use "I" to get information
|
//note: JRCs use "I" to get information
|
||||||
retval = jrc_transaction (rig, "I" EOM, 2, freqbuf, &freq_len);
|
retval = get_current_istate(rig, freqbuf, &freq_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
@ -309,31 +334,31 @@ int jrc_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* jrc_get_mode
|
* jrc_get_mode
|
||||||
* Assumes rig!=NULL, freq!=NULL
|
* Assumes rig!=NULL, mode!=NULL, width!=NULL
|
||||||
*/
|
*/
|
||||||
int jrc_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
int jrc_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
||||||
{
|
{
|
||||||
struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv;
|
struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv;
|
||||||
int freq_len, retval;
|
int md_len, retval;
|
||||||
char freqbuf[BUFSZ];
|
char mdbuf[BUFSZ];
|
||||||
char cmode;
|
char cmode;
|
||||||
char cwidth;
|
char cwidth;
|
||||||
|
|
||||||
//note: JRCs use "I" to get information
|
//note: JRCs use "I" to get information
|
||||||
retval = jrc_transaction (rig, "I" EOM, 2, freqbuf, &freq_len);
|
retval = get_current_istate(rig, mdbuf, &md_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
//I command returns Iabdffffffffg<CR>
|
//I command returns Iabdffffffffg<CR>
|
||||||
if (freqbuf[0] != 'I' || freq_len != priv->info_len) {
|
if (mdbuf[0] != 'I' || md_len != priv->info_len) {
|
||||||
rig_debug(RIG_DEBUG_ERR,"jrc_get_mode: wrong answer %s, "
|
rig_debug(RIG_DEBUG_ERR,"jrc_get_mode: wrong answer %s, "
|
||||||
"len=%d\n", freqbuf, freq_len);
|
"len=%d\n", mdbuf, md_len);
|
||||||
return -RIG_ERJCTED;
|
return -RIG_ERJCTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* extract width and mode */
|
/* extract width and mode */
|
||||||
cwidth = freqbuf[2];
|
cwidth = mdbuf[2];
|
||||||
cmode = freqbuf[3];
|
cmode = mdbuf[3];
|
||||||
|
|
||||||
retval = jrc2rig_mode(rig, cmode, cwidth,
|
retval = jrc2rig_mode(rig, cmode, cwidth,
|
||||||
mode, width);
|
mode, width);
|
||||||
|
@ -410,7 +435,7 @@ int jrc_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
|
||||||
case RIG_FUNC_FAGC:
|
case RIG_FUNC_FAGC:
|
||||||
/* FIXME: FAGC levels */
|
/* FIXME: FAGC levels */
|
||||||
//retval = jrc_transaction (rig, "G" EOM, 2, funcbuf, &func_len);
|
//retval = jrc_transaction (rig, "G" EOM, 2, funcbuf, &func_len);
|
||||||
retval = jrc_transaction (rig, "I" EOM, 2, funcbuf, &func_len);
|
retval = get_current_istate(rig, funcbuf, &func_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
@ -633,7 +658,7 @@ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RIG_LEVEL_ATT:
|
case RIG_LEVEL_ATT:
|
||||||
retval = jrc_transaction (rig, "I" EOM, 2, lvlbuf, &lvl_len);
|
retval = get_current_istate(rig, lvlbuf, &lvl_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
@ -647,7 +672,7 @@ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RIG_LEVEL_AGC:
|
case RIG_LEVEL_AGC:
|
||||||
retval = jrc_transaction (rig, "I" EOM, 2, lvlbuf, &lvl_len);
|
retval = get_current_istate(rig, lvlbuf, &lvl_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
@ -968,12 +993,14 @@ int jrc_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd)
|
||||||
*/
|
*/
|
||||||
int jrc_set_trn(RIG *rig, int trn)
|
int jrc_set_trn(RIG *rig, int trn)
|
||||||
{
|
{
|
||||||
unsigned char trnbuf[BUFSZ];
|
unsigned char *trncmd;
|
||||||
int trn_len;
|
|
||||||
|
|
||||||
trn_len = sprintf(trnbuf, "I%d" EOM, trn==RIG_TRN_RIG?1:0);
|
/* transceive mode not available in remote mode
|
||||||
|
* so switch back and forth upon entering/leaving
|
||||||
|
*/
|
||||||
|
trncmd = trn==RIG_TRN_RIG ? "H0"EOM"I1"EOM : "I0"EOM"H1"EOM;
|
||||||
|
|
||||||
return jrc_transaction (rig, trnbuf, trn_len, NULL, NULL);
|
return jrc_transaction (rig, trncmd, 6, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Ładowanie…
Reference in New Issue