Merge upstream changes and fix conflicts. Use snprintf() in most sprintflst.c functions to avoid buffer overflows.

pull/1481/head
Mikael Nousiainen 2024-01-04 10:43:15 +02:00
commit 051e671bfa
61 zmienionych plików z 570 dodań i 86 usunięć

2
NEWS
Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -142,7 +142,7 @@ int id5100_set_vfo(RIG *rig, vfo_t vfo)
RETURNFUNC2(retval);
}
return retval;
RETURNFUNC(retval);
}

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -135,6 +135,7 @@ int flexradio_open(RIG *rig)
break;
case RIG_MODEL_POWERSDR:
case RIG_MODEL_THETIS:
break;
default:

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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