diff --git a/icom/icom.c b/icom/icom.c index 028efe3a0..16c257a58 100644 --- a/icom/icom.c +++ b/icom/icom.c @@ -50,8 +50,6 @@ static int set_vfo_curr(RIG *rig, vfo_t vfo, vfo_t curr_vfo); -static char databuf[MAXFRAMELEN]; - const cal_table_float_t icom_default_swr_cal = { 5, @@ -408,19 +406,20 @@ const struct confparams icom_cfg_params[] = const struct confparams icom_ext_parms[] = { - { TOK_DSTAR_CALL_SIGN, "dscals", "D-STAR Call sign" }, - { TOK_DSTAR_MESSAGE, "dsrmes", "D-STAR Rx Message" }, - { TOK_DSTAR_STATUS, "dsstat", "D-STAR Rx Status" }, - { TOK_DSTAR_GPS_DATA, "dsgpsd", "D-STAR GPS Data" }, - { TOK_DSTAR_GPS_MESS, "dsgpsm", "D-STAR GPS Message" }, - { TOK_DSTAR_DSQL, "dsdsql", "D-STAR CSQL Code" }, - { TOK_DSTAR_MY_CS, "dsmycs", "D-STAR MY Call Sign" }, - { TOK_DSTAR_TX_CS, "dstxcs", "D-STAR Tx Call Sign" }, - { TOK_DSTAR_TX_MESS, "dstmes", "D-STAR Tx Message" }, - { TOK_DSTAR_TX_DATA, "dstdat", "D-STAR Tx Data" }, - { TOK_DRIVE_GAIN, "drive_gain", "Drive gain" }, - { TOK_DIGI_SEL_FUNC, "digi_sel", "DIGI-SEL enable" }, - { TOK_DIGI_SEL_LEVEL, "digi_sel_level", "DIGI-SEL level" }, + { TOK_DSTAR_DSQL, "dsdsql", "D-STAR CSQL Status", "", "", RIG_CONF_CHECKBUTTON, {} }, + { TOK_DSTAR_CALL_SIGN, "dscals", "D-STAR Call sign", "", "", RIG_CONF_BINARY, {} }, + { TOK_DSTAR_MESSAGE, "dsrmes", "D-STAR Rx Message", "", "", RIG_CONF_STRING, {} }, + { TOK_DSTAR_STATUS, "dsstat", "D-STAR Rx Status", "", "", RIG_CONF_NUMERIC, {} }, + { TOK_DSTAR_GPS_DATA, "dsgpsd", "D-STAR GPS Data", "", "", RIG_CONF_BINARY, {} }, + { TOK_DSTAR_GPS_MESS, "dsgpsm", "D-STAR GPS Message", "", "", RIG_CONF_STRING, {} }, + { TOK_DSTAR_CODE, "dscode", "D-STAR CSQL Code", "", "", RIG_CONF_NUMERIC, {} }, + { TOK_DSTAR_TX_DATA, "dstdat", "D-STAR Tx Data", "", "", RIG_CONF_BINARY, {} }, + { TOK_DSTAR_MY_CS, "dsmycs", "D-STAR MY Call Sign", "", "", RIG_CONF_STRING, {} }, + { TOK_DSTAR_TX_CS, "dstxcs", "D-STAR Tx Call Sign", "", "", RIG_CONF_BINARY, {} }, + { TOK_DSTAR_TX_MESS, "dstmes", "D-STAR Tx Message", "", "", RIG_CONF_STRING, {} }, + { TOK_DRIVE_GAIN, "drive_gain", "Drive gain", "", "", RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } } }, + { TOK_DIGI_SEL_FUNC, "digi_sel", "DIGI-SEL enable", "", "", RIG_CONF_CHECKBUTTON, {} }, + { TOK_DIGI_SEL_LEVEL, "digi_sel_level", "DIGI-SEL level", "", "", RIG_CONF_NUMERIC, { .n = { 0, 255, 1 } } }, { RIG_CONF_END, NULL, } }; @@ -431,15 +430,16 @@ const struct confparams icom_ext_parms[] = const struct cmdparams icom_ext_cmd[] = { { TOK_DSTAR_CALL_SIGN, C_CTL_DIG, S_DIG_DSCALS, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 38 }, - { TOK_DSTAR_MESSAGE, C_CTL_DIG, S_DIG_DSMESS, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 32 }, + { TOK_DSTAR_MESSAGE, C_CTL_DIG, S_DIG_DSMESS, SC_MOD_RW12, 2, {0}, CMD_DAT_STR, 32 }, { TOK_DSTAR_STATUS, C_CTL_DIG, S_DIG_DSRSTS, SC_MOD_RW12, 2, {0}, CMD_DAT_WRD, 1 }, - { TOK_DSTAR_GPS_DATA, C_CTL_DIG, S_DIG_DSGPSD, SC_MOD_RW12, 2, {0}, 0, 0 }, - { TOK_DSTAR_GPS_MESS, C_CTL_DIG, S_DIG_DSGPSM, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 52 }, - { TOK_DSTAR_DSQL, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW12, 2, {0}, 0, 0 }, - { TOK_DSTAR_MY_CS, C_CTL_DVT, S_DVT_DSMYCS, SC_MOD_RW, 1, {0}, 0, 0 }, - { TOK_DSTAR_TX_CS, C_CTL_DVT, S_DVT_DSTXCS, SC_MOD_RW, 1, {0}, 0, 0 }, - { TOK_DSTAR_TX_MESS, C_CTL_DVT, S_DVT_DSTXMS, SC_MOD_RW, 1, {0}, 0, 0 }, - { TOK_DSTAR_TX_DATA, C_CTL_DSD, S_DSD_DSTXDT, SC_MOD_RW, 1, {0}, 0, 0 }, + { TOK_DSTAR_GPS_DATA, C_CTL_DIG, S_DIG_DSGPSD, SC_MOD_RW12, 2, {0}, CMD_DAT_BUF, 52 }, + { TOK_DSTAR_GPS_MESS, C_CTL_DIG, S_DIG_DSGPSM, SC_MOD_RW12, 2, {0}, CMD_DAT_STR, 52 }, + { TOK_DSTAR_DSQL, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW, 2, {0}, CMD_DAT_INT, 1 }, + { TOK_DSTAR_CODE, C_CTL_DIG, S_DIG_DSCSQL, SC_MOD_RW12, 2, {0}, CMD_DAT_FLT, 1 }, + { TOK_DSTAR_TX_DATA, C_CTL_DSD, S_DSD_DSTXDT, SC_MOD_RW, 1, {0}, CMD_DAT_BUF, 30 }, + { TOK_DSTAR_MY_CS, C_CTL_DVT, S_DVT_DSMYCS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 12 }, + { TOK_DSTAR_TX_CS, C_CTL_DVT, S_DVT_DSTXCS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 24 }, + { TOK_DSTAR_TX_MESS, C_CTL_DVT, S_DVT_DSTXMS, SC_MOD_RW, 1, {0}, CMD_DAT_STR, 20 }, { TOK_DRIVE_GAIN, C_CTL_LVL, S_LVL_DRIVE, SC_MOD_RW, 1, {0}, CMD_DAT_FLT, 2 }, { TOK_DIGI_SEL_FUNC, C_CTL_FUNC, S_FUNC_DIGISEL, SC_MOD_RW, 1, {0}, CMD_DAT_BOL, 1 }, { TOK_DIGI_SEL_LEVEL, C_CTL_LVL, S_LVL_DIGI, SC_MOD_RW, 1, {0}, CMD_DAT_FLT, 2 }, @@ -1537,6 +1537,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) return -RIG_ERJCTED; } + priv->curr_vfo = vfo; return RIG_OK; case RIG_VFO_MEM: @@ -1555,6 +1556,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) return -RIG_ERJCTED; } + priv->curr_vfo = vfo; return RIG_OK; case RIG_VFO_MAIN_A: // we need to select Main before setting VFO @@ -1574,6 +1576,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) return -RIG_ERJCTED; } + priv->curr_vfo = vfo; return RIG_OK; break; @@ -1595,6 +1598,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) return -RIG_ERJCTED; } + priv->curr_vfo = vfo; return RIG_OK; break; @@ -2461,32 +2465,49 @@ 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; icom_ext_cmd[i].token != 0; i++) { - if (icom_ext_cmd[i].token == token) { - if (!(icom_ext_cmd[i].submod & SC_MOD_WR)) break; - if ((icom_ext_cmd[i].submod & SC_MOD_RW12) == SC_MOD_RW12) { - retval = icom_get_raw_buf(rig, icom_ext_cmd[i].command, icom_ext_cmd[i].subcmd, + const struct icom_priv_caps *priv = rig->caps->priv; + const struct cmdparams *cmd = priv->cmdparams; + for (i = 0; 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) { + retval = icom_get_raw_buf(rig, cmd[i].command, cmd[i].subcmd, 1, &ssc, &reslen, resbuf); } else { - retval = icom_get_raw_buf(rig, icom_ext_cmd[i].command, icom_ext_cmd[i].subcmd, - icom_ext_cmd[i].sublen, (unsigned char *)icom_ext_cmd[i].subext, &reslen, resbuf); + 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 (icom_ext_cmd[i].dattyp) { + switch (cmd[i].dattyp) { case CMD_DAT_WRD: { int wrd = 0; int j; - for (j = 0; j < icom_ext_cmd[i].datlen; 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: - memcpy(databuf, resbuf, icom_ext_cmd[i].datlen); - val->s = databuf; + 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)); @@ -2521,31 +2542,38 @@ 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; icom_ext_cmd[i].token != 0; i++) { - if (icom_ext_cmd[i].token == token) { - if (!(icom_ext_cmd[i].submod & SC_MOD_RD)) break; - if ((icom_ext_cmd[i].submod & SC_MOD_RW12) == SC_MOD_RW12) { + const struct icom_priv_caps *priv = rig->caps->priv; + const struct cmdparams *cmd = priv->cmdparams; + for (i = 0; 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) { cmdbuf[0] = 0x01; cmdlen = 1; } else { - cmdlen = icom_ext_cmd[i].sublen - 1; - memcpy(cmdbuf, icom_ext_cmd[i].subext, cmdlen); + cmdlen = cmd[i].sublen; + memcpy(cmdbuf, cmd[i].subext, cmdlen); } int wrd = val.i; int j; - switch (icom_ext_cmd[i].dattyp) { + switch (cmd[i].dattyp) { case CMD_DAT_WRD: - for (j = 1; j <= icom_ext_cmd[i].datlen; j++) { - cmdbuf[cmdlen + icom_ext_cmd[i].datlen - j] = wrd & 0xff; + 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.s, icom_ext_cmd[i].datlen); + 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, (icom_ext_cmd[i].datlen * 2)); + 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)); @@ -2553,8 +2581,8 @@ int icom_set_ext_cmd(RIG *rig, vfo_t vfo, token_t token, value_t val) default: break; } - cmdlen += icom_ext_cmd[i].datlen; - return icom_transaction(rig, icom_ext_cmd[i].command, icom_ext_cmd[i].subcmd, + cmdlen += cmd[i].datlen; + return icom_transaction(rig, cmd[i].command, cmd[i].subcmd, cmdbuf, cmdlen, ackbuf, &acklen); } } diff --git a/icom/icom.h b/icom/icom.h index 50b6e2332..cfdd5352f 100644 --- a/icom/icom.h +++ b/icom/icom.h @@ -136,8 +136,8 @@ struct icom_priv_caps int offs_len; /* Number of bytes in offset frequency field. 0 defaults to 3 */ 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 */ + struct icom_agc_level agc_levels[RIG_AGC_LAST + 1]; /* Icom rig-specific AGC levels, the last entry should have level -1 */ + struct cmdparams *cmdparams; /* Pointer to ext_cmd paramater array */ }; diff --git a/icom/icom_defs.h b/icom/icom_defs.h index 86c32e524..f296b73d1 100644 --- a/icom/icom_defs.h +++ b/icom/icom_defs.h @@ -507,16 +507,18 @@ #define TOK_DRIVE_GAIN TOKEN_BACKEND(103) #define TOK_DIGI_SEL_FUNC TOKEN_BACKEND(104) #define TOK_DIGI_SEL_LEVEL TOKEN_BACKEND(105) -#define TOK_DSTAR_CALL_SIGN TOKEN_BACKEND(106) -#define TOK_DSTAR_MESSAGE TOKEN_BACKEND(107) -#define TOK_DSTAR_STATUS TOKEN_BACKEND(108) -#define TOK_DSTAR_GPS_DATA TOKEN_BACKEND(109) -#define TOK_DSTAR_GPS_MESS TOKEN_BACKEND(110) -#define TOK_DSTAR_DSQL TOKEN_BACKEND(111) -#define TOK_DSTAR_MY_CS TOKEN_BACKEND(112) -#define TOK_DSTAR_TX_CS TOKEN_BACKEND(113) +#define TOK_KEY_BEEP TOKEN_BACKEND(106) +#define TOK_DSTAR_CALL_SIGN TOKEN_BACKEND(120) +#define TOK_DSTAR_MESSAGE TOKEN_BACKEND(121) +#define TOK_DSTAR_STATUS TOKEN_BACKEND(122) +#define TOK_DSTAR_GPS_DATA TOKEN_BACKEND(123) +#define TOK_DSTAR_GPS_MESS TOKEN_BACKEND(124) +#define TOK_DSTAR_DSQL TOKEN_BACKEND(125) +#define TOK_DSTAR_MY_CS TOKEN_BACKEND(126) +#define TOK_DSTAR_TX_CS TOKEN_BACKEND(127) #define TOK_DSTAR_TX_MESS TOKEN_BACKEND(114) #define TOK_DSTAR_TX_DATA TOKEN_BACKEND(115) +#define TOK_DSTAR_CODE TOKEN_BACKEND(116) /* * icom_ext_parm table subcommand modifiers @@ -532,9 +534,10 @@ */ #define CMD_DAT_WRD 0x00 /* literal single word type */ - #define CMD_DAT_BUF 0x01 /* literal byte buffer type */ - #define CMD_DAT_INT 0x02 /* bcd int type */ - #define CMD_DAT_FLT 0x03 /* bcd float type */ - #define CMD_DAT_BOL 0x04 /* bcd boolean type */ + #define CMD_DAT_INT 0x01 /* bcd int type */ + #define CMD_DAT_FLT 0x02 /* bcd float type */ + #define CMD_DAT_BOL 0x03 /* bcd boolean type */ + #define CMD_DAT_STR 0x04 /* string type */ + #define CMD_DAT_BUF 0x05 /* literal byte buffer type */ #endif /* _ICOM_DEFS_H */ diff --git a/icom/icr30.c b/icom/icr30.c index 1b6931e44..7d7802a0d 100644 --- a/icom/icr30.c +++ b/icom/icr30.c @@ -53,6 +53,14 @@ { 255, 60 } /* +60 */ \ } } +struct confparams icr30_ext[] = { + { 0 } +}; + +struct cmdparams icr30_cmd[] = { + { TOK_LINK } +}; + /* * This function does the special bandwidth coding for IC-R30 * (1 - normal, 2 - narrow) @@ -96,7 +104,8 @@ static const struct icom_priv_caps icr30_priv_caps = 0, /* no XCHG */ r8500_ts_sc_list, /* wrong, but don't have set_ts anyway */ .r2i_mode = icr30_r2i_mode, - .offs_len = 4 + .offs_len = 4, + .cmdparams = icr30_cmd }; const struct rig_caps icr30_caps = @@ -131,6 +140,7 @@ const struct rig_caps icr30_caps = [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, }, .parm_gran = {}, + .extlevels = icr30_ext, .extparms = icom_ext_parms, .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, diff --git a/icom/icr8600.c b/icom/icr8600.c index f128b3b21..2b9f76433 100644 --- a/icom/icr8600.c +++ b/icom/icr8600.c @@ -55,6 +55,7 @@ #define ICR8600_VFO_ALL (RIG_VFO_VFO|RIG_VFO_MEM) #define ICR8600_VFO_OPS (RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) + #define ICR8600_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_VFO|RIG_SCAN_SLCT|\ RIG_SCAN_PRIO|RIG_SCAN_PRIO|RIG_SCAN_DELTA|RIG_SCAN_STOP) @@ -66,6 +67,17 @@ { 255, 60 }, \ } } +struct confparams icr8600_ext[] = { + { TOK_KEY_BEEP, "beep", "Key beep enable", "", "", RIG_CONF_CHECKBUTTON, {} }, + { 0 } +}; + +struct cmdparams icr8600_cmd[] = { + { TOK_KEY_BEEP, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x38}, CMD_DAT_BOL, 1 }, +// { TOK_LINK } +{ 0 } +}; + /* * channel caps. */ @@ -89,7 +101,8 @@ static const struct icom_priv_caps icr8600_priv_caps = 0, /* no XCHG */ r8600_ts_sc_list, /* list of tuning steps */ .offs_len = 4, /* Repeater offset is 4 bytes */ - .serial_USB_echo_check = 1 /* USB CI-V may not echo */ + .serial_USB_echo_check = 1, /* USB CI-V may not echo */ + .cmdparams = icr8600_cmd }; const struct rig_caps icr8600_caps = @@ -122,6 +135,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} } }, + .extlevels = icr8600_ext, .extparms = icom_ext_parms, .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 856b6e2ce..f3dd032aa 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -600,6 +600,7 @@ typedef long token_t; * COMBO: val.i, starting from 0. Points to a table of strings or asci stored values. * STRING: val.s or val.cs * CHECKBUTTON: val.i 0/1 + * BINARY: val.b */ /* strongly inspired from soundmodem. Thanks Thomas! */ @@ -608,11 +609,13 @@ enum rig_conf_e { RIG_CONF_COMBO, /*!< Combo type */ RIG_CONF_NUMERIC, /*!< Numeric type integer or real */ RIG_CONF_CHECKBUTTON, /*!< on/off type */ - RIG_CONF_BUTTON /*!< Button type */ + RIG_CONF_BUTTON, /*!< Button type */ + RIG_CONF_BINARY /*!< Binary buffer type */ }; - +#define TOK_LINK -1 #define RIG_COMBO_MAX 16 +#define RIG_BIN_MAX 80 /** * \brief Configuration parameter structure. @@ -706,10 +709,14 @@ enum meter_level_e { * \sa rig_set_level(), rig_get_level(), rig_set_parm(), rig_get_parm() */ typedef union { - signed int i; /*!< Signed integer */ - float f; /*!< Single precision float */ - char *s; /*!< Pointer to char string */ - const char *cs; /*!< Pointer to constant char string */ + signed int i; /*!< Signed integer */ + float f; /*!< Single precision float */ + char *s; /*!< Pointer to char string */ + const char *cs; /*!< Pointer to constant char string */ + struct { + int l; /*!< Length of data */ + unsigned char *d; /* Pointer to data buffer */ + } b; } value_t; @@ -1574,6 +1581,9 @@ 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); @@ -2086,6 +2096,17 @@ 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 d0748d37b..0ee4ee7ee 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -2930,6 +2930,10 @@ declare_proto_rig(set_parm) val.cs = arg2; break; + case RIG_CONF_BINARY: + val.b.d = arg2; + break; + default: return -RIG_ECONF; } @@ -2956,6 +2960,7 @@ declare_proto_rig(get_parm) int status; setting_t parm; value_t val; + char buffer[RIG_BIN_MAX]; if (!strcmp(arg1, "?")) { @@ -2978,6 +2983,22 @@ declare_proto_rig(get_parm) return -RIG_EINVAL; /* no such parameter */ } + switch (cfp->type) + { + case RIG_CONF_STRING: + memset(buffer, '0', sizeof(buffer)); + buffer[sizeof(buffer)-1] = 0; + val.s = buffer; + break; + case RIG_CONF_BINARY: + memset(buffer, 0, sizeof(buffer)); + val.b.d = (unsigned char *)buffer; + val.b.l = RIG_BIN_MAX; + break; + default: + break; + } + status = rig_get_ext_parm(rig, cfp->token, &val); if (status != RIG_OK) @@ -3009,6 +3030,10 @@ declare_proto_rig(get_parm) fprintf(fout, "%s\n", val.s); break; + case RIG_CONF_BINARY: + dump_hex((unsigned char *)buffer, val.b.l); + break; + default: return -RIG_ECONF; } diff --git a/tests/sprintflst.c b/tests/sprintflst.c index d7e69494d..93c6c2bbb 100644 --- a/tests/sprintflst.c +++ b/tests/sprintflst.c @@ -229,6 +229,7 @@ int sprintf_level_ext(char *str, const struct confparams *extlevels) case RIG_CONF_COMBO: case RIG_CONF_NUMERIC: case RIG_CONF_STRING: + case RIG_CONF_BINARY: strcat(str, extlevels->name); strcat(str, " "); len += strlen(extlevels->name) + 1; @@ -460,6 +461,9 @@ char *get_rig_conf_type(enum rig_conf_e type) case RIG_CONF_BUTTON: return "BUTTON"; + + case RIG_CONF_BINARY: + return "BINARY"; } return "UNKNOWN";