Add custom levels to Icom rigs for drive gain and DIGI-SEL

pull/112/head
Mikael Nousiainen 2019-06-01 11:12:35 +03:00
rodzic 45a8c5c575
commit 60ae18bb0b
8 zmienionych plików z 202 dodań i 73 usunięć

Wyświetl plik

@ -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,

Wyświetl plik

@ -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,

Wyświetl plik

@ -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,

Wyświetl plik

@ -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,

Wyświetl plik

@ -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,

Wyświetl plik

@ -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
*/

Wyświetl plik

@ -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,

Wyświetl plik

@ -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 */