diff --git a/NEWS b/NEWS index 06e771e1a..a00262d00 100644 --- a/NEWS +++ b/NEWS @@ -15,7 +15,8 @@ Version 5.x -- future Version 4.6 Version 4.5 - * 2022-05-XX + * 2022-07-XX + * Add Xeigu X5105 * Add Gemini DX-1200 HF-1K Amplifiers * Kenwood rigs should now support AI command packets * Add FT-990UNI for older 990 ROMs 1.2 and earlier diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index d6c054894..ef9987725 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -270,6 +270,7 @@ #define RIG_MODEL_ICF8101 RIG_MAKE_MODEL(RIG_ICOM, 86) #define RIG_MODEL_X6100 RIG_MAKE_MODEL(RIG_ICOM, 87) /* Xiegu X6100 */ #define RIG_MODEL_G90 RIG_MAKE_MODEL(RIG_ICOM, 88) /* Xiegu G90 */ +#define RIG_MODEL_X5105 RIG_MAKE_MODEL(RIG_ICOM, 89) /* Xiegu X5105 -- G90 compatible */ /* diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index fdb1c6572..c4bd941aa 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -9634,6 +9634,7 @@ DECLARE_INITRIG_BACKEND(icom) rig_register(&x108g_caps); rig_register(&x6100_caps); rig_register(&g90_caps); + rig_register(&x5105_caps); return (RIG_OK); } diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 1cb70776f..8571d014f 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -491,6 +491,7 @@ extern const struct rig_caps perseus_caps; extern const struct rig_caps x108g_caps; extern const struct rig_caps x6100_caps; extern const struct rig_caps g90_caps; +extern const struct rig_caps x5105_caps; extern const struct rig_caps icr8600_caps; extern const struct rig_caps icr30_caps; diff --git a/rigs/icom/xiegu.c b/rigs/icom/xiegu.c index 08d891efe..ab76c948f 100644 --- a/rigs/icom/xiegu.c +++ b/rigs/icom/xiegu.c @@ -330,7 +330,7 @@ const struct rig_caps x6100_caps = .mfg_name = "Xiegu", .version = BACKEND_VER ".1", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, @@ -505,7 +505,181 @@ const struct rig_caps g90_caps = .mfg_name = "Xiegu", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, + .rig_type = RIG_TYPE_TRANSCEIVER, + .ptt_type = RIG_PTT_RIG, + .dcd_type = RIG_DCD_RIG, + .port_type = RIG_PORT_SERIAL, + .serial_rate_min = 300, + .serial_rate_max = 19200, + .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, + .timeout = 1000, + .retry = 3, + .has_get_func = X108G_FUNCS, + .has_set_func = X108G_FUNCS, + .has_get_level = X108G_LEVELS, + .has_set_level = RIG_LEVEL_SET(X108G_LEVELS), + .has_get_parm = X108G_PARMS, + .has_set_parm = RIG_PARM_SET(X108G_PARMS), + .level_gran = { + // cppcheck-suppress * + [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, + }, + .parm_gran = {}, + .ctcss_list = common_ctcss_list, + .dcs_list = common_dcs_list, + .preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess*/ + .attenuator = { 12, RIG_DBLST_END, }, + .max_rit = Hz(9999), + .max_xit = Hz(9999), + .max_ifshift = Hz(0), /* TODO */ + .targetable_vfo = 0, + .vfo_ops = X108G_VFO_OPS, + .scan_ops = X108G_SCAN_OPS, + .transceive = RIG_TRN_RIG, + .bank_qty = 5, + .chan_desc_sz = 0, /* TODO */ + + .chan_list = { + { 1, 99, RIG_MTYPE_MEM, X108G_MEM_CAP }, + { 100, 105, RIG_MTYPE_EDGE, X108G_MEM_CAP }, /* two by two */ + { 106, 107, RIG_MTYPE_CALL, X108G_MEM_CAP }, + RIG_CHAN_END, + }, + + .rx_range_list1 = { {kHz(30), MHz(199.999999), X108G_ALL_RX_MODES, -1, -1, X108G_VFOS}, + {MHz(400), MHz(470), X108G_ALL_RX_MODES, -1, -1, X108G_VFOS}, RIG_FRNG_END, + }, + .tx_range_list1 = { + FRQ_RNG_HF(1, X108G_OTHER_TX_MODES, W(2), W(100), X108G_VFOS, RIG_ANT_1), + FRQ_RNG_6m(1, X108G_OTHER_TX_MODES, W(2), W(100), X108G_VFOS, RIG_ANT_1), + FRQ_RNG_2m(1, X108G_OTHER_TX_MODES, W(2), W(50), X108G_VFOS, RIG_ANT_2), + FRQ_RNG_70cm(1, X108G_OTHER_TX_MODES, W(2), W(35), X108G_VFOS, RIG_ANT_2), + FRQ_RNG_HF(1, X108G_AM_TX_MODES, W(1), W(40), X108G_VFOS, RIG_ANT_1), /* AM class */ + FRQ_RNG_6m(1, X108G_AM_TX_MODES, W(1), W(40), X108G_VFOS, RIG_ANT_1), /* AM class */ + FRQ_RNG_2m(1, X108G_AM_TX_MODES, W(2), W(20), X108G_VFOS, RIG_ANT_2), + FRQ_RNG_70cm(1, X108G_OTHER_TX_MODES, W(2), W(14), X108G_VFOS, RIG_ANT_2), + RIG_FRNG_END, + }, + + .rx_range_list2 = { {kHz(30), MHz(199.999999), X108G_ALL_RX_MODES, -1, -1, X108G_VFOS}, + {MHz(400), MHz(470), X108G_ALL_RX_MODES, -1, -1, X108G_VFOS}, RIG_FRNG_END, + }, + .tx_range_list2 = { /* needs the 5 mhz channels added */ + FRQ_RNG_HF(2, X108G_OTHER_TX_MODES, W(2), W(100), X108G_VFOS, RIG_ANT_1), + FRQ_RNG_6m(2, X108G_OTHER_TX_MODES, W(2), W(100), X108G_VFOS, RIG_ANT_1), + FRQ_RNG_2m(2, X108G_OTHER_TX_MODES, W(2), W(50), X108G_VFOS, RIG_ANT_2), + FRQ_RNG_70cm(2, X108G_OTHER_TX_MODES, W(2), W(35), X108G_VFOS, RIG_ANT_2), + FRQ_RNG_HF(2, X108G_AM_TX_MODES, W(1), W(40), X108G_VFOS, RIG_ANT_1), /* AM class */ + FRQ_RNG_6m(2, X108G_AM_TX_MODES, W(1), W(40), X108G_VFOS, RIG_ANT_1), /* AM class */ + FRQ_RNG_2m(2, X108G_AM_TX_MODES, W(2), W(20), X108G_VFOS, RIG_ANT_2), + FRQ_RNG_70cm(2, X108G_OTHER_TX_MODES, W(2), W(14), X108G_VFOS, RIG_ANT_2), + RIG_FRNG_END, + }, + + .tuning_steps = { + {X108G_1HZ_TS_MODES, 1}, + {X108G_NOT_TS_MODES, 10}, + {X108G_ALL_RX_MODES, Hz(100)}, + {X108G_ALL_RX_MODES, kHz(1)}, + {X108G_ALL_RX_MODES, kHz(5)}, + {X108G_ALL_RX_MODES, kHz(9)}, + {X108G_ALL_RX_MODES, kHz(10)}, + {X108G_ALL_RX_MODES, kHz(12.5)}, + {X108G_ALL_RX_MODES, kHz(20)}, + {X108G_ALL_RX_MODES, kHz(25)}, + {X108G_ALL_RX_MODES, kHz(100)}, + {X108G_NOT_TS_MODES, MHz(1)}, + RIG_TS_END, + }, + + /* mode/filter list, remember: order matters! But duplication may speed up search. Put the most commonly used modes first! Remember these are defaults, with dsp rigs you can change them to anything you want except FM and WFM which are fixed */ + .filters = { + {RIG_MODE_SSB, kHz(2.4)}, + {RIG_MODE_SSB, kHz(1.8)}, + {RIG_MODE_SSB, kHz(3)}, + {RIG_MODE_FM, kHz(10)}, + {RIG_MODE_FM, kHz(15)}, + {RIG_MODE_FM, kHz(7)}, + {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(500)}, + {RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(250)}, + {RIG_MODE_CW | RIG_MODE_CWR, kHz(1.2)}, + {RIG_MODE_RTTY | RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_AM, kHz(3)}, + {RIG_MODE_AM, kHz(9)}, + {RIG_MODE_WFM, kHz(280)}, + RIG_FLT_END, + }, + + .str_cal = X108G_STR_CAL, + + .cfgparams = icom_cfg_params, + .set_conf = icom_set_conf, + .get_conf = icom_get_conf, + + .priv = (void *)& x108g_priv_caps, + .rig_init = icom_init, + .rig_cleanup = icom_cleanup, + .rig_open = icom_rig_open, + .rig_close = icom_rig_open, + + .set_freq = icom_set_freq, + .get_freq = icom_get_freq, + .set_mode = icom_set_mode, + .get_mode = icom_get_mode, + .set_vfo = icom_set_vfo, + .set_ant = NULL, /*automatically set by rig depending band */ + .get_ant = NULL, + + .decode_event = icom_decode_event, + .set_level = icom_set_level, + .get_level = icom_get_level, + .set_func = icom_set_func, + .get_func = icom_get_func, + .set_parm = NULL, + .get_parm = NULL, + .set_mem = icom_set_mem, + .set_bank = icom_set_bank, + .vfo_op = icom_vfo_op, + .scan = icom_scan, + .set_ptt = x108g_set_ptt, + .get_ptt = icom_get_ptt, + .get_dcd = icom_get_dcd, + .set_ts = icom_set_ts, + .get_ts = NULL, + .set_rptr_shift = icom_set_rptr_shift, + .get_rptr_shift = NULL, + .set_rptr_offs = icom_set_rptr_offs, + .get_rptr_offs = icom_get_rptr_offs, + .set_ctcss_tone = icom_set_ctcss_tone, + .get_ctcss_tone = icom_get_ctcss_tone, + .set_ctcss_sql = icom_set_ctcss_sql, + .get_ctcss_sql = icom_get_ctcss_sql, + .set_dcs_code = icom_set_dcs_code, + .get_dcs_code = icom_get_dcs_code, + .set_split_freq = x108g_set_split_freq, + .get_split_freq = icom_get_split_freq, + .set_split_mode = x108g_set_split_mode, + .get_split_mode = icom_get_split_mode, + .set_split_vfo = x108g_set_split_vfo, + .get_split_vfo = NULL, + .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS +}; + +const struct rig_caps x5105_caps = +{ + RIG_MODEL(RIG_MODEL_X5105), + .model_name = "X5105", + .mfg_name = "Xiegu", + .version = BACKEND_VER ".0", + .copyright = "LGPL", + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG,