diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index a26d7cec0..655439be1 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2,7 +2,7 @@ * Hamlib Interface - API header * Copyright (c) 2000-2002 by Stephane Fillod and Frank Singleton * - * $Id: rig.h,v 1.66 2002-07-08 22:20:08 fillods Exp $ + * $Id: rig.h,v 1.67 2002-07-09 20:40:28 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -435,6 +435,7 @@ enum meter_level_e { union value_u { signed int i; float f; + char *s; }; typedef union value_u value_t; @@ -542,6 +543,7 @@ typedef unsigned long long setting_t; /* hope 64 bits will be enough.. */ #define RIG_FUNC_SATMODE (1<<26) /* Satellite mode ON/OFF (IC-910H) */ #define RIG_FUNC_SCOPE (1<<27) /* Simple bandscope ON/OFF (IC-910H) */ #define RIG_FUNC_RESUME (1<<28) /* Scan resume */ +#define RIG_FUNC_TBURST (1<<29) /* 1750 Hz tone burst */ /* @@ -630,6 +632,14 @@ struct filter_list { #define RIG_CHFLAG_NONE 0 #define RIG_CHFLAG_SKIP (1<<0) +struct ext_list { + token_t token; + value_t val; +}; + +#define RIG_EXT_END {0, {i:0}} +#define RIG_IS_EXT_END(x) ((x).token == 0) + /* * Convenience struct, describes a freq/vfo/mode combo * Also useful for memory handling -- FS @@ -663,6 +673,7 @@ struct channel { int scan_group; int flags; /* RIG_CHFLAG's */ char channel_desc[MAXCHANDESC]; + struct ext_list *ext_levels; }; typedef struct channel channel_t; @@ -753,6 +764,9 @@ struct rig_caps { int level_gran[RIG_SETTING_MAX]; int parm_gran[RIG_SETTING_MAX]; + const struct confparams *extparms; /* apply to whole rig */ + const struct confparams *extlevels; /* specific to a VFO */ + const tone_t *ctcss_list; const tone_t *dcs_list; @@ -884,6 +898,12 @@ struct rig_caps { int (*set_parm) (RIG * rig, setting_t parm, value_t val); int (*get_parm) (RIG * rig, setting_t parm, value_t * val); + 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_parm)(RIG *rig, token_t token, value_t val); + int (*get_ext_parm)(RIG *rig, token_t token, value_t *val); + int (*set_conf) (RIG * rig, token_t token, const char *val); int (*get_conf) (RIG * rig, token_t token, char *val); @@ -1152,6 +1172,19 @@ extern HAMLIB_EXPORT(int) rig_get_powerstat HAMLIB_PARAMS((RIG *rig, powerstat_t extern HAMLIB_EXPORT(int) rig_reset HAMLIB_PARAMS((RIG *rig, reset_t reset)); /* dangerous! */ +extern HAMLIB_EXPORT(int) rig_set_ext_level HAMLIB_PARAMS((RIG *rig, vfo_t vfo, + token_t token, value_t val)); +extern HAMLIB_EXPORT(int) rig_get_ext_level HAMLIB_PARAMS((RIG *rig, vfo_t vfo, + token_t token, value_t *val)); + +extern HAMLIB_EXPORT(int) rig_set_ext_parm HAMLIB_PARAMS((RIG *rig, token_t token, value_t val)); +extern HAMLIB_EXPORT(int) rig_get_ext_parm HAMLIB_PARAMS((RIG *rig, token_t token, value_t *val)); + +extern HAMLIB_EXPORT(int) rig_ext_level_foreach HAMLIB_PARAMS((RIG *rig, int (*cfunc)(RIG*, const struct confparams *, rig_ptr_t), rig_ptr_t data)); +extern HAMLIB_EXPORT(int) rig_ext_parm_foreach HAMLIB_PARAMS((RIG *rig, int (*cfunc)(RIG*, const struct confparams *, rig_ptr_t), rig_ptr_t data)); +extern HAMLIB_EXPORT(const struct confparams*) rig_ext_lookup HAMLIB_PARAMS((RIG *rig, const char *name)); +extern HAMLIB_EXPORT(token_t) rig_ext_token_lookup HAMLIB_PARAMS((RIG *rig, const char *name)); + extern HAMLIB_EXPORT(int) rig_token_foreach HAMLIB_PARAMS((RIG *rig, int (*cfunc)(const struct confparams *, rig_ptr_t), rig_ptr_t data)); extern HAMLIB_EXPORT(const struct confparams*) rig_confparam_lookup HAMLIB_PARAMS((RIG *rig, const char *name)); diff --git a/src/Makefile.am b/src/Makefile.am index b9b725140..5bc136f61 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ INCLUDES = @INCLUDES@ @INCLTDL@ RIGSRC = rig.c serial.c misc.c register.c event.c cal.c conf.c tones.c \ - rotator.c locator.c rot_reg.c rot_conf.c iofunc.c + rotator.c locator.c rot_reg.c rot_conf.c iofunc.c ext.c lib_LTLIBRARIES = libhamlib.la libhamlib_la_SOURCES = $(RIGSRC) diff --git a/src/rig.c b/src/rig.c index 71a6b64d8..ab632c93a 100644 --- a/src/rig.c +++ b/src/rig.c @@ -13,7 +13,7 @@ * Hamlib Interface - main file * Copyright (c) 2000-2002 by Stephane Fillod and Frank Singleton * - * $Id: rig.c,v 1.58 2002-03-18 22:59:30 fillods Exp $ + * $Id: rig.c,v 1.59 2002-07-09 20:40:28 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -2987,6 +2987,148 @@ int rig_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) return retcode; } +/** + * \brief set a radio level extra parameter + * \param rig The rig handle + * \param vfo The target VFO + * \param token The parameter + * \param val The value to set the parameter to + * + * Sets an level extra parameter. + * + * \return RIG_OK if the operation has been sucessful, otherwise + * a negative value if an error occured (in which case, cause is + * set appropriately). + * + * \sa rig_get_ext_level() + */ +int rig_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val) +{ + const struct rig_caps *caps; + int retcode; + vfo_t curr_vfo; + + if (CHECK_RIG_ARG(rig)) + return -RIG_EINVAL; + + caps = rig->caps; + + if (caps->set_ext_level == NULL) + return -RIG_ENAVAIL; + + if ((caps->targetable_vfo&RIG_TARGETABLE_ALL) || + vfo == RIG_VFO_CURR || vfo == rig->state.current_vfo) + return caps->set_ext_level(rig, vfo, token, val); + + if (!caps->set_vfo) + return -RIG_ENTARGET; + curr_vfo = rig->state.current_vfo; + retcode = caps->set_vfo(rig, vfo); + if (retcode != RIG_OK) + return retcode; + + retcode = caps->set_ext_level(rig, vfo, token, val); + caps->set_vfo(rig, curr_vfo); + return retcode; +} + +/** + * \brief get the value of a level extra parameter + * \param rig The rig handle + * \param vfo The target VFO + * \param token The parameter + * \param val The location where to store the value of \a token + * + * Retrieves the value of a level extra paramter associated with \a token. + * + * \return RIG_OK if the operation has been sucessful, otherwise + * a negative value if an error occured (in which case, cause is + * set appropriately). + * + * \sa rig_set_ext_level() + */ +int rig_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val) +{ + const struct rig_caps *caps; + int retcode; + vfo_t curr_vfo; + + if (CHECK_RIG_ARG(rig) || !val) + return -RIG_EINVAL; + + caps = rig->caps; + + if (caps->get_ext_level == NULL) + return -RIG_ENAVAIL; + + if ((caps->targetable_vfo&RIG_TARGETABLE_ALL) || + vfo == RIG_VFO_CURR || vfo == rig->state.current_vfo) + return caps->get_ext_level(rig, vfo, token, val); + + if (!caps->set_vfo) + return -RIG_ENTARGET; + curr_vfo = rig->state.current_vfo; + retcode = caps->set_vfo(rig, vfo); + if (retcode != RIG_OK) + return retcode; + + retcode = caps->get_ext_level(rig, vfo, token, val); + caps->set_vfo(rig, curr_vfo); + return retcode; +} + +/** + * \brief set a radio parm extra parameter + * \param rig The rig handle + * \param token The parameter + * \param val The value to set the parameter to + * + * Sets an parm extra parameter. + * + * \return RIG_OK if the operation has been sucessful, otherwise + * a negative value if an error occured (in which case, cause is + * set appropriately). + * + * \sa rig_get_ext_parm() + */ +int rig_set_ext_parm(RIG *rig, token_t token, value_t val) +{ + if (CHECK_RIG_ARG(rig)) + return -RIG_EINVAL; + + if (rig->caps->set_ext_parm == NULL) + return -RIG_ENAVAIL; + + return rig->caps->set_ext_parm(rig, token, val); +} + +/** + * \brief get the value of a parm extra parameter + * \param rig The rig handle + * \param token The parameter + * \param val The location where to store the value of \a token + * + * Retrieves the value of a parm extra paramter associated with \a token. + * + * \return RIG_OK if the operation has been sucessful, otherwise + * a negative value if an error occured (in which case, cause is + * set appropriately). + * + * \sa rig_set_ext_parm() + */ +int rig_get_ext_parm(RIG *rig, token_t token, value_t *val) +{ + if (CHECK_RIG_ARG(rig) || !val) + return -RIG_EINVAL; + + if (rig->caps->get_ext_parm == NULL) + return -RIG_ENAVAIL; + + return rig->caps->get_ext_parm(rig, token, val); +} + + + /** * \brief set a radio configuration parameter * \param rig The rig handle diff --git a/tests/rigctl.c b/tests/rigctl.c index 72f3abd26..034fde8ae 100644 --- a/tests/rigctl.c +++ b/tests/rigctl.c @@ -5,7 +5,7 @@ * It takes commands in interactive mode as well as * from command line options. * - * $Id: rigctl.c,v 1.30 2002-06-26 20:44:37 dedmons Exp $ + * $Id: rigctl.c,v 1.31 2002-07-09 20:40:28 fillods Exp $ * * * This program is free software; you can redistribute it and/or @@ -607,7 +607,6 @@ static int print_conf_list(const struct confparams *cfp, rig_ptr_t data) printf(", %s", cfp->u.c.combostr[i]); printf("\n"); break; - default: } return 1; /* !=0, we want them all ! */ @@ -976,13 +975,43 @@ declare_proto_rig(power2mW) return status; } - +/* + * RIG_CONF_ extparm's type: + * NUMERIC: val.f + * COMBO: val.i, starting from 0 + * STRING: val.s + * CHECKBUTTON: val.i 0/1 + */ declare_proto_rig(set_level) { setting_t level; value_t val; level = parse_level(arg1); + if (!rig_has_set_level(rig, level)) { + const struct confparams *cfp; + + cfp = rig_ext_lookup(rig, arg1); + if (!cfp) + return -RIG_EINVAL; /* no such parameter */ + + switch (cfp->type) { + case RIG_CONF_CHECKBUTTON: + case RIG_CONF_COMBO: + sscanf(arg2, "%d", &val.i); + break; + case RIG_CONF_NUMERIC: + sscanf(arg2, "%f", &val.f); + break; + case RIG_CONF_STRING: + val.s = arg2; + break; + default: + return -RIG_ECONF; + } + return rig_set_ext_level(rig, RIG_VFO_CURR, cfp->token, val); + } + if (RIG_LEVEL_IS_FLOAT(level)) sscanf(arg2, "%f", &val.f); else @@ -999,6 +1028,37 @@ declare_proto_rig(get_level) value_t val; level = parse_level(arg1); + if (!rig_has_get_level(rig, level)) { + const struct confparams *cfp; + + cfp = rig_ext_lookup(rig, arg1); + if (!cfp) + return -RIG_EINVAL; /* no such parameter */ + + status = rig_get_ext_level(rig, RIG_VFO_CURR, cfp->token, &val); + if (status != RIG_OK) + return status; + + if (interactive) + printf("%s: ", cmd->arg2); + + switch (cfp->type) { + case RIG_CONF_CHECKBUTTON: + case RIG_CONF_COMBO: + printf("%d\n", val.i); + break; + case RIG_CONF_NUMERIC: + printf("%f\n", val.f); + break; + case RIG_CONF_STRING: + printf("%s\n", val.s); + break; + default: + return -RIG_ECONF; + } + return status; + } + status = rig_get_level(rig, RIG_VFO_CURR, level, &val); if (status != RIG_OK) return status; @@ -1008,7 +1068,6 @@ declare_proto_rig(get_level) printf("%f\n", val.f); else printf("%d\n", val.i); - return status; } @@ -1046,6 +1105,31 @@ declare_proto_rig(set_parm) value_t val; parm = parse_parm(arg1); + + if (!rig_has_set_parm(rig, parm)) { + const struct confparams *cfp; + + cfp = rig_ext_lookup(rig, arg1); + if (!cfp) + return -RIG_EINVAL; /* no such parameter */ + + switch (cfp->type) { + case RIG_CONF_CHECKBUTTON: + case RIG_CONF_COMBO: + sscanf(arg2, "%d", &val.i); + break; + case RIG_CONF_NUMERIC: + sscanf(arg2, "%f", &val.f); + break; + case RIG_CONF_STRING: + val.s = arg2; + break; + default: + return -RIG_ECONF; + } + return rig_set_ext_parm(rig, cfp->token, val); + } + if (RIG_PARM_IS_FLOAT(parm)) sscanf(arg2, "%f", &val.f); else @@ -1062,6 +1146,37 @@ declare_proto_rig(get_parm) value_t val; parm = parse_parm(arg1); + if (!rig_has_get_parm(rig, parm)) { + const struct confparams *cfp; + + cfp = rig_ext_lookup(rig, arg1); + if (!cfp) + return -RIG_EINVAL; /* no such parameter */ + + status = rig_get_ext_parm(rig, cfp->token, &val); + if (status != RIG_OK) + return status; + + if (interactive) + printf("%s: ", cmd->arg2); + + switch (cfp->type) { + case RIG_CONF_CHECKBUTTON: + case RIG_CONF_COMBO: + printf("%d\n", val.i); + break; + case RIG_CONF_NUMERIC: + printf("%f\n", val.f); + break; + case RIG_CONF_STRING: + printf("%s\n", val.s); + break; + default: + return -RIG_ECONF; + } + return status; + } + status = rig_get_parm(rig, parm, &val); if (status != RIG_OK) return status;