kopia lustrzana https://github.com/Hamlib/Hamlib
Add custom levels to Icom rigs for drive gain and DIGI-SEL
rodzic
45a8c5c575
commit
60ae18bb0b
|
@ -143,6 +143,12 @@ static const struct icom_priv_caps ic7600_priv_caps = {
|
|||
},
|
||||
};
|
||||
|
||||
const struct confparams ic7600_ext_levels[] = {
|
||||
{ TOK_DRIVE_GAIN, "drive_gain", "Drive gain", "Drive gain",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ RIG_CONF_END, NULL, }
|
||||
};
|
||||
|
||||
const struct rig_caps ic7600_caps = {
|
||||
.rig_model = RIG_MODEL_IC7600,
|
||||
|
@ -176,6 +182,7 @@ const struct rig_caps ic7600_caps = {
|
|||
[LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 20 }, .step = { .i = 1 } },
|
||||
},
|
||||
.parm_gran = {},
|
||||
.extlevels = ic7600_ext_levels,
|
||||
.ctcss_list = common_ctcss_list,
|
||||
.dcs_list = NULL,
|
||||
.preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */
|
||||
|
@ -283,6 +290,8 @@ const struct rig_caps ic7600_caps = {
|
|||
.decode_event = icom_decode_event,
|
||||
.set_level = ic7600_set_level,
|
||||
.get_level = ic7600_get_level,
|
||||
.set_ext_level = icom_set_ext_level,
|
||||
.get_ext_level = icom_get_ext_level,
|
||||
.set_func = icom_set_func,
|
||||
.get_func = icom_get_func,
|
||||
.set_parm = icom_set_parm,
|
||||
|
|
|
@ -144,6 +144,18 @@ static const struct icom_priv_caps ic7610_priv_caps = {
|
|||
},
|
||||
};
|
||||
|
||||
const struct confparams ic7610_ext_levels[] = {
|
||||
{ TOK_DRIVE_GAIN, "drive_gain", "Drive gain", "Drive gain",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ TOK_DIGI_SEL_FUNC, "digi_sel", "DIGI-SEL enable", "DIGI-SEL enable",
|
||||
NULL, RIG_CONF_CHECKBUTTON, { },
|
||||
},
|
||||
{ TOK_DIGI_SEL_LEVEL, "digi_sel_level", "DIGI-SEL level", "DIGI-SEL level",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ RIG_CONF_END, NULL, }
|
||||
};
|
||||
|
||||
const struct rig_caps ic7610_caps = {
|
||||
.rig_model = RIG_MODEL_IC7610,
|
||||
|
@ -177,6 +189,7 @@ const struct rig_caps ic7610_caps = {
|
|||
[LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 20 }, .step = { .i = 1 } },
|
||||
},
|
||||
.parm_gran = {},
|
||||
.extlevels = ic7610_ext_levels,
|
||||
.ctcss_list = common_ctcss_list,
|
||||
.dcs_list = NULL,
|
||||
.preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */
|
||||
|
@ -284,6 +297,8 @@ const struct rig_caps ic7610_caps = {
|
|||
.decode_event = icom_decode_event,
|
||||
.set_level = ic7610_set_level,
|
||||
.get_level = ic7610_get_level,
|
||||
.set_ext_level = icom_set_ext_level,
|
||||
.get_ext_level = icom_get_ext_level,
|
||||
.set_func = icom_set_func,
|
||||
.get_func = icom_get_func,
|
||||
.set_parm = icom_set_parm,
|
||||
|
|
|
@ -128,6 +128,18 @@ static const struct icom_priv_caps ic7700_priv_caps = {
|
|||
},
|
||||
};
|
||||
|
||||
const struct confparams ic7700_ext_levels[] = {
|
||||
{ TOK_DRIVE_GAIN, "drive_gain", "Drive gain", "Drive gain",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ TOK_DIGI_SEL_FUNC, "digi_sel", "DIGI-SEL enable", "DIGI-SEL enable",
|
||||
NULL, RIG_CONF_CHECKBUTTON, { },
|
||||
},
|
||||
{ TOK_DIGI_SEL_LEVEL, "digi_sel_level", "DIGI-SEL level", "DIGI-SEL level",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ RIG_CONF_END, NULL, }
|
||||
};
|
||||
|
||||
const struct rig_caps ic7700_caps = {
|
||||
.rig_model = RIG_MODEL_IC7700,
|
||||
|
@ -161,6 +173,7 @@ const struct rig_caps ic7700_caps = {
|
|||
[LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 20 }, .step = { .i = 1 } },
|
||||
},
|
||||
.parm_gran = {},
|
||||
.extlevels = ic7700_ext_levels,
|
||||
.ctcss_list = common_ctcss_list,
|
||||
.dcs_list = NULL,
|
||||
.preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */
|
||||
|
@ -268,6 +281,8 @@ const struct rig_caps ic7700_caps = {
|
|||
.decode_event = icom_decode_event,
|
||||
.set_level = ic7700_set_level,
|
||||
.get_level = ic7700_get_level,
|
||||
.set_ext_level = icom_set_ext_level,
|
||||
.get_ext_level = icom_get_ext_level,
|
||||
.set_func = icom_set_func,
|
||||
.get_func = icom_get_func,
|
||||
.set_parm = icom_set_parm,
|
||||
|
|
|
@ -128,6 +128,18 @@ static const struct icom_priv_caps ic7800_priv_caps = {
|
|||
},
|
||||
};
|
||||
|
||||
const struct confparams ic7800_ext_levels[] = {
|
||||
{ TOK_DRIVE_GAIN, "drive_gain", "Drive gain", "Drive gain",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ TOK_DIGI_SEL_FUNC, "digi_sel", "DIGI-SEL enable", "DIGI-SEL enable",
|
||||
NULL, RIG_CONF_CHECKBUTTON, { },
|
||||
},
|
||||
{ TOK_DIGI_SEL_LEVEL, "digi_sel_level", "DIGI-SEL level", "DIGI-SEL level",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ RIG_CONF_END, NULL, }
|
||||
};
|
||||
|
||||
const struct rig_caps ic7800_caps = {
|
||||
.rig_model = RIG_MODEL_IC7800,
|
||||
|
@ -161,6 +173,7 @@ const struct rig_caps ic7800_caps = {
|
|||
[LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 20 }, .step = { .i = 1 } },
|
||||
},
|
||||
.parm_gran = {},
|
||||
.extlevels = ic7800_ext_levels,
|
||||
.ctcss_list = common_ctcss_list,
|
||||
.dcs_list = NULL,
|
||||
.preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */
|
||||
|
@ -268,6 +281,8 @@ const struct rig_caps ic7800_caps = {
|
|||
.decode_event = icom_decode_event,
|
||||
.set_level = ic7800_set_level,
|
||||
.get_level = ic7800_get_level,
|
||||
.set_ext_level = icom_set_ext_level,
|
||||
.get_ext_level = icom_get_ext_level,
|
||||
.set_func = icom_set_func,
|
||||
.get_func = icom_get_func,
|
||||
.set_parm = icom_set_parm,
|
||||
|
|
|
@ -133,6 +133,18 @@ static const struct icom_priv_caps ic785x_priv_caps = {
|
|||
},
|
||||
};
|
||||
|
||||
const struct confparams ic785x_ext_levels[] = {
|
||||
{ TOK_DRIVE_GAIN, "drive_gain", "Drive gain", "Drive gain",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ TOK_DIGI_SEL_FUNC, "digi_sel", "DIGI-SEL enable", "DIGI-SEL enable",
|
||||
NULL, RIG_CONF_CHECKBUTTON, { },
|
||||
},
|
||||
{ TOK_DIGI_SEL_LEVEL, "digi_sel_level", "DIGI-SEL level", "DIGI-SEL level",
|
||||
NULL, RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } },
|
||||
},
|
||||
{ RIG_CONF_END, NULL, }
|
||||
};
|
||||
|
||||
const struct rig_caps ic785x_caps = {
|
||||
.rig_model = RIG_MODEL_IC785x,
|
||||
|
@ -166,6 +178,7 @@ const struct rig_caps ic785x_caps = {
|
|||
[LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 20 }, .step = { .i = 1 } },
|
||||
},
|
||||
.parm_gran = {},
|
||||
.extlevels = ic785x_ext_levels,
|
||||
.ctcss_list = common_ctcss_list,
|
||||
.dcs_list = NULL,
|
||||
.preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */
|
||||
|
@ -273,6 +286,8 @@ const struct rig_caps ic785x_caps = {
|
|||
.decode_event = icom_decode_event,
|
||||
.set_level = ic785x_set_level,
|
||||
.get_level = ic785x_get_level,
|
||||
.set_ext_level = icom_set_ext_level,
|
||||
.get_ext_level = icom_get_ext_level,
|
||||
.set_func = icom_set_func,
|
||||
.get_func = icom_get_func,
|
||||
.set_parm = icom_set_parm,
|
||||
|
|
201
icom/icom.c
201
icom/icom.c
|
@ -1841,109 +1841,164 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
/*
|
||||
* icom_set_ext_level
|
||||
* Assumes rig!=NULL, rig->state.priv!=NULL
|
||||
*
|
||||
*/
|
||||
int icom_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
switch (token) {
|
||||
default: return -RIG_EINVAL;
|
||||
}
|
||||
return RIG_OK;
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
switch (token) {
|
||||
case TOK_DRIVE_GAIN:
|
||||
return icom_set_raw(rig, C_CTL_LVL, S_LVL_DRIVE, 0, NULL, 2, (int) val.f);
|
||||
case TOK_DIGI_SEL_FUNC:
|
||||
return icom_set_raw(rig, C_CTL_FUNC, S_FUNC_DIGISEL, 0, NULL, 1, val.i ? 1 : 0);
|
||||
case TOK_DIGI_SEL_LEVEL:
|
||||
return icom_set_raw(rig, C_CTL_LVL, S_LVL_DIGI, 0, NULL, 2, (int) val.f);
|
||||
default:
|
||||
return -RIG_EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* icom_get_ext_level
|
||||
* Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL
|
||||
*
|
||||
*/
|
||||
int icom_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
switch (token) {
|
||||
default: return -RIG_EINVAL;
|
||||
}
|
||||
return RIG_OK;
|
||||
int icom_val;
|
||||
int retval;
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
switch (token) {
|
||||
case TOK_DRIVE_GAIN:
|
||||
retval = icom_get_raw(rig, C_CTL_LVL, S_LVL_DRIVE, 0, NULL, &icom_val);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
val->f = (float) icom_val;
|
||||
break;
|
||||
case TOK_DIGI_SEL_FUNC:
|
||||
retval = icom_get_raw(rig, C_CTL_FUNC, S_FUNC_DIGISEL, 0, NULL, &icom_val);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
val->i = icom_val ? 1 : 0;
|
||||
break;
|
||||
case TOK_DIGI_SEL_LEVEL:
|
||||
retval = icom_get_raw(rig, C_CTL_LVL, S_LVL_DIGI, 0, NULL, &icom_val);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
val->f = (float) icom_val;
|
||||
break;
|
||||
default:
|
||||
return -RIG_EINVAL;
|
||||
}
|
||||
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
int icom_set_raw(RIG *rig, int cmd, int subcmd, int len, unsigned char *buf, int val_bytes, int val)
|
||||
{
|
||||
unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||
int ack_len = sizeof(ackbuf);
|
||||
int lvl_len = len;
|
||||
int retval;
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
if (len > 0) {
|
||||
if (buf == NULL) {
|
||||
return -RIG_EINTERNAL;
|
||||
}
|
||||
|
||||
memcpy(lvlbuf, buf, len);
|
||||
}
|
||||
|
||||
to_bcd_be(lvlbuf + len, (long long) val, val_bytes * 2);
|
||||
lvl_len += val_bytes;
|
||||
|
||||
retval = icom_transaction(rig, cmd, subcmd, lvlbuf, lvl_len, ackbuf, &ack_len);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (ack_len != 1 || ackbuf[0] != ACK) {
|
||||
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, ackbuf[0], ack_len);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
int icom_get_raw(RIG *rig, int cmd, int subcmd, int len, unsigned char *buf, int *val)
|
||||
{
|
||||
unsigned char lvlbuf[MAXFRAMELEN];
|
||||
int lvl_len;
|
||||
int cmdhead = len;
|
||||
int retval;
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
retval = icom_transaction(rig, cmd, subcmd, buf, len, lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
cmdhead += (subcmd == -1) ? 1 : 2;
|
||||
lvl_len -= cmdhead;
|
||||
|
||||
if (lvlbuf[0] != ACK && lvlbuf[0] != cmd) {
|
||||
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, lvlbuf[0], lvl_len);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
|
||||
*val = from_bcd_be(lvlbuf + cmdhead, lvl_len * 2);
|
||||
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s: %d %d\n", __func__, lvl_len, *val);
|
||||
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
int icom_set_level_raw(RIG *rig, setting_t level, int cmd, int subcmd, int len, unsigned char *buf, int val_bytes, value_t val)
|
||||
{
|
||||
unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||
int ack_len = sizeof(ackbuf);
|
||||
int lvl_len = len;
|
||||
int icom_val;
|
||||
int retval;
|
||||
int icom_val;
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
if (RIG_LEVEL_IS_FLOAT(level)) {
|
||||
icom_val = val.f * 255;
|
||||
} else {
|
||||
icom_val = val.i;
|
||||
}
|
||||
|
||||
if (len > 0) {
|
||||
if (buf == NULL) {
|
||||
return -RIG_EINTERNAL;
|
||||
if (RIG_LEVEL_IS_FLOAT(level)) {
|
||||
icom_val = val.f * 255;
|
||||
} else {
|
||||
icom_val = val.i;
|
||||
}
|
||||
|
||||
memcpy(lvlbuf, buf, len);
|
||||
}
|
||||
|
||||
to_bcd_be(lvlbuf + len, (long long) icom_val, val_bytes * 2);
|
||||
lvl_len += val_bytes;
|
||||
|
||||
retval = icom_transaction(rig, cmd, subcmd, lvlbuf, lvl_len, ackbuf, &ack_len);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (ack_len != 1 || ackbuf[0] != ACK) {
|
||||
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, ackbuf[0], ack_len);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
|
||||
return RIG_OK;
|
||||
return icom_set_raw(rig, cmd, subcmd, len, buf, val_bytes, icom_val);
|
||||
}
|
||||
|
||||
int icom_get_level_raw(RIG *rig, setting_t level, int cmd, int subcmd, int len, unsigned char *buf, value_t *val)
|
||||
{
|
||||
unsigned char lvlbuf[MAXFRAMELEN];
|
||||
int lvl_len;
|
||||
int icom_val;
|
||||
int cmdhead = len;
|
||||
int retval;
|
||||
int icom_val;
|
||||
int retval;
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
retval = icom_transaction(rig, cmd, subcmd, buf, len, lvlbuf, &lvl_len);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
retval = icom_get_raw(rig, cmd, subcmd, len, buf, &icom_val);
|
||||
if (retval != RIG_OK) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
cmdhead += (subcmd == -1) ? 1 : 2;
|
||||
lvl_len -= cmdhead;
|
||||
if (RIG_LEVEL_IS_FLOAT(level)) {
|
||||
val->f = (float) icom_val / 255;
|
||||
} else {
|
||||
val->i = icom_val;
|
||||
}
|
||||
|
||||
if (lvlbuf[0] != ACK && lvlbuf[0] != cmd) {
|
||||
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, lvlbuf[0], lvl_len);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
|
||||
icom_val = from_bcd_be(lvlbuf + cmdhead, lvl_len * 2);
|
||||
|
||||
if (RIG_LEVEL_IS_FLOAT(level)) {
|
||||
val->f = (float) icom_val / 255;
|
||||
} else {
|
||||
val->i = icom_val;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Assumes rig!=NULL, rig->state.priv!=NULL
|
||||
*/
|
||||
|
|
|
@ -204,6 +204,8 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
|
|||
int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
|
||||
int icom_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val);
|
||||
int icom_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val);
|
||||
int icom_set_raw(RIG *rig, int cmd, int subcmd, int len, unsigned char *buf, int val_bytes, int val);
|
||||
int icom_get_raw(RIG *rig, int cmd, int subcmd, int len, unsigned char *buf, int *val);
|
||||
int icom_set_level_raw(RIG *rig, setting_t level, int cmd, int subcmd,
|
||||
int len, unsigned char *buf, int val_bytes, value_t val);
|
||||
int icom_get_level_raw(RIG *rig, setting_t level, int cmd, int subcmd,
|
||||
|
|
|
@ -496,5 +496,8 @@
|
|||
#define TOK_RTTY_FLTR TOKEN_BACKEND(100)
|
||||
#define TOK_SSBBASS TOKEN_BACKEND(101)
|
||||
#define TOK_SQLCTRL TOKEN_BACKEND(102)
|
||||
#define TOK_DRIVE_GAIN TOKEN_BACKEND(103)
|
||||
#define TOK_DIGI_SEL_FUNC TOKEN_BACKEND(104)
|
||||
#define TOK_DIGI_SEL_LEVEL TOKEN_BACKEND(105)
|
||||
|
||||
#endif /* _ICOM_DEFS_H */
|
||||
|
|
Ładowanie…
Reference in New Issue