kopia lustrzana https://github.com/Hamlib/Hamlib
IC-7300: Fix issues in Icom civ_version 1 parameters implementations. Add correct mappings for AGC settings.
rodzic
be4e882a19
commit
9ad45cc5d3
132
icom/ic7300.c
132
icom/ic7300.c
|
@ -75,6 +75,11 @@
|
||||||
{ 241, 64 } \
|
{ 241, 64 } \
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
#define IC7300_AGC_OFF 0x00
|
||||||
|
#define IC7300_AGC_FAST 0x01
|
||||||
|
#define IC7300_AGC_MID 0x02
|
||||||
|
#define IC7300_AGC_SLOW 0x03
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IC-7300 rig capabilities.
|
* IC-7300 rig capabilities.
|
||||||
*
|
*
|
||||||
|
@ -106,6 +111,8 @@ int ic7300_set_rit(RIG *rig, vfo_t vfo, shortfreq_t ts);
|
||||||
int ic7300_set_xit(RIG *rig, vfo_t vfo, shortfreq_t ts);
|
int ic7300_set_xit(RIG *rig, vfo_t vfo, shortfreq_t ts);
|
||||||
int ic7300_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
|
int ic7300_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
|
||||||
int ic7300_set_func(RIG *rig, vfo_t vfo, setting_t func, int status);
|
int ic7300_set_func(RIG *rig, vfo_t vfo, setting_t func, int status);
|
||||||
|
int ic7300_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
|
||||||
|
int ic7300_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
|
||||||
|
|
||||||
const struct rig_caps ic7300_caps = {
|
const struct rig_caps ic7300_caps = {
|
||||||
.rig_model = RIG_MODEL_IC7300,
|
.rig_model = RIG_MODEL_IC7300,
|
||||||
|
@ -241,8 +248,8 @@ const struct rig_caps ic7300_caps = {
|
||||||
.set_xit = ic7300_set_xit,
|
.set_xit = ic7300_set_xit,
|
||||||
|
|
||||||
.decode_event = icom_decode_event,
|
.decode_event = icom_decode_event,
|
||||||
.set_level = icom_set_level,
|
.set_level = ic7300_set_level,
|
||||||
.get_level = icom_get_level,
|
.get_level = ic7300_get_level,
|
||||||
.set_ext_level = icom_set_ext_level,
|
.set_ext_level = icom_set_ext_level,
|
||||||
.get_ext_level = icom_get_ext_level,
|
.get_ext_level = icom_get_ext_level,
|
||||||
.set_func = ic7300_set_func,
|
.set_func = ic7300_set_func,
|
||||||
|
@ -409,5 +416,126 @@ int ic7300_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
|
||||||
default:
|
default:
|
||||||
return icom_set_func(rig, vfo, func, status);
|
return icom_set_func(rig, vfo, func, status);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ic7300_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
|
||||||
|
{
|
||||||
|
unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||||
|
int ack_len=sizeof(ackbuf), lvl_len;
|
||||||
|
int lvl_cn, lvl_sc; /* Command Number, Subcommand */
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
switch (level) {
|
||||||
|
case RIG_LEVEL_AGC:
|
||||||
|
lvl_cn = C_CTL_FUNC;
|
||||||
|
lvl_sc = S_FUNC_AGC;
|
||||||
|
lvl_len = 1;
|
||||||
|
|
||||||
|
unsigned char agc_value;
|
||||||
|
switch (val.i) {
|
||||||
|
case RIG_AGC_OFF:
|
||||||
|
agc_value = IC7300_AGC_OFF;
|
||||||
|
break;
|
||||||
|
case RIG_AGC_SLOW:
|
||||||
|
agc_value = IC7300_AGC_SLOW;
|
||||||
|
break;
|
||||||
|
case RIG_AGC_MEDIUM:
|
||||||
|
agc_value = IC7300_AGC_MID;
|
||||||
|
break;
|
||||||
|
case RIG_AGC_FAST:
|
||||||
|
agc_value = IC7300_AGC_FAST;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"Unsupported LEVEL_AGC %d", val.i);
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
lvlbuf[0] = agc_value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return icom_set_level(rig, vfo, level, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = icom_transaction (rig, lvl_cn, lvl_sc, lvlbuf, lvl_len,
|
||||||
|
ackbuf, &ack_len);
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
if (ack_len != 1 || ackbuf[0] != ACK) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"icom_set_level: ack NG (%#.2x), "
|
||||||
|
"len=%d\n", ackbuf[0], ack_len);
|
||||||
|
return -RIG_ERJCTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ic7300_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
|
{
|
||||||
|
unsigned char lvlbuf[MAXFRAMELEN], lvl2buf[MAXFRAMELEN];
|
||||||
|
int lvl_len, lvl2_len;
|
||||||
|
int lvl_cn, lvl_sc; /* Command Number, Subcommand */
|
||||||
|
int icom_val;
|
||||||
|
int cmdhead;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
lvl2_len = 0;
|
||||||
|
|
||||||
|
switch (level) {
|
||||||
|
case RIG_LEVEL_AGC:
|
||||||
|
lvl_cn = C_CTL_FUNC;
|
||||||
|
lvl_sc = S_FUNC_AGC;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return icom_get_level(rig, vfo, level, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = icom_transaction (rig, lvl_cn, lvl_sc, lvl2buf, lvl2_len,
|
||||||
|
lvlbuf, &lvl_len);
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
cmdhead = 2;
|
||||||
|
lvl_len -= cmdhead;
|
||||||
|
|
||||||
|
if (lvlbuf[0] != ACK && lvlbuf[0] != lvl_cn) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"%s: ack NG (%#.2x), len=%d\n", __func__, lvlbuf[0], lvl_len);
|
||||||
|
return -RIG_ERJCTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The result is a 3 digit BCD, but in *big endian* order: 0000..0255
|
||||||
|
* (from_bcd is little endian)
|
||||||
|
*/
|
||||||
|
icom_val = from_bcd_be(lvlbuf + cmdhead, lvl_len * 2);
|
||||||
|
|
||||||
|
switch (level) {
|
||||||
|
case RIG_LEVEL_AGC:
|
||||||
|
switch (icom_val) {
|
||||||
|
case IC7300_AGC_OFF:
|
||||||
|
val->i = RIG_AGC_OFF;
|
||||||
|
break;
|
||||||
|
case IC7300_AGC_SLOW:
|
||||||
|
val->i = RIG_AGC_SLOW;
|
||||||
|
break;
|
||||||
|
case IC7300_AGC_MID:
|
||||||
|
val->i = RIG_AGC_MEDIUM;
|
||||||
|
break;
|
||||||
|
case IC7300_AGC_FAST:
|
||||||
|
val->i = RIG_AGC_FAST;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"Unexpected AGC 0x%02x", icom_val);
|
||||||
|
return -RIG_EPROTO;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_TRACE ,"%s: %d %d %d %f\n", __func__, lvl_len, icom_val, val->i, val->f);
|
||||||
|
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
|
38
icom/icom.c
38
icom/icom.c
|
@ -2630,18 +2630,18 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_BACKLIGHT:
|
case RIG_PARM_BACKLIGHT:
|
||||||
prm_cn = C_CTL_MEM;
|
prm_cn = C_CTL_MEM;
|
||||||
prm_sc = S_MEM_MODE_SLCT;
|
|
||||||
icom_val = val.f * 255;
|
icom_val = val.f * 255;
|
||||||
prm_len = 3;
|
|
||||||
prmbuf[0] = S_PRM_BACKLT;
|
|
||||||
if (priv->civ_version == 1) {
|
if (priv->civ_version == 1) {
|
||||||
prm_sc = 0x05;
|
prm_sc = 0x05;
|
||||||
prm_len = 4;
|
prm_len = 4;
|
||||||
prmbuf[0] = 0x00;
|
prmbuf[0] = 0x00;
|
||||||
prmbuf[1] = 0x81;
|
prmbuf[1] = 0x81;
|
||||||
to_bcd_be(prmbuf+2, (long long)icom_val, (prm_len-1)*2);
|
to_bcd_be(prmbuf+2, (long long)icom_val, (prm_len-2)*2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
prm_sc = S_MEM_MODE_SLCT;
|
||||||
|
prm_len = 3;
|
||||||
|
prmbuf[0] = S_PRM_BACKLT;
|
||||||
to_bcd_be(prmbuf+1, (long long)icom_val, (prm_len-1)*2);
|
to_bcd_be(prmbuf+1, (long long)icom_val, (prm_len-1)*2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2730,15 +2730,15 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
prmbuf[0] = S_PRM_SLPTM;
|
prmbuf[0] = S_PRM_SLPTM;
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_BACKLIGHT:
|
case RIG_PARM_BACKLIGHT:
|
||||||
prm_cn = C_CTL_MEM;
|
|
||||||
if (priv->civ_version == 1) {
|
if (priv->civ_version == 1) {
|
||||||
prm_cn = 0; // avoid passing uninitialized data
|
prm_cn = C_CTL_MEM;
|
||||||
prm_sc = 0x05;
|
prm_sc = 0x05;
|
||||||
prm_len = 2;
|
prm_len = 2;
|
||||||
prmbuf[0] = 0x00;
|
prmbuf[0] = 0x00;
|
||||||
prmbuf[1] = 0x81;
|
prmbuf[1] = 0x81;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
prm_cn = C_CTL_MEM;
|
||||||
prm_sc = S_MEM_MODE_SLCT;
|
prm_sc = S_MEM_MODE_SLCT;
|
||||||
prm_len = 1;
|
prm_len = 1;
|
||||||
prmbuf[0] = S_PRM_BACKLT;
|
prmbuf[0] = S_PRM_BACKLT;
|
||||||
|
@ -2746,7 +2746,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_BEEP:
|
case RIG_PARM_BEEP:
|
||||||
if (priv->civ_version == 1) {
|
if (priv->civ_version == 1) {
|
||||||
prm_cn = 0; // avoid passing uninitialized data
|
prm_cn = C_CTL_MEM;
|
||||||
prm_sc = 0x05;
|
prm_sc = 0x05;
|
||||||
prm_len = 2;
|
prm_len = 2;
|
||||||
prmbuf[0] = 0x00;
|
prmbuf[0] = 0x00;
|
||||||
|
@ -2761,7 +2761,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_TIME:
|
case RIG_PARM_TIME:
|
||||||
if (priv->civ_version == 1) {
|
if (priv->civ_version == 1) {
|
||||||
prm_cn = 0; // avoid passing uninitialized data
|
prm_cn = C_CTL_MEM;
|
||||||
prm_sc = 0x05;
|
prm_sc = 0x05;
|
||||||
prm_len = 2;
|
prm_len = 2;
|
||||||
prmbuf[0] = 0x00;
|
prmbuf[0] = 0x00;
|
||||||
|
@ -2805,15 +2805,15 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_TIME:
|
case RIG_PARM_TIME:
|
||||||
if (priv->civ_version == 1) {
|
if (priv->civ_version == 1) {
|
||||||
hr = from_bcd_be(resbuf+cmdhead, 2);
|
|
||||||
min = from_bcd_be(resbuf+cmdhead+1, 2);
|
|
||||||
sec = from_bcd_be(resbuf+cmdhead+2, 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
hr = from_bcd_be(resbuf+cmdhead+1, 2);
|
hr = from_bcd_be(resbuf+cmdhead+1, 2);
|
||||||
min = from_bcd_be(resbuf+cmdhead+2, 2);
|
min = from_bcd_be(resbuf+cmdhead+2, 2);
|
||||||
sec = 0;
|
sec = 0;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
hr = from_bcd_be(resbuf+cmdhead, 2);
|
||||||
|
min = from_bcd_be(resbuf+cmdhead+1, 2);
|
||||||
|
sec = from_bcd_be(resbuf+cmdhead+2, 2);
|
||||||
|
}
|
||||||
icom_val = (hr*3600)+(min*60)+sec;
|
icom_val = (hr*3600)+(min*60)+sec;
|
||||||
val->i = icom_val;
|
val->i = icom_val;
|
||||||
break;
|
break;
|
||||||
|
@ -2821,8 +2821,18 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
icom_val = 0;
|
icom_val = 0;
|
||||||
if (priv->civ_version == 1) {
|
if (priv->civ_version == 1) {
|
||||||
icom_val = from_bcd_be(resbuf+cmdhead+1, (res_len-1)*2);
|
icom_val = from_bcd_be(resbuf+cmdhead+1, (res_len-1)*2);
|
||||||
val->f = icom_val/255.0*100;
|
} else {
|
||||||
|
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
|
||||||
}
|
}
|
||||||
|
val->f = (float)icom_val/255.0;
|
||||||
|
break;
|
||||||
|
case RIG_PARM_BEEP:
|
||||||
|
if (priv->civ_version == 1) {
|
||||||
|
icom_val = from_bcd_be(resbuf+cmdhead+1, (res_len-1)*2);
|
||||||
|
} else {
|
||||||
|
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
|
||||||
|
}
|
||||||
|
val->i = icom_val;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
|
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
|
||||||
|
|
Ładowanie…
Reference in New Issue