kopia lustrzana https://github.com/Hamlib/Hamlib
Merge upstream changes and fix conflicts. Use snprintf() in most sprintflst.c functions to avoid buffer overflows.
commit
051e671bfa
2
NEWS
2
NEWS
|
@ -13,6 +13,8 @@ Version 5.x -- future
|
|||
* Change FT1000MP Mark V model names to align with FT1000MP
|
||||
|
||||
Version 4.6
|
||||
* Added Thetis entry -- derived from FlexRadio/Apache PowerSDR
|
||||
* Added VOICE/CW memory capability to many rigs -- thanks to David Balharrie M0DGB/G8FKH
|
||||
* Add -# --skip_init option to rigctl to skip rig initialization -- useful for executing commands quickly
|
||||
* rig_caps is no longer constant -- this may break some 3rd party relying on the "const" declaration. Here's an example of how to handle compatiblity.
|
||||
#ifdef RIGCAPS_NOT_CONST
|
||||
|
|
|
@ -1168,7 +1168,7 @@ VFO reset, \(oq4\(cq = Memory Clear reset, \(oq8\(cq = Master reset.
|
|||
.IP
|
||||
Since these values are defined as a bitmask in
|
||||
.IR include/hamlib/rig.h ,
|
||||
it should be possible to AND these values together to do multiple resets at
|
||||
it should be possible to OR these values together to do multiple resets at
|
||||
once, if the backend supports it or supports a reset action via rig control at
|
||||
all.
|
||||
.
|
||||
|
|
|
@ -1052,7 +1052,7 @@ VFO reset, \(oq4\(cq = Memory Clear reset, \(oq8\(cq = Master reset.
|
|||
.IP
|
||||
Since these values are defined as a bitmask in
|
||||
.IR include/hamlib/rig.h ,
|
||||
it should be possible to AND these values together to do multiple resets at
|
||||
it should be possible to OR these values together to do multiple resets at
|
||||
once, if the backend supports it or supports a reset action via rig control at
|
||||
all.
|
||||
.
|
||||
|
|
|
@ -1669,11 +1669,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
|
||||
|
|
|
@ -201,6 +201,7 @@
|
|||
#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)
|
||||
|
||||
/*
|
||||
* Icom
|
||||
|
|
|
@ -141,7 +141,7 @@ static const struct confparams flrig_ext_parms[] =
|
|||
struct rig_caps flrig_caps =
|
||||
{
|
||||
RIG_MODEL(RIG_MODEL_FLRIG),
|
||||
.model_name = "FLRig",
|
||||
.model_name = "",
|
||||
.mfg_name = "FLRig",
|
||||
.version = "20231216.0",
|
||||
.copyright = "LGPL",
|
||||
|
|
|
@ -736,6 +736,18 @@ static int netrigctl_open(RIG *rig)
|
|||
|
||||
if (!has) { rig->caps->get_conf = NULL; }
|
||||
}
|
||||
else if (strcmp(setting, "has_get_ant") == 0)
|
||||
{
|
||||
int has = strtol(value, NULL, 0);
|
||||
|
||||
if (!has) { rig->caps->get_ant = NULL; }
|
||||
}
|
||||
else if (strcmp(setting, "has_set_ant") == 0)
|
||||
{
|
||||
int has = strtol(value, NULL, 0);
|
||||
|
||||
if (!has) { rig->caps->set_ant = NULL; }
|
||||
}
|
||||
|
||||
#if 0 // for the future
|
||||
else if (strcmp(setting, "has_set_trn") == 0)
|
||||
|
@ -2811,7 +2823,7 @@ struct rig_caps netrigctl_caps =
|
|||
RIG_MODEL(RIG_MODEL_NETRIGCTL),
|
||||
.model_name = "NET rigctl",
|
||||
.mfg_name = "Hamlib",
|
||||
.version = "20231004.0",
|
||||
.version = "20231229.0",
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_STABLE,
|
||||
.rig_type = RIG_TYPE_OTHER,
|
||||
|
|
Plik binarny nie jest wyświetlany.
|
@ -86,11 +86,11 @@ struct rig_caps ic703_caps =
|
|||
RIG_MODEL(RIG_MODEL_IC703),
|
||||
.model_name = "IC-703",
|
||||
.mfg_name = "Icom",
|
||||
.version = BACKEND_VER ".1",
|
||||
.version = BACKEND_VER ".2",
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_STABLE,
|
||||
.rig_type = RIG_TYPE_MOBILE,
|
||||
.ptt_type = RIG_PTT_NONE,
|
||||
.ptt_type = RIG_PTT_RIG,
|
||||
.dcd_type = RIG_DCD_RIG,
|
||||
.port_type = RIG_PORT_SERIAL,
|
||||
.serial_rate_min = 300,
|
||||
|
|
|
@ -391,6 +391,7 @@ struct rig_caps ic7100_caps =
|
|||
{ 1, 396, RIG_MTYPE_MEM },
|
||||
{ 397, 400, RIG_MTYPE_CALL },
|
||||
{ 401, 424, RIG_MTYPE_EDGE },
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -152,6 +152,23 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo);
|
|||
#define IC705_OTHER_TX_MODES (RIG_MODE_FM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR)
|
||||
#define IC705_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_MODE|RIG_LEVEL_SPECTRUM_SPAN|RIG_LEVEL_SPECTRUM_SPEED|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_SPECTRUM_AVG|RIG_LEVEL_SPECTRUM_EDGE_LOW|RIG_LEVEL_SPECTRUM_EDGE_HIGH)
|
||||
|
||||
#define IC705_RFPOWER_METER_CAL { 13, \
|
||||
{ \
|
||||
{ 0, 0.0f }, \
|
||||
{ 21, 0.50f }, \
|
||||
{ 43, 1.00f }, \
|
||||
{ 65, 1.50f }, \
|
||||
{ 83, 2.00f }, \
|
||||
{ 95, 2.50f }, \
|
||||
{ 105, 3.00f }, \
|
||||
{ 114, 3.50f }, \
|
||||
{ 124, 4.00f }, \
|
||||
{ 143, 5.00f }, \
|
||||
{ 183, 7.50f }, \
|
||||
{ 213, 10.0f }, \
|
||||
{ 255, 12.0f } \
|
||||
} }
|
||||
|
||||
/*
|
||||
* IC9700 items that differ from IC7300
|
||||
*/
|
||||
|
@ -779,11 +796,10 @@ struct rig_caps ic7300_caps =
|
|||
.transceive = RIG_TRN_RIG,
|
||||
.bank_qty = 1,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
@ -1345,11 +1361,10 @@ struct rig_caps ic705_caps =
|
|||
.transceive = RIG_TRN_RIG,
|
||||
.bank_qty = 5,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
@ -1434,7 +1449,7 @@ struct rig_caps ic705_caps =
|
|||
.str_cal = IC7300_STR_CAL,
|
||||
.swr_cal = IC7300_SWR_CAL,
|
||||
.alc_cal = IC7300_ALC_CAL,
|
||||
.rfpower_meter_cal = IC7300_RFPOWER_METER_CAL,
|
||||
.rfpower_meter_cal = IC705_RFPOWER_METER_CAL,
|
||||
.comp_meter_cal = IC7300_COMP_METER_CAL,
|
||||
.vd_meter_cal = IC7300_VD_METER_CAL,
|
||||
.id_meter_cal = IC7300_ID_METER_CAL,
|
||||
|
@ -1619,11 +1634,10 @@ struct rig_caps ic905_caps =
|
|||
.transceive = RIG_TRN_RIG,
|
||||
.bank_qty = 5,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
@ -1705,7 +1719,7 @@ struct rig_caps ic905_caps =
|
|||
.str_cal = IC7300_STR_CAL,
|
||||
.swr_cal = IC7300_SWR_CAL,
|
||||
.alc_cal = IC7300_ALC_CAL,
|
||||
.rfpower_meter_cal = IC7300_RFPOWER_METER_CAL,
|
||||
.rfpower_meter_cal = IC705_RFPOWER_METER_CAL,
|
||||
.comp_meter_cal = IC7300_COMP_METER_CAL,
|
||||
.vd_meter_cal = IC7300_VD_METER_CAL,
|
||||
.id_meter_cal = IC7300_ID_METER_CAL,
|
||||
|
|
|
@ -157,7 +157,7 @@ struct rig_caps ic737_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -162,7 +162,7 @@ struct rig_caps ic738_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -178,6 +178,7 @@ struct rig_caps ic7410_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
@ -245,7 +246,7 @@ struct rig_caps ic7410_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -297,7 +297,7 @@ struct rig_caps ic746_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -209,7 +209,7 @@ struct rig_caps ic751_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -350,6 +350,7 @@ struct rig_caps ic7600_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
@ -426,7 +427,7 @@ struct rig_caps ic7600_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -174,7 +174,7 @@ struct rig_caps ic761_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -433,6 +433,8 @@ struct rig_caps ic7610_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
|
||||
{ 1, 8, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -325,6 +325,7 @@ struct rig_caps ic7700_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -222,6 +222,7 @@ struct rig_caps ic7800_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM },
|
||||
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -8475,6 +8475,10 @@ int icom_power2mW(RIG *rig, unsigned int *mwpower, float power, freq_t freq,
|
|||
|
||||
switch (rig_id)
|
||||
{
|
||||
case RIG_MODEL_IC705:
|
||||
case RIG_MODEL_IC905:
|
||||
*mwpower = power * 10000;
|
||||
break;
|
||||
default:
|
||||
/* Normal 100 Watts */
|
||||
*mwpower = power * 100000;
|
||||
|
|
|
@ -169,7 +169,7 @@ struct rig_caps id1_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -168,7 +168,7 @@ struct rig_caps id31_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -176,7 +176,7 @@ struct rig_caps id4100_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -142,7 +142,7 @@ int id5100_set_vfo(RIG *rig, vfo_t vfo)
|
|||
RETURNFUNC2(retval);
|
||||
}
|
||||
|
||||
return retval;
|
||||
RETURNFUNC(retval);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ struct rig_caps omnivip_caps =
|
|||
.rig_cleanup = icom_cleanup,
|
||||
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
.set_mode = icom_set_mode,
|
||||
|
|
|
@ -153,7 +153,7 @@ struct rig_caps perseus_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -273,7 +273,7 @@ struct rig_caps x108g_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = x108g_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
@ -464,7 +464,7 @@ struct rig_caps x6100_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
@ -512,12 +512,31 @@ struct rig_caps x6100_caps =
|
|||
.hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS
|
||||
};
|
||||
|
||||
int g90_rig_open(RIG *rig)
|
||||
{
|
||||
int retval;
|
||||
unsigned char id[2];
|
||||
int id_len = 2;
|
||||
int cmd = 0x19;
|
||||
int subcmd = 0x1d;
|
||||
short iid;
|
||||
retval = icom_transaction(rig, cmd, subcmd, NULL, 0, id, &id_len);
|
||||
|
||||
if (retval == RIG_OK)
|
||||
{
|
||||
memcpy(&iid, id, 2);
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "Xiegu Radio ID=0x%04x\n", iid);
|
||||
}
|
||||
|
||||
return icom_rig_open(rig);
|
||||
}
|
||||
|
||||
struct rig_caps g90_caps =
|
||||
{
|
||||
RIG_MODEL(RIG_MODEL_G90),
|
||||
.model_name = "G90",
|
||||
.mfg_name = "Xiegu",
|
||||
.version = BACKEND_VER ".6",
|
||||
.version = BACKEND_VER ".7",
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_STABLE,
|
||||
.rig_type = RIG_TYPE_TRANSCEIVER,
|
||||
|
@ -639,8 +658,8 @@ struct rig_caps g90_caps =
|
|||
.priv = (void *)& x108g_priv_caps,
|
||||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_open = g90_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
@ -815,7 +834,7 @@ struct rig_caps x5105_caps =
|
|||
.rig_init = icom_init,
|
||||
.rig_cleanup = icom_cleanup,
|
||||
.rig_open = icom_rig_open,
|
||||
.rig_close = icom_rig_open,
|
||||
.rig_close = icom_rig_close,
|
||||
|
||||
.set_freq = icom_set_freq,
|
||||
.get_freq = icom_get_freq,
|
||||
|
|
|
@ -135,6 +135,7 @@ int flexradio_open(RIG *rig)
|
|||
break;
|
||||
|
||||
case RIG_MODEL_POWERSDR:
|
||||
case RIG_MODEL_THETIS:
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -1372,8 +1372,8 @@ struct rig_caps f6k_caps =
|
|||
struct rig_caps powersdr_caps =
|
||||
{
|
||||
RIG_MODEL(RIG_MODEL_POWERSDR),
|
||||
.model_name = "PowerSDR/Thetis",
|
||||
.mfg_name = "FlexRadio/ANAN",
|
||||
.model_name = "PowerSDR",
|
||||
.mfg_name = "FlexRadio/Apache",
|
||||
.version = "20231107.0",
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_STABLE,
|
||||
|
@ -1518,3 +1518,155 @@ struct rig_caps powersdr_caps =
|
|||
.hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS
|
||||
};
|
||||
|
||||
/*
|
||||
* Thetis rig capabilities. Same as PowerSDR for now but may get new functions
|
||||
*/
|
||||
struct rig_caps thetis_caps =
|
||||
{
|
||||
RIG_MODEL(RIG_MODEL_THETIS),
|
||||
.model_name = "",
|
||||
.mfg_name = "Thetis",
|
||||
.version = "20231222.0",
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_STABLE,
|
||||
.rig_type = RIG_TYPE_TRANSCEIVER,
|
||||
.ptt_type = RIG_PTT_RIG,
|
||||
.dcd_type = RIG_DCD_NONE,
|
||||
.port_type = RIG_PORT_SERIAL,
|
||||
.serial_rate_min = 300,
|
||||
.serial_rate_max = 115200,
|
||||
.serial_data_bits = 8,
|
||||
.serial_stop_bits = 1,
|
||||
.serial_parity = RIG_PARITY_NONE,
|
||||
.serial_handshake = RIG_HANDSHAKE_NONE,
|
||||
.write_delay = 0,
|
||||
.post_write_delay = 0,
|
||||
// The combination of timeout and retry is important
|
||||
// We need at least 3 seconds to do profile switches
|
||||
// Hitting the timeout is OK as long as we retry
|
||||
// Previous note showed FA/FB may take up to 500ms on band change
|
||||
// Flex 1500 needs about 6 seconds for a band change in PowerSDR
|
||||
.timeout = 800, // some band transitions can take 600ms
|
||||
.retry = 10,
|
||||
|
||||
.has_get_func = POWERSDR_FUNC_ALL,
|
||||
.has_set_func = POWERSDR_FUNC_ALL,
|
||||
.has_get_level = POWERSDR_LEVEL_ALL,
|
||||
.has_set_level = POWERSDR_LEVEL_SET,
|
||||
.has_get_parm = RIG_PARM_BANDSELECT,
|
||||
.has_set_parm = RIG_PARM_BANDSELECT,
|
||||
.level_gran = {
|
||||
#include "level_gran_kenwood.h"
|
||||
[LVL_KEYSPD] = { .min = { .i = 5 }, .max = { .i = 60 }, .step = { .i = 1 } },
|
||||
}, /* FIXME: granularity */
|
||||
.parm_gran = {
|
||||
// there are V00 thru V13 but we don't cover them as of yet -- what rig?
|
||||
[PARM_BANDSELECT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.s = "BAND160M,BAND80M,BAND60M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BAND2M,BANDWWV,BANDGEN"}}
|
||||
},
|
||||
|
||||
//.extlevels = elecraft_ext_levels,
|
||||
//.extparms = kenwood_cfg_params,
|
||||
.preamp = { RIG_DBLST_END, },
|
||||
.attenuator = { RIG_DBLST_END, },
|
||||
.max_rit = Hz(0),
|
||||
.max_xit = Hz(0),
|
||||
.max_ifshift = Hz(0),
|
||||
.vfo_op = kenwood_vfo_op,
|
||||
.vfo_ops = POWERSDR_VFO_OP,
|
||||
.targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE,
|
||||
.transceive = RIG_TRN_RIG,
|
||||
.agc_level_count = 6,
|
||||
.agc_levels = { RIG_AGC_OFF, RIG_AGC_LONG, RIG_AGC_SLOW, RIG_AGC_MEDIUM, RIG_AGC_FAST, RIG_AGC_USER },
|
||||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(30), MHz(77), POWERSDR_MODES, -1, -1, F6K_VFO, F6K_ANTS},
|
||||
{MHz(135), MHz(165), POWERSDR_MODES, -1, - 1, F6K_VFO, F6K_ANTS},
|
||||
RIG_FRNG_END,
|
||||
}, /* rx range */
|
||||
.tx_range_list1 = {
|
||||
FRQ_RNG_HF(1, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS),
|
||||
FRQ_RNG_6m(1, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS),
|
||||
FRQ_RNG_2m(1, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS),
|
||||
RIG_FRNG_END,
|
||||
}, /* tx range */
|
||||
|
||||
.rx_range_list2 = {
|
||||
{kHz(30), MHz(77), POWERSDR_MODES, -1, -1, F6K_VFO, F6K_ANTS},
|
||||
{ MHz(135), MHz(165), POWERSDR_MODES, -1, -1, F6K_VFO, F6K_ANTS},
|
||||
RIG_FRNG_END,
|
||||
}, /* rx range */
|
||||
.tx_range_list2 = {
|
||||
FRQ_RNG_HF(2, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS),
|
||||
FRQ_RNG_6m(2, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS),
|
||||
FRQ_RNG_2m(2, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS),
|
||||
RIG_FRNG_END,
|
||||
}, /* tx range */
|
||||
|
||||
.tuning_steps = {
|
||||
{POWERSDR_MODES, 1},
|
||||
RIG_TS_END,
|
||||
},
|
||||
|
||||
/* mode/filter list, remember: order matters! */
|
||||
.filters = {
|
||||
{RIG_MODE_SSB, kHz(2.7)},
|
||||
{RIG_MODE_SSB, kHz(3.3)},
|
||||
{RIG_MODE_SSB, kHz(1.8)},
|
||||
{RIG_MODE_SSB, kHz(1.6)},
|
||||
{RIG_MODE_SSB, kHz(4.0)},
|
||||
{RIG_MODE_SSB, RIG_FLT_ANY},
|
||||
{RIG_MODE_CW, kHz(0.4)},
|
||||
{RIG_MODE_CW, kHz(1.5)},
|
||||
{RIG_MODE_CW, Hz(50)},
|
||||
{RIG_MODE_CW, kHz(3.0)},
|
||||
{RIG_MODE_CW, RIG_FLT_ANY},
|
||||
{RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, kHz(1.5)},
|
||||
{RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, kHz(3.0)},
|
||||
{RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, kHz(0.1)},
|
||||
{RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, RIG_FLT_ANY},
|
||||
{RIG_MODE_AM, kHz(6)},
|
||||
{RIG_MODE_AM, kHz(14)},
|
||||
{RIG_MODE_AM, kHz(5.6)},
|
||||
{RIG_MODE_AM, kHz(20.0)},
|
||||
{RIG_MODE_AM, RIG_FLT_ANY},
|
||||
{RIG_MODE_FM, kHz(13)}, /* TBC */
|
||||
RIG_FLT_END,
|
||||
},
|
||||
.priv = (void *)& powersdr_priv_caps,
|
||||
|
||||
.rig_init = kenwood_init,
|
||||
.rig_cleanup = kenwood_cleanup,
|
||||
.rig_open = flexradio_open,
|
||||
.rig_close = kenwood_close,
|
||||
.set_freq = kenwood_set_freq,
|
||||
.get_freq = kenwood_get_freq,
|
||||
.set_mode = powersdr_set_mode,
|
||||
.get_mode = powersdr_get_mode,
|
||||
.set_vfo = kenwood_set_vfo,
|
||||
.get_vfo = kenwood_get_vfo_if,
|
||||
.set_split_vfo = kenwood_set_split_vfo,
|
||||
.get_split_vfo = kenwood_get_split_vfo_if,
|
||||
.get_ptt = flex6k_get_ptt,
|
||||
.set_ptt = flex6k_set_ptt,
|
||||
.get_powerstat = kenwood_get_powerstat,
|
||||
.set_powerstat = kenwood_set_powerstat,
|
||||
// TODO copy over kenwood_[set|get]_level and modify to handle DSP filter values
|
||||
// correctly - use actual values instead of indices
|
||||
.set_level = powersdr_set_level,
|
||||
.get_level = powersdr_get_level,
|
||||
.get_func = powersdr_get_func,
|
||||
.set_func = powersdr_set_func,
|
||||
.get_parm = powersdr_get_parm,
|
||||
.set_parm = powersdr_set_parm,
|
||||
//.set_ant = kenwood_set_ant_no_ack,
|
||||
//.get_ant = kenwood_get_ant,
|
||||
.send_morse = kenwood_send_morse,
|
||||
.stop_morse = kenwood_stop_morse,
|
||||
.wait_morse = rig_wait_morse,
|
||||
.hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS
|
||||
};
|
||||
|
||||
|
|
|
@ -160,7 +160,9 @@ struct rig_caps k2_caps =
|
|||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
.chan_list = {
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(500), MHz(30), K2_MODES, -1, -1, K2_VFO, K2_ANTS},
|
||||
|
|
|
@ -238,7 +238,10 @@ struct rig_caps k3_caps =
|
|||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
.chan_list = {
|
||||
{ 1, 4, RIG_MTYPE_VOICE },
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS},
|
||||
|
@ -394,7 +397,10 @@ struct rig_caps k3s_caps =
|
|||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
.chan_list = {
|
||||
{ 1, 4, RIG_MTYPE_VOICE },
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS},
|
||||
|
@ -556,7 +562,10 @@ struct rig_caps k4_caps =
|
|||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
.chan_list = {
|
||||
{ 1, 4, RIG_MTYPE_VOICE },
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K4_ANTS},
|
||||
|
@ -711,7 +720,10 @@ struct rig_caps kx3_caps =
|
|||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
.chan_list = {
|
||||
{ 1, 4, RIG_MTYPE_VOICE },
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS},
|
||||
|
@ -866,7 +878,9 @@ struct rig_caps kx2_caps =
|
|||
.bank_qty = 0,
|
||||
.chan_desc_sz = 0,
|
||||
|
||||
.chan_list = { RIG_CHAN_END },
|
||||
.chan_list = {
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END },
|
||||
|
||||
.rx_range_list1 = {
|
||||
{kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS},
|
||||
|
|
|
@ -710,7 +710,7 @@ int kenwood_safe_transaction(RIG *rig, const char *cmd, char *buf,
|
|||
{
|
||||
size_t length;
|
||||
// some PowerSDR commands have variable len
|
||||
int checklen = !RIG_IS_POWERSDR;
|
||||
int checklen = !RIG_IS_POWERSDR && !RIG_IS_THETIS;
|
||||
err = kenwood_transaction(rig, cmd, buf, buf_size);
|
||||
|
||||
if (err != RIG_OK) /* return immediately on error as any
|
||||
|
@ -5018,6 +5018,7 @@ int kenwood_set_trn(RIG *rig, int trn)
|
|||
char buf[5];
|
||||
|
||||
case RIG_MODEL_POWERSDR: // powersdr doesn't have AI command
|
||||
case RIG_MODEL_THETIS: // powersdr doesn't have AI command
|
||||
RETURNFUNC(-RIG_ENAVAIL);
|
||||
|
||||
case RIG_MODEL_TS990S:
|
||||
|
@ -5052,7 +5053,7 @@ int kenwood_get_trn(RIG *rig, int *trn)
|
|||
|
||||
/* these rigs only have AI[0|1] set commands and no AI query */
|
||||
if (RIG_IS_TS450S || RIG_IS_TS690S || RIG_IS_TS790 || RIG_IS_TS850
|
||||
|| RIG_IS_TS950S || RIG_IS_TS950SDX || RIG_IS_POWERSDR)
|
||||
|| RIG_IS_TS950S || RIG_IS_TS950SDX || RIG_IS_POWERSDR || RIG_IS_THETIS)
|
||||
{
|
||||
RETURNFUNC(-RIG_ENAVAIL);
|
||||
}
|
||||
|
@ -6187,6 +6188,7 @@ DECLARE_INITRIG_BACKEND(kenwood)
|
|||
rig_register(&sdruno_caps);
|
||||
rig_register(&qrplabs_caps);
|
||||
rig_register(&fx4_caps);
|
||||
rig_register(&thetis_caps);
|
||||
|
||||
return (RIG_OK);
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "token.h"
|
||||
#include "idx_builtin.h"
|
||||
|
||||
#define BACKEND_VER "20231112"
|
||||
#define BACKEND_VER "20231226"
|
||||
|
||||
#define EOM_KEN ';'
|
||||
#define EOM_TH '\r'
|
||||
|
@ -109,6 +109,7 @@ extern struct confparams kenwood_cfg_params[];
|
|||
#define RIG_IS_XG3 (rig->caps->rig_model == RIG_MODEL_XG3)
|
||||
#define RIG_IS_PT8000A (rig->caps->rig_model == RIG_MODEL_PT8000A)
|
||||
#define RIG_IS_POWERSDR (rig->caps->rig_model == RIG_MODEL_POWERSDR)
|
||||
#define RIG_IS_THETIS (rig->caps->rig_model == RIG_MODEL_THETIS)
|
||||
#define RIG_IS_MALACHITE (rig->caps->rig_model == RIG_MODEL_MALACHITE)
|
||||
#define RIG_IS_QRPLABS (rig->caps->rig_model == RIG_MODEL_QRPLABS)
|
||||
|
||||
|
@ -323,6 +324,7 @@ extern struct rig_caps tx500_caps;
|
|||
extern struct rig_caps sdruno_caps;
|
||||
extern struct rig_caps qrplabs_caps;
|
||||
extern struct rig_caps fx4_caps;
|
||||
extern struct rig_caps thetis_caps;
|
||||
|
||||
/* use when not interested in the answer, but want to check its len */
|
||||
static int inline kenwood_simple_transaction(RIG *rig, const char *cmd,
|
||||
|
|
|
@ -1729,6 +1729,7 @@ struct rig_caps ts2000_caps =
|
|||
|
||||
.chan_list = {
|
||||
{ 0, 299, RIG_MTYPE_MEM, TS2000_MEM_CAP },
|
||||
{ 1, 3, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -1134,6 +1134,7 @@ struct rig_caps ts570d_caps =
|
|||
.chan_list = {
|
||||
{ 0, 89, RIG_MTYPE_MEM, TS570_MEM_CAP },
|
||||
{ 90, 99, RIG_MTYPE_EDGE, TS570_MEM_CAP },
|
||||
{ 1, 3, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
.rx_range_list1 = {
|
||||
|
|
|
@ -2015,6 +2015,7 @@ struct rig_caps ts590sg_caps =
|
|||
.chan_list = { /* TBC */
|
||||
{ 0, 89, RIG_MTYPE_MEM, TS590_CHANNEL_CAPS },
|
||||
{ 90, 99, RIG_MTYPE_EDGE, TS590_CHANNEL_CAPS },
|
||||
{ 1, 3, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -586,6 +586,7 @@ struct rig_caps ts870s_caps =
|
|||
.chan_list = {
|
||||
{ 0, 89, RIG_MTYPE_MEM }, /* TBC */
|
||||
{ 90, 99, RIG_MTYPE_EDGE },
|
||||
{ 1, 4, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -422,7 +422,11 @@ struct rig_caps ts890s_caps =
|
|||
.transceive = RIG_TRN_RIG,
|
||||
.agc_level_count = 5,
|
||||
.agc_levels = { RIG_AGC_OFF, RIG_AGC_SLOW, RIG_AGC_MEDIUM, RIG_AGC_FAST, RIG_AGC_ON },
|
||||
|
||||
.chan_list = {
|
||||
{ 1, 6, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
.rx_range_list1 = {
|
||||
{kHz(100), Hz(59999999), TS890_ALL_MODES, -1, -1, TS890_VFO},
|
||||
RIG_FRNG_END,
|
||||
|
|
|
@ -181,6 +181,8 @@ struct rig_caps ts990s_caps =
|
|||
|
||||
.chan_list = {
|
||||
{ 0, 299, RIG_MTYPE_MEM, TS990S_MEM_CAP },
|
||||
{ 1, 6, RIG_MTYPE_VOICE },
|
||||
{ 1, 8, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -202,6 +202,7 @@ struct rig_caps ftdx1200_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -184,6 +184,7 @@ struct rig_caps ft2000_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -297,6 +297,7 @@ struct rig_caps ftdx3000_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -94,7 +94,8 @@ struct rig_caps ft450_caps =
|
|||
.chan_list = {
|
||||
{ 1, 500, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 501, 504, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
RIG_CHAN_END,
|
||||
{ 1, 1, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
.rx_range_list1 = {
|
||||
|
|
|
@ -192,6 +192,7 @@ struct rig_caps ftdx5000_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -177,6 +177,7 @@ struct rig_caps ft710_caps =
|
|||
.comp_meter_cal = FT710_COMP_CAL,
|
||||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -185,6 +185,7 @@ struct rig_caps ft891_caps =
|
|||
.str_cal = FT891_STR_CAL,
|
||||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -98,6 +98,7 @@ struct rig_caps ft9000_caps =
|
|||
/* TBC */
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
@ -274,6 +275,7 @@ struct rig_caps ft9000Old_caps =
|
|||
/* TBC */
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -140,7 +140,7 @@ struct rig_caps ft950_caps =
|
|||
{ 125, 128, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* 60M Channels U51-U54 or US1-US4, if available */
|
||||
{ 130, 130, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* 60M Channel U55 or US5, if available */
|
||||
{ 131, 131, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* EU5, 5167.5 KHz Alaska Emergency Freq, if available */
|
||||
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -233,7 +233,9 @@ struct rig_caps ft991_caps =
|
|||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // P1L-P9U PMS channels
|
||||
{ 118, 127, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // 5xx 5MHz band
|
||||
RIG_CHAN_END,
|
||||
{ 1, 5, RIG_MTYPE_VOICE },
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
// Rig only has 1 model
|
||||
|
|
|
@ -190,6 +190,7 @@ struct rig_caps ftdx10_caps =
|
|||
.chan_list = {
|
||||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 501, 510, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* 60M Channels, 5-01 - 5-10, if available */
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -232,6 +232,7 @@ struct rig_caps ftdx101d_caps =
|
|||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // P1L-P9U PMS channels
|
||||
{ 501, 510, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // 5xx 5MHz band
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -133,6 +133,7 @@ struct rig_caps ftdx101mp_caps =
|
|||
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
|
||||
{ 100, 117, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // P1L-P9U PMS channels
|
||||
{ 501, 510, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // 5xx 5MHz band
|
||||
{ 1, 5, RIG_MTYPE_MORSE },
|
||||
RIG_CHAN_END,
|
||||
},
|
||||
|
||||
|
|
|
@ -853,7 +853,7 @@ int newcat_60m_exception(RIG *rig, freq_t freq, mode_t mode)
|
|||
}
|
||||
|
||||
// some rigs need to skip freq/mode settings as 60M only operates in memory mode
|
||||
if (is_ft991 || is_ft897 || is_ft897d || is_ftdx5000) { return 1; }
|
||||
if (is_ft991 || is_ft897 || is_ft897d || is_ftdx5000 || is_ftdx10) { return 1; }
|
||||
|
||||
if (!is_ftdx10 && !is_ft710 && !is_ftdx101d && !is_ftdx101mp) { return 0; }
|
||||
|
||||
|
@ -2729,6 +2729,12 @@ int newcat_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo)
|
|||
{
|
||||
RETURNFUNC(err);
|
||||
}
|
||||
if (newcat_60m_exception(rig, rig->state.cache.freqMainA, rig->state.cache.modeMainA))
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: force set_split off since we're on 60M exception\n", __func__);
|
||||
split = RIG_SPLIT_OFF;
|
||||
//return RIG_OK; // fake the return code to make things happy
|
||||
}
|
||||
|
||||
if (is_ft991)
|
||||
{
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
typedef char ncboolean;
|
||||
|
||||
/* shared function version */
|
||||
#define NEWCAT_VER "20231204"
|
||||
#define NEWCAT_VER "20231230"
|
||||
|
||||
/* Hopefully large enough for future use, 128 chars plus '\0' */
|
||||
#define NEWCAT_DATA_LEN 129
|
||||
|
|
|
@ -135,7 +135,7 @@ easycomm_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el)
|
|||
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__);
|
||||
|
||||
SNPRINTF(cmdstr, sizeof(cmdstr), "AZ EL \n");
|
||||
SNPRINTF(cmdstr, sizeof(cmdstr), "AZ\n");
|
||||
|
||||
retval = easycomm_transaction(rot, cmdstr, ackbuf, sizeof(ackbuf));
|
||||
|
||||
|
@ -145,16 +145,37 @@ easycomm_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/* Parse parse string to extract AZ,EL values */
|
||||
/* Parse parse string to extract AZ values */
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s got response: %s\n", __func__, ackbuf);
|
||||
retval = sscanf(ackbuf, "AZ%f EL%f", az, el);
|
||||
retval = sscanf(ackbuf, "AZ%f", az);
|
||||
|
||||
if (retval != 2)
|
||||
if (retval != 1)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_ERR, "%s: unknown response (%s)\n", __func__, ackbuf);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
|
||||
SNPRINTF(cmdstr, sizeof(cmdstr), "EL\n");
|
||||
|
||||
retval = easycomm_transaction(rot, cmdstr, ackbuf, sizeof(ackbuf));
|
||||
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s got error: %d\n", __func__, retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* Parse parse string to extract EL values */
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s got response: %s\n", __func__, ackbuf);
|
||||
retval = sscanf(ackbuf, "EL%f", el);
|
||||
|
||||
if (retval != 1)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_ERR, "%s: unknown response (%s)\n", __func__, ackbuf);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
|
||||
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
|
@ -527,7 +548,7 @@ const struct rot_caps easycomm1_rot_caps =
|
|||
ROT_MODEL(ROT_MODEL_EASYCOMM1),
|
||||
.model_name = "EasycommI",
|
||||
.mfg_name = "Hamlib",
|
||||
.version = "20231218.0",
|
||||
.version = "20231219.0",
|
||||
.copyright = "LGPL",
|
||||
.status = RIG_STATUS_STABLE,
|
||||
.rot_type = ROT_TYPE_OTHER,
|
||||
|
|
214
src/network.c
214
src/network.c
|
@ -85,7 +85,11 @@
|
|||
#endif
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#include <iphlpapi.h>
|
||||
static int wsstarted;
|
||||
static int is_networked(char *address, int address_length);
|
||||
#endif
|
||||
|
||||
//! @cond Doxygen_Suppress
|
||||
|
@ -963,6 +967,9 @@ void *multicast_publisher(void *arg)
|
|||
{
|
||||
unsigned char spectrum_data[HAMLIB_MAX_SPECTRUM_DATA];
|
||||
char snapshot_buffer[HAMLIB_MAX_SNAPSHOT_PACKET_SIZE];
|
||||
#ifdef __MINGW32__
|
||||
char ip4[32];
|
||||
#endif
|
||||
|
||||
struct multicast_publisher_args_s *args = (struct multicast_publisher_args_s *)
|
||||
arg;
|
||||
|
@ -981,6 +988,17 @@ void *multicast_publisher(void *arg)
|
|||
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast publisher\n", __FILE__,
|
||||
__LINE__);
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
if (!is_networked(ip4, sizeof(ip4)))
|
||||
{
|
||||
rig_debug(RIG_DEBUG_WARN, "%s: no IPV4 network detected...multicast disabled\n",
|
||||
__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
snapshot_init();
|
||||
|
||||
memset(&dest_addr, 0, sizeof(dest_addr));
|
||||
|
@ -1050,8 +1068,99 @@ void *multicast_publisher(void *arg)
|
|||
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#include <winsock2.h>
|
||||
#include <iphlpapi.h>
|
||||
|
||||
static int is_networked(char *address, int address_length)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
DWORD dwSize = 0;
|
||||
DWORD dwRetVal = 0;
|
||||
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
|
||||
PIP_ADAPTER_ADDRESSES pAddresses = NULL;
|
||||
PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
|
||||
PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
|
||||
char ipString[INET6_ADDRSTRLEN]; // large enough for both IPv4 and IPv6
|
||||
address[0] = 0;
|
||||
|
||||
// First call to determine actual memory size needed
|
||||
GetAdaptersAddresses(AF_UNSPEC, flags, NULL, NULL, &dwSize);
|
||||
pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(dwSize);
|
||||
|
||||
// Second call to get the actual data
|
||||
dwRetVal = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &dwSize);
|
||||
|
||||
if (dwRetVal == NO_ERROR)
|
||||
{
|
||||
for (pCurrAddresses = pAddresses; pCurrAddresses != NULL;
|
||||
pCurrAddresses = pCurrAddresses->Next)
|
||||
{
|
||||
// if (pCurrAddresses->IfType == IF_TYPE_IEEE80211) // Wireless adapter
|
||||
{
|
||||
char friendlyName[256];
|
||||
wcstombs(friendlyName, pCurrAddresses->FriendlyName, sizeof(friendlyName));
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: network IfType = %d, name=%s\n", __func__,
|
||||
(int)pCurrAddresses->IfType, friendlyName);
|
||||
|
||||
for (pUnicast = pCurrAddresses->FirstUnicastAddress; pUnicast != NULL;
|
||||
pUnicast = pUnicast->Next)
|
||||
{
|
||||
void *addr = NULL;
|
||||
|
||||
if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) // IPv4 address
|
||||
{
|
||||
struct sockaddr_in *sa_in = (struct sockaddr_in *)pUnicast->Address.lpSockaddr;
|
||||
addr = &(sa_in->sin_addr);
|
||||
}
|
||||
|
||||
#if 0 // going to skip IPV6 for now -- should never need it on a local network
|
||||
else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) // IPv6 address
|
||||
{
|
||||
struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)
|
||||
pUnicast->Address.lpSockaddr;
|
||||
addr = &(sa_in6->sin6_addr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Convert IP address to string and ignore bad ones
|
||||
if (addr)
|
||||
{
|
||||
|
||||
if (inet_ntop(pUnicast->Address.lpSockaddr->sa_family, addr, ipString,
|
||||
sizeof(ipString)) != NULL)
|
||||
{
|
||||
// Use IP address if not 169.x.x.x
|
||||
if (strncmp(ipString, "169", 3) != 0)
|
||||
{
|
||||
count++;
|
||||
|
||||
if (count > 1)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_WARN,
|
||||
"%s: more than 1 address found...multicast may not work\n", __func__);
|
||||
}
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: Address: %s\n", ipString, ipString);
|
||||
strncpy(address, ipString, address_length);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(pAddresses);
|
||||
return 1; // Wireless and addresses printed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pAddresses)
|
||||
{
|
||||
free(pAddresses);
|
||||
}
|
||||
|
||||
return 0; // Not wireless or no addresses found
|
||||
}
|
||||
|
||||
int is_wireless()
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
|
@ -1099,13 +1208,53 @@ int is_wireless()
|
|||
return 0;
|
||||
}
|
||||
#else
|
||||
#ifndef __APPLE__
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <ifaddrs.h>
|
||||
|
||||
int is_networked(char *ipv4, int ipv4_length)
|
||||
{
|
||||
struct ifaddrs *interfaces, *iface;
|
||||
char addr_str[INET_ADDRSTRLEN];
|
||||
|
||||
// Get a list of all network interfaces
|
||||
if (getifaddrs(&interfaces) == -1)
|
||||
{
|
||||
perror("getifaddrs");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// Iterate through the list of interfaces
|
||||
for (iface = interfaces; iface != NULL; iface = iface->ifa_next)
|
||||
{
|
||||
if (iface->ifa_addr
|
||||
&& iface->ifa_addr->sa_family == AF_INET) // Check it is IP4
|
||||
{
|
||||
// Convert the linked list of interfaces to a human readable string
|
||||
struct sockaddr_in *sa = (struct sockaddr_in *) iface->ifa_addr;
|
||||
inet_ntop(AF_INET, &(sa->sin_addr), addr_str, INET_ADDRSTRLEN);
|
||||
|
||||
if (strncmp(addr_str, "127", 3) == 0 && ipv4[0] == 0)
|
||||
{
|
||||
strncpy(ipv4, addr_str, ipv4_length);
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: Can use %s\n", __func__, ipv4);
|
||||
}
|
||||
else if (strncmp(addr_str, "127", 3) != 0)
|
||||
{
|
||||
strncpy(ipv4, addr_str, ipv4_length);
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: Will use %s\n", __func__, ipv4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
freeifaddrs(interfaces); // Free the linked list
|
||||
return strlen(ipv4) > 0 ;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __linux__
|
||||
#include <linux/wireless.h>
|
||||
int is_wireless_linux(const char *ifname)
|
||||
{
|
||||
int sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
|
@ -1155,6 +1304,7 @@ int is_wireless()
|
|||
void *multicast_receiver(void *arg)
|
||||
{
|
||||
char data[4096];
|
||||
char ip4[INET6_ADDRSTRLEN];
|
||||
|
||||
struct multicast_receiver_args_s *args = (struct multicast_receiver_args_s *)
|
||||
arg;
|
||||
|
@ -1170,7 +1320,15 @@ void *multicast_receiver(void *arg)
|
|||
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast receiver\n", __FILE__,
|
||||
__LINE__);
|
||||
|
||||
if (!is_networked(ip4, sizeof(ip4)))
|
||||
{
|
||||
rig_debug(RIG_DEBUG_WARN,
|
||||
"%s: no network detected...disabling multicast receive\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int optval = 1;
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (PCHAR)&optval,
|
||||
|
@ -1196,6 +1354,7 @@ void *multicast_receiver(void *arg)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
memset(&dest_addr, 0, sizeof(dest_addr));
|
||||
|
@ -1203,19 +1362,22 @@ void *multicast_receiver(void *arg)
|
|||
#ifdef __MINGW32__
|
||||
|
||||
// Windows wireless cannot bind to multicast group addresses for some unknown reason
|
||||
// Update: it's not wireless causing the error we see but we'll leave the detection in place
|
||||
if (is_wireless())
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE,
|
||||
"%s: wireless detected so localhost is being used\n", __func__);
|
||||
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
|
||||
"%s: wireless detected\n", __func__);
|
||||
|
||||
// dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
|
||||
}
|
||||
else
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE,
|
||||
"%s: no wireless detect so INADDR_ANY is being used\n", __func__);
|
||||
"%s: no wireless detected so INADDR_ANY is being used\n", __func__);
|
||||
}
|
||||
|
||||
#else
|
||||
// dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr);
|
||||
dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr);
|
||||
#endif
|
||||
dest_addr.sin_port = htons(args->multicast_port);
|
||||
|
@ -1234,9 +1396,23 @@ void *multicast_receiver(void *arg)
|
|||
|
||||
mreq.imr_multiaddr.s_addr = inet_addr(args->multicast_addr);
|
||||
|
||||
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
||||
#ifdef __MINGW32__
|
||||
|
||||
// we're not worrying about IPV6 right now as that will likely never occur on home network
|
||||
if (strlen(ip4) > 0)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: multicast binding to %s\n", __func__, ip4);
|
||||
mreq.imr_interface.s_addr = inet_addr(ip4);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: multicast binding to INADDR_ANY\n", __func__);
|
||||
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
if (setsockopt(socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (PCHAR)&mreq,
|
||||
sizeof(mreq)) < 0)
|
||||
#else
|
||||
|
@ -1247,7 +1423,13 @@ void *multicast_receiver(void *arg)
|
|||
rig_debug(RIG_DEBUG_ERR, "%s: error joining multicast group %s:%d: %s\n",
|
||||
__func__,
|
||||
args->multicast_addr, args->multicast_port, strerror(errno));
|
||||
return NULL;
|
||||
|
||||
if (errno != 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: errno==0 so trying to continue\n", __func__);
|
||||
}
|
||||
|
||||
rs->multicast_receiver_run = 1;
|
||||
|
@ -1356,6 +1538,9 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr,
|
|||
int socket_fd;
|
||||
int status;
|
||||
int mutex_status;
|
||||
#ifdef __MINGW32__
|
||||
char ip4[32];
|
||||
#endif
|
||||
|
||||
ENTERFUNC;
|
||||
|
||||
|
@ -1371,6 +1556,17 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr,
|
|||
__LINE__,
|
||||
multicast_addr, multicast_port);
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
if (!is_networked(ip4, sizeof(ip4)))
|
||||
{
|
||||
rig_debug(RIG_DEBUG_WARN, "%s: No network found...multicast disabled\n",
|
||||
__func__);
|
||||
return RIG_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (multicast_addr == NULL || strcmp(multicast_addr, "0.0.0.0") == 0)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_TRACE, "%s(%d): not starting multicast publisher\n",
|
||||
|
|
|
@ -72,7 +72,7 @@ int rig_sprintf_vfo(char *str, int nlen, vfo_t vfo)
|
|||
|
||||
if (sv && sv[0] && (strstr(sv, "None") == 0))
|
||||
{
|
||||
len += sprintf(str + len, "%s ", sv);
|
||||
len += snprintf(str + len, nlen - len, "%s ", sv);
|
||||
check_buffer_overflow(str, len, nlen);
|
||||
}
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ int rig_sprintf_ant(char *str, int str_len, ant_t ant)
|
|||
break;
|
||||
}
|
||||
|
||||
len += sprintf(str + len, "%s ", ant_name);
|
||||
len += snprintf(str + len, str_len - len, "%s ", ant_name);
|
||||
check_buffer_overflow(str, len, str_len);
|
||||
}
|
||||
}
|
||||
|
@ -388,7 +388,7 @@ int rig_sprintf_level_gran(char *str, int nlen, setting_t level,
|
|||
|
||||
if (RIG_LEVEL_IS_FLOAT(rig_idx2setting(i)))
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%f..%f/%f) ",
|
||||
ms,
|
||||
gran[i].min.f,
|
||||
|
@ -397,7 +397,7 @@ int rig_sprintf_level_gran(char *str, int nlen, setting_t level,
|
|||
}
|
||||
else
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%d..%d/%d) ",
|
||||
ms,
|
||||
gran[i].min.i,
|
||||
|
@ -447,7 +447,7 @@ int rot_sprintf_level_gran(char *str, int nlen, setting_t level,
|
|||
|
||||
if (ROT_LEVEL_IS_FLOAT(rig_idx2setting(i)))
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%f..%f/%f) ",
|
||||
ms,
|
||||
gran[i].min.f,
|
||||
|
@ -456,7 +456,7 @@ int rot_sprintf_level_gran(char *str, int nlen, setting_t level,
|
|||
}
|
||||
else
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%d..%d/%d) ",
|
||||
ms,
|
||||
gran[i].min.i,
|
||||
|
@ -566,7 +566,7 @@ int rig_sprintf_parm_gran(char *str, int nlen, setting_t parm,
|
|||
|
||||
if (RIG_PARM_IS_FLOAT(rig_idx2setting(i)))
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%.g..%.g/%.g) ",
|
||||
ms,
|
||||
gran[i].min.f,
|
||||
|
@ -577,7 +577,7 @@ int rig_sprintf_parm_gran(char *str, int nlen, setting_t parm,
|
|||
{
|
||||
if (gran[i].step.s)
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%s) ",
|
||||
ms,
|
||||
gran[i].step.s);
|
||||
|
@ -585,7 +585,7 @@ int rig_sprintf_parm_gran(char *str, int nlen, setting_t parm,
|
|||
}
|
||||
else
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%d..%d/%d) ",
|
||||
ms,
|
||||
gran[i].min.i,
|
||||
|
@ -635,7 +635,7 @@ int rot_sprintf_parm_gran(char *str, int nlen, setting_t parm,
|
|||
|
||||
if (ROT_PARM_IS_FLOAT(rig_idx2setting(i)))
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%f..%f/%f) ",
|
||||
ms,
|
||||
gran[i].min.f,
|
||||
|
@ -644,7 +644,7 @@ int rot_sprintf_parm_gran(char *str, int nlen, setting_t parm,
|
|||
}
|
||||
else
|
||||
{
|
||||
len += sprintf(str + len,
|
||||
len += snprintf(str + len, nlen - len,
|
||||
"%s(%d..%d/%d) ",
|
||||
ms,
|
||||
gran[i].min.i,
|
||||
|
@ -739,7 +739,7 @@ int rot_sprintf_status(char *str, int nlen, rot_status_t status)
|
|||
|
||||
if (sv && sv[0] && (strstr(sv, "None") == 0))
|
||||
{
|
||||
len += sprintf(str + len, "%s ", sv);
|
||||
len += snprintf(str + len, nlen - len, "%s ", sv);
|
||||
}
|
||||
|
||||
check_buffer_overflow(str, len, nlen);
|
||||
|
@ -940,7 +940,7 @@ int rig_sprintf_agc_levels(RIG *rig, char *str, int lenstr)
|
|||
{
|
||||
if (strlen(str) > 0) { strcat(str, " "); }
|
||||
|
||||
sprintf(tmpbuf, "%d=%s", priv_caps->agc_levels[i].icom_level,
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "%d=%s", priv_caps->agc_levels[i].icom_level,
|
||||
rig_stragclevel(priv_caps->agc_levels[i].level));
|
||||
|
||||
if (strlen(str) + strlen(tmpbuf) < lenstr - 1)
|
||||
|
@ -960,7 +960,7 @@ int rig_sprintf_agc_levels(RIG *rig, char *str, int lenstr)
|
|||
{
|
||||
if (strlen(str) > 0) { strcat(str, " "); }
|
||||
|
||||
sprintf(tmpbuf, "%d=%s", rig->caps->agc_levels[i],
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "%d=%s", rig->caps->agc_levels[i],
|
||||
rig_stragclevel(rig->caps->agc_levels[i]));
|
||||
|
||||
if (strlen(str) + strlen(tmpbuf) < lenstr - 1)
|
||||
|
|
|
@ -4672,6 +4672,8 @@ declare_proto_rig(dump_state)
|
|||
// fprintf(fout, "has_get_trn=%d\n", rig->caps->get_trn != NULL);
|
||||
fprintf(fout, "has_power2mW=%d\n", rig->caps->power2mW != NULL);
|
||||
fprintf(fout, "has_mW2power=%d\n", rig->caps->mW2power != NULL);
|
||||
fprintf(fout, "has_get_ant=%d\n", rig->caps->get_ant != NULL);
|
||||
fprintf(fout, "has_set_ant=%d\n", rig->caps->set_ant != NULL);
|
||||
fprintf(fout, "timeout=%d\n", rig->caps->timeout);
|
||||
fprintf(fout, "rig_model=%d\n", rig->caps->rig_model);
|
||||
fprintf(fout, "rigctld_version=%s\n", hamlib_version2);
|
||||
|
|
|
@ -417,6 +417,10 @@ static int scanfc(FILE *fin, const char *format, void *p)
|
|||
}
|
||||
|
||||
if (ferror(fin)) { rig_debug(RIG_DEBUG_ERR, "%s: errno=%d, %s\n", __func__, errno, strerror(errno)); clearerr(fin); }
|
||||
if (errno == EINVAL) // invalid arg we will continue
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue