From 17a3cf614e1514ed9404c046568e4536691f1865 Mon Sep 17 00:00:00 2001 From: PianetaRadio <78976006+PianetaRadio@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:54:59 +0100 Subject: [PATCH] Hamlib 4.6 beta --- hamlib/amplifier.h | 23 +- hamlib/amplist.h | 5 + hamlib/config.h | 15 +- hamlib/libhamlib.dll.a | Bin 327974 -> 345576 bytes hamlib/multicast.h | 45 ++++ hamlib/rig.h | 596 +++++++++++++++++++++++++++++++++++------ hamlib/riglist.h | 70 ++--- hamlib/rotator.h | 45 ++-- hamlib/rotlist.h | 54 +++- 9 files changed, 703 insertions(+), 150 deletions(-) create mode 100644 hamlib/multicast.h diff --git a/hamlib/amplifier.h b/hamlib/amplifier.h index 8a0b076..3647aee 100644 --- a/hamlib/amplifier.h +++ b/hamlib/amplifier.h @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ #ifndef _AMPLIFIER_H #define _AMPLIFIER_H 1 @@ -232,9 +233,9 @@ struct amp_caps int (*set_freq)(AMP *amp, freq_t val); /*!< Pointer to backend implementation of ::amp_set_freq(). */ int (*get_freq)(AMP *amp, freq_t *val); /*!< Pointer to backend implementation of ::amp_get_freq(). */ - int (*set_conf)(AMP *amp, token_t token, const char *val); /*!< Pointer to backend implementation of ::amp_set_conf(). */ - int (*get_conf2)(AMP *amp, token_t token, char *val, int val_len); /*!< Pointer to backend implementation of ::amp_get_conf(). */ - int (*get_conf)(AMP *amp, token_t token, char *val); /*!< Pointer to backend implementation of ::amp_get_conf(). */ + int (*set_conf)(AMP *amp, hamlib_token_t token, const char *val); /*!< Pointer to backend implementation of ::amp_set_conf(). */ + int (*get_conf2)(AMP *amp, hamlib_token_t token, char *val, int val_len); /*!< Pointer to backend implementation of ::amp_get_conf(). */ + int (*get_conf)(AMP *amp, hamlib_token_t token, char *val); /*!< Pointer to backend implementation of ::amp_get_conf(). */ /* * General API commands, from most primitive to least.. :() @@ -244,8 +245,8 @@ struct amp_caps int (*reset)(AMP *amp, amp_reset_t reset); /*!< Pointer to backend implementation of ::amp_reset(). */ int (*get_level)(AMP *amp, setting_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_level(). */ int (*set_level)(AMP *amp, setting_t level, value_t val); /*!< Pointer to backend implementation of ::amp_get_level(). */ - int (*get_ext_level)(AMP *amp, token_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_ext_level(). */ - int (*set_ext_level)(AMP *amp, token_t level, value_t val); /*!< Pointer to backend implementation of ::amp_set_ext_level(). */ + int (*get_ext_level)(AMP *amp, hamlib_token_t level, value_t *val); /*!< Pointer to backend implementation of ::amp_get_ext_level(). */ + int (*set_ext_level)(AMP *amp, hamlib_token_t level, value_t val); /*!< Pointer to backend implementation of ::amp_set_ext_level(). */ int (*set_powerstat)(AMP *amp, powerstat_t status); /*!< Pointer to backend implementation of ::amp_set_powerstat(). */ int (*get_powerstat)(AMP *amp, powerstat_t *status); /*!< Pointer to backend implementation of ::amp_get_powerstat(). */ @@ -335,11 +336,11 @@ amp_cleanup HAMLIB_PARAMS((AMP *amp)); extern HAMLIB_EXPORT(int) amp_set_conf HAMLIB_PARAMS((AMP *amp, - token_t token, + hamlib_token_t token, const char *val)); extern HAMLIB_EXPORT(int) amp_get_conf HAMLIB_PARAMS((AMP *amp, - token_t token, + hamlib_token_t token, char *val)); extern HAMLIB_EXPORT(int) amp_set_powerstat HAMLIB_PARAMS((AMP *amp, @@ -407,7 +408,7 @@ extern HAMLIB_EXPORT(const struct confparams *) amp_confparam_lookup HAMLIB_PARAMS((AMP *amp, const char *name)); -extern HAMLIB_EXPORT(token_t) +extern HAMLIB_EXPORT(hamlib_token_t) amp_token_lookup HAMLIB_PARAMS((AMP *amp, const char *name)); @@ -428,12 +429,12 @@ amp_ext_lookup HAMLIB_PARAMS((AMP *amp, extern HAMLIB_EXPORT(int) amp_get_ext_level HAMLIB_PARAMS((AMP *amp, - token_t token, + hamlib_token_t token, value_t *val)); extern HAMLIB_EXPORT(int) amp_set_ext_level HAMLIB_PARAMS((AMP *amp, - token_t token, + hamlib_token_t token, value_t val)); extern HAMLIB_EXPORT(const char *) amp_strlevel(setting_t); @@ -445,6 +446,8 @@ rig_ext_lookup HAMLIB_PARAMS((RIG *rig, extern HAMLIB_EXPORT(setting_t) amp_parse_level(const char *s); extern HAMLIB_EXPORT(const char *) amp_strlevel(setting_t); +extern HAMLIB_EXPORT(void *) amp_data_pointer(AMP *amp, rig_ptrx_t idx); + //! @endcond diff --git a/hamlib/amplist.h b/hamlib/amplist.h index db6d4b5..fd4581a 100644 --- a/hamlib/amplist.h +++ b/hamlib/amplist.h @@ -106,10 +106,15 @@ //! @endcond #define AMP_MODEL_ELECRAFT_KPA1500 AMP_MAKE_MODEL(AMP_ELECRAFT, 1) //#define AMP_MODEL_ELECRAFT_KPA500 AMP_MAKE_MODEL(AMP_ELECRAFT, 2) + #define AMP_GEMINI 3 #define AMP_BACKEND_GEMINI "gemini" #define AMP_MODEL_GEMINI_DX1200 AMP_MAKE_MODEL(AMP_GEMINI, 1) +#define AMP_EXPERT 4 +#define AMP_BACKEND_EXPERT "expert" +#define AMP_MODEL_EXPERT_FA AMP_MAKE_MODEL(AMP_EXPERT, 1) + /** * \brief Convenience type definition for an amplifier model. diff --git a/hamlib/config.h b/hamlib/config.h index 2e2237e..fb25a20 100644 --- a/hamlib/config.h +++ b/hamlib/config.h @@ -10,6 +10,15 @@ /* Frontend ABI version */ #define ABI_VERSION 4 +/* Frontend Major version */ +#define ABI_VERSION_MAJOR 4 + +/* Frontend Minor version */ +#define ABI_VERSION_MINOR 6 + +/* Frontend Patch version */ +#define ABI_VERSION_PATCH 0 + /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ @@ -367,7 +376,7 @@ #define PACKAGE_NAME "Hamlib" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "Hamlib 4.5.5" +#define PACKAGE_STRING "Hamlib 4.6~git" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "hamlib" @@ -376,7 +385,7 @@ #define PACKAGE_URL "http://www.hamlib.org" /* Define to the version of this package. */ -#define PACKAGE_VERSION "4.5.5" +#define PACKAGE_VERSION "4.6~git" /* Define to necessary symbol if this constant uses a non-standard name on your system. */ @@ -416,7 +425,7 @@ /* Version number of package */ -#define VERSION "4.5.5" +#define VERSION "4.6~git" /* Define to 1 if on MINIX. */ /* #undef _MINIX */ diff --git a/hamlib/libhamlib.dll.a b/hamlib/libhamlib.dll.a index 7ad64d06ef48e4de7633ae2211131201d6c13ef0..2814f40c1e60afd03b4310d79b0bafae9b177387 100644 GIT binary patch delta 18552 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 C?Puu# delta 15583 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 VC&J3Oon_g|20m7fu4+WN{|}Q-g)smC diff --git a/hamlib/multicast.h b/hamlib/multicast.h new file mode 100644 index 0000000..619d598 --- /dev/null +++ b/hamlib/multicast.h @@ -0,0 +1,45 @@ +//include +//#include +//#include +//#include +//#include +#include +//#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef _WIN32 +#include +#include +#endif + +#ifdef HAVE_ARPA_INET_H +#include +#endif + +#ifndef MULTICAST_H +#define MULTICAST_H + +struct multicast_vfo +{ + char *name; + double freq; + char *mode; + int width; + int widthLower; + int widthUpper; + unsigned char rx; // true if in rx mode + unsigned char tx; // true in in tx mode +}; + +struct multicast_broadcast +{ + char *ID; + struct multicast_vfo **vfo; +}; + +// returns # of bytes sent +extern HAMLIB_EXPORT (int) multicast_init(RIG *rig, char *addr, int port); +extern HAMLIB_EXPORT (int) multicast_send(RIG *rig, const char *msg, int msglen); +extern HAMLIB_EXPORT (int) multicast_stop(RIG *rig); +#endif //MULTICAST_H diff --git a/hamlib/rig.h b/hamlib/rig.h index 5d59e2e..a99a157 100644 --- a/hamlib/rig.h +++ b/hamlib/rig.h @@ -19,25 +19,46 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ - +/* SPDX-License-Identifier: LGPL-2.1-or-later */ #ifndef _RIG_H #define _RIG_H 1 +// as of 2023-11-23 rig_caps is no longer constant +// this #define allows clients to test which declaration to use for backwards compatibility +#define RIGCAPS_NOT_CONST 1 + #define BUILTINFUNC 0 // Our shared secret password #define HAMLIB_SECRET_LENGTH 32 -#define HAMLIB_TRACE rig_debug(RIG_DEBUG_TRACE,"%s(%d) trace\n", __FILE__, __LINE__) +#define HAMLIB_TRACE rig_debug(RIG_DEBUG_TRACE,"%s%s(%d) trace\n",spaces(rig->state.depth-1), __FILE__, __LINE__) #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #include -#include #include #include #include +// to stop warnings about including winsock2.h before windows.h +#if defined(_WIN32) +#include +#include +#else +#include +#include +#include +#endif + +// mingw64 still shows __TIMESIZE != 64 +// need to do more testing +#if 0 +#if __TIMESIZE != 64 +#warning TIMESIZE != 64 -- Please report your OS system to hamlib-developer@lists.sourceforge.net +#endif +#endif + // For MSVC install the NUGet pthread package #if defined(_MSC_VER) #define HAVE_STRUCT_TIMESPEC @@ -46,6 +67,7 @@ /* Rig list is in a separate file so as not to mess up w/ this one */ #include +//#include /** * \addtogroup rig @@ -118,6 +140,23 @@ __BEGIN_DECLS +// FIFO currently used for send_morse queue +#define HAMLIB_FIFO_SIZE 1024 + +typedef struct +{ + char data[HAMLIB_FIFO_SIZE]; + int head; + int tail; + int flush; // flush flag for stop_morse +#ifdef _PTHREAD_H + pthread_mutex_t mutex; +#else + int mutex; +#endif +} FIFO_RIG; + + /** * \brief size of cookie request buffer * Minimum size of cookie buffer to pass to rig_cookie @@ -125,6 +164,7 @@ __BEGIN_DECLS // cookie is 26-char time code plus 10-char (2^31-1) random number #define HAMLIB_COOKIE_SIZE 37 extern int cookie_use; // this is global as once one client requests it everybody needs to honor it +extern int skip_init; // allow rigctl to skip any radio commands at startup //! @cond Doxygen_Suppress extern HAMLIB_EXPORT_VAR(const char) hamlib_version[]; @@ -164,7 +204,7 @@ enum rig_errcode_e { RIG_EDOM, /*!< 17 Argument out of domain of func */ RIG_EDEPRECATED,/*!< 18 Function deprecated */ RIG_ESECURITY, /*!< 19 Security error */ - RIG_EPOWER, /*!, 20 Rig not powered on */ + RIG_EPOWER, /*!< 20 Rig not powered on */ RIG_EEND // MUST BE LAST ITEM IN LAST }; /** @@ -260,6 +300,8 @@ typedef unsigned int tone_t; /** * \brief Port type + * + * Note: All rigs may use a network:port address ( e.g. tcp/serial adapter) */ typedef enum rig_port_e { RIG_PORT_NONE = 0, /*!< No port */ @@ -341,8 +383,8 @@ enum agc_level_e { RIG_AGC_MEDIUM, RIG_AGC_AUTO, RIG_AGC_LONG, - RIG_AGC_ON, /*< Turns AGC ON -- Kenwood -- restores last level set */ - RIG_AGC_NONE /*< Rig does not have CAT AGC control */ + RIG_AGC_ON, /*!< Turns AGC ON -- Kenwood -- restores last level set */ + RIG_AGC_NONE /*!< Rig does not have CAT AGC control */ }; @@ -397,8 +439,8 @@ typedef enum { * \brief Split mode */ typedef enum { - RIG_SPLIT_OFF = 0, /*!< Split mode disabled */ - RIG_SPLIT_ON /*!< Split mode enabled */ + RIG_SPLIT_OFF = 0, /*!< Split mode disabled */ + RIG_SPLIT_ON, /*!< Split mode enabled */ } split_t; @@ -537,7 +579,7 @@ typedef unsigned int vfo_t; /** \brief \c Macro to tell you if VFO can transmit */ #define RIG_VFO_TX_VFO(v) ((v)|RIG_VFO_TX_FLAG) -/** \brief \c TX -- alias for split tx or uplink, of VFO_CURR */ +/** \brief \c TX -- alias for split tx or uplink, of VFO_CURR */ #define RIG_VFO_TX RIG_VFO_TX_VFO(RIG_VFO_CURR) /** \brief \c RX -- alias for split rx or downlink */ @@ -565,7 +607,7 @@ typedef unsigned int vfo_t; #define RIG_TARGETABLE_ANT (1<<10) #define RIG_TARGETABLE_ROOFING (1<<11) // roofing filter targetable by VFO #define RIG_TARGETABLE_SPECTRUM (1<<12) // spectrum scope targetable by VFO -#define RIG_TARGETABLE_BAND (1<<13) // Band select -- e.g. Yaeus BS command +#define RIG_TARGETABLE_BAND (1<<13) // Band select -- e.g. Yaesu BS command #define RIG_TARGETABLE_COMMON (RIG_TARGETABLE_RITXIT | RIG_TARGETABLE_PTT | RIG_TARGETABLE_MEM | RIG_TARGETABLE_BANK) #define RIG_TARGETABLE_ALL 0x7fffffff //! @endcond @@ -739,6 +781,46 @@ typedef enum { // numbers here reflect the Yaesu values RIG_BAND_430MHZ = 16, /*!< \c 430MHz */ } hamlib_band_t; +typedef enum { // numbers here reflect generic values -- need to map to rig values + RIG_BANDSELECT_UNUSED = CONSTANT_64BIT_FLAG(0), /*!< \c Unused */ + RIG_BANDSELECT_2200M = CONSTANT_64BIT_FLAG(1), /*!< \c 160M */ + RIG_BANDSELECT_600M = CONSTANT_64BIT_FLAG(2), /*!< \c 160M */ + RIG_BANDSELECT_160M = CONSTANT_64BIT_FLAG(3), /*!< \c 160M */ + RIG_BANDSELECT_80M = CONSTANT_64BIT_FLAG(4), /*!< \c 80M */ + RIG_BANDSELECT_60M = CONSTANT_64BIT_FLAG(5), /*!< \c 60M */ + RIG_BANDSELECT_40M = CONSTANT_64BIT_FLAG(6), /*!< \c 40M */ + RIG_BANDSELECT_30M = CONSTANT_64BIT_FLAG(7), /*!< \c 30M */ + RIG_BANDSELECT_20M = CONSTANT_64BIT_FLAG(8), /*!< \c 20M */ + RIG_BANDSELECT_17M = CONSTANT_64BIT_FLAG(9), /*!< \c 17M */ + RIG_BANDSELECT_15M = CONSTANT_64BIT_FLAG(10), /*!< \c 15M */ + RIG_BANDSELECT_12M = CONSTANT_64BIT_FLAG(11), /*!< \c 12M */ + RIG_BANDSELECT_10M = CONSTANT_64BIT_FLAG(12), /*!< \c 10M */ + RIG_BANDSELECT_6M = CONSTANT_64BIT_FLAG(13), /*!< \c 6M */ + RIG_BANDSELECT_WFM = CONSTANT_64BIT_FLAG(14), /*!< \c IC705 74.8-108 */ + RIG_BANDSELECT_GEN = CONSTANT_64BIT_FLAG(15), /*!< \c 60M */ + RIG_BANDSELECT_MW = CONSTANT_64BIT_FLAG(16), /*!< \c Medium Wave */ + RIG_BANDSELECT_AIR = CONSTANT_64BIT_FLAG(17), /*!< \c Air band */ + RIG_BANDSELECT_4M = CONSTANT_64BIT_FLAG(18), /*!< \c 70MHz */ + RIG_BANDSELECT_2M = CONSTANT_64BIT_FLAG(19), /*!< \c 144MHz */ + RIG_BANDSELECT_1_25M = CONSTANT_64BIT_FLAG(20), /*!< \c 222MHz */ + RIG_BANDSELECT_70CM = CONSTANT_64BIT_FLAG(21), /*!< \c 420MHz */ + RIG_BANDSELECT_33CM = CONSTANT_64BIT_FLAG(22), /*!< \c 902MHz */ + RIG_BANDSELECT_23CM = CONSTANT_64BIT_FLAG(23), /*!< \c 1240MHz */ + RIG_BANDSELECT_13CM = CONSTANT_64BIT_FLAG(24), /*!< \c 2300MHz */ + RIG_BANDSELECT_9CM = CONSTANT_64BIT_FLAG(25), /*!< \c 3300MHz */ + RIG_BANDSELECT_5CM = CONSTANT_64BIT_FLAG(26), /*!< \c 5650MHz */ + RIG_BANDSELECT_3CM = CONSTANT_64BIT_FLAG(27), /*!< \c 10000MHz */ +} hamlib_bandselect_t; + + +#define RIG_BANDSELECT_ALL +#define RIG_BANDSELECT_LF (RIG_BANDSELECT_2200M | RIG_BANDSELECT_600M) +#define RIG_BANDSELECT_HF (RIG_BANDSELECT_160M | RIG_BANDSELECT_80M | RIG_BANDSELECT_60M | RIG_BANDSELECT_40M\ +| RIG_BANDSELECT_30M | RIG_BANDSELECT_20M | RIG_BANDSELECT_17M | RIG_BANDSELECT_15M | RIG_BANDSELECT_12M\ +RIG_BANDSELECT_10M | RIG_BANDSELECT_6M) +#define RIG_BANDSELECT_VHF (RIG_BANDSELECT_AIR | RIG_BANDSELECT_2M| RIG_BANDSELECT_1_25M( +#define RIG_BANDSELECT_UHF (RIG_BANDSELECT_70CM) + /** * \brief Rig Scan operation @@ -764,7 +846,8 @@ typedef enum { /** * \brief configuration token */ -typedef long token_t; +typedef long hamlib_token_t; +#define token_t hamlib_token_t //! @cond Doxygen_Suppress @@ -779,7 +862,7 @@ typedef long token_t; * * Current internal implementation * NUMERIC: val.f or val.i - * COMBO: val.i, starting from 0. Points to a table of strings or asci stored values. + * COMBO: val.i, starting from 0. Points to a table of strings or ASCII stored values. * STRING: val.s or val.cs * CHECKBUTTON: val.i 0/1 * BINARY: val.b @@ -792,7 +875,8 @@ enum rig_conf_e { RIG_CONF_NUMERIC, /*!< Numeric type integer or real */ RIG_CONF_CHECKBUTTON, /*!< on/off type */ RIG_CONF_BUTTON, /*!< Button type */ - RIG_CONF_BINARY /*!< Binary buffer type */ + RIG_CONF_BINARY, /*!< Binary buffer type */ + RIG_CONF_INT /*!< Integer */ }; //! @cond Doxygen_Suppress @@ -804,7 +888,7 @@ enum rig_conf_e { * \brief Configuration parameter structure. */ struct confparams { - token_t token; /*!< Conf param token ID */ + hamlib_token_t token; /*!< Conf param token ID */ const char *name; /*!< Param name, no spaces allowed */ const char *label; /*!< Human readable label */ const char *tooltip; /*!< Hint on the parameter */ @@ -902,7 +986,7 @@ typedef unsigned int ant_t; //! @cond Doxygen_Suppress -#define RIG_AGC_LAST -1 +#define RIG_AGC_LAST 99999 //! @endcond #if 1 // deprecated @@ -930,6 +1014,7 @@ enum meter_level_e { */ typedef union { signed int i; /*!< Signed integer */ + unsigned int u; /*!< Unsigned integer */ float f; /*!< Single precision float */ char *s; /*!< Pointer to char string */ const char *cs; /*!< Pointer to constant char string */ @@ -1006,8 +1091,8 @@ typedef uint64_t rig_level_e; #define RIG_LEVEL_TEMP_METER CONSTANT_64BIT_FLAG(48) /*!< \c TEMP_METER -- arg float (C, centigrade) */ #define RIG_LEVEL_BAND_SELECT CONSTANT_64BIT_FLAG(49) /*!< \c BAND_SELECT -- arg enum BAND_ENUM */ #define RIG_LEVEL_USB_AF CONSTANT_64BIT_FLAG(50) /*!< \c ACC/USB AF output level */ -#define RIG_LEVEL_AGC_TIME CONSTANT_64BIT_FLAG(51) /*!< \c AGC_TIME -- in seconds, rig dependent */ -#define RIG_LEVEL_52 CONSTANT_64BIT_FLAG(52) /*!< \c Future use */ +#define RIG_LEVEL_USB_AF_INPUT CONSTANT_64BIT_FLAG(51) /*!< \c ACC/USB AF input level */ +#define RIG_LEVEL_AGC_TIME CONSTANT_64BIT_FLAG(52) /*!< \c AGC_TIME -- in seconds, rig dependent */ #define RIG_LEVEL_53 CONSTANT_64BIT_FLAG(53) /*!< \c Future use */ #define RIG_LEVEL_54 CONSTANT_64BIT_FLAG(54) /*!< \c Future use */ #define RIG_LEVEL_55 CONSTANT_64BIT_FLAG(55) /*!< \c Future use */ @@ -1021,9 +1106,9 @@ typedef uint64_t rig_level_e; #define RIG_LEVEL_63 CONSTANT_64BIT_FLAG(63) /*!< \c Future use */ //! @cond Doxygen_Suppress -#define RIG_LEVEL_FLOAT_LIST (RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_APF|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_COMP|RIG_LEVEL_BALANCE|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_TEMP_METER|RIG_LEVEL_USB_AF|RIG_LEVEL_AGC_TIME) +#define RIG_LEVEL_FLOAT_LIST (RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_APF|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_COMP|RIG_LEVEL_BALANCE|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_TEMP_METER|RIG_LEVEL_USB_AF|RIG_LEVEL_USB_AF_INPUT|RIG_LEVEL_AGC_TIME) -#define RIG_LEVEL_READONLY_LIST (RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_STRENGTH|RIG_LEVEL_RAWSTR|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS) +#define RIG_LEVEL_READONLY_LIST (RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_STRENGTH|RIG_LEVEL_RAWSTR|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_TEMP_METER|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS) #define RIG_LEVEL_IS_FLOAT(l) ((l)&RIG_LEVEL_FLOAT_LIST) #define RIG_LEVEL_SET(l) ((l)&~RIG_LEVEL_READONLY_LIST) @@ -1048,7 +1133,15 @@ enum rig_parm_e { RIG_PARM_BAT = (1 << 6), /*!< \c BAT -- battery level, float [0.0 ... 1.0] */ RIG_PARM_KEYLIGHT = (1 << 7), /*!< \c KEYLIGHT -- Button backlight, on/off */ RIG_PARM_SCREENSAVER = (1 << 8), /*!< \c SCREENSAVER -- rig specific timeouts */ - RIG_PARM_AFIF = (1 << 9) /*!< \c AFIF -- 0=AF audio, 1=IF audio -- see IC-7300/9700/705 */ + RIG_PARM_AFIF = (1 << 9), /*!< \c AFIF -- 0=AF audio, 1=IF audio -- see IC-7300/9700/705 */ + RIG_PARM_BANDSELECT = (1 << 10), /*!< \c BANDSELECT -- e.g. BAND160M, BAND80M, BAND70CM, BAND2CM */ + RIG_PARM_KEYERTYPE = (1 << 11) /*!< \c KEYERTYPE -- 0,1,2 or STRAIGHT PADDLE BUG */ +}; + +enum rig_keyertype_e { + RIG_KEYERTYPE_STRAIGHT = 0, + RIG_KEYERTYPE_BUG = (1 << 0), + RIG_KEYERTYPE_PADDLE = (2 << 0) }; /** @@ -1076,10 +1169,12 @@ enum multicast_item_e { }; //! @cond Doxygen_Suppress -#define RIG_PARM_FLOAT_LIST (RIG_PARM_BACKLIGHT|RIG_PARM_BAT|RIG_PARM_KEYLIGHT) +#define RIG_PARM_FLOAT_LIST (RIG_PARM_BACKLIGHT|RIG_PARM_BAT|RIG_PARM_KEYLIGHT|RIG_PARM_BACKLIGHT) +#define RIG_PARM_STRING_LIST (RIG_PARM_BANDSELECT|RIG_PARM_KEYERTYPE) #define RIG_PARM_READONLY_LIST (RIG_PARM_BAT) #define RIG_PARM_IS_FLOAT(l) ((l)&RIG_PARM_FLOAT_LIST) +#define RIG_PARM_IS_STRING(l) ((l)&RIG_PARM_STRING_LIST) #define RIG_PARM_SET(l) ((l)&~RIG_PARM_READONLY_LIST) //! @endcond @@ -1179,14 +1274,14 @@ typedef uint64_t setting_t; #define RIG_FUNC_DIVERSITY CONSTANT_64BIT_FLAG (38) /*!< \c DIVERSITY -- Diversity receive */ #define RIG_FUNC_DSQL CONSTANT_64BIT_FLAG (39) /*!< \c DSQL -- Digital modes squelch */ #define RIG_FUNC_SCEN CONSTANT_64BIT_FLAG (40) /*!< \c SCEN -- scrambler/encryption */ -#define RIG_FUNC_SLICE CONSTANT_64BIT_FLAG (41) /*!< \c Rig slice selection -- Flex */ +#define RIG_FUNC_SLICE CONSTANT_64BIT_FLAG (41) /*!< \c SLICE -- Rig slice selection -- Flex */ #define RIG_FUNC_TRANSCEIVE CONSTANT_64BIT_FLAG (42) /*!< \c TRANSCEIVE -- Send radio state changes automatically ON/OFF */ #define RIG_FUNC_SPECTRUM CONSTANT_64BIT_FLAG (43) /*!< \c SPECTRUM -- Spectrum scope data output ON/OFF */ #define RIG_FUNC_SPECTRUM_HOLD CONSTANT_64BIT_FLAG (44) /*!< \c SPECTRUM_HOLD -- Pause spectrum scope updates ON/OFF */ #define RIG_FUNC_SEND_MORSE CONSTANT_64BIT_FLAG (45) /*!< \c SEND_MORSE -- Send specified characters using CW */ #define RIG_FUNC_SEND_VOICE_MEM CONSTANT_64BIT_FLAG (46) /*!< \c SEND_VOICE_MEM -- Transmit in SSB message stored in memory */ #define RIG_FUNC_OVF_STATUS CONSTANT_64BIT_FLAG (47) /*!< \c OVF -- Read overflow status 0=Off, 1=On */ -#define RIG_FUNC_BIT48 CONSTANT_64BIT_FLAG (48) /*!< \c available for future RIG_FUNC items */ +#define RIG_FUNC_SYNC CONSTANT_64BIT_FLAG (48) /*!< \c Synchronize VFOS -- FTDX101D/MP for now SY command */ #define RIG_FUNC_BIT49 CONSTANT_64BIT_FLAG (49) /*!< \c available for future RIG_FUNC items */ #define RIG_FUNC_BIT50 CONSTANT_64BIT_FLAG (50) /*!< \c available for future RIG_FUNC items */ #define RIG_FUNC_BIT51 CONSTANT_64BIT_FLAG (51) /*!< \c available for future RIG_FUNC items */ @@ -1291,12 +1386,12 @@ typedef uint64_t rmode_t; #define RIG_MODE_IQ CONSTANT_64BIT_FLAG (37) /*!< \c IQ mode for a couple of kit rigs */ #define RIG_MODE_ISBUSB CONSTANT_64BIT_FLAG (38) /*!< \c ISB mode monitoring USB */ #define RIG_MODE_ISBLSB CONSTANT_64BIT_FLAG (39) /*!< \c ISB mode monitoring LSB */ -#define RIG_MODE_BIT40 CONSTANT_64BIT_FLAG (40) /*!< \c reserved for future expansion */ -#define RIG_MODE_BIT41 CONSTANT_64BIT_FLAG (41) /*!< \c reserved for future expansion */ -#define RIG_MODE_BIT42 CONSTANT_64BIT_FLAG (42) /*!< \c reserved for future expansion */ -#define RIG_MODE_BIT43 CONSTANT_64BIT_FLAG (43) /*!< \c reserved for future expansion */ -#define RIG_MODE_BIT44 CONSTANT_64BIT_FLAG (44) /*!< \c reserved for future expansion */ -#define RIG_MODE_BIT45 CONSTANT_64BIT_FLAG (45) /*!< \c reserved for future expansion */ +#define RIG_MODE_USBD1 CONSTANT_64BIT_FLAG (40) /*!< \c USB-D1 for some rigs */ +#define RIG_MODE_USBD2 CONSTANT_64BIT_FLAG (41) /*!< \c USB-D2 for some rigs */ +#define RIG_MODE_USBD3 CONSTANT_64BIT_FLAG (42) /*!< \c USB-D3 for some rigs */ +#define RIG_MODE_LSBD1 CONSTANT_64BIT_FLAG (43) /*!< \c LSB-D1 for some rigs */ +#define RIG_MODE_LSBD2 CONSTANT_64BIT_FLAG (44) /*!< \c LSB-D1 for some rigs */ +#define RIG_MODE_LSBD3 CONSTANT_64BIT_FLAG (45) /*!< \c LSB-D1 for some rigs */ #define RIG_MODE_BIT46 CONSTANT_64BIT_FLAG (46) /*!< \c reserved for future expansion */ #define RIG_MODE_BIT47 CONSTANT_64BIT_FLAG (47) /*!< \c reserved for future expansion */ #define RIG_MODE_BIT48 CONSTANT_64BIT_FLAG (48) /*!< \c reserved for future expansion */ @@ -1323,6 +1418,11 @@ typedef uint64_t rmode_t; */ #define RIG_MODE_SSB (RIG_MODE_USB|RIG_MODE_LSB) +/** + * \brief macro for backends, not to be used by rig_set_mode et al. + */ +#define RIG_MODE_PKTSSB (RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) + /** * \brief macro for backends, not to be used by rig_set_mode et al. */ @@ -1441,7 +1541,7 @@ struct filter_list { * */ struct ext_list { - token_t token; /*!< Token ID */ + hamlib_token_t token; /*!< Token ID */ value_t val; /*!< Value */ }; @@ -1489,6 +1589,7 @@ struct channel { char channel_desc[HAMLIB_MAXCHANDESC]; /*!< Name */ struct ext_list *ext_levels; /*!< Extension level value list, NULL ended. ext_levels can be NULL */ + char tag[32]; /*!< TAG ASCII for channel name, etc */ }; /** @@ -1530,6 +1631,7 @@ struct channel_cap { unsigned flags: 1; /*!< Channel flags */ unsigned channel_desc: 1; /*!< Name */ unsigned ext_levels: 1; /*!< Extension level value list */ + unsigned tag: 1; /*!< Has tag field e.g. FT991 */ }; /** @@ -1556,7 +1658,9 @@ typedef enum { RIG_MTYPE_MEMOPAD, /*!< Memory pad */ RIG_MTYPE_SAT, /*!< Satellite */ RIG_MTYPE_BAND, /*!< VFO/Band channel */ - RIG_MTYPE_PRIO /*!< Priority channel */ + RIG_MTYPE_PRIO, /*!< Priority channel */ + RIG_MTYPE_VOICE, /*!< Stored Voice Message */ + RIG_MTYPE_MORSE /*!< Morse Message */ } chan_type_t; @@ -1574,11 +1678,10 @@ typedef enum { \endcode */ struct chan_list { - int startc; /*!< Starting memory channel \b number */ - int endc; /*!< Ending memory channel \b number */ - chan_type_t type; /*!< Memory type. see chan_type_t */ - channel_cap_t - mem_caps; /*!< Definition of attributes that can be stored/retrieved */ + int startc; /*!< Starting memory channel \b number */ + int endc; /*!< Ending memory channel \b number */ + chan_type_t type; /*!< Memory type. see chan_type_t */ + channel_cap_t mem_caps; /*!< Definition of attributes that can be stored/retrieved */ }; //! @cond Doxygen_Suppress @@ -1602,7 +1705,7 @@ typedef struct chan_list chan_t; * * The granularity is undefined if min = 0, max = 0, and step = 0. * - * For float settings, if min.f = 0 and max.f = 0 (and step.f! = 0), max.f is + * For float settings, if min.f = 0 and max.f = 0 (and step.f != 0), max.f is * assumed to be actually equal to 1.0. * * If step = 0 (and min and/or max are not null), then this means step can @@ -1983,17 +2086,17 @@ 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_level)(RIG *rig, vfo_t vfo, hamlib_token_t token, value_t val); + int (*get_ext_level)(RIG *rig, vfo_t vfo, hamlib_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_func)(RIG *rig, vfo_t vfo, hamlib_token_t token, int status); + int (*get_ext_func)(RIG *rig, vfo_t vfo, hamlib_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); + int (*set_ext_parm)(RIG *rig, hamlib_token_t token, value_t val); + int (*get_ext_parm)(RIG *rig, hamlib_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); + int (*set_conf)(RIG *rig, hamlib_token_t token, const char *val); + int (*get_conf)(RIG *rig, hamlib_token_t token, char *val); int (*send_dtmf)(RIG *rig, vfo_t vfo, const char *digits); int (*recv_dtmf)(RIG *rig, vfo_t vfo, char *digits, int *length); @@ -2003,6 +2106,7 @@ struct rig_caps { int (*wait_morse)(RIG *rig, vfo_t vfo); int (*send_voice_mem)(RIG *rig, vfo_t vfo, int ch); + int (*stop_voice_mem)(RIG *rig, vfo_t vfo); int (*set_bank)(RIG *rig, vfo_t vfo, int bank); @@ -2063,10 +2167,14 @@ struct rig_caps { const unsigned char *frame); // this will be used to check rigcaps structure is compatible with client char *hamlib_check_rig_caps; // a constant value we can check for hamlib integrity - int (*get_conf2)(RIG *rig, token_t token, char *val, int val_len); + int (*get_conf2)(RIG *rig, hamlib_token_t token, char *val, int val_len); int (*password)(RIG *rig, const char *key1); /*< Send encrypted password if rigctld is secured with -A/--password */ int (*set_lock_mode)(RIG *rig, int mode); int (*get_lock_mode)(RIG *rig, int *mode); + short timeout_retry; /*!< number of retries to make in case of read timeout errors, some serial interfaces may require this, 0 to use default value, -1 to disable */ + short morse_qsize; /* max length of morse */ +// int (*bandwidth2rig)(RIG *rig, enum bandwidth_t bandwidth); +// enum bandwidth_t (*rig2bandwidth)(RIG *rig, int rigbandwidth); }; //! @endcond @@ -2074,7 +2182,6 @@ struct rig_caps { * \brief Enumeration of all rig_ functions * */ -//! @cond Doxygen_Suppress // all functions enumerated for rig_get_function_ptr enum rig_function_e { RIG_FUNCTION_INIT, @@ -2165,27 +2272,27 @@ enum rig_function_e { RIG_FUNCTION_IS_ASYNC_FRAME, RIG_FUNCTION_PROCESS_ASYNC_FRAME, RIG_FUNCTION_GET_CONF2, + RIG_FUNCTION_STOP_VOICE_MEM, }; /** * \brief Function to return pointer to rig_* function * */ -//! @cond Doxygen_Suppress extern HAMLIB_EXPORT (void *) rig_get_function_ptr(rig_model_t rig_model, enum rig_function_e rig_function); /** * \brief Enumeration of rig->caps values * */ -//! @cond Doxygen_Suppress // values enumerated for rig->caps values enum rig_caps_int_e { RIG_CAPS_TARGETABLE_VFO, RIG_CAPS_RIG_MODEL, RIG_CAPS_PORT_TYPE, RIG_CAPS_PTT_TYPE, - RIG_CAPS_HAS_GET_LEVEL + RIG_CAPS_HAS_GET_LEVEL, + RIG_CAPS_HAS_SET_LEVEL, }; enum rig_caps_cptr_e { @@ -2199,14 +2306,12 @@ enum rig_caps_cptr_e { * \brief Function to return int value from rig->caps * Does not support > 32-bit rig_caps values */ -//! @cond Doxygen_Suppress -extern HAMLIB_EXPORT (long long) rig_get_caps_int(rig_model_t rig_model, enum rig_caps_int_e rig_caps); +extern HAMLIB_EXPORT (uint64_t) rig_get_caps_int(rig_model_t rig_model, enum rig_caps_int_e rig_caps); /** * \brief Function to return char pointer value from rig->caps * */ -//! @cond Doxygen_Suppress extern HAMLIB_EXPORT (const char *) rig_get_caps_cptr(rig_model_t rig_model, enum rig_caps_cptr_e rig_caps); struct hamlib_async_pipe; @@ -2280,8 +2385,8 @@ typedef struct hamlib_port { int value; /*!< Toggle PTT ON or OFF */ } gpio; /*!< GPIO attributes */ } parm; /*!< Port parameter union */ - int client_port; /*!< client socket port for tcp connection */ - RIG *rig; /*!< our parent RIG device */ + int client_port; /*!< client socket port for tcp connection */ + RIG *rig; /*!< our parent RIG device */ int asyncio; /*!< enable asynchronous data handling if true -- async collides with python keyword so _async is used */ #if defined(_WIN32) hamlib_async_pipe_t *sync_data_pipe; /*!< pipe data structure for synchronous data */ @@ -2292,6 +2397,8 @@ typedef struct hamlib_port { int fd_sync_error_write; /*!< file descriptor for writing synchronous data error codes */ int fd_sync_error_read; /*!< file descriptor for reading synchronous data error codes */ #endif + short timeout_retry; /*!< number of retries to make in case of read timeout errors, some serial interfaces may require this, 0 to disable */ +// DO NOT ADD ANYTHING HERE UNTIL 5.0!! } hamlib_port_t; @@ -2364,11 +2471,62 @@ typedef hamlib_port_t_deprecated port_t_deprecated; typedef hamlib_port_t port_t; #endif +/* Macros to access data structures/pointers + * Make it easier to change location in preparation + * for moving them out of rig->state. + * See https://github.com/Hamlib/Hamlib/issues/1445 + * https://github.com/Hamlib/Hamlib/issues/1452 + * https://github.com/Hamlib/Hamlib/issues/1420 + * https://github.com/Hamlib/Hamlib/issues/536 + * https://github.com/Hamlib/Hamlib/issues/487 + */ +// Note: Experimental, and subject to change!! +#if defined(IN_HAMLIB) +/* These are for internal use only */ +#define RIGPORT(r) (&r->state.rigport) +#define PTTPORT(r) (&r->state.pttport) +#define DCDPORT(r) (&r->state.dcdport) +#define CACHE(r) (&r->state.cache) +#define AMPPORT(a) (&a->state.ampport) +#define ROTPORT(r) (&r->state.rotport) +#define ROTPORT2(r) (&r->state.rotport2) +#define STATE(r) (&r->state) +/* Then when the rigport address is stored as a pointer somewhere else(say, + * in the rig structure itself), the definition could be changed to + * #define RIGPORT(r) r->somewhereelse + * and every reference is updated. + */ +#else +/* Define external unique names */ +#define HAMLIB_RIGPORT(r) ((hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_RIGPORT)) +#define HAMLIB_PTTPORT(r) ((hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_PTTPORT)) +#define HAMLIB_DCDPORT(r) ((hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_DCDPORT)) +#define HAMLIB_CACHE(r) ((struct rig_cache *)rig_data_pointer(r, RIG_PTRX_CACHE)) +#define HAMLIB_AMPPORT(a) ((hamlib_port_t *)amp_data_pointer(a, RIG_PTRX_AMPPORT)) +#define HAMLIB_ROTPORT(r) ((hamlib_port_t *)rot_data_pointer(r, RIG_PTRX_ROTPORT)) +#define HAMLIB_ROTPORT2(r) ((hamlib_port_t *)rot_data_pointer(r, RIG_PTRX_ROTPORT2)) +#define HAMLIB_STATE(r) ((struct rig_state *)rig_data_pointer(r, RIG_PTRX_STATE)) +#endif + +typedef enum { + RIG_PTRX_NONE=0, + RIG_PTRX_RIGPORT, + RIG_PTRX_PTTPORT, + RIG_PTRX_DCDPORT, + RIG_PTRX_CACHE, + RIG_PTRX_AMPPORT, + RIG_PTRX_ROTPORT, + RIG_PTRX_ROTPORT2, + RIG_PTRX_STATE, +// New entries go directly above this line==================== + RIG_PTRX_MAXIMUM +} rig_ptrx_t; + #define HAMLIB_ELAPSED_GET 0 #define HAMLIB_ELAPSED_SET 1 #define HAMLIB_ELAPSED_INVALIDATE 2 -#define HAMLIB_CACHE_ALWAYS (-1) /*< value to set cache timeout to always use cache */ +#define HAMLIB_CACHE_ALWAYS (-1) /*!< value to set cache timeout to always use cache */ typedef enum { HAMLIB_CACHE_ALL, // to set all cache timeouts at once @@ -2389,6 +2547,7 @@ typedef enum { * \brief Rig cache data * * This struct contains all the items we cache at the highest level + * DO NOT MODIFY THIS STRUCTURE AT ALL -- we need a new cache that is a pointer rather than a structure */ struct rig_cache { int timeout_ms; // the cache timeout for invalidating itself @@ -2464,6 +2623,38 @@ struct rig_cache { int satmode; // if rig is in satellite mode }; +/** + * \brief Multicast data items the are unique per rig instantiation + * This is meant for internal Hamlib use only + */ +#include +struct multicast_s +{ + int multicast_running; + int sock; + int seqnumber; + int runflag; // = 0; + pthread_t threadid; + // this mutex is needed to control serial access + // as of 2023-05-13 we have main thread and multicast thread needing it + // eventually we should be able to use cached info only in the main thread to avoid contention + pthread_mutex_t mutex; + int mutex_initialized; +//#ifdef HAVE_ARPA_INET_H + //struct ip_mreq mreq; // = {0}; + struct sockaddr_in dest_addr; // = {0}; + int port; +//#endif +}; + +typedef unsigned int rig_comm_status_t; + +#define RIG_COMM_STATUS_OK 0x00 +#define RIG_COMM_STATUS_CONNECTING 0x01 +#define RIG_COMM_STATUS_DISCONNECTED 0x02 +#define RIG_COMM_STATUS_TERMINATED 0x03 +#define RIG_COMM_STATUS_WARNING 0x04 +#define RIG_COMM_STATUS_ERROR 0x05 /** * \brief Rig state containing live data and customized fields. @@ -2472,7 +2663,7 @@ struct rig_cache { * that may be updated (ie. customized) * * It is NOT fine to move fields around as it can break share library offset - * As of 2021-03-03 vfo_list is the last known item being reference externally + * As of 2024-03-03 freq_event_elapsed is the last known item being reference externally * So any additions or changes to this structure must be at the end of the structure */ struct rig_state { @@ -2584,12 +2775,215 @@ struct rig_state { /********* DO NOT ADD or CHANGE anything (or than to rename) ABOVE THIS LINE *********/ /********* ENSURE ANY NEW ITEMS ARE ADDED AFTER HERE *********/ /* flags instructing the rig_get routines to use cached values when asyncio is in use */ - int use_cached_freq; /*state.depth, spaces(), rig->state.depth, __func__, elapsed_ms(&__begin, HAMLIB_ELAPSED_GET)); +#define ELAPSED2 rig_debug(RIG_DEBUG_VERBOSE, "%s%d:%s: elapsed=%.0lfms\n", spaces(rig->state.depth-1), rig->state.depth, __func__, elapsed_ms(&__begin, HAMLIB_ELAPSED_GET)); // use this instead of snprintf for automatic detection of buffer limit #define SNPRINTF(s,n,...) { snprintf(s,n,##__VA_ARGS__);if (strlen(s) > n-1) fprintf(stderr,"****** %s(%d): buffer overflow ******\n", __func__, __LINE__); } @@ -3323,13 +3746,13 @@ extern HAMLIB_EXPORT(FILE *) rig_set_debug_file HAMLIB_PARAMS((FILE *stream)); extern HAMLIB_EXPORT(int) -rig_register HAMLIB_PARAMS((const struct rig_caps *caps)); +rig_register HAMLIB_PARAMS((struct rig_caps *caps)); extern HAMLIB_EXPORT(int) rig_unregister HAMLIB_PARAMS((rig_model_t rig_model)); extern HAMLIB_EXPORT(int) -rig_list_foreach HAMLIB_PARAMS((int (*cfunc)(const struct rig_caps *, rig_ptr_t), +rig_list_foreach HAMLIB_PARAMS((int (*cfunc)(struct rig_caps *, rig_ptr_t), rig_ptr_t data)); extern HAMLIB_EXPORT(int) @@ -3364,7 +3787,7 @@ extern HAMLIB_EXPORT(const char *) rig_strfunc(setting_t); extern HAMLIB_EXPORT(const char *) rig_strlevel(setting_t); extern HAMLIB_EXPORT(const char *) rig_strparm(setting_t); extern HAMLIB_EXPORT(const char *) rig_stragclevel(enum agc_level_e level); -extern HAMLIB_EXPORT(enum agc_level_e) rig_levelagcstr (char *agcString); +extern HAMLIB_EXPORT(enum agc_level_e) rig_levelagcstr (const char *agcString); extern HAMLIB_EXPORT(enum agc_level_e) rig_levelagcvalue (int agcValue); extern HAMLIB_EXPORT(value_t) rig_valueagclevel (enum agc_level_e agcLevel); extern HAMLIB_EXPORT(const char *) rig_strptrshift(rptr_shift_t); @@ -3373,6 +3796,7 @@ extern HAMLIB_EXPORT(const char *) rig_strscan(scan_t scan); extern HAMLIB_EXPORT(const char *) rig_strstatus(enum rig_status_e status); extern HAMLIB_EXPORT(const char *) rig_strmtype(chan_type_t mtype); extern HAMLIB_EXPORT(const char *) rig_strspectrummode(enum rig_spectrum_mode_e mode); +extern HAMLIB_EXPORT(const char *) rig_strcommstatus(rig_comm_status_t vfo); extern HAMLIB_EXPORT(rmode_t) rig_parse_mode(const char *s); extern HAMLIB_EXPORT(vfo_t) rig_parse_vfo(const char *s); @@ -3430,6 +3854,14 @@ extern HAMLIB_EXPORT(int) rig_get_lock_mode(RIG *rig, int *lock); extern HAMLIB_EXPORT(int) rig_is_model(RIG *rig, rig_model_t model); +extern HAMLIB_EXPORT(char*) rig_date_strget(char *buf, int buflen, int localtime); + +enum GPIO { GPIO1, GPIO2, GPIO3, GPIO4 }; +extern HAMLIB_EXPORT(int) rig_cm108_get_bit(hamlib_port_t *p, enum GPIO gpio, int *bit); +extern HAMLIB_EXPORT(int) rig_cm108_set_bit(hamlib_port_t *p, enum GPIO gpio, int bit); +extern HAMLIB_EXPORT(int) rig_band_changed(RIG *rig, hamlib_bandselect_t band); + +extern HAMLIB_EXPORT(void *) rig_data_pointer(RIG *rig, rig_ptrx_t idx); //! @endcond diff --git a/hamlib/riglist.h b/hamlib/riglist.h index 3c347da..6723445 100644 --- a/hamlib/riglist.h +++ b/hamlib/riglist.h @@ -33,6 +33,8 @@ #define RIG_MAKE_MODEL(a,b) ((a)*MAX_MODELS_PER_BACKEND+(b)) #define RIG_BACKEND_NUM(a) ((a)/MAX_MODELS_PER_BACKEND) +//! @endcond + /*! \file riglist.h * \brief Hamlib rig(radio) model definitions. * @@ -49,6 +51,13 @@ * whishes to use. It is done with the rig_init() API call. */ +/** + * \def RIG_MODEL_NONE + * \brief A macro that returns the model number for an unknown model. + * + * The none backend, as the name suggests, does nothing. It is mainly for + * internal use. + */ #define RIG_MODEL_NONE 0 /*! \def RIG_MODEL_DUMMY @@ -62,16 +71,21 @@ * It has also been expanded to provide support to "virtual" type of rigs * such as the network rig control backend and W1HKJ's Flrig application. */ +//! @cond Doxygen_Suppress #define RIG_DUMMY 0 #define RIG_BACKEND_DUMMY "dummy" +//! @endcond #define RIG_MODEL_DUMMY RIG_MAKE_MODEL(RIG_DUMMY, 1) +//! @cond Doxygen_Suppress #define RIG_MODEL_NETRIGCTL RIG_MAKE_MODEL(RIG_DUMMY, 2) #define RIG_MODEL_ARMSTRONG RIG_MAKE_MODEL(RIG_DUMMY, 3) #define RIG_MODEL_FLRIG RIG_MAKE_MODEL(RIG_DUMMY, 4) #define RIG_MODEL_TRXMANAGER_RIG RIG_MAKE_MODEL(RIG_DUMMY, 5) #define RIG_MODEL_DUMMY_NOVFO RIG_MAKE_MODEL(RIG_DUMMY, 6) #define RIG_MODEL_TCI1X RIG_MAKE_MODEL(RIG_DUMMY, 7) - +#define RIG_MODEL_ACLOG RIG_MAKE_MODEL(RIG_DUMMY, 8) +#define RIG_MODEL_SDRSHARP RIG_MAKE_MODEL(RIG_DUMMY, 9) +#define RIG_MODEL_QUISK RIG_MAKE_MODEL(RIG_DUMMY, 10) /* * Yaesu @@ -127,7 +141,8 @@ #define RIG_MODEL_FT650 RIG_MAKE_MODEL(RIG_YAESU, 47) #define RIG_MODEL_FT990UNI RIG_MAKE_MODEL(RIG_YAESU, 48) #define RIG_MODEL_FT710 RIG_MAKE_MODEL(RIG_YAESU, 49) - +#define RIG_MODEL_FT9000OLD RIG_MAKE_MODEL(RIG_YAESU, 50) +#define RIG_MODEL_Q900 RIG_MAKE_MODEL(RIG_YAESU, 51) /* * Kenwood @@ -186,6 +201,9 @@ #define RIG_MODEL_LAB599_TX500 RIG_MAKE_MODEL(RIG_KENWOOD,50) #define RIG_MODEL_SDRUNO RIG_MAKE_MODEL(RIG_KENWOOD,51) #define RIG_MODEL_QRPLABS RIG_MAKE_MODEL(RIG_KENWOOD,52) +#define RIG_MODEL_FX4 RIG_MAKE_MODEL(RIG_KENWOOD,53) +#define RIG_MODEL_THETIS RIG_MAKE_MODEL(RIG_KENWOOD, 54) +#define RIG_MODEL_TRUSDX RIG_MAKE_MODEL(RIG_KENWOOD, 55) /* * Icom @@ -273,7 +291,7 @@ #define RIG_MODEL_X6100 RIG_MAKE_MODEL(RIG_ICOM, 87) /* Xiegu X6100 */ #define RIG_MODEL_G90 RIG_MAKE_MODEL(RIG_ICOM, 88) /* Xiegu G90 */ #define RIG_MODEL_X5105 RIG_MAKE_MODEL(RIG_ICOM, 89) /* Xiegu X5105 -- G90 compatible */ - +#define RIG_MODEL_IC905 RIG_MAKE_MODEL(RIG_ICOM, 90) /* * Optoelectronics (CI-V) @@ -283,7 +301,6 @@ #define RIG_MODEL_OS535 RIG_MAKE_MODEL(RIG_ICOM, 52) #define RIG_MODEL_OS456 RIG_MAKE_MODEL(RIG_ICOM, 53) - /* * TenTec (CI-V) */ @@ -292,7 +309,6 @@ #define RIG_MODEL_PARAGON2 RIG_MAKE_MODEL(RIG_ICOM, 59) #define RIG_MODEL_DELTAII RIG_MAKE_MODEL(RIG_ICOM, 64) - /* * Icom PCR */ @@ -303,7 +319,6 @@ #define RIG_MODEL_PCR1500 RIG_MAKE_MODEL(RIG_PCR, 3) #define RIG_MODEL_PCR2500 RIG_MAKE_MODEL(RIG_PCR, 4) - /* * AOR */ @@ -326,7 +341,6 @@ #define RIG_MODEL_AR7030P RIG_MAKE_MODEL(RIG_AOR, 15) #define RIG_MODEL_SR2200 RIG_MAKE_MODEL(RIG_AOR, 16) - /* * JRC */ @@ -340,7 +354,6 @@ #define RIG_MODEL_NRD535 RIG_MAKE_MODEL(RIG_JRC, 6) #define RIG_MODEL_NRD545 RIG_MAKE_MODEL(RIG_JRC, 7) - /* * Radio Shack * Actually, they might be either Icom or Uniden. TBC --SF @@ -354,7 +367,6 @@ #define RIG_MODEL_RS2042 RIG_MAKE_MODEL(RIG_RADIOSHACK, 5) /* w/ OptoElectronics OS435 Board */ #define RIG_MODEL_RS2041 RIG_MAKE_MODEL(RIG_RADIOSHACK, 6) /* PRO-2041 */ - /* * Uniden */ @@ -373,7 +385,6 @@ #define RIG_MODEL_BCD996T RIG_MAKE_MODEL(RIG_UNIDEN, 11) #define RIG_MODEL_BC898 RIG_MAKE_MODEL(RIG_UNIDEN, 12) - /* * Drake */ @@ -383,7 +394,6 @@ #define RIG_MODEL_DKR8A RIG_MAKE_MODEL(RIG_DRAKE, 2) #define RIG_MODEL_DKR8B RIG_MAKE_MODEL(RIG_DRAKE, 3) - /* * Lowe */ @@ -394,7 +404,6 @@ #define RIG_MODEL_HF250 RIG_MAKE_MODEL(RIG_LOWE, 3) #define RIG_MODEL_HF235 RIG_MAKE_MODEL(RIG_LOWE, 4) - /* * Racal */ @@ -406,7 +415,6 @@ #define RIG_MODEL_RA3710 RIG_MAKE_MODEL(RIG_RACAL, 4) #define RIG_MODEL_RA3702 RIG_MAKE_MODEL(RIG_RACAL, 5) - /* * Watkins-Johnson */ @@ -417,7 +425,6 @@ #define RIG_MODEL_WJ8711 RIG_MAKE_MODEL(RIG_WJ, 3) #define RIG_MODEL_WJ8888 RIG_MAKE_MODEL(RIG_WJ, 4) - /* * Rohde & Schwarz--ek */ @@ -429,7 +436,6 @@ #define RIG_MODEL_EK895 RIG_MAKE_MODEL(RIG_EK, 4) #define RIG_MODEL_EK070 RIG_MAKE_MODEL(RIG_EK, 5) - /* * Skanti */ @@ -440,7 +446,6 @@ #define RIG_MODEL_TRP9000 RIG_MAKE_MODEL(RIG_SKANTI, 3) #define RIG_MODEL_TRP8255 RIG_MAKE_MODEL(RIG_SKANTI, 4) - /* * WiNRADiO/LinRADiO */ @@ -458,7 +463,6 @@ #define RIG_MODEL_G305 RIG_MAKE_MODEL(RIG_WINRADIO, 10) #define RIG_MODEL_G315 RIG_MAKE_MODEL(RIG_WINRADIO, 11) - /* * Ten Tec */ @@ -477,7 +481,6 @@ #define RIG_MODEL_RX331 RIG_MAKE_MODEL(RIG_TENTEC, 12) #define RIG_MODEL_TT599 RIG_MAKE_MODEL(RIG_TENTEC, 13) /* Eagle */ - /* * Alinco */ @@ -486,7 +489,6 @@ #define RIG_MODEL_DX77 RIG_MAKE_MODEL(RIG_ALINCO, 1) #define RIG_MODEL_DXSR8 RIG_MAKE_MODEL(RIG_ALINCO, 2) - /* * Kachina */ @@ -494,7 +496,6 @@ #define RIG_BACKEND_KACHINA "kachina" #define RIG_MODEL_505DSP RIG_MAKE_MODEL(RIG_KACHINA, 1) - /* * Gnuradio backend */ @@ -506,7 +507,6 @@ #define RIG_MODEL_GRAUDIOIQ RIG_MAKE_MODEL(RIG_GNURADIO, 4) /* I&Q stereo sound card source */ #define RIG_MODEL_USRP_G RIG_MAKE_MODEL(RIG_GNURADIO, 5) /* Universal Software Radio Peripheral */ - /* * Microtune tuners */ @@ -516,7 +516,6 @@ #define RIG_MODEL_MICROTUNE_4702 RIG_MAKE_MODEL(RIG_MICROTUNE, 2) /* Alan's */ #define RIG_MODEL_MICROTUNE_4707 RIG_MAKE_MODEL(RIG_MICROTUNE, 3) - /* * TAPR */ @@ -524,7 +523,6 @@ #define RIG_BACKEND_TAPR "tapr" #define RIG_MODEL_DSP10 RIG_MAKE_MODEL(RIG_TAPR, 1) - /* * Flex-radio */ @@ -535,7 +533,6 @@ #define RIG_MODEL_DTTSP RIG_MAKE_MODEL(RIG_FLEXRADIO, 3) #define RIG_MODEL_DTTSP_UDP RIG_MAKE_MODEL(RIG_FLEXRADIO, 4) - /* * VEB Funkwerk Köpenick RFT */ @@ -543,7 +540,6 @@ #define RIG_BACKEND_RFT "rft" #define RIG_MODEL_EKD500 RIG_MAKE_MODEL(RIG_RFT, 1) - /* * Various kits */ @@ -569,7 +565,6 @@ #define RIG_MODEL_FUNCUBEDONGLEPLUS RIG_MAKE_MODEL(RIG_KIT, 18) /* FunCUBE Dongle Pro+ */ #define RIG_MODEL_RSHFIQ RIG_MAKE_MODEL(RIG_KIT, 19) /* RS-HFIQ */ - /* * SW/FM/TV tuner cards supported by Video4Linux,*BSD, .. */ @@ -578,7 +573,6 @@ #define RIG_MODEL_V4L RIG_MAKE_MODEL(RIG_TUNER, 1) #define RIG_MODEL_V4L2 RIG_MAKE_MODEL(RIG_TUNER, 2) - /* * Rohde & Schwarz--rs */ @@ -589,7 +583,6 @@ #define RIG_MODEL_XK2100 RIG_MAKE_MODEL(RIG_RS, 3) #define RIG_MODEL_EK89X RIG_MAKE_MODEL(RIG_RS, 4) - /* * Phillips/Simoco PRM80 */ @@ -598,7 +591,6 @@ #define RIG_MODEL_PRM8060 RIG_MAKE_MODEL(RIG_PRM80, 1) #define RIG_MODEL_PRM8070 RIG_MAKE_MODEL(RIG_PRM80, 2) - /* * ADAT by HB9CBU * @@ -608,7 +600,6 @@ #define RIG_BACKEND_ADAT "adat" #define RIG_MODEL_ADT_200A RIG_MAKE_MODEL(RIG_ADAT, 1) - /* * ICOM Marine */ @@ -619,7 +610,6 @@ #define RIG_MODEL_IC_M710 RIG_MAKE_MODEL(RIG_ICMARINE, 3) #define RIG_MODEL_IC_M803 RIG_MAKE_MODEL(RIG_ICMARINE, 4) - /* * Dorji transceiver modules */ @@ -636,6 +626,7 @@ #define RIG_MODEL_BARRETT_2050 RIG_MAKE_MODEL(RIG_BARRETT, 1) #define RIG_MODEL_BARRETT_950 RIG_MAKE_MODEL(RIG_BARRETT, 2) #define RIG_MODEL_BARRETT_4050 RIG_MAKE_MODEL(RIG_BARRETT, 3) +#define RIG_MODEL_BARRETT_4100 RIG_MAKE_MODEL(RIG_BARRETT, 4) /* * Elad @@ -658,8 +649,14 @@ #define RIG_GOMSPACE 35 #define RIG_BACKEND_GOMSPACE "gomspace" #define RIG_MODEL_GS100 RIG_MAKE_MODEL(RIG_GOMSPACE, 1) -//! @endcond +/* + * MDS Microwave Data Systems https://en.wikipedia.org/wiki/Microwave_Data_Systems + */ +#define RIG_MDS 36 +#define RIG_BACKEND_MDS "MDS" +#define RIG_MODEL_MDS4710 RIG_MAKE_MODEL(RIG_MDS, 1) +#define RIG_MODEL_MDS9710 RIG_MAKE_MODEL(RIG_MDS, 2) /* * TODO: RIG_MODEL_KWZ30, KNEISNER +DOERING @@ -667,6 +664,15 @@ etc. */ +/* + * AnyTone rigs + */ +#define RIG_ANYTONE 37 +#define RIG_BACKEND_ANYTONE "AnyTone" +#define RIG_MODEL_ATD578UVIII RIG_MAKE_MODEL(RIG_ANYTONE, 1) + + +//! @endcond /*! \typedef typedef int rig_model_t \brief Convenience type definition for rig model. diff --git a/hamlib/rotator.h b/hamlib/rotator.h index 0b67230..7468752 100644 --- a/hamlib/rotator.h +++ b/hamlib/rotator.h @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ #ifndef _ROTATOR_H #define _ROTATOR_H 1 @@ -413,8 +414,8 @@ struct rot_caps { int (*rot_open)(ROT *rot); /*!< Pointer to backend implementation of ::rot_open(). */ int (*rot_close)(ROT *rot); /*!< Pointer to backend implementation of ::rot_close(). */ - int (*set_conf)(ROT *rot, token_t token, const char *val); /*!< Pointer to backend implementation of ::rot_set_conf(). */ - int (*get_conf)(ROT *rot, token_t token, char *val); /*!< Pointer to backend implementation of ::rot_get_conf(). */ + int (*set_conf)(ROT *rot, hamlib_token_t token, const char *val); /*!< Pointer to backend implementation of ::rot_set_conf(). */ + int (*get_conf)(ROT *rot, hamlib_token_t token, char *val); /*!< Pointer to backend implementation of ::rot_get_conf(). */ /* * General API commands, from most primitive to least.. :() @@ -441,19 +442,19 @@ struct rot_caps { int (*set_parm)(ROT *rot, setting_t parm, value_t val); /*!< Pointer to backend implementation of ::rot_set_parm(). */ int (*get_parm)(ROT *rot, setting_t parm, value_t *val); /*!< Pointer to backend implementation of ::rot_get_parm(). */ - int (*set_ext_level)(ROT *rot, token_t token, value_t val); /*!< Pointer to backend implementation of ::rot_set_ext_level(). */ - int (*get_ext_level)(ROT *rot, token_t token, value_t *val); /*!< Pointer to backend implementation of ::rot_get_ext_level(). */ + int (*set_ext_level)(ROT *rot, hamlib_token_t token, value_t val); /*!< Pointer to backend implementation of ::rot_set_ext_level(). */ + int (*get_ext_level)(ROT *rot, hamlib_token_t token, value_t *val); /*!< Pointer to backend implementation of ::rot_get_ext_level(). */ - int (*set_ext_func)(ROT *rot, token_t token, int status); /*!< Pointer to backend implementation of ::rot_set_ext_func(). */ - int (*get_ext_func)(ROT *rot, token_t token, int *status); /*!< Pointer to backend implementation of ::rot_get_ext_func(). */ + int (*set_ext_func)(ROT *rot, hamlib_token_t token, int status); /*!< Pointer to backend implementation of ::rot_set_ext_func(). */ + int (*get_ext_func)(ROT *rot, hamlib_token_t token, int *status); /*!< Pointer to backend implementation of ::rot_get_ext_func(). */ - int (*set_ext_parm)(ROT *rot, token_t token, value_t val); /*!< Pointer to backend implementation of ::rot_set_ext_parm(). */ - int (*get_ext_parm)(ROT *rot, token_t token, value_t *val); /*!< Pointer to backend implementation of ::rot_get_ext_parm(). */ + int (*set_ext_parm)(ROT *rot, hamlib_token_t token, value_t val); /*!< Pointer to backend implementation of ::rot_set_ext_parm(). */ + int (*get_ext_parm)(ROT *rot, hamlib_token_t token, value_t *val); /*!< Pointer to backend implementation of ::rot_get_ext_parm(). */ int (*get_status)(ROT *rot, rot_status_t *status); /*!< Pointer to backend implementation of ::rot_get_status(). */ const char *macro_name; /*!< Rotator model macro name. */ - int (*get_conf2)(ROT *rot, token_t token, char *val, int val_len); /*!< Pointer to backend implementation of ::rot_get_conf2(). */ + int (*get_conf2)(ROT *rot, hamlib_token_t token, char *val, int val_len); /*!< Pointer to backend implementation of ::rot_get_conf2(). */ }; //! @cond Doxygen_Suppress #define ROT_MODEL(arg) .rot_model=arg,.macro_name=#arg @@ -544,16 +545,16 @@ rot_cleanup HAMLIB_PARAMS((ROT *rot)); extern HAMLIB_EXPORT(int) rot_set_conf HAMLIB_PARAMS((ROT *rot, - token_t token, + hamlib_token_t token, const char *val)); extern HAMLIB_EXPORT(int) rot_get_conf HAMLIB_PARAMS((ROT *rot, - token_t token, + hamlib_token_t token, char *val)); extern HAMLIB_EXPORT(int) rot_get_conf2 HAMLIB_PARAMS((ROT *rot, - token_t token, + hamlib_token_t token, char *val, int val_len)); @@ -635,29 +636,29 @@ rot_get_parm HAMLIB_PARAMS((ROT *rig, extern HAMLIB_EXPORT(int) rot_set_ext_level HAMLIB_PARAMS((ROT *rig, - token_t token, + hamlib_token_t token, value_t val)); extern HAMLIB_EXPORT(int) rot_get_ext_level HAMLIB_PARAMS((ROT *rig, - token_t token, + hamlib_token_t token, value_t *val)); extern HAMLIB_EXPORT(int) rot_set_ext_func HAMLIB_PARAMS((ROT *rig, - token_t token, + hamlib_token_t token, int status)); extern HAMLIB_EXPORT(int) rot_get_ext_func HAMLIB_PARAMS((ROT *rig, - token_t token, + hamlib_token_t token, int *status)); extern HAMLIB_EXPORT(int) rot_set_ext_parm HAMLIB_PARAMS((ROT *rig, - token_t token, + hamlib_token_t token, value_t val)); extern HAMLIB_EXPORT(int) rot_get_ext_parm HAMLIB_PARAMS((ROT *rig, - token_t token, + hamlib_token_t token, value_t *val)); extern HAMLIB_EXPORT(const char *) @@ -700,7 +701,7 @@ extern HAMLIB_EXPORT(const struct confparams *) rot_confparam_lookup HAMLIB_PARAMS((ROT *rot, const char *name)); -extern HAMLIB_EXPORT(token_t) +extern HAMLIB_EXPORT(hamlib_token_t) rot_token_lookup HAMLIB_PARAMS((ROT *rot, const char *name)); @@ -729,8 +730,8 @@ rot_ext_lookup HAMLIB_PARAMS((ROT *rot, extern HAMLIB_EXPORT(const struct confparams *) rot_ext_lookup_tok HAMLIB_PARAMS((ROT *rot, - token_t token)); -extern HAMLIB_EXPORT(token_t) + hamlib_token_t token)); +extern HAMLIB_EXPORT(hamlib_token_t) rot_ext_token_lookup HAMLIB_PARAMS((ROT *rot, const char *name)); @@ -797,6 +798,8 @@ extern HAMLIB_EXPORT(const char *) rot_strlevel(setting_t); extern HAMLIB_EXPORT(const char *) rot_strparm(setting_t); extern HAMLIB_EXPORT(const char *) rot_strstatus(rot_status_t); +extern HAMLIB_EXPORT(void *) rot_data_pointer(ROT *rot, rig_ptrx_t idx); + //! @endcond /** diff --git a/hamlib/rotlist.h b/hamlib/rotlist.h index a96b9a5..d043a14 100644 --- a/hamlib/rotlist.h +++ b/hamlib/rotlist.h @@ -637,9 +637,17 @@ #define ROT_MODEL_ANDROIDSENSOR ROT_MAKE_MODEL(ROT_ANDROIDSENSOR, 1) /** - * \brief A macro that returns the model number of the GRBLTRK backend. + * \brief A macro that returns the model number of the ROT_MODEL_GRBLTRK_SER backend. * - * \def ROT_MODEL_GRBLTRK + * \def ROT_MODEL_GRBLTRK_SER + * + * The GRBLTRK backend can be used with rotators that support the GRBL + * protocol. + */ +/** + * \brief A macro that returns the model number of the ROT_MODEL_GRBLTRK_NET backend. + * + * \def ROT_MODEL_GRBLTRK_NET * * The GRBLTRK backend can be used with rotators that support the GRBL * protocol. @@ -651,6 +659,48 @@ #define ROT_MODEL_GRBLTRK_SER ROT_MAKE_MODEL(ROT_GRBLTRK, 1) #define ROT_MODEL_GRBLTRK_NET ROT_MAKE_MODEL(ROT_GRBLTRK, 2) +/** + * \brief A macro that returns the model number of the FLIR backend. + * + * \def ROT_MODEL_FLIR + * + * The FLIR backend can be used with FLIR and DirectedPercepition + * rotators using the PTU protocol (e.g. PTU-D48). Currently only + * the serial interface is supported and no ethernet. + */ +//! @cond Doxygen_Suppress +#define ROT_FLIR 25 +#define ROT_BACKEND_FLIR "flir" +//! @endcond +#define ROT_MODEL_FLIR ROT_MAKE_MODEL(ROT_FLIR, 1) + +/** + * \brief A macro that returns the model number of the APEX backend. + * + * \def ROT_MODEL_APEX_SHARED_LOOP + * + * The APEX backend can be used with APEX * rotators. + */ +//! @cond Doxygen_Suppress +#define ROT_APEX 26 +#define ROT_BACKEND_APEX "apex" +//! @endcond +#define ROT_MODEL_APEX_SHARED_LOOP ROT_MAKE_MODEL(ROT_APEX, 1) + +/** + * \brief A macro that returns the model number of the SAEBRTRACK backend. + * + * \def ROT_MODEL_SAEBRTRACK + * + * The SAEBRTRACK backend can be used with SAEBRTRACK * rotators. + */ +//! @cond Doxygen_Suppress +#define ROT_SAEBRTRACK 27 +#define ROT_BACKEND_SAEBRTRACK "SAEBRTrack" +//! @endcond +#define ROT_MODEL_SAEBRTRACK ROT_MAKE_MODEL(ROT_SAEBRTRACK, 1) + + /** * \brief Convenience type definition for a rotator model. *