* 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-79ac388436b8
Hamlib-1.2.10
Stéphane Fillod, F8CFE 2009-06-01 16:58:08 +00:00
rodzic c1c220c986
commit fe43cf0e26
3 zmienionych plików z 122 dodań i 43 usunięć

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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