From c4e0696ee16309fd45d3b4d223b7fbcd1b1ada74 Mon Sep 17 00:00:00 2001 From: Malcolm Herring Date: Mon, 6 Jan 2020 19:54:09 +0000 Subject: [PATCH] add token list for ext operations --- icom/icom.c | 230 +++++++++++++++++++++---------------------- icom/icom.h | 2 - icom/icom_defs.h | 3 - icom/icr30.c | 20 ++-- icom/icr8600.c | 4 + include/hamlib/rig.h | 15 +-- tests/rigctl_parse.c | 2 +- 7 files changed, 135 insertions(+), 141 deletions(-) diff --git a/icom/icom.c b/icom/icom.c index fdc7f1e52..4a1517d55 100644 --- a/icom/icom.c +++ b/icom/icom.c @@ -2526,18 +2526,6 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return RIG_OK; } -int icom_set_ext_func(RIG *rig, vfo_t vfo, token_t token, int status) -{ - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - return icom_set_ext_cmd(rig, vfo, token, (value_t)status); -} - -int icom_get_ext_func(RIG *rig, vfo_t vfo, token_t token, int *status) -{ - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - return icom_get_ext_cmd(rig, vfo, token, (value_t *)status); -} - 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__); @@ -2572,67 +2560,73 @@ 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__); - const struct icom_priv_caps *priv = rig->caps->priv; - const struct cmdparams *cmd = priv->cmdparams ? priv->cmdparams : icom_ext_cmd; - for (i = 0; cmd && cmd[i].token != 0; i++) { - if (cmd[i].token == TOK_LINK) { - cmd = icom_ext_cmd; - i = -1; - continue; - } - if (cmd[i].token == token) { - if (!(cmd[i].submod & SC_MOD_RD)) break; - if ((cmd[i].submod & SC_MOD_RW12) == SC_MOD_RW12) { - retval = icom_get_raw_buf(rig, cmd[i].command, cmd[i].subcmd, - 1, &ssc, &reslen, resbuf); - } else { - retval = icom_get_raw_buf(rig, cmd[i].command, cmd[i].subcmd, - cmd[i].sublen, (unsigned char *)cmd[i].subext, &reslen, resbuf); + 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->cmdparams ? priv->cmdparams : icom_ext_cmd; + for (i = 0; cmd && cmd[i].token != 0; i++) { + if (cmd[i].token == TOK_LINK) { + cmd = icom_ext_cmd; + i = -1; + continue; + } + if (cmd[i].token == token) { + if (!(cmd[i].submod & SC_MOD_RD)) break; + if ((cmd[i].submod & SC_MOD_RW12) == SC_MOD_RW12) { + retval = icom_get_raw_buf(rig, cmd[i].command, cmd[i].subcmd, + 1, &ssc, &reslen, resbuf); + } else { + retval = icom_get_raw_buf(rig, cmd[i].command, cmd[i].subcmd, + cmd[i].sublen, (unsigned char *)cmd[i].subext, &reslen, resbuf); + } + if (retval != RIG_OK) { + return retval; + } + switch (cmd[i].dattyp) { + case CMD_DAT_WRD: { + int wrd = 0; + int j; + for (j = 0; j < cmd[i].datlen; j++) { + wrd = (wrd << 8) + resbuf[j]; + } + 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_BOL: + val->i = (from_bcd_be(resbuf, (reslen * 2)) == 0) ? 0 : 1; + break; + case CMD_DAT_TIM: + val->f = (float)((from_bcd_be(resbuf, 2) * 3600) + (from_bcd_be(&resbuf[1], 2) * 60)); + break; + default: + val->i = 0; + break; + } + return RIG_OK; + } } - if (retval != RIG_OK) { - return retval; - } - switch (cmd[i].dattyp) { - case CMD_DAT_WRD: { - int wrd = 0; - int j; - for (j = 0; j < cmd[i].datlen; j++) { - wrd = (wrd << 8) + resbuf[j]; - } - 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_BOL: - val->i = (from_bcd_be(resbuf, (reslen * 2)) == 0) ? 0 : 1; - break; - case CMD_DAT_TIM: - val->f = (float)((from_bcd_be(resbuf, 2) * 3600) + (from_bcd_be(&resbuf[1], 2) * 60)); - break; - default: - val->i = 0; - break; - } - return RIG_OK; + return -RIG_EINVAL; } } return -RIG_EINVAL; @@ -2652,51 +2646,57 @@ 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__); - const struct icom_priv_caps *priv = rig->caps->priv; - const struct cmdparams *cmd = priv->cmdparams ? priv->cmdparams : icom_ext_cmd; - for (i = 0; cmd && cmd[i].token != 0; i++) { - if (cmd[i].token == TOK_LINK) { - cmd = icom_ext_cmd; - i = -1; - continue; - } - if (cmd[i].token == token) { - if (!(cmd[i].submod & SC_MOD_WR)) break; - if ((cmd[i].submod & SC_MOD_RW12) == SC_MOD_RW12) { - cmdbuf[0] = 0x01; - cmdlen = 1; - } else { - cmdlen = cmd[i].sublen; - memcpy(cmdbuf, cmd[i].subext, cmdlen); - } - int wrd = val.i; - int j; - switch (cmd[i].dattyp) { - case CMD_DAT_WRD: - for (j = 1; j <= cmd[i].datlen; j++) { - cmdbuf[cmdlen + cmd[i].datlen - j] = wrd & 0xff; - wrd >>= 8; + 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->cmdparams ? priv->cmdparams : icom_ext_cmd; + for (i = 0; cmd && cmd[i].token != 0; i++) { + if (cmd[i].token == TOK_LINK) { + cmd = icom_ext_cmd; + i = -1; + continue; + } + if (cmd[i].token == token) { + if (!(cmd[i].submod & SC_MOD_WR)) break; + if ((cmd[i].submod & SC_MOD_RW12) == SC_MOD_RW12) { + cmdbuf[0] = 0x01; + cmdlen = 1; + } else { + cmdlen = cmd[i].sublen; + memcpy(cmdbuf, cmd[i].subext, cmdlen); + } + int wrd = val.i; + int j; + switch (cmd[i].dattyp) { + case CMD_DAT_WRD: + for (j = 1; j <= cmd[i].datlen; j++) { + cmdbuf[cmdlen + cmd[i].datlen - j] = wrd & 0xff; + wrd >>= 8; + } + break; + case CMD_DAT_BUF: + memcpy(&cmdbuf[cmdlen], val.b.d, cmd[i].datlen); + break; + case CMD_DAT_INT: + case CMD_DAT_BOL: + to_bcd_be(&cmdbuf[cmdlen], val.i, (cmd[i].datlen * 2)); + break; + case CMD_DAT_FLT: + to_bcd_be(&cmdbuf[cmdlen], (int) val.f, (cmdlen * 2)); + break; + case CMD_DAT_TIM: + to_bcd_be(&cmdbuf[cmdlen], ((((int)val.f / 3600) * 100) + (((int)val.f / 60) % 60)), (cmd[i].datlen * 2)); + break; + default: + break; + } + cmdlen += cmd[i].datlen; + return icom_transaction(rig, cmd[i].command, cmd[i].subcmd, + cmdbuf, cmdlen, ackbuf, &acklen); } - break; - case CMD_DAT_BUF: - memcpy(&cmdbuf[cmdlen], val.b.d, cmd[i].datlen); - break; - case CMD_DAT_INT: - case CMD_DAT_BOL: - to_bcd_be(&cmdbuf[cmdlen], val.i, (cmd[i].datlen * 2)); - break; - case CMD_DAT_FLT: - to_bcd_be(&cmdbuf[cmdlen], (int) val.f, (cmdlen * 2)); - break; - case CMD_DAT_TIM: - to_bcd_be(&cmdbuf[cmdlen], ((((int)val.f / 3600) * 100) + (((int)val.f / 60) % 60)), (cmd[i].datlen * 2)); - break; - default: - break; } - cmdlen += cmd[i].datlen; - return icom_transaction(rig, cmd[i].command, cmd[i].subcmd, - cmdbuf, cmdlen, ackbuf, &acklen); + return -RIG_EINVAL; } } return -RIG_EINVAL; diff --git a/icom/icom.h b/icom/icom.h index d6e1235ed..934f678e5 100644 --- a/icom/icom.h +++ b/icom/icom.h @@ -236,8 +236,6 @@ 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_func(RIG *rig, vfo_t vfo, setting_t func, int status); int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status); -int icom_set_ext_func(RIG *rig, vfo_t vfo, token_t token, int status); -int icom_get_ext_func(RIG *rig, vfo_t vfo, token_t token, int *status); int icom_set_parm(RIG *rig, setting_t parm, value_t val); int icom_get_parm(RIG *rig, setting_t parm, value_t *val); int icom_set_ext_parm(RIG *rig, token_t token, value_t val); diff --git a/icom/icom_defs.h b/icom/icom_defs.h index e1502140c..8a4406dc3 100644 --- a/icom/icom_defs.h +++ b/icom/icom_defs.h @@ -513,9 +513,6 @@ #define TOK_BACKLIGHT TOKEN_BACKEND(107) #define TOK_KEYLIGHT TOKEN_BACKEND(108) #define TOK_TIME TOKEN_BACKEND(109) -#define TOK_ANL_R30 TOKEN_BACKEND(110) -#define TOK_EAR_R30 TOKEN_BACKEND(111) -#define TOK_REC_R30 TOKEN_BACKEND(112) #define TOK_DSTAR_CALL_SIGN TOKEN_BACKEND(120) #define TOK_DSTAR_MESSAGE TOKEN_BACKEND(121) #define TOK_DSTAR_STATUS TOKEN_BACKEND(122) diff --git a/icom/icr30.c b/icom/icr30.c index 59c67a7f1..5fae80343 100644 --- a/icom/icr30.c +++ b/icom/icr30.c @@ -26,6 +26,7 @@ #include #include "hamlib/rig.h" +#include "token.h" #include "icom.h" #include "idx_builtin.h" #include "icom_defs.h" @@ -47,17 +48,23 @@ #define ICR30_VFO_OPS (RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) #define ICR30_SCAN_OPS (RIG_SCAN_NONE) +#define TOK_ANL TOKEN_BACKEND(110) +#define TOK_EAR TOKEN_BACKEND(111) +#define TOK_REC TOKEN_BACKEND(112) + +int icr30_tokens[] = { TOK_ANL, TOK_EAR, TOK_REC, TOK_BACKEND_NONE }; + struct confparams icr30_ext[] = { - { TOK_ANL_R30, "anl", "Auto noise limiter", "", "", RIG_CONF_CHECKBUTTON, {} }, - { TOK_EAR_R30, "ear", "Earphone mode", "", "", RIG_CONF_CHECKBUTTON, {} }, - { TOK_REC_R30, "record", "Recorder on/off", "", "", RIG_CONF_CHECKBUTTON, {} }, + { TOK_ANL, "anl", "Auto noise limiter", "", "", RIG_CONF_CHECKBUTTON, {} }, + { TOK_EAR, "ear", "Earphone mode", "", "", RIG_CONF_CHECKBUTTON, {} }, + { TOK_REC, "record", "Recorder on/off", "", "", RIG_CONF_CHECKBUTTON, {} }, { 0 } }; struct cmdparams icr30_cmd[] = { - { TOK_ANL_R30, C_CTL_MEM, S_MEM_ANL, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 }, - { TOK_EAR_R30, C_CTL_MEM, S_MEM_EAR, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 }, - { TOK_REC_R30, C_CTL_MEM, S_MEM_REC, SC_MOD_WR, 0, {}, CMD_DAT_BOL, 1 }, + { TOK_ANL, C_CTL_MEM, S_MEM_ANL, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 }, + { TOK_EAR, C_CTL_MEM, S_MEM_EAR, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 }, + { TOK_REC, C_CTL_MEM, S_MEM_REC, SC_MOD_WR, 0, {}, CMD_DAT_BOL, 1 }, { TOK_LINK } }; @@ -146,6 +153,7 @@ const struct rig_caps icr30_caps = [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, }, .parm_gran = {}, + .ext_tokens = icr30_tokens, .extlevels = icr30_ext, .extparms = icom_ext_parms, .ctcss_list = common_ctcss_list, diff --git a/icom/icr8600.c b/icom/icr8600.c index fe4c20deb..e15f1511c 100644 --- a/icom/icr8600.c +++ b/icom/icr8600.c @@ -31,6 +31,7 @@ #include "hamlib/rig.h" #include "misc.h" #include "idx_builtin.h" +#include "token.h" #include "icom.h" #include "icom_defs.h" @@ -67,6 +68,8 @@ { 255, 60 }, \ } } +int icr8600_tokens[] = { TOK_DSTAR_CALL_SIGN, TOK_BACKEND_NONE }; + struct confparams icr8600_ext[] = { { TOK_KEY_BEEP, "beep", "Key beep enable", "", "", RIG_CONF_CHECKBUTTON, {} }, { 0 } @@ -134,6 +137,7 @@ const struct rig_caps icr8600_caps = .has_set_parm = RIG_PARM_SET(ICR8600_PARM_ALL), .level_gran = { [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } } }, .parm_gran = { [PARM_TIME] = { .min = { .i = 0 }, .max = { .i = 86399} } }, + .ext_tokens = icr8600_tokens, .extlevels = icr8600_ext, .extparms = icom_ext_parms, .ctcss_list = common_ctcss_list, diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index b37d44191..e1b2dc8ab 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1423,6 +1423,7 @@ struct rig_caps { const struct confparams *extparms; /*!< Extension parm list, \sa ext.c */ const struct confparams *extlevels; /*!< Extension level list, \sa ext.c */ + int *ext_tokens; /*!< Extension token list */ const tone_t *ctcss_list; /*!< CTCSS tones list, zero ended */ const tone_t *dcs_list; /*!< DCS code list, zero ended */ @@ -1583,9 +1584,6 @@ struct rig_caps { int (*set_ext_level)(RIG *rig, vfo_t vfo, token_t token, value_t val); int (*get_ext_level)(RIG *rig, vfo_t vfo, token_t token, value_t *val); - int (*set_ext_func)(RIG *rig, vfo_t vfo, token_t token, int status); - int (*get_ext_func)(RIG *rig, vfo_t vfo, token_t token, int *status); - int (*set_ext_parm)(RIG *rig, token_t token, value_t val); int (*get_ext_parm)(RIG *rig, token_t token, value_t *val); @@ -2098,17 +2096,6 @@ rig_get_ext_level HAMLIB_PARAMS((RIG *rig, token_t token, value_t *val)); -extern HAMLIB_EXPORT(int) -rig_set_ext_func HAMLIB_PARAMS((RIG *rig, - vfo_t vfo, - token_t token, - int status)); -extern HAMLIB_EXPORT(int) -rig_get_ext_func HAMLIB_PARAMS((RIG *rig, - vfo_t vfo, - token_t token, - int *status)); - extern HAMLIB_EXPORT(int) rig_set_ext_parm HAMLIB_PARAMS((RIG *rig, token_t token, diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 9dbd15dfd..bf3b1991c 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -2949,7 +2949,7 @@ declare_proto_rig(set_parm) break; case RIG_CONF_BINARY: - val.b.d = arg2; + val.b.d = (unsigned char *)arg2; break; default: