Fix get_ant/set_ant commands to work with 1 or 2 byte responses in icom rigs

pull/193/head
Michael Black 2020-01-27 17:33:01 -06:00
rodzic 87ff07d625
commit 203c94fa4a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6599353EC683404D
2 zmienionych plików z 287 dodań i 153 usunięć

Wyświetl plik

@ -444,34 +444,34 @@ const struct confparams icom_ext_parms[] =
const struct cmdparams icom_ext_cmd[] =
{
{ {.t=TOK_DSTAR_CALL_SIGN}, C_CTL_DIG, S_DIG_DSCALS, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 38 },
{ {.t=TOK_DSTAR_MESSAGE}, C_CTL_DIG, S_DIG_DSMESS, SC_MOD_RW12, 2, {0}, CMD_DAT_STR, 32 },
{ {.t=TOK_DSTAR_STATUS}, C_CTL_DIG, S_DIG_DSRSTS, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 1 },
{ {.t=TOK_DSTAR_GPS_DATA}, C_CTL_DIG, S_DIG_DSGPSD, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 52 },
{ {.t=TOK_DSTAR_GPS_MESS}, C_CTL_DIG, S_DIG_DSGPSM, SC_MOD_RW12, 2, {0}, CMD_DAT_STR, 52 },
{ {.t=TOK_DSTAR_DSQL}, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW, 1, {0}, CMD_DAT_BOL, 1 },
{ {.t=TOK_DSTAR_CODE}, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW12, 2, {0}, CMD_DAT_FLT, 1 },
{ {.t=TOK_DSTAR_TX_DATA}, C_CTL_DSD, S_DSD_DSTXDT, SC_MOD_RW, 1, {0}, CMD_DAT_BUF, 30 },
{ {.t=TOK_DSTAR_MY_CS}, C_CTL_DVT, S_DVT_DSMYCS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 12 },
{ {.t=TOK_DSTAR_TX_CS}, C_CTL_DVT, S_DVT_DSTXCS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 24 },
{ {.t=TOK_DSTAR_TX_MESS}, C_CTL_DVT, S_DVT_DSTXMS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 20 },
{ {.t=TOK_DRIVE_GAIN}, C_CTL_LVL, S_LVL_DRIVE, SC_MOD_RW, 1, {0}, CMD_DAT_FLT, 2 },
{ {.t=TOK_DIGI_SEL_FUNC}, C_CTL_FUNC, S_FUNC_DIGISEL, SC_MOD_RW, 1, {0}, CMD_DAT_BOL, 1 },
{ {.t=TOK_DIGI_SEL_LEVEL}, C_CTL_LVL, S_LVL_DIGI, SC_MOD_RW, 1, {0}, CMD_DAT_FLT, 2 },
{ {.t=TOK_SCOPE_DAT}, C_CTL_SCP, S_SCP_DAT, SC_MOD_RD, 0, {0}, CMD_DAT_BUF, 481 },
{ {.t=TOK_SCOPE_STS}, C_CTL_SCP, S_SCP_STS, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t=TOK_SCOPE_DOP}, C_CTL_SCP, S_SCP_DOP, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t=TOK_SCOPE_MSS}, C_CTL_SCP, S_SCP_MSS, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t=TOK_SCOPE_MOD}, C_CTL_SCP, S_SCP_MOD, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t=TOK_SCOPE_SPN}, C_CTL_SCP, S_SCP_SPN, SC_MOD_RW, 0, {0}, CMD_DAT_BUF, 6 },
{ {.t=TOK_SCOPE_EDG}, C_CTL_SCP, S_SCP_EDG, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t=TOK_SCOPE_HLD}, C_CTL_SCP, S_SCP_HLD, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t=TOK_SCOPE_REF}, C_CTL_SCP, S_SCP_REF, SC_MOD_RW, 0, {0}, CMD_DAT_BUF, 4 },
{ {.t=TOK_SCOPE_SWP}, C_CTL_SCP, S_SCP_SWP, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t=TOK_SCOPE_STX}, C_CTL_SCP, S_SCP_STX, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t=TOK_SCOPE_TYP}, C_CTL_SCP, S_SCP_TYP, SC_MOD_RW, 0, {0}, CMD_DAT_INT, 1 },
{ {.t=TOK_SCOPE_VBW}, C_CTL_SCP, S_SCP_VBW, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t=TOK_SCOPE_FEF}, C_CTL_SCP, S_SCP_FEF, SC_MOD_RW, 0, {0}, CMD_DAT_BUF, 12 },
{ {.t = TOK_DSTAR_CALL_SIGN}, C_CTL_DIG, S_DIG_DSCALS, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 38 },
{ {.t = TOK_DSTAR_MESSAGE}, C_CTL_DIG, S_DIG_DSMESS, SC_MOD_RW12, 2, {0}, CMD_DAT_STR, 32 },
{ {.t = TOK_DSTAR_STATUS}, C_CTL_DIG, S_DIG_DSRSTS, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 1 },
{ {.t = TOK_DSTAR_GPS_DATA}, C_CTL_DIG, S_DIG_DSGPSD, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 52 },
{ {.t = TOK_DSTAR_GPS_MESS}, C_CTL_DIG, S_DIG_DSGPSM, SC_MOD_RW12, 2, {0}, CMD_DAT_STR, 52 },
{ {.t = TOK_DSTAR_DSQL}, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW, 1, {0}, CMD_DAT_BOL, 1 },
{ {.t = TOK_DSTAR_CODE}, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW12, 2, {0}, CMD_DAT_FLT, 1 },
{ {.t = TOK_DSTAR_TX_DATA}, C_CTL_DSD, S_DSD_DSTXDT, SC_MOD_RW, 1, {0}, CMD_DAT_BUF, 30 },
{ {.t = TOK_DSTAR_MY_CS}, C_CTL_DVT, S_DVT_DSMYCS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 12 },
{ {.t = TOK_DSTAR_TX_CS}, C_CTL_DVT, S_DVT_DSTXCS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 24 },
{ {.t = TOK_DSTAR_TX_MESS}, C_CTL_DVT, S_DVT_DSTXMS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 20 },
{ {.t = TOK_DRIVE_GAIN}, C_CTL_LVL, S_LVL_DRIVE, SC_MOD_RW, 1, {0}, CMD_DAT_FLT, 2 },
{ {.t = TOK_DIGI_SEL_FUNC}, C_CTL_FUNC, S_FUNC_DIGISEL, SC_MOD_RW, 1, {0}, CMD_DAT_BOL, 1 },
{ {.t = TOK_DIGI_SEL_LEVEL}, C_CTL_LVL, S_LVL_DIGI, SC_MOD_RW, 1, {0}, CMD_DAT_FLT, 2 },
{ {.t = TOK_SCOPE_DAT}, C_CTL_SCP, S_SCP_DAT, SC_MOD_RD, 0, {0}, CMD_DAT_BUF, 481 },
{ {.t = TOK_SCOPE_STS}, C_CTL_SCP, S_SCP_STS, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t = TOK_SCOPE_DOP}, C_CTL_SCP, S_SCP_DOP, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t = TOK_SCOPE_MSS}, C_CTL_SCP, S_SCP_MSS, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t = TOK_SCOPE_MOD}, C_CTL_SCP, S_SCP_MOD, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t = TOK_SCOPE_SPN}, C_CTL_SCP, S_SCP_SPN, SC_MOD_RW, 0, {0}, CMD_DAT_BUF, 6 },
{ {.t = TOK_SCOPE_EDG}, C_CTL_SCP, S_SCP_EDG, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t = TOK_SCOPE_HLD}, C_CTL_SCP, S_SCP_HLD, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t = TOK_SCOPE_REF}, C_CTL_SCP, S_SCP_REF, SC_MOD_RW, 0, {0}, CMD_DAT_BUF, 4 },
{ {.t = TOK_SCOPE_SWP}, C_CTL_SCP, S_SCP_SWP, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t = TOK_SCOPE_STX}, C_CTL_SCP, S_SCP_STX, SC_MOD_RW, 0, {0}, CMD_DAT_BOL, 1 },
{ {.t = TOK_SCOPE_TYP}, C_CTL_SCP, S_SCP_TYP, SC_MOD_RW, 0, {0}, CMD_DAT_INT, 1 },
{ {.t = TOK_SCOPE_VBW}, C_CTL_SCP, S_SCP_VBW, SC_MOD_RW, 0, {0}, CMD_DAT_WRD, 2 },
{ {.t = TOK_SCOPE_FEF}, C_CTL_SCP, S_SCP_FEF, SC_MOD_RW, 0, {0}, CMD_DAT_BUF, 12 },
{ {0} }
};
@ -566,10 +566,10 @@ int
icom_init(RIG *rig)
{
struct icom_priv_data *priv;
const struct icom_priv_caps *priv_caps;
const struct rig_caps *caps;
struct icom_priv_caps *priv_caps;
struct rig_caps *caps;
int retval;
int satmode;
int satmode = 0;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
@ -585,10 +585,11 @@ icom_init(RIG *rig)
return -RIG_ECONF;
}
priv_caps = (const struct icom_priv_caps *) caps->priv;
priv_caps = (struct icom_priv_caps *) caps->priv;
rig->state.priv = (struct icom_priv_data *) calloc(1, sizeof(struct icom_priv_data));
rig->state.priv = (struct icom_priv_data *) calloc(1,
sizeof(struct icom_priv_data));
if (!rig->state.priv)
{
@ -611,6 +612,7 @@ icom_init(RIG *rig)
priv->tx_vfo = RIG_VFO_NONE;
priv->rx_vfo = RIG_VFO_NONE;
priv->curr_vfo = RIG_VFO_NONE;
//priv_caps->antack_len = 0;
retval = rig_get_func(rig, RIG_VFO_CURR, RIG_FUNC_SATMODE, &satmode);
rig_debug(RIG_DEBUG_VERBOSE, "%s: satmode=%d\n", __func__, satmode);
@ -711,6 +713,8 @@ icom_rig_open(RIG *rig)
rig_debug(RIG_DEBUG_VERBOSE, "%s %d \n", __func__, __LINE__);
rig_debug(RIG_DEBUG_VERBOSE, "%s: %s v%s\n", __func__, rig->caps->model_name,
rig->caps->version);
retval = icom_get_usb_echo_off(rig);
if (retval >= 0) { return RIG_OK; }
@ -747,7 +751,7 @@ int
icom_rig_close(RIG *rig)
{
// Nothing to do yet
rig_debug(RIG_DEBUG_TRACE,"%s: called\n", __func__);
rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__);
return RIG_OK;
}
@ -1790,44 +1794,62 @@ int icom_set_cmd(RIG *rig, vfo_t vfo, struct cmdparams *par, value_t val)
unsigned char ackbuf[MAXFRAMELEN];
int acklen = 0;
if (!(par->submod & SC_MOD_WR)) return -RIG_EINVAL;
if ((par->submod & SC_MOD_RW12) == SC_MOD_RW12) {
if (!(par->submod & SC_MOD_WR)) { return -RIG_EINVAL; }
if ((par->submod & SC_MOD_RW12) == SC_MOD_RW12)
{
cmdbuf[0] = 0x01;
cmdlen = 1;
} else {
}
else
{
cmdlen = par->sublen;
memcpy(cmdbuf, par->subext, cmdlen);
}
int wrd = val.i;
int i;
switch (par->dattyp) {
case CMD_DAT_WRD:
for (i = 1; i <= par->datlen; i++) {
cmdbuf[cmdlen + par->datlen - i] = wrd & 0xff;
wrd >>= 8;
}
break;
case CMD_DAT_BUF:
memcpy(&cmdbuf[cmdlen], val.b.d, par->datlen);
break;
case CMD_DAT_INT:
case CMD_DAT_BOL:
to_bcd_be(&cmdbuf[cmdlen], val.i, (par->datlen * 2));
break;
case CMD_DAT_FLT:
to_bcd_be(&cmdbuf[cmdlen], (int) val.f, (cmdlen * 2));
break;
case CMD_DAT_LVL:
to_bcd_be(&cmdbuf[cmdlen], (int)(val.f * 255.0), (cmdlen * 2));
break;
case CMD_DAT_TIM:
to_bcd_be(&cmdbuf[cmdlen], ((((int)val.f / 3600) * 100) + (((int)val.f / 60) % 60)), (par->datlen * 2));
break;
default:
break;
switch (par->dattyp)
{
case CMD_DAT_WRD:
for (i = 1; i <= par->datlen; i++)
{
cmdbuf[cmdlen + par->datlen - i] = wrd & 0xff;
wrd >>= 8;
}
break;
case CMD_DAT_BUF:
memcpy(&cmdbuf[cmdlen], val.b.d, par->datlen);
break;
case CMD_DAT_INT:
case CMD_DAT_BOL:
to_bcd_be(&cmdbuf[cmdlen], val.i, (par->datlen * 2));
break;
case CMD_DAT_FLT:
to_bcd_be(&cmdbuf[cmdlen], (int) val.f, (cmdlen * 2));
break;
case CMD_DAT_LVL:
to_bcd_be(&cmdbuf[cmdlen], (int)(val.f * 255.0), (cmdlen * 2));
break;
case CMD_DAT_TIM:
to_bcd_be(&cmdbuf[cmdlen],
((((int)val.f / 3600) * 100) + (((int)val.f / 60) % 60)), (par->datlen * 2));
break;
default:
break;
}
cmdlen += par->datlen;
return icom_transaction(rig, par->command, par->subcmd, cmdbuf, cmdlen, ackbuf, &acklen);
return icom_transaction(rig, par->command, par->subcmd, cmdbuf, cmdlen, ackbuf,
&acklen);
}
int icom_get_cmd(RIG *rig, vfo_t vfo, struct cmdparams *par, value_t *val)
@ -1840,59 +1862,85 @@ int icom_get_cmd(RIG *rig, vfo_t vfo, struct cmdparams *par, value_t *val)
int reslen = sizeof(resbuf);
int retval;
if (!(par->submod & SC_MOD_RD)) return -RIG_EINVAL;
if ((par->submod & SC_MOD_RW12) == SC_MOD_RW12) {
retval = icom_get_raw_buf(rig, par->command, par->subcmd, 1, &ssc, &reslen, resbuf);
} else {
retval = icom_get_raw_buf(rig, par->command, par->subcmd,
par->sublen, (unsigned char *)par->subext, &reslen, resbuf);
if (!(par->submod & SC_MOD_RD)) { return -RIG_EINVAL; }
if ((par->submod & SC_MOD_RW12) == SC_MOD_RW12)
{
retval = icom_get_raw_buf(rig, par->command, par->subcmd, 1, &ssc, &reslen,
resbuf);
}
if (retval != RIG_OK) {
else
{
retval = icom_get_raw_buf(rig, par->command, par->subcmd,
par->sublen, (unsigned char *)par->subext, &reslen, resbuf);
}
if (retval != RIG_OK)
{
return retval;
}
switch (par->dattyp) {
case CMD_DAT_WRD: {
int wrd = 0;
int i;
for (i = 0; i < par->datlen; i++) {
wrd = (wrd << 8) + resbuf[i];
}
val->i = wrd;
}
break;
case CMD_DAT_STR:
if (strlen(val->s) < reslen) {
return -RIG_EINTERNAL;
}
memcpy(val->s, resbuf, reslen);
val->s[reslen] = 0;
break;
case CMD_DAT_BUF:
if (reslen > val->b.l) {
return -RIG_EINTERNAL;
}
memcpy(val->b.d, resbuf, reslen);
val->b.l = reslen;
break;
case CMD_DAT_INT:
val->i = from_bcd_be(resbuf, (reslen * 2));
break;
case CMD_DAT_FLT:
val->f = (float) from_bcd_be(resbuf, (reslen * 2));
break;
case CMD_DAT_LVL:
val->f = (float) from_bcd_be(resbuf, (reslen * 2)) / 255.0;
break;
case CMD_DAT_BOL:
val->i = (from_bcd_be(resbuf, (reslen * 2)) == 0) ? 0 : 1;
break;
case CMD_DAT_TIM:
val->i = (from_bcd_be(resbuf, 2) * 3600) + (from_bcd_be(&resbuf[1], 2) * 60);
break;
default:
val->i = 0;
break;
switch (par->dattyp)
{
case CMD_DAT_WRD:
{
int wrd = 0;
int i;
for (i = 0; i < par->datlen; i++)
{
wrd = (wrd << 8) + resbuf[i];
}
val->i = wrd;
}
break;
case CMD_DAT_STR:
if (strlen(val->s) < reslen)
{
return -RIG_EINTERNAL;
}
memcpy(val->s, resbuf, reslen);
val->s[reslen] = 0;
break;
case CMD_DAT_BUF:
if (reslen > val->b.l)
{
return -RIG_EINTERNAL;
}
memcpy(val->b.d, resbuf, reslen);
val->b.l = reslen;
break;
case CMD_DAT_INT:
val->i = from_bcd_be(resbuf, (reslen * 2));
break;
case CMD_DAT_FLT:
val->f = (float) from_bcd_be(resbuf, (reslen * 2));
break;
case CMD_DAT_LVL:
val->f = (float) from_bcd_be(resbuf, (reslen * 2)) / 255.0;
break;
case CMD_DAT_BOL:
val->i = (from_bcd_be(resbuf, (reslen * 2)) == 0) ? 0 : 1;
break;
case CMD_DAT_TIM:
val->i = (from_bcd_be(resbuf, 2) * 3600) + (from_bcd_be(&resbuf[1], 2) * 60);
break;
default:
val->i = 0;
break;
}
return RIG_OK;
}
@ -1914,9 +1962,12 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
const struct cmdparams *cmd = priv_caps->riglevels;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == level) {
return icom_set_cmd(rig,vfo, (struct cmdparams *)&cmd[i], val);
for (i = 0; cmd && cmd[i].id.s != 0; i++)
{
if (cmd[i].id.s == level)
{
return icom_set_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
}
}
@ -2269,8 +2320,11 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->riglevels;
int i;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == level) {
for (i = 0; cmd && cmd[i].id.s != 0; i++)
{
if (cmd[i].id.s == level)
{
return icom_get_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
}
}
@ -2519,7 +2573,6 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
if (priv_caps->agc_levels_present)
{
int found = 0;
int i;
for (i = 0;
i <= RIG_AGC_LAST && priv_caps->agc_levels[i].level >= 0; i++)
@ -2742,22 +2795,33 @@ int icom_get_ext_cmd(RIG *rig, vfo_t vfo, token_t token, value_t *val)
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
for (i = 0; rig->caps->ext_tokens && rig->caps->ext_tokens[i] != TOK_BACKEND_NONE; i++) {
if (rig->caps->ext_tokens[i] == token) {
for (i = 0; rig->caps->ext_tokens
&& rig->caps->ext_tokens[i] != TOK_BACKEND_NONE; i++)
{
if (rig->caps->ext_tokens[i] == token)
{
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->extcmds ? priv->extcmds : icom_ext_cmd;
for (i = 0; (cmd[i].id.t != 0) || (cmd != icom_ext_cmd); ) {
if (cmd[i].id.t == 0) {
for (i = 0; (cmd[i].id.t != 0) || (cmd != icom_ext_cmd);)
{
if (cmd[i].id.t == 0)
{
cmd = icom_ext_cmd;
i = 0;
} else if (cmd[i].id.t == token) {
}
else if (cmd[i].id.t == token)
{
return icom_get_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
} else i++;
}
else { i++; }
}
return -RIG_EINVAL;
}
}
return -RIG_EINVAL;
}
@ -2767,22 +2831,33 @@ int icom_set_ext_cmd(RIG *rig, vfo_t vfo, token_t token, value_t val)
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
for (i = 0; rig->caps->ext_tokens && rig->caps->ext_tokens[i] != TOK_BACKEND_NONE; i++) {
if (rig->caps->ext_tokens[i] == token) {
for (i = 0; rig->caps->ext_tokens
&& rig->caps->ext_tokens[i] != TOK_BACKEND_NONE; i++)
{
if (rig->caps->ext_tokens[i] == token)
{
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->extcmds ? priv->extcmds : icom_ext_cmd;
for (i = 0; (cmd[i].id.t != 0) || (cmd != icom_ext_cmd); ) {
if (cmd[i].id.t == 0) {
for (i = 0; (cmd[i].id.t != 0) || (cmd != icom_ext_cmd);)
{
if (cmd[i].id.t == 0)
{
cmd = icom_ext_cmd;
i = 0;
} else if (cmd[i].id.t == token) {
}
else if (cmd[i].id.t == token)
{
return icom_set_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
} else i++;
}
else { i++; }
}
return -RIG_EINVAL;
}
}
return -RIG_EINVAL;
}
@ -3990,7 +4065,8 @@ int icom_mem_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split,
*split = RIG_SPLIT_ON;
/* get it back to normal */
retval = icom_vfo_op(rig, vfo, RIG_OP_XCHG);
if (retval != RIG_OK) return retval;
if (retval != RIG_OK) { return retval; }
}
else if (retval == -RIG_ERJCTED)
{
@ -4508,11 +4584,15 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
int i;
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->rigparms;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == parm) {
for (i = 0; cmd && cmd[i].id.s != 0; i++)
{
if (cmd[i].id.s == parm)
{
return icom_set_cmd(rig, RIG_VFO_NONE, (struct cmdparams *)&cmd[i], val);
}
}
switch (parm)
{
case RIG_PARM_ANN:
@ -4566,8 +4646,11 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->rigparms;
int i;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == parm) {
for (i = 0; cmd && cmd[i].id.s != 0; i++)
{
if (cmd[i].id.s == parm)
{
return icom_get_cmd(rig, RIG_VFO_NONE, (struct cmdparams *)&cmd[i], val);
}
}
@ -5040,7 +5123,7 @@ int icom_set_powerstat(RIG *rig, powerstat_t status)
}
i = 0;
retry = 2;
retry = 1;
if (status == RIG_POWER_ON) // wait for wakeup only
{
@ -5218,10 +5301,12 @@ int icom_set_bank(RIG *rig, vfo_t vfo, int bank)
*/
int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option)
{
unsigned char antarg;
unsigned char antopt[2];
unsigned char ackbuf[MAXFRAMELEN];
int ack_len = sizeof(ackbuf), retval, i_ant = 0;
int ant_len;
int antopt_len = 0;
const struct icom_priv_caps *priv_caps = (const struct icom_priv_caps *)
rig->caps->priv;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
@ -5247,17 +5332,53 @@ int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option)
break;
default:
rig_debug(RIG_DEBUG_ERR, "%s: unsupported ant %#x\n", __func__, ant);
rig_debug(RIG_DEBUG_ERR, "%s: unsupported ant %#x", __func__, ant);
return -RIG_EINVAL;
}
antarg = option.i;
ant_len = ((rig->caps->rig_model == RIG_MODEL_ICR75)
|| (rig->caps->rig_model == RIG_MODEL_ICR8600) ||
(rig->caps->rig_model == RIG_MODEL_ICR6)
|| (rig->caps->rig_model == RIG_MODEL_ICR30)) ? 0 : 1;
if (priv_caps->antack_len == 0) { // we need to find out the antack_len
ant_t tmp_ant;
value_t tmp_option;
retval = rig_get_ant(rig, vfo, &tmp_ant, &tmp_option);
if (retval != RIG_OK) {
rig_debug(RIG_DEBUG_ERR,"%s: rig_get_ant error: %s \n", __func__, rigerror(retval));
return retval;
}
}
// Some rigs have 3-byte ant cmd so there is an option to be set
if (priv_caps->antack_len == 3)
{
if (option.i != 0 && option.i != 1)
{
rig_debug(RIG_DEBUG_ERR, "%s: option.i != 0 or 1, ==%d?\n", __func__, option.i);
return -RIG_EINVAL;
}
antopt_len = 1;
antopt[0] = option.i;
rig_debug(RIG_DEBUG_TRACE, "%s: antack_len=%d so antopt_len=%d, antopt=0x%02x\n",
__func__, priv_caps->antack_len, antopt_len, antopt[0]);
}
else if (priv_caps->antack_len == 2)
{
antopt_len = 0;
rig_debug(RIG_DEBUG_TRACE, "%s: antack_len=%d so antopt_len=%d\n", __func__,
priv_caps->antack_len, antopt_len);
}
else
{
rig_debug(RIG_DEBUG_TRACE, "%s: antack_len=%d so antopt_len=%d\n", __func__,
priv_caps->antack_len, antopt_len);
antopt_len = 0;
rig_debug(RIG_DEBUG_ERR,
"%s: rig does not have antenna select? antack_len=%d\n", __func__,
priv_caps->antack_len);
}
rig_debug(RIG_DEBUG_TRACE, "%s: i_ant=%d, antopt=0x%02x, antopt_len=%d\n",
__func__, i_ant, antopt[0], antopt_len);
retval = icom_transaction(rig, C_CTL_ANT, i_ant,
&antarg, ant_len, ackbuf, &ack_len);
antopt, antopt_len, ackbuf, &ack_len);
if (retval != RIG_OK)
{
@ -5279,14 +5400,25 @@ int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option)
* Assumes rig!=NULL, rig->state.priv!=NULL
* only meaningfull for HF
*/
int icom_get_ant(RIG *rig, vfo_t vfo, ant_t *ant, value_t *rxant)
int icom_get_ant(RIG *rig, vfo_t vfo, ant_t *ant, value_t *option)
{
unsigned char ackbuf[MAXFRAMELEN];
int ack_len = sizeof(ackbuf), retval;
struct icom_priv_caps *priv_caps = (struct icom_priv_caps *) rig->caps->priv;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
retval = icom_transaction(rig, C_CTL_ANT, -1, NULL, 0, ackbuf, &ack_len);
if (retval != RIG_OK) {
}
// ack_len should be either 2 or 3
// ant cmd format is one of
// 0x12 0xaa
// 0x12 0xaa 0xrr
// Where aa is a zero-base antenna number and rr is a binary for rx only
priv_caps->antack_len = ack_len; // remember this for set_ant
if (retval != RIG_OK)
{
return retval;
@ -5295,16 +5427,17 @@ int icom_get_ant(RIG *rig, vfo_t vfo, ant_t *ant, value_t *rxant)
if ((ack_len != 2 && ack_len != 3) || ackbuf[0] != C_CTL_ANT ||
ackbuf[1] > 3)
{
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__,
ackbuf[0], ack_len);
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d, ant=%d\n", __func__,
ackbuf[0], ack_len, ackbuf[1]);
return -RIG_ERJCTED;
}
/* Note: with IC756/IC-756Pro/IC-7800, ackbuf[2] deals with [RX ANT] */
*ant = RIG_ANT_N(ackbuf[1]);
if (ack_len == 3) { // then this should be rx ant on/off status
rxant->i = RIG_ANT_N(ackbuf[2]);
/* Note: with IC756/IC-756Pro/IC-7800 and more, ackbuf[2] deals with [RX ANT] */
if (ack_len == 3)
{
option->i = ackbuf[1];
}
return RIG_OK;

Wyświetl plik

@ -30,7 +30,7 @@
#include <sys/time.h>
#endif
#define BACKEND_VER "0.23"
#define BACKEND_VER "0.24"
/*
* defines used by comp_cal_str in rig.c
@ -137,6 +137,7 @@ struct icom_priv_caps
mode */
int serial_full_duplex; /*!< Whether RXD&TXD are not tied together */
int offs_len; /* Number of bytes in offset frequency field. 0 defaults to 3 */
int antack_len; /* Length of 0x12 cmd may be 3 or 4 bytes as of 2020-01-22 e.g. 7851 */
int serial_USB_echo_check; /* Flag to test USB echo state */
int agc_levels_present; /* Flag to indicate that agc_levels array is populated */
struct icom_agc_level agc_levels[RIG_AGC_LAST + 1]; /* Icom rig-specific AGC levels, the last entry should have level -1 */