update rigs for new functions

pull/179/head
Malcolm Herring 2020-01-18 05:59:22 +00:00
rodzic 99a99ba97e
commit f6b39c1161
7 zmienionych plików z 123 dodań i 106 usunięć

Wyświetl plik

@ -22,7 +22,7 @@
#ifndef _FRAME_H #ifndef _FRAME_H
#define _FRAME_H 1 #define _FRAME_H 1
#define MAXFRAMELEN 512 #define MAXFRAMELEN 80
/* /*
* helper functions * helper functions

Wyświetl plik

@ -123,7 +123,7 @@ struct confparams ic7100_ext[] = {
}; };
struct cmdparams ic7100_extcmds[] = { struct cmdparams ic7100_extcmds[] = {
{ {.t=TOK_LINK} } { {0} }
}; };
// IC-7100 S-meter calibration data based on manual // IC-7100 S-meter calibration data based on manual

Wyświetl plik

@ -424,6 +424,17 @@ const struct confparams icom_ext_parms[] =
{ TOK_SCOPE_DAT, "scpdat", "Scope data", "", "", RIG_CONF_BINARY, {} }, { TOK_SCOPE_DAT, "scpdat", "Scope data", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_STS, "scpsts", "Scope status", "", "", RIG_CONF_CHECKBUTTON, {} }, { TOK_SCOPE_STS, "scpsts", "Scope status", "", "", RIG_CONF_CHECKBUTTON, {} },
{ TOK_SCOPE_DOP, "scpdop", "Scope data output", "", "", RIG_CONF_CHECKBUTTON, {} }, { TOK_SCOPE_DOP, "scpdop", "Scope data output", "", "", RIG_CONF_CHECKBUTTON, {} },
{ TOK_SCOPE_MSS, "scpmss", "Scope main/sub", "", "", RIG_CONF_CHECKBUTTON, {} },
{ TOK_SCOPE_MOD, "scpmod", "Scope mode", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_SPN, "scpspn", "Scope span", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_EDG, "scpedg", "Scope edge", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_HLD, "scphld", "Scope hold", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_REF, "scpref", "Scope reference", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_SWP, "scpswp", "Scope sweep", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_STX, "scpstx", "Scope Tx o/p", "", "", RIG_CONF_CHECKBUTTON, {} },
{ TOK_SCOPE_TYP, "scptyp", "Scope type", "", "", RIG_CONF_NUMERIC, {} },
{ TOK_SCOPE_VBW, "scpvbw", "Scope vbw", "", "", RIG_CONF_BINARY, {} },
{ TOK_SCOPE_FEF, "scpfef", "Scope edge", "", "", RIG_CONF_BINARY, {} },
{ RIG_CONF_END, NULL, } { RIG_CONF_END, NULL, }
}; };
@ -1867,6 +1878,14 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
(const struct icom_priv_caps *) rig->caps->priv; (const struct icom_priv_caps *) rig->caps->priv;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
const struct cmdparams *cmd = priv_caps->riglevels;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == level) {
return icom_set_cmd(rig,vfo, (struct cmdparams *)&cmd[i], val);
}
}
rs = &rig->state; rs = &rig->state;
/* /*
@ -2170,19 +2189,10 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
lvl_sc = S_LVL_MON; lvl_sc = S_LVL_MON;
break; break;
default: { default:
int i;
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->riglevels;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == level) {
return icom_set_cmd(rig,vfo, (struct cmdparams *)&cmd[i], val);
}
}
rig_debug(RIG_DEBUG_ERR, "%s: unsupported set_level %s", __func__, rig_debug(RIG_DEBUG_ERR, "%s: unsupported set_level %s", __func__,
rig_strlevel(level)); rig_strlevel(level));
return -RIG_EINVAL; return -RIG_EINVAL;
}
} }
retval = icom_transaction(rig, lvl_cn, lvl_sc, lvlbuf, lvl_len, ackbuf, retval = icom_transaction(rig, lvl_cn, lvl_sc, lvlbuf, lvl_len, ackbuf,
@ -2221,6 +2231,16 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
(const struct icom_priv_caps *) rig->caps->priv; (const struct icom_priv_caps *) rig->caps->priv;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->riglevels;
int i;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == level) {
return icom_get_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
}
}
rs = &rig->state; rs = &rig->state;
lvl2_len = 0; lvl2_len = 0;
@ -2408,19 +2428,10 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
lvl_sc = S_LVL_MON; lvl_sc = S_LVL_MON;
break; break;
default: { default:
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->riglevels;
int i;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == level) {
return icom_get_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
}
}
rig_debug(RIG_DEBUG_ERR, "%s: unsupported get_level %s", __func__, rig_debug(RIG_DEBUG_ERR, "%s: unsupported get_level %s", __func__,
rig_strlevel(level)); rig_strlevel(level));
return -RIG_EINVAL; return -RIG_EINVAL;
}
} }
/* use lvl2buf and lvl2_len for 'set mode' subcommand */ /* use lvl2buf and lvl2_len for 'set mode' subcommand */
@ -2702,15 +2713,13 @@ int icom_get_ext_cmd(RIG *rig, vfo_t vfo, token_t token, value_t *val)
const struct icom_priv_caps *priv = rig->caps->priv; const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->extcmds ? priv->extcmds : icom_ext_cmd; const struct cmdparams *cmd = priv->extcmds ? priv->extcmds : icom_ext_cmd;
for (i = 0; cmd && cmd[i].id.t != 0; i++) { for (i = 0; (cmd[i].id.t != 0) || (cmd != icom_ext_cmd); ) {
if (cmd[i].id.t == TOK_LINK) { if (cmd[i].id.t == 0) {
cmd = icom_ext_cmd; cmd = icom_ext_cmd;
i = -1; i = 0;
continue; } else if (cmd[i].id.t == token) {
}
if (cmd[i].id.t == token) {
return icom_get_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val); return icom_get_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
} } else i++;
} }
return -RIG_EINVAL; return -RIG_EINVAL;
} }
@ -2729,15 +2738,13 @@ int icom_set_ext_cmd(RIG *rig, vfo_t vfo, token_t token, value_t val)
const struct icom_priv_caps *priv = rig->caps->priv; const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->extcmds ? priv->extcmds : icom_ext_cmd; const struct cmdparams *cmd = priv->extcmds ? priv->extcmds : icom_ext_cmd;
for (i = 0; cmd && cmd[i].id.t != 0; i++) { for (i = 0; (cmd[i].id.t != 0) || (cmd != icom_ext_cmd); ) {
if (cmd[i].id.t == TOK_LINK) { if (cmd[i].id.t == 0) {
cmd = icom_ext_cmd; cmd = icom_ext_cmd;
i = -1; i = 0;
continue; } else if (cmd[i].id.t == token) {
}
if (cmd[i].id.t == token) {
return icom_set_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val); return icom_set_cmd(rig, vfo, (struct cmdparams *)&cmd[i], val);
} } else i++;
} }
return -RIG_EINVAL; return -RIG_EINVAL;
} }
@ -4464,6 +4471,14 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
{ {
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
int i;
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->rigparms;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == parm) {
return icom_set_cmd(rig, RIG_VFO_NONE, (struct cmdparams *)&cmd[i], val);
}
}
switch (parm) switch (parm)
{ {
case RIG_PARM_ANN: case RIG_PARM_ANN:
@ -4493,19 +4508,10 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
return icom_set_raw(rig, C_CTL_ANN, ann_mode, 0, NULL, 0, 0); return icom_set_raw(rig, C_CTL_ANN, ann_mode, 0, NULL, 0, 0);
} }
default:{ default:
int i;
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->rigparms;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == parm) {
return icom_set_cmd(rig, RIG_VFO_NONE, (struct cmdparams *)&cmd[i], val);
}
}
rig_debug(RIG_DEBUG_ERR, "%s: unsupported set_parm %s\n", __func__, rig_debug(RIG_DEBUG_ERR, "%s: unsupported set_parm %s\n", __func__,
rig_strparm(parm)); rig_strparm(parm));
return -RIG_EINVAL; return -RIG_EINVAL;
}
} }
} }
@ -4524,21 +4530,21 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
{ {
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->rigparms;
int i;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == parm) {
return icom_get_cmd(rig, RIG_VFO_NONE, (struct cmdparams *)&cmd[i], val);
}
}
switch (parm) switch (parm)
{ {
default: { default:
const struct icom_priv_caps *priv = rig->caps->priv;
const struct cmdparams *cmd = priv->rigparms;
int i;
for (i = 0; cmd && cmd[i].id.s != 0; i++) {
if (cmd[i].id.s == parm) {
return icom_get_cmd(rig, RIG_VFO_NONE, (struct cmdparams *)&cmd[i], val);
}
}
rig_debug(RIG_DEBUG_ERR, "%s: unsupported get_parm %s", __func__, rig_debug(RIG_DEBUG_ERR, "%s: unsupported get_parm %s", __func__,
rig_strparm(parm)); rig_strparm(parm));
return -RIG_EINVAL; return -RIG_EINVAL;
}
} }
return RIG_OK; return RIG_OK;

Wyświetl plik

@ -48,9 +48,9 @@
#define ICR30_VFO_OPS (RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) #define ICR30_VFO_OPS (RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL)
#define ICR30_SCAN_OPS (RIG_SCAN_NONE) #define ICR30_SCAN_OPS (RIG_SCAN_NONE)
#define TOK_ANL TOKEN_BACKEND(110) #define TOK_ANL TOKEN_BACKEND(001)
#define TOK_EAR TOKEN_BACKEND(111) #define TOK_EAR TOKEN_BACKEND(002)
#define TOK_REC TOKEN_BACKEND(112) #define TOK_REC TOKEN_BACKEND(003)
int icr30_tokens[] = { TOK_ANL, TOK_EAR, TOK_REC, int icr30_tokens[] = { TOK_ANL, TOK_EAR, TOK_REC,
TOK_DSTAR_DSQL, TOK_DSTAR_CALL_SIGN, TOK_DSTAR_MESSAGE, TOK_DSTAR_STATUS, TOK_DSTAR_DSQL, TOK_DSTAR_CALL_SIGN, TOK_DSTAR_MESSAGE, TOK_DSTAR_STATUS,
@ -64,11 +64,11 @@ struct confparams icr30_ext[] = {
{ 0 } { 0 }
}; };
struct cmdparams icr30_cmd[] = { struct cmdparams icr30_extcmds[] = {
{ {.t=TOK_ANL}, C_CTL_MEM, S_MEM_ANL, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 }, { {.t=TOK_ANL}, C_CTL_MEM, S_MEM_ANL, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 },
{ {.t=TOK_EAR}, C_CTL_MEM, S_MEM_EAR, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 }, { {.t=TOK_EAR}, C_CTL_MEM, S_MEM_EAR, SC_MOD_RW, 0, {}, CMD_DAT_BOL, 1 },
{ {.t=TOK_REC}, C_CTL_MEM, S_MEM_REC, SC_MOD_WR, 0, {}, CMD_DAT_BOL, 1 }, { {.t=TOK_REC}, C_CTL_MEM, S_MEM_REC, SC_MOD_WR, 0, {}, CMD_DAT_BOL, 1 },
{ {.t=TOK_LINK} } { {0} }
}; };
#define ICR30_STR_CAL { 2, \ #define ICR30_STR_CAL { 2, \
@ -121,7 +121,7 @@ static const struct icom_priv_caps icr30_priv_caps =
r8500_ts_sc_list, /* wrong, but don't have set_ts anyway */ r8500_ts_sc_list, /* wrong, but don't have set_ts anyway */
.r2i_mode = icr30_r2i_mode, .r2i_mode = icr30_r2i_mode,
.offs_len = 4, .offs_len = 4,
.extcmds = icr30_cmd .extcmds = icr30_extcmds /* Custom ext_parm parameters */
}; };
const struct rig_caps icr30_caps = const struct rig_caps icr30_caps =
@ -225,46 +225,47 @@ const struct rig_caps icr30_caps =
}, },
.str_cal = ICR30_STR_CAL, .str_cal = ICR30_STR_CAL,
.cfgparams = icom_cfg_params, .cfgparams = icom_cfg_params,
.set_conf = icom_set_conf, .set_conf = icom_set_conf,
.get_conf = icom_get_conf, .get_conf = icom_get_conf,
.set_powerstat = icom_set_powerstat,
.priv = (void *)& icr30_priv_caps, .priv = (void *)& icr30_priv_caps,
.rig_init = icom_init, .rig_init = icom_init,
.rig_cleanup = icom_cleanup, .rig_cleanup = icom_cleanup,
.rig_open = NULL, .rig_open = NULL,
.rig_close = NULL, .rig_close = NULL,
.set_freq = icom_set_freq, .set_freq = icom_set_freq,
.get_freq = icom_get_freq, .get_freq = icom_get_freq,
.set_mode = icr30_set_mode, .set_mode = icr30_set_mode,
.get_mode = icom_get_mode, .get_mode = icom_get_mode,
.vfo_op = icom_vfo_op, .vfo_op = icom_vfo_op,
.set_vfo = icom_set_vfo, .set_vfo = icom_set_vfo,
.set_rptr_offs = icom_set_rptr_offs, .set_rptr_offs = icom_set_rptr_offs,
.get_rptr_offs = icom_get_rptr_offs, .get_rptr_offs = icom_get_rptr_offs,
.set_rptr_shift = icom_set_rptr_shift, .set_rptr_shift = icom_set_rptr_shift,
.get_rptr_shift = icom_get_rptr_shift, .get_rptr_shift = icom_get_rptr_shift,
.set_ts = icom_set_ts, .set_ts = icom_set_ts,
.get_ts = icom_get_ts, .get_ts = icom_get_ts,
.set_ant = icom_set_ant, .set_ant = icom_set_ant,
.get_ant = icom_get_ant, .get_ant = icom_get_ant,
.set_bank = icom_set_bank, .set_bank = icom_set_bank,
.set_mem = icom_set_mem, .set_mem = icom_set_mem,
.decode_event = icom_decode_event, .decode_event = icom_decode_event,
.set_level = icom_set_level, .set_level = icom_set_level,
.get_level = icom_get_level, .get_level = icom_get_level,
.set_func = icom_set_func, .set_func = icom_set_func,
.get_func = icom_get_func, .get_func = icom_get_func,
.set_parm = icom_set_parm, .set_parm = icom_set_parm,
.get_parm = icom_get_parm, .get_parm = icom_get_parm,
.set_ext_parm = icom_set_ext_parm, .set_ext_parm = icom_set_ext_parm,
.get_ext_parm = icom_get_ext_parm, .get_ext_parm = icom_get_ext_parm,
.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,
.get_dcd = icom_get_dcd, .get_dcd = icom_get_dcd,
.set_ctcss_sql = icom_set_ctcss_sql, .set_ctcss_sql = icom_set_ctcss_sql,
.get_ctcss_sql = icom_get_ctcss_sql, .get_ctcss_sql = icom_get_ctcss_sql,
.set_dcs_sql = icom_set_dcs_sql, .set_dcs_sql = icom_set_dcs_sql,
.get_dcs_sql = icom_get_dcs_sql, .get_dcs_sql = icom_get_dcs_sql,
}; };

Wyświetl plik

@ -77,7 +77,8 @@ struct cmdparams icr8600_rigparms[] = {
int icr8600_tokens[] = { TOK_DSTAR_DSQL, TOK_DSTAR_CALL_SIGN, TOK_DSTAR_MESSAGE, TOK_DSTAR_STATUS, int icr8600_tokens[] = { TOK_DSTAR_DSQL, TOK_DSTAR_CALL_SIGN, TOK_DSTAR_MESSAGE, TOK_DSTAR_STATUS,
TOK_DSTAR_GPS_DATA, TOK_DSTAR_GPS_MESS, TOK_DSTAR_CODE, TOK_DSTAR_TX_DATA, TOK_DSTAR_GPS_DATA, TOK_DSTAR_GPS_MESS, TOK_DSTAR_CODE, TOK_DSTAR_TX_DATA,
TOK_SCOPE_DAT, TOK_SCOPE_STS, TOK_SCOPE_DOP, TOK_SCOPE_DAT, TOK_SCOPE_STS, TOK_SCOPE_DOP, TOK_SCOPE_MSS, TOK_SCOPE_MOD, TOK_SCOPE_SPN,
TOK_SCOPE_HLD, TOK_SCOPE_REF, TOK_SCOPE_SWP, TOK_SCOPE_TYP, TOK_SCOPE_VBW, TOK_SCOPE_FEF,
TOK_BACKEND_NONE }; TOK_BACKEND_NONE };
struct confparams icr8600_ext[] = { struct confparams icr8600_ext[] = {
@ -85,7 +86,7 @@ struct confparams icr8600_ext[] = {
}; };
struct cmdparams icr8600_extcmds[] = { struct cmdparams icr8600_extcmds[] = {
{ {.t=TOK_LINK} } { {0} }
}; };
/* /*
@ -103,14 +104,14 @@ struct cmdparams icr8600_extcmds[] = {
static const struct icom_priv_caps icr8600_priv_caps = static const struct icom_priv_caps icr8600_priv_caps =
{ {
0x96, /* default address */ 0x96, /* default address */
0, /* 731 mode */ 0, /* 731 mode */
0, /* no XCHG */ 0, /* no XCHG */
r8600_ts_sc_list, /* list of tuning steps */ r8600_ts_sc_list, /* list of tuning steps */
.offs_len = 4, /* Repeater offset is 4 bytes */ .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 */
.rigparms = icr8600_rigparms, .rigparms = icr8600_rigparms, /* Custom parm parameters */
.extcmds = icr8600_extcmds .extcmds = icr8600_extcmds /* Custom ext_parm parameters */
}; };
const struct rig_caps icr8600_caps = const struct rig_caps icr8600_caps =
@ -219,6 +220,7 @@ const struct rig_caps icr8600_caps =
.set_conf = icom_set_conf, .set_conf = icom_set_conf,
.get_conf = icom_get_conf, .get_conf = icom_get_conf,
// .set_powerstat = icom_set_powerstat,
.priv = (void *)& icr8600_priv_caps, .priv = (void *)& icr8600_priv_caps,
.rig_init = icom_init, .rig_init = icom_init,

Wyświetl plik

@ -27,8 +27,11 @@
#include <stdlib.h> #include <stdlib.h>
#include "hamlib/rig.h" #include "hamlib/rig.h"
#include "idx_builtin.h" #include "token.h"
#include "icom.h" #include "icom.h"
#include "idx_builtin.h"
#include "icom_defs.h"
#include "frame.h"
/* /*
* Specs and protocol details comes from the chapter 17 of ID-51A_E_PLUS2_CD_0.pdf * Specs and protocol details comes from the chapter 17 of ID-51A_E_PLUS2_CD_0.pdf
@ -63,6 +66,10 @@
#define ID51_PARM_ALL RIG_PARM_NONE #define ID51_PARM_ALL RIG_PARM_NONE
int id51_tokens[] = { TOK_DSTAR_DSQL, TOK_DSTAR_CALL_SIGN, TOK_DSTAR_MESSAGE, TOK_DSTAR_STATUS,
TOK_DSTAR_GPS_DATA, TOK_DSTAR_GPS_MESS, TOK_DSTAR_CODE, TOK_DSTAR_TX_DATA,
TOK_DSTAR_MY_CS, TOK_DSTAR_TX_CS, TOK_DSTAR_TX_MESS,
TOK_BACKEND_NONE };
/* /*
* FIXME: real measurement * FIXME: real measurement
@ -111,6 +118,7 @@ const struct rig_caps id51_caps =
.level_gran = { .level_gran = {
[LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } },
}, },
.ext_tokens = id51_tokens,
.extparms = icom_ext_parms, .extparms = icom_ext_parms,
.parm_gran = {}, .parm_gran = {},
.ctcss_list = common_ctcss_list, .ctcss_list = common_ctcss_list,
@ -170,6 +178,7 @@ const struct rig_caps id51_caps =
.cfgparams = icom_cfg_params, .cfgparams = icom_cfg_params,
.set_conf = icom_set_conf, .set_conf = icom_set_conf,
.get_conf = icom_get_conf, .get_conf = icom_get_conf,
.set_powerstat = icom_set_powerstat,
.priv = (void *)& id51_priv_caps, .priv = (void *)& id51_priv_caps,
.rig_init = icom_init, .rig_init = icom_init,

Wyświetl plik

@ -613,7 +613,6 @@ enum rig_conf_e {
RIG_CONF_BINARY /*!< Binary buffer type */ RIG_CONF_BINARY /*!< Binary buffer type */
}; };
#define TOK_LINK -1
#define RIG_COMBO_MAX 16 #define RIG_COMBO_MAX 16
#define RIG_BIN_MAX 80 #define RIG_BIN_MAX 80