diff --git a/icom/Makefile.am b/icom/Makefile.am index 5af9f908d..8e0836775 100644 --- a/icom/Makefile.am +++ b/icom/Makefile.am @@ -2,11 +2,11 @@ ICOMSRCLIST = ic706.c icr8500.c ic735.c ic775.c ic756.c \ ic275.c ic475.c ic820h.c ic821h.c \ icr7000.c ic910.c ic970.c \ ic725.c ic737.c ic718.c os535.c os456.c omni.c \ - ic736.c ic746.c ic703.c ic726.c ic271.c \ + ic736.c ic738.c ic746.c ic703.c ic726.c ic271.c \ ic765.c ic781.c ic471.c id1.c icr9000.c \ - icr10.c icr71.c icr72.c icr75.c \ + icr10.c icr20.c icr71.c icr72.c icr75.c \ ic707.c ic728.c ic751.c ic761.c \ - ic78.c ic7800.c icr20.c ic7000.c ic7200.c ic7600.c + ic78.c ic7800.c ic7000.c ic7200.c ic7600.c ic7700.c lib_LTLIBRARIES = hamlib-icom.la hamlib_icom_la_SOURCES = $(ICOMSRCLIST) icom.c frame.c optoscan.c diff --git a/icom/ic738.c b/icom/ic738.c new file mode 100644 index 000000000..a2e763535 --- /dev/null +++ b/icom/ic738.c @@ -0,0 +1,183 @@ +/* + * Hamlib CI-V backend - description of IC-738 and variations + * Copyright (c) 2000-2010 by Stephane Fillod + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include "icom.h" + + +/* + * IC-738, like the IC-736 but without 6m + */ + + +#define IC738_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) + +/* + * 100W in all modes but AM (40W) + */ +#define IC738_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) +#define IC738_AM_TX_MODES (RIG_MODE_AM) + +#define IC738_VFO_ALL (RIG_VFO_A|RIG_VFO_B) + +#define IC738_VFO_OPS (RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_CPY) +#define IC738_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_PROG|RIG_SCAN_VFO) + +#define IC738_ANTS 0 /* TODO: declare both antenna connectors? */ + +#define IC738_STR_CAL { 0, { } } + +/* + */ +static const struct icom_priv_caps ic738_priv_caps = { + 0x44, /* default address */ + 0, /* 731 mode */ + ic737_ts_sc_list +}; + +const struct rig_caps ic738_caps = { +.rig_model = RIG_MODEL_IC738, +.model_name = "IC-738", +.mfg_name = "Icom", +.version = BACKEND_VER, +.copyright = "LGPL", +.status = RIG_STATUS_UNTESTED, +.rig_type = RIG_TYPE_TRANSCEIVER, +.ptt_type = RIG_PTT_NONE, +.dcd_type = RIG_DCD_NONE, +.port_type = RIG_PORT_SERIAL, +.serial_rate_min = 1200, +.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 = 200, +.retry = 3, +.has_get_func = RIG_FUNC_NONE, +.has_set_func = RIG_FUNC_NONE, +.has_get_level = RIG_LEVEL_NONE, +.has_set_level = RIG_LEVEL_NONE, +.has_get_parm = RIG_PARM_NONE, +.has_set_parm = RIG_PARM_NONE, +.level_gran = {}, +.parm_gran = {}, +.ctcss_list = NULL, +.dcs_list = NULL, +.preamp = { RIG_DBLST_END, }, +.attenuator = { RIG_DBLST_END, }, +.max_rit = Hz(0), +.max_xit = Hz(0), +.max_ifshift = Hz(0), +.targetable_vfo = 0, +.vfo_ops = IC738_VFO_OPS, +.scan_ops = IC738_SCAN_OPS, +.transceive = RIG_TRN_RIG, +.bank_qty = 0, +.chan_desc_sz = 0, + +.chan_list = { + { 1, 89, RIG_MTYPE_MEM, IC_MIN_MEM_CAP }, + { 90, 99, RIG_MTYPE_MEM, IC_MIN_MEM_CAP }, /* FIXME: split */ + { 100, 101, RIG_MTYPE_EDGE, IC_MIN_MEM_CAP }, + RIG_CHAN_END, + }, + +.rx_range_list1 = { + {kHz(500),MHz(30),IC738_ALL_RX_MODES,-1,-1,IC738_VFO_ALL,IC738_ANTS}, + {MHz(50),MHz(54),IC738_ALL_RX_MODES,-1,-1,IC738_VFO_ALL,IC738_ANTS}, + RIG_FRNG_END, }, +.tx_range_list1 = { + FRQ_RNG_HF(1,IC738_OTHER_TX_MODES, W(5),W(100),IC738_VFO_ALL,IC738_ANTS), + FRQ_RNG_HF(1,IC738_AM_TX_MODES, W(4),W(40),IC738_VFO_ALL,IC738_ANTS), /* AM class */ + RIG_FRNG_END, + }, + +.rx_range_list2 = { + {kHz(500),MHz(30),IC738_ALL_RX_MODES,-1,-1,IC738_VFO_ALL,IC738_ANTS}, + {MHz(50),MHz(54),IC738_ALL_RX_MODES,-1,-1,IC738_VFO_ALL,IC738_ANTS}, + RIG_FRNG_END, }, +.tx_range_list2 = { + FRQ_RNG_HF(2,IC738_OTHER_TX_MODES, W(5),W(100),IC738_VFO_ALL,IC738_ANTS), + FRQ_RNG_HF(2,IC738_AM_TX_MODES, W(4),W(40),IC738_VFO_ALL,IC738_ANTS), /* AM class */ + RIG_FRNG_END, + }, + +.tuning_steps = { /* TBC */ + {IC738_ALL_RX_MODES,10}, + {IC738_ALL_RX_MODES,kHz(1)}, + {IC738_ALL_RX_MODES,kHz(2)}, + {IC738_ALL_RX_MODES,kHz(3)}, + {IC738_ALL_RX_MODES,kHz(4)}, + {IC738_ALL_RX_MODES,kHz(5)}, + {IC738_ALL_RX_MODES,kHz(6)}, + {IC738_ALL_RX_MODES,kHz(7)}, + {IC738_ALL_RX_MODES,kHz(8)}, + {IC738_ALL_RX_MODES,kHz(9)}, + {IC738_ALL_RX_MODES,kHz(10)}, + RIG_TS_END, + }, + + /* mode/filter list, remember: order matters! */ +.filters = { + {RIG_MODE_SSB|RIG_MODE_CW, kHz(2.1)}, + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_FM, kHz(12)}, + RIG_FLT_END, + }, + +.cfgparams = icom_cfg_params, +.set_conf = icom_set_conf, +.get_conf = icom_get_conf, + +.priv = (void*)&ic738_priv_caps, +.rig_init = icom_init, +.rig_cleanup = icom_cleanup, +.rig_open = NULL, +.rig_close = NULL, + +.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, + +.decode_event = icom_decode_event, +.set_mem = icom_set_mem, +.vfo_op = icom_vfo_op, +.scan = icom_scan, +.set_ts = icom_set_ts, +.set_split_freq = icom_set_split_freq, +.get_split_freq = icom_get_split_freq, +.set_split_mode = icom_set_split_mode, +.get_split_mode = icom_get_split_mode, +.set_split_vfo = icom_set_split_vfo, + +}; + diff --git a/icom/ic7700.c b/icom/ic7700.c new file mode 100644 index 000000000..99fd96640 --- /dev/null +++ b/icom/ic7700.c @@ -0,0 +1,232 @@ +/* + * Hamlib CI-V backend - description of IC-7700 and variations + * Copyright (c) 2009-2010 by Stephane Fillod + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include /* String function definitions */ + +#include +#include "token.h" +#include "idx_builtin.h" + +#include "icom.h" +#include "icom_defs.h" +#include "frame.h" +#include "misc.h" +#include "bandplan.h" + +/* + * TODO: PSK and PSKR + */ +#define IC7700_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM) +#define IC7700_1HZ_TS_MODES IC7700_ALL_RX_MODES +#define IC7700_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM) +#define IC7700_AM_TX_MODES (RIG_MODE_AM) + +#define IC7700_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) + +#define IC7700_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|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|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC) + +#define IC7700_VFOS (RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) +#define IC7700_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) + +#define IC7700_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE) +#define IC7700_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_VFO|RIG_SCAN_PROG|RIG_SCAN_DELTA|RIG_SCAN_PRIO) + +#define IC7700_ANTS (RIG_ANT_1|RIG_ANT_2|RIG_ANT_3|RIG_ANT_4) + +/* + * FIXME: real measures! + */ +#define IC7700_STR_CAL { 3, \ + { \ + { 0,-54 }, \ + { 120, 0 }, \ + { 241, 60 } \ + } } + + +/* + * IC-7700 rig capabilities. + * + * TODO: complete command set (esp. the $1A bunch!) and testing.. + */ +static const struct icom_priv_caps ic7700_priv_caps = { + 0x74, /* default address */ + 0, /* 731 mode */ + ic756pro_ts_sc_list +}; + + +const struct rig_caps ic7700_caps = { +.rig_model = RIG_MODEL_IC7700, +.model_name = "IC-7700", +.mfg_name = "Icom", +.version = BACKEND_VER, +.copyright = "LGPL", +.status = RIG_STATUS_UNTESTED, +.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 = 200, +.retry = 3, +.has_get_func = IC7700_FUNCS, +.has_set_func = IC7700_FUNCS, +.has_get_level = IC7700_LEVELS, +.has_set_level = RIG_LEVEL_SET(IC7700_LEVELS), +.has_get_parm = IC7700_PARMS, +.has_set_parm = RIG_PARM_SET(IC7700_PARMS), /* FIXME: parms */ +.level_gran = { + [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, +}, +.parm_gran = {}, +.ctcss_list = common_ctcss_list, +.dcs_list = NULL, +.preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */ +.attenuator = { 6, 12, 18, RIG_DBLST_END, }, +.max_rit = Hz(9999), +.max_xit = Hz(9999), +.max_ifshift = Hz(0), +.targetable_vfo = 0, +.vfo_ops = IC7700_VFO_OPS, +.scan_ops = IC7700_SCAN_OPS, +.transceive = RIG_TRN_RIG, +.bank_qty = 0, +.chan_desc_sz = 0, + +.chan_list = { + { 1, 99, RIG_MTYPE_MEM }, + { 100, 101, RIG_MTYPE_EDGE }, /* two by two */ + RIG_CHAN_END, + }, + +.rx_range_list1 = { {kHz(30),MHz(60),IC7700_ALL_RX_MODES,-1,-1,IC7700_VFOS,IC7700_ANTS}, + RIG_FRNG_END, }, +.tx_range_list1 = { + FRQ_RNG_HF(1,IC7700_OTHER_TX_MODES, W(5),W(200),IC7700_VFOS,IC7700_ANTS), + FRQ_RNG_6m(1,IC7700_OTHER_TX_MODES, W(5),W(200),IC7700_VFOS,IC7700_ANTS), + FRQ_RNG_HF(1,IC7700_AM_TX_MODES, W(5),W(50),IC7700_VFOS,IC7700_ANTS), /* AM class */ + FRQ_RNG_6m(1,IC7700_AM_TX_MODES, W(5),W(50),IC7700_VFOS,IC7700_ANTS), /* AM class */ + RIG_FRNG_END, }, + +.rx_range_list2 = { {kHz(30),MHz(60),IC7700_ALL_RX_MODES,-1,-1,IC7700_VFOS,IC7700_ANTS}, + RIG_FRNG_END, }, +.tx_range_list2 = { + FRQ_RNG_HF(2,IC7700_OTHER_TX_MODES, W(5),W(200),IC7700_VFOS,IC7700_ANTS), + FRQ_RNG_6m(2,IC7700_OTHER_TX_MODES, W(5),W(200),IC7700_VFOS,IC7700_ANTS), + FRQ_RNG_HF(2,IC7700_AM_TX_MODES, W(5),W(50),IC7700_VFOS,IC7700_ANTS), /* AM class */ + FRQ_RNG_6m(2,IC7700_AM_TX_MODES, W(5),W(50),IC7700_VFOS,IC7700_ANTS), /* AM class */ + /* USA only, TBC: end of range and modes */ + {MHz(5.33050),MHz(5.33350),IC7700_OTHER_TX_MODES,W(5),W(200),IC7700_VFOS,IC7700_ANTS}, /* USA only */ + {MHz(5.34650),MHz(5.34950),IC7700_OTHER_TX_MODES,W(5),W(200),IC7700_VFOS,IC7700_ANTS}, /* USA only */ + {MHz(5.36650),MHz(5.36950),IC7700_OTHER_TX_MODES,W(5),W(200),IC7700_VFOS,IC7700_ANTS}, /* USA only */ + {MHz(5.37150),MHz(5.37450),IC7700_OTHER_TX_MODES,W(5),W(200),IC7700_VFOS,IC7700_ANTS}, /* USA only */ + {MHz(5.40350),MHz(5.40650),IC7700_OTHER_TX_MODES,W(5),W(200),IC7700_VFOS,IC7700_ANTS}, /* USA only */ + RIG_FRNG_END, }, + +.tuning_steps = { + {IC7700_1HZ_TS_MODES,1}, + {IC7700_ALL_RX_MODES,Hz(100)}, + {IC7700_ALL_RX_MODES,kHz(1)}, + {IC7700_ALL_RX_MODES,kHz(5)}, + {IC7700_ALL_RX_MODES,kHz(9)}, + {IC7700_ALL_RX_MODES,kHz(10)}, + {IC7700_ALL_RX_MODES,kHz(12.5)}, + {IC7700_ALL_RX_MODES,kHz(20)}, + {IC7700_ALL_RX_MODES,kHz(25)}, + RIG_TS_END, + }, + /* mode/filter list, remember: order matters! */ +.filters = { + {RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_CW|RIG_MODE_CWR, Hz(500)}, + {RIG_MODE_CW|RIG_MODE_CWR, Hz(350)}, + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_AM, kHz(2.4)}, + {RIG_MODE_FM, kHz(12)}, + {RIG_MODE_FM, kHz(8)}, /* TBC */ + RIG_FLT_END, + }, +.str_cal = IC7700_STR_CAL, + +.cfgparams = icom_cfg_params, +.set_conf = icom_set_conf, +.get_conf = icom_get_conf, + +.priv = (void*)&ic7700_priv_caps, +.rig_init = icom_init, +.rig_cleanup = icom_cleanup, +.rig_open = NULL, +.rig_close = NULL, + +.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 = icom_set_ant, +.get_ant = icom_get_ant, + +.set_rit = icom_set_rit, + +.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 = icom_set_parm, +.get_parm = icom_get_parm, +.set_mem = icom_set_mem, +.vfo_op = icom_vfo_op, +.scan = icom_scan, +.set_ptt = icom_set_ptt, +.get_ptt = icom_get_ptt, +.get_dcd = icom_get_dcd, +.set_ts = icom_set_ts, +.get_ts = icom_get_ts, +.set_rptr_shift = icom_set_rptr_shift, +.get_rptr_shift = icom_get_rptr_shift, +.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_split_freq = icom_set_split_freq, +.get_split_freq = icom_get_split_freq, +.set_split_mode = icom_set_split_mode, +.get_split_mode = icom_get_split_mode, +.set_split_vfo = icom_set_split_vfo, +.get_split_vfo = icom_get_split_vfo, + +}; + diff --git a/icom/icom.c b/icom/icom.c index 85c5f40d2..abbdd11b1 100644 --- a/icom/icom.c +++ b/icom/icom.c @@ -1,8 +1,6 @@ /* * Hamlib CI-V backend - main file - * Copyright (c) 2000-2009 by Stephane Fillod - * - * $Id: icom.c,v 1.107 2008-11-13 20:29:43 y32kn Exp $ + * Copyright (c) 2000-2010 by Stephane Fillod * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -3070,6 +3068,7 @@ DECLARE_INITRIG_BACKEND(icom) rig_register(&ic735_caps); rig_register(&ic736_caps); rig_register(&ic737_caps); + rig_register(&ic738_caps); rig_register(&ic746_caps); rig_register(&ic746pro_caps); rig_register(&ic751_caps); @@ -3081,6 +3080,7 @@ DECLARE_INITRIG_BACKEND(icom) rig_register(&ic756pro3_caps); rig_register(&ic7600_caps); rig_register(&ic765_caps); + rig_register(&ic7700_caps); rig_register(&ic78_caps); rig_register(&ic7800_caps); rig_register(&ic7000_caps); diff --git a/icom/icom.h b/icom/icom.h index 9eb7939b1..b3ae04c75 100644 --- a/icom/icom.h +++ b/icom/icom.h @@ -1,8 +1,6 @@ /* * Hamlib CI-V backend - main header - * Copyright (c) 2000-2009 by Stephane Fillod - * - * $Id: icom.h,v 1.77 2008-11-13 20:29:43 y32kn Exp $ + * Copyright (c) 2000-2010 by Stephane Fillod * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -198,6 +196,7 @@ extern const struct rig_caps ic728_caps; extern const struct rig_caps ic735_caps; extern const struct rig_caps ic736_caps; extern const struct rig_caps ic737_caps; +extern const struct rig_caps ic738_caps; extern const struct rig_caps ic746_caps; extern const struct rig_caps ic746pro_caps; extern const struct rig_caps ic756_caps; @@ -208,6 +207,7 @@ extern const struct rig_caps ic751_caps; extern const struct rig_caps ic7600_caps; extern const struct rig_caps ic761_caps; extern const struct rig_caps ic765_caps; +extern const struct rig_caps ic7700_caps; extern const struct rig_caps ic775_caps; extern const struct rig_caps ic78_caps; extern const struct rig_caps ic7800_caps;