From 86a6ffb19e3aae8a1364dab9bd696d93ed4755de Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Mon, 27 Dec 2021 23:23:26 -0600 Subject: [PATCH] Add Xeigu X6100 --- include/hamlib/riglist.h | 1 + rigs/icom/icom.c | 2 + rigs/icom/icom.h | 1 + rigs/icom/x108g.c | 193 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+) diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index d7854162d..dd50e6a34 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -263,6 +263,7 @@ #define RIG_MODEL_ID51 RIG_MAKE_MODEL(RIG_ICOM, 84) #define RIG_MODEL_IC705 RIG_MAKE_MODEL(RIG_ICOM, 85) #define RIG_MODEL_ICF8101 RIG_MAKE_MODEL(RIG_ICOM, 86) +#define RIG_MODEL_X6100 RIG_MAKE_MODEL(RIG_ICOM, 87) /* Xiegu X6100 */ /* diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 527d76a2c..8a761e595 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -592,6 +592,7 @@ static const struct icom_addr icom_addr_list[] = {RIG_MODEL_IC7700, 0x74}, {RIG_MODEL_PERSEUS, 0xE1}, {RIG_MODEL_X108G, 0x70}, + {RIG_MODEL_X6100, 0x70}, {RIG_MODEL_ICR8600, 0x96}, {RIG_MODEL_ICR30, 0x9c}, {RIG_MODEL_NONE, 0}, @@ -9546,6 +9547,7 @@ DECLARE_INITRIG_BACKEND(icom) rig_register(&perseus_caps); rig_register(&x108g_caps); + rig_register(&x6100_caps); RETURNFUNC(RIG_OK); } diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index a26428802..8f24bed2c 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -488,6 +488,7 @@ extern const struct rig_caps ic2730_caps; 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 icr8600_caps; extern const struct rig_caps icr30_caps; diff --git a/rigs/icom/x108g.c b/rigs/icom/x108g.c index 77b0da69f..77463f712 100644 --- a/rigs/icom/x108g.c +++ b/rigs/icom/x108g.c @@ -45,6 +45,7 @@ #include "frame.h" #include "misc.h" #include "bandplan.h" +#include "serial.h" #define X108G_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_WFM) #define X108G_1HZ_TS_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR) @@ -119,6 +120,24 @@ static int x108g_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq); static int x108g_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, pbwidth_t tx_width); +static int x108g_rig_open(RIG *rig) +{ + int retval; + struct rig_state *rs; + + retval = icom_rig_open(rig); + if (retval != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: rig_open failed with %s\n", __func__, rigerror(retval)); + RETURNFUNC(retval); + } + rs = &rig->state; + ser_set_rts(&rs->rigport, 1); + ser_set_dtr(&rs->rigport, 1); + + RETURNFUNC(RIG_OK); +} + /* * IC-7000 rig capabilities. * @@ -140,6 +159,180 @@ const struct rig_caps x108g_caps = .mfg_name = "Xeigu", .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, + .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 = x108g_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, + +}; + +const struct rig_caps x6100_caps = +{ + RIG_MODEL(RIG_MODEL_X6100), + .model_name = "X6100", + .mfg_name = "Xeigu", + .version = BACKEND_VER ".0", + .copyright = "LGPL", .status = RIG_STATUS_ALPHA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG,