added "extra" level and "extra" parm support

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1111 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.1.4
Stéphane Fillod, F8CFE 2002-07-09 20:40:28 +00:00
rodzic 27b67a82da
commit e8403d542d
4 zmienionych plików z 297 dodań i 7 usunięć

Wyświetl plik

@ -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));

Wyświetl plik

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

144
src/rig.c
Wyświetl plik

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

Wyświetl plik

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