/* * Hamlib Interface - extrq parameter interface * Copyright (c) 2000-2008 by Stephane Fillod * * $Id: ext.c,v 1.7 2008-04-11 14:12:26 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 * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** * \addtogroup rig * @{ */ /** * \file ext.c * \brief Extension request parameter interface * * An open-ended set of extension parameters and levels are available for each rig, * as provided in the rigcaps extparms and extlevels lists. These provide a way * to work with rig-specific functions that don't fit into the basic "virtual rig" of * Hamlib. See icom/ic746.c for an example. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include /* Standard input/output definitions */ #include /* String function definitions */ #include /* UNIX standard function definitions */ #include #include "token.h" /** * \param rig The rig handle * \param cfunc callback function of each extlevel * \param data cookie to be passed to \a cfunc callback * \brief Executes cfunc on all the elements stored in the extlevels table * The callback \a cfunc is called until it returns a value which is not strictly positive. * A zero value means a normal end of iteration, and a negative value an abnormal end, * which will be the return value of rig_ext_level_foreach. */ int HAMLIB_API rig_ext_level_foreach(RIG *rig, int (*cfunc)(RIG *, const struct confparams *, rig_ptr_t), rig_ptr_t data) { const struct confparams *cfp; int ret; if (!rig || !rig->caps || !cfunc) return -RIG_EINVAL; for (cfp = rig->caps->extlevels; cfp && cfp->name; cfp++) { ret = (*cfunc)(rig, cfp, data); if (ret == 0) return RIG_OK; if (ret < 0) return ret; } return RIG_OK; } /** * \param rig The rig handle * \param cfunc callback function of each extparm * \param data cookie to be passed to \a cfunc callback * \brief Executes cfunc on all the elements stored in the extparms table * The callback \a cfunc is called until it returns a value which is not strictly positive. * A zero value means a normal end of iteration, and a negative value an abnormal end, * which will be the return value of rig_ext_parm_foreach. */ int HAMLIB_API rig_ext_parm_foreach(RIG *rig, int (*cfunc)(RIG *, const struct confparams *, rig_ptr_t), rig_ptr_t data) { const struct confparams *cfp; int ret; if (!rig || !rig->caps || !cfunc) return -RIG_EINVAL; for (cfp = rig->caps->extparms; cfp && cfp->name; cfp++) { ret = (*cfunc)(rig, cfp, data); if (ret == 0) return RIG_OK; if (ret < 0) return ret; } return RIG_OK; } /** * \param rig * \param name * \brief lookup ext token by its name, return pointer to confparams struct. * * Lookup extlevels table first, then fall back to extparms. * * Returns NULL if nothing found * * TODO: should use Lex to speed it up, strcmp hurts! */ const struct confparams * HAMLIB_API rig_ext_lookup(RIG *rig, const char *name) { const struct confparams *cfp; if (!rig || !rig->caps) return NULL; for (cfp = rig->caps->extlevels; cfp && cfp->name; cfp++) if (!strcmp(cfp->name, name)) return cfp; for (cfp = rig->caps->extparms; cfp && cfp->name; cfp++) if (!strcmp(cfp->name, name)) return cfp; return NULL; } /** * \param rig * \param token * \brief lookup ext token, return pointer to confparams struct. * * lookup extlevels table first, then fall back to extparms. * * Returns NULL if nothing found */ const struct confparams * HAMLIB_API rig_ext_lookup_tok(RIG *rig, token_t token) { const struct confparams *cfp; if (!rig || !rig->caps) return NULL; for (cfp = rig->caps->extlevels; cfp && cfp->token; cfp++) if (cfp->token == token) return cfp; for (cfp = rig->caps->extparms; cfp && cfp->token; cfp++) if (cfp->token == token) return cfp; return NULL; } /** * \param rig * \param name * \brief Simple lookup returning token id assicated with name */ token_t HAMLIB_API rig_ext_token_lookup(RIG *rig, const char *name) { const struct confparams *cfp; cfp = rig_ext_lookup(rig, name); if (!cfp) return RIG_CONF_END; return cfp->token; } /** @} */