kopia lustrzana https://github.com/Hamlib/Hamlib
* Bug fixed in icom_set_ctcss_tone and icom_set_ctcss_sql, reported by Joe KJ0EYT.
* New: icom_set_dcs_code/icom_get_dcs_code * More declarations for IC-7000 git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2702 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.10
rodzic
c1c220c986
commit
fe43cf0e26
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Hamlib CI-V backend - description of IC-7000 and variations
|
* Hamlib CI-V backend - description of IC-7000 and variations
|
||||||
* Adapted from IC-7800 code 2006 by Kent Hill
|
* Adapted from IC-7800 code 2006 by Kent Hill
|
||||||
* Copyright (c) 2004 by Stephane Fillod
|
* Copyright (c) 2004-2009 by Stephane Fillod
|
||||||
*
|
*
|
||||||
* $Id: ic7000.c,v 1.2 2008-10-26 13:45:21 y32kn Exp $
|
* $Id: ic7000.c,v 1.2 2008-10-26 13:45:21 y32kn Exp $
|
||||||
*
|
*
|
||||||
|
@ -67,6 +67,27 @@
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* IC7000 channel caps.
|
||||||
|
*/
|
||||||
|
#define IC7000_MEM_CAP { \
|
||||||
|
.freq = 1, \
|
||||||
|
.mode = 1, \
|
||||||
|
.width = 1, \
|
||||||
|
.split = 1, \
|
||||||
|
.tx_freq = 1, \
|
||||||
|
.tx_mode = 1, \
|
||||||
|
.tx_width = 1, \
|
||||||
|
.rptr_offs = 1, \
|
||||||
|
.rptr_shift = 1, \
|
||||||
|
.ctcss_tone = 1, \
|
||||||
|
.ctcss_sql = 1, \
|
||||||
|
.funcs = IC7000_FUNCS, \
|
||||||
|
.levels = RIG_LEVEL_SET(IC7000_LEVELS), \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IC-7000 rig capabilities.
|
* IC-7000 rig capabilities.
|
||||||
*
|
*
|
||||||
|
@ -83,9 +104,9 @@ const struct rig_caps ic7000_caps = {
|
||||||
.rig_model = RIG_MODEL_IC7000,
|
.rig_model = RIG_MODEL_IC7000,
|
||||||
.model_name = "IC-7000",
|
.model_name = "IC-7000",
|
||||||
.mfg_name = "Icom",
|
.mfg_name = "Icom",
|
||||||
.version = BACKEND_VER,
|
.version = BACKEND_VER ".1",
|
||||||
.copyright = "LGPL",
|
.copyright = "LGPL",
|
||||||
.status = RIG_STATUS_UNTESTED,
|
.status = RIG_STATUS_BETA,
|
||||||
.rig_type = RIG_TYPE_TRANSCEIVER,
|
.rig_type = RIG_TYPE_TRANSCEIVER,
|
||||||
.ptt_type = RIG_PTT_RIG,
|
.ptt_type = RIG_PTT_RIG,
|
||||||
.dcd_type = RIG_DCD_RIG,
|
.dcd_type = RIG_DCD_RIG,
|
||||||
|
@ -111,22 +132,23 @@ const struct rig_caps ic7000_caps = {
|
||||||
},
|
},
|
||||||
.parm_gran = {},
|
.parm_gran = {},
|
||||||
.ctcss_list = common_ctcss_list,
|
.ctcss_list = common_ctcss_list,
|
||||||
.dcs_list = NULL,
|
.dcs_list = common_dcs_list,
|
||||||
.preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess*/
|
.preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess*/
|
||||||
.attenuator = { 12, RIG_DBLST_END, },
|
.attenuator = { 12, RIG_DBLST_END, },
|
||||||
.max_rit = Hz(9999),
|
.max_rit = Hz(9999),
|
||||||
.max_xit = Hz(9999),
|
.max_xit = Hz(9999),
|
||||||
.max_ifshift = Hz(0),
|
.max_ifshift = Hz(0), /* TODO */
|
||||||
.targetable_vfo = 0,
|
.targetable_vfo = 0,
|
||||||
.vfo_ops = IC7000_VFO_OPS,
|
.vfo_ops = IC7000_VFO_OPS,
|
||||||
.scan_ops = IC7000_SCAN_OPS,
|
.scan_ops = IC7000_SCAN_OPS,
|
||||||
.transceive = RIG_TRN_RIG,
|
.transceive = RIG_TRN_RIG,
|
||||||
.bank_qty = 5,
|
.bank_qty = 5,
|
||||||
.chan_desc_sz = 0,
|
.chan_desc_sz = 0, /* TODO */
|
||||||
|
|
||||||
.chan_list = {
|
.chan_list = {
|
||||||
{ 1, 99, RIG_MTYPE_MEM },
|
{ 1, 99, RIG_MTYPE_MEM, IC7000_MEM_CAP },
|
||||||
{ 100, 105, RIG_MTYPE_EDGE }, /* two by two */
|
{ 100, 105, RIG_MTYPE_EDGE, IC7000_MEM_CAP }, /* two by two */
|
||||||
|
{ 106, 107, RIG_MTYPE_CALL, IC7000_MEM_CAP },
|
||||||
RIG_CHAN_END,
|
RIG_CHAN_END,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -221,6 +243,7 @@ const struct rig_caps ic7000_caps = {
|
||||||
.set_parm = NULL,
|
.set_parm = NULL,
|
||||||
.get_parm = NULL,
|
.get_parm = NULL,
|
||||||
.set_mem = icom_set_mem,
|
.set_mem = icom_set_mem,
|
||||||
|
.set_mem = icom_set_bank,
|
||||||
.vfo_op = icom_vfo_op,
|
.vfo_op = icom_vfo_op,
|
||||||
.scan = icom_scan,
|
.scan = icom_scan,
|
||||||
.set_ptt = icom_set_ptt,
|
.set_ptt = icom_set_ptt,
|
||||||
|
@ -236,6 +259,8 @@ const struct rig_caps ic7000_caps = {
|
||||||
.get_ctcss_tone = icom_get_ctcss_tone,
|
.get_ctcss_tone = icom_get_ctcss_tone,
|
||||||
.set_ctcss_sql = icom_set_ctcss_sql,
|
.set_ctcss_sql = icom_set_ctcss_sql,
|
||||||
.get_ctcss_sql = icom_get_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 = icom_set_split_freq,
|
.set_split_freq = icom_set_split_freq,
|
||||||
.get_split_freq = icom_get_split_freq,
|
.get_split_freq = icom_get_split_freq,
|
||||||
.set_split_mode = icom_set_split_mode,
|
.set_split_mode = icom_set_split_mode,
|
||||||
|
|
114
icom/icom.c
114
icom/icom.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Hamlib CI-V backend - main file
|
* Hamlib CI-V backend - main file
|
||||||
* Copyright (c) 2000-2005 by Stephane Fillod
|
* Copyright (c) 2000-2008 by Stephane Fillod
|
||||||
*
|
*
|
||||||
* $Id: icom.c,v 1.107 2008-11-13 20:29:43 y32kn Exp $
|
* $Id: icom.c,v 1.107 2008-11-13 20:29:43 y32kn Exp $
|
||||||
*
|
*
|
||||||
|
@ -2131,9 +2131,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
* icom_set_ctcss_tone
|
* icom_set_ctcss_tone
|
||||||
* Assumes rig!=NULL, rig->state.priv!=NULL
|
* Assumes rig!=NULL, rig->state.priv!=NULL
|
||||||
*
|
*
|
||||||
* Warning! This is untested stuff! May work at least on 756PRO and IC746.
|
* Works for 746 pro and should work for 756 xx and 7800
|
||||||
* Please owners report to me <f4cfe@users.sourceforge.net>, thanks. --SF
|
|
||||||
Works for 746 pro and should work for 756 xx and 7800
|
|
||||||
*/
|
*/
|
||||||
int icom_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone)
|
int icom_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone)
|
||||||
{
|
{
|
||||||
|
@ -2144,16 +2142,6 @@ int icom_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone)
|
||||||
|
|
||||||
caps = rig->caps;
|
caps = rig->caps;
|
||||||
|
|
||||||
/*
|
|
||||||
* I don't have documentation for this function,
|
|
||||||
* and I can't experiment (no hardware), so let's guess.
|
|
||||||
* Most probably, it might be the index of the CTCSS subaudible
|
|
||||||
* tone, and not the tone itself, starting from zero.
|
|
||||||
*
|
|
||||||
* Something in the range of 00..51, BCD big endian 4 nibbles
|
|
||||||
* Please someone let me know if it works this way. --SF
|
|
||||||
* No. sent directly as be nibbles with frequency same format as internal kh
|
|
||||||
*/
|
|
||||||
for (i = 0; caps->ctcss_list[i] != 0 && i<52; i++) {
|
for (i = 0; caps->ctcss_list[i] != 0 && i<52; i++) {
|
||||||
if (caps->ctcss_list[i] == tone)
|
if (caps->ctcss_list[i] == tone)
|
||||||
break;
|
break;
|
||||||
|
@ -2161,7 +2149,9 @@ int icom_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone)
|
||||||
if (caps->ctcss_list[i] != tone)
|
if (caps->ctcss_list[i] != tone)
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
tone_len = 1;
|
/* Sent as frequency in tenth of Hz */
|
||||||
|
|
||||||
|
tone_len = 3;
|
||||||
to_bcd_be(tonebuf, tone, tone_len*2);
|
to_bcd_be(tonebuf, tone, tone_len*2);
|
||||||
|
|
||||||
retval = icom_transaction(rig, C_SET_TONE, S_TONE_RPTR,
|
retval = icom_transaction(rig, C_SET_TONE, S_TONE_RPTR,
|
||||||
|
@ -2191,10 +2181,6 @@ int icom_get_ctcss_tone(RIG *rig, vfo_t vfo, tone_t *tone)
|
||||||
|
|
||||||
caps = rig->caps;
|
caps = rig->caps;
|
||||||
|
|
||||||
/*
|
|
||||||
* see icom_set_ctcss for discussion on the status!
|
|
||||||
*/
|
|
||||||
|
|
||||||
retval = icom_transaction(rig, C_SET_TONE, S_TONE_RPTR, NULL, 0,
|
retval = icom_transaction(rig, C_SET_TONE, S_TONE_RPTR, NULL, 0,
|
||||||
tonebuf, &tone_len);
|
tonebuf, &tone_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
|
@ -2224,9 +2210,6 @@ int icom_get_ctcss_tone(RIG *rig, vfo_t vfo, tone_t *tone)
|
||||||
/*
|
/*
|
||||||
* icom_set_ctcss_sql
|
* icom_set_ctcss_sql
|
||||||
* Assumes rig!=NULL, rig->state.priv!=NULL
|
* Assumes rig!=NULL, rig->state.priv!=NULL
|
||||||
*
|
|
||||||
* Warning! This is untested stuff! May work at least on 756PRO and IC746.
|
|
||||||
* Please owners report to me <f4cfe@users.sourceforge.net>, thanks. --SF
|
|
||||||
*/
|
*/
|
||||||
int icom_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone)
|
int icom_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone)
|
||||||
{
|
{
|
||||||
|
@ -2237,10 +2220,6 @@ int icom_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone)
|
||||||
|
|
||||||
caps = rig->caps;
|
caps = rig->caps;
|
||||||
|
|
||||||
/*
|
|
||||||
* see icom_set_ctcss for discussion on the untested status!
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0; caps->ctcss_list[i] != 0 && i<52; i++) {
|
for (i = 0; caps->ctcss_list[i] != 0 && i<52; i++) {
|
||||||
if (caps->ctcss_list[i] == tone)
|
if (caps->ctcss_list[i] == tone)
|
||||||
break;
|
break;
|
||||||
|
@ -2248,7 +2227,9 @@ int icom_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone)
|
||||||
if (caps->ctcss_list[i] != tone)
|
if (caps->ctcss_list[i] != tone)
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
tone_len = 1;
|
/* Sent as frequency in tenth of Hz */
|
||||||
|
|
||||||
|
tone_len = 3;
|
||||||
to_bcd_be(tonebuf, tone, tone_len*2);
|
to_bcd_be(tonebuf, tone, tone_len*2);
|
||||||
|
|
||||||
retval = icom_transaction(rig, C_SET_TONE, S_TONE_SQL,
|
retval = icom_transaction(rig, C_SET_TONE, S_TONE_SQL,
|
||||||
|
@ -2278,10 +2259,6 @@ int icom_get_ctcss_sql(RIG *rig, vfo_t vfo, tone_t *tone)
|
||||||
|
|
||||||
caps = rig->caps;
|
caps = rig->caps;
|
||||||
|
|
||||||
/*
|
|
||||||
* see icom_set_ctcss for discussion on the untested status!
|
|
||||||
*/
|
|
||||||
|
|
||||||
retval = icom_transaction(rig, C_SET_TONE, S_TONE_SQL, NULL, 0,
|
retval = icom_transaction(rig, C_SET_TONE, S_TONE_SQL, NULL, 0,
|
||||||
tonebuf, &tone_len);
|
tonebuf, &tone_len);
|
||||||
if (retval != RIG_OK)
|
if (retval != RIG_OK)
|
||||||
|
@ -2307,6 +2284,81 @@ int icom_get_ctcss_sql(RIG *rig, vfo_t vfo, tone_t *tone)
|
||||||
return -RIG_EPROTO;
|
return -RIG_EPROTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* icom_set_dcs_code
|
||||||
|
* Assumes rig!=NULL, rig->state.priv!=NULL
|
||||||
|
*/
|
||||||
|
int icom_set_dcs_code(RIG *rig, vfo_t vfo, tone_t code)
|
||||||
|
{
|
||||||
|
const struct rig_caps *caps;
|
||||||
|
unsigned char codebuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||||
|
int code_len, ack_len=sizeof(ackbuf), retval;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
caps = rig->caps;
|
||||||
|
|
||||||
|
for (i = 0; caps->dcs_list[i] != 0 && i<104; i++) {
|
||||||
|
if (caps->dcs_list[i] == code)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (caps->dcs_list[i] != code)
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
|
code_len = 3;
|
||||||
|
to_bcd_be(codebuf, code, code_len*2);
|
||||||
|
|
||||||
|
retval = icom_transaction(rig, C_SET_TONE, S_TONE_DTCS,
|
||||||
|
codebuf, code_len, ackbuf, &ack_len);
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
if (ack_len != 1 || ackbuf[0] != ACK) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"icom_set_dcs_code: ack NG (%#.2x), "
|
||||||
|
"len=%d\n", ackbuf[0], ack_len);
|
||||||
|
return -RIG_ERJCTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* icom_get_dcs_code
|
||||||
|
* Assumes rig!=NULL, rig->state.priv!=NULL
|
||||||
|
*/
|
||||||
|
int icom_get_dcs_code(RIG *rig, vfo_t vfo, tone_t *code)
|
||||||
|
{
|
||||||
|
const struct rig_caps *caps;
|
||||||
|
unsigned char codebuf[MAXFRAMELEN];
|
||||||
|
int code_len, retval;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
caps = rig->caps;
|
||||||
|
|
||||||
|
retval = icom_transaction(rig, C_SET_TONE, S_TONE_DTCS, NULL, 0,
|
||||||
|
codebuf, &code_len);
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* cn,sc,data*3 */
|
||||||
|
if (code_len != 5) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"icom_get_dcs_code: ack NG (%#.2x), "
|
||||||
|
"len=%d\n", codebuf[0], code_len);
|
||||||
|
return -RIG_ERJCTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
code_len -= 2;
|
||||||
|
*code = from_bcd_be(codebuf+2, code_len*2);
|
||||||
|
|
||||||
|
/* check this code exists. That's better than nothing. */
|
||||||
|
for (i = 0; caps->dcs_list[i] != 0 && i<104; i++) {
|
||||||
|
if (caps->dcs_list[i] == *code)
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"icom_get_dcs_code: DTCS NG "
|
||||||
|
"(%#.2x)\n", codebuf[2]);
|
||||||
|
return -RIG_EPROTO;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* icom_set_powerstat
|
* icom_set_powerstat
|
||||||
|
|
10
icom/icom.h
10
icom/icom.h
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Hamlib CI-V backend - main header
|
* Hamlib CI-V backend - main header
|
||||||
* Copyright (c) 2000-2004 by Stephane Fillod
|
* Copyright (c) 2000-2009 by Stephane Fillod
|
||||||
*
|
*
|
||||||
* $Id: icom.h,v 1.77 2008-11-13 20:29:43 y32kn Exp $
|
* $Id: icom.h,v 1.77 2008-11-13 20:29:43 y32kn Exp $
|
||||||
*
|
*
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BACKEND_VER "0.4"
|
#define BACKEND_VER "0.5"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* defines used by comp_cal_str in rig.c
|
* defines used by comp_cal_str in rig.c
|
||||||
|
@ -108,8 +108,8 @@ struct icom_priv_caps {
|
||||||
void (*i2r_mode)(RIG *rig, unsigned char md, int pd,
|
void (*i2r_mode)(RIG *rig, unsigned char md, int pd,
|
||||||
rmode_t *mode, pbwidth_t *width); /*< backend specific code
|
rmode_t *mode, pbwidth_t *width); /*< backend specific code
|
||||||
to convert response
|
to convert response
|
||||||
tokes to bandwidth and
|
tokens to bandwidth and
|
||||||
mdoe */
|
mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,6 +164,8 @@ int icom_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone);
|
||||||
int icom_get_ctcss_tone(RIG *rig, vfo_t vfo, tone_t *tone);
|
int icom_get_ctcss_tone(RIG *rig, vfo_t vfo, tone_t *tone);
|
||||||
int icom_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone);
|
int icom_set_ctcss_sql(RIG *rig, vfo_t vfo, tone_t tone);
|
||||||
int icom_get_ctcss_sql(RIG *rig, vfo_t vfo, tone_t *tone);
|
int icom_get_ctcss_sql(RIG *rig, vfo_t vfo, tone_t *tone);
|
||||||
|
int icom_set_dcs_code(RIG *rig, vfo_t vfo, tone_t code);
|
||||||
|
int icom_get_dcs_code(RIG *rig, vfo_t vfo, tone_t *code);
|
||||||
int icom_set_bank(RIG *rig, vfo_t vfo, int bank);
|
int icom_set_bank(RIG *rig, vfo_t vfo, int bank);
|
||||||
int icom_set_mem(RIG *rig, vfo_t vfo, int ch);
|
int icom_set_mem(RIG *rig, vfo_t vfo, int ch);
|
||||||
int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op);
|
int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op);
|
||||||
|
|
Ładowanie…
Reference in New Issue