Changes for IC-7300 and IC-7200

Added civ_version for newer rigs to use the newer command structures e.g. IC7200, IC7300, see icom.c and ic7300.c
Added ic7300_set_xit
Added ic7300_set_rit
Added ic7300_get_rit
Added ic7300_get_func
Added ic7300_set_func
Added RIG_LEVEL_KEYSPD
Fixed RIG_LEVEL_VOXDELAY
Fixed RIG_FUNC_FAGC
Fixed RIG_FUNC_VOX
Fixed RIG_FUNC_BACKLIGHT
Fixed RIG_PARM_BEEP
Fixed RIG_PARM_TIME
Fixed RIG_OP_TUNE
Removed unused items
Hamlib-3.1
unknown 2016-05-26 00:01:27 -05:00
rodzic 1767cb5c43
commit 8326250e07
5 zmienionych plików z 468 dodań i 75 usunięć

Wyświetl plik

@ -80,7 +80,9 @@ static const struct icom_priv_caps IC7200_priv_caps = {
0x76, /* default address */
0, /* 731 mode */
0, /* no XCHG */
ic7200_ts_sc_list
ic7200_ts_sc_list,
.civ_version = 1 /* new version of some commands, e.g. ic7200/7300 */
};

Wyświetl plik

@ -1,6 +1,7 @@
/*
* Hamlib CI-V backend - description of IC-7300 and variations
* Adapted by J.Watson from IC-7000 code (c) 2004 by Stephane Fillod
* Adapted from IC-7200 (c) 2016 by Michael Black W9MDB
*
*
* This library is free software; you can redistribute it and/or
@ -19,11 +20,6 @@
*
*/
/*
* 26Mar09: Corrected tuning steps and added data modes.
* 25Mar09: Initial release
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@ -50,25 +46,30 @@
#define IC7300_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR)
#define IC7300_AM_TX_MODES (RIG_MODE_AM)
#define IC7300_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|RIG_FUNC_ARO)
#define IC7300_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_LOCK|RIG_FUNC_RIT|RIG_FUNC_XIT)
#define IC7300_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|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_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC)
#define IC7300_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|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_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC)
// Not implemented yet
//#define IC7300_EXT_LEVELS (TOK_LEVEL_MONITOR)
#define IC7300_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM)
#define IC7300_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_APO|RIG_PARM_TIME|RIG_PARM_BEEP)
#define IC7300_PARMS (RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP)
#define IC7300_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE)
#define IC7300_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_PROG|RIG_SCAN_SLCT|RIG_SCAN_PRIO)
#define IC7300_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_PROG|RIG_SCAN_SLCT)
#define IC7300_ANTS (RIG_ANT_1) /* ant-1 is Hf-6m */
/*
* FIXME: This is a guess real measures please!
*/
#define IC7300_STR_CAL { 2, \
#define IC7300_STR_CAL { 3, \
{ \
{ 0, -60 }, \
{ 255, 60 } \
{ 0, -54 }, \
{ 120, 0 }, \
{ 241, 64 } \
} }
/*
@ -80,22 +81,41 @@ static const struct icom_priv_caps IC7300_priv_caps = {
0x94, /* default address */
0, /* 731 mode */
0, /* no XCHG */
ic7300_ts_sc_list
ic7300_ts_sc_list,
.civ_version = 1 /* new version of some commands, e.g. ic7200/7300 */
};
/* Private IC7300 extra levels definitions
*
* Token definitions for .cfgparams in rig_caps
* See enum rig_conf_e and struct confparams in rig.h
*/
const struct confparams ic7300_ext_levels[] = {
{ TOK_LEVEL_MONITOR, "MONITORGAIN", "Monitor gain", "Monitor gain",
NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, 0 } }
},
{ RIG_CONF_END, NULL, }
};
int ic7300_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *ts);
int ic7300_set_rit(RIG *rig, vfo_t vfo, shortfreq_t ts);
int ic7300_set_xit(RIG *rig, vfo_t vfo, shortfreq_t ts);
int ic7300_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
int ic7300_set_func(RIG *rig, vfo_t vfo, setting_t func, int status);
const struct rig_caps ic7300_caps = {
.rig_model = RIG_MODEL_IC7300,
.model_name = "IC-7300",
.mfg_name = "Icom",
.version = BACKEND_VER,
.version = BACKEND_VER ".1",
.copyright = "LGPL",
.status = RIG_STATUS_ALPHA,
.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_min = 4800,
.serial_rate_max = 19200,
.serial_data_bits = 8,
.serial_stop_bits = 1,
@ -115,10 +135,11 @@ const struct rig_caps ic7300_caps = {
[LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } },
},
.parm_gran = {},
.extlevels = ic7300_ext_levels,
.ctcss_list = full_ctcss_list,
.dcs_list = NULL,
.preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess*/
.attenuator = { 20, RIG_DBLST_END, }, /* value taken from p.45 of manual*/
.preamp = { 1, 2, RIG_DBLST_END, },
.attenuator = { 1, RIG_DBLST_END, }, /* value taken from p.45 of manual*/
.max_rit = Hz(9999),
.max_xit = Hz(9999),
.max_ifshift = Hz(0),
@ -130,8 +151,8 @@ const struct rig_caps ic7300_caps = {
.chan_desc_sz = 0,
.chan_list = {
{ 1, 199, RIG_MTYPE_MEM },
{ 200, 201, RIG_MTYPE_EDGE }, /* two by two */
{ 1, 99, RIG_MTYPE_MEM },
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
RIG_CHAN_END,
},
@ -152,15 +173,16 @@ const struct rig_caps ic7300_caps = {
RIG_FRNG_END, },
.tuning_steps = {
{IC7300_1HZ_TS_MODES,1},
{IC7300_NOT_TS_MODES,10},
{IC7300_ALL_RX_MODES,Hz(100)},
{IC7300_ALL_RX_MODES,kHz(1)},
{IC7300_ALL_RX_MODES,kHz(5)},
{IC7300_ALL_RX_MODES,kHz(9)},
{IC7300_ALL_RX_MODES,kHz(10)},
RIG_TS_END,
},
{IC7300_ALL_RX_MODES,Hz(1)},
{IC7300_ALL_RX_MODES,kHz(1)},
{IC7300_ALL_RX_MODES,kHz(5)},
{IC7300_ALL_RX_MODES,kHz(9)},
{IC7300_ALL_RX_MODES,kHz(10)},
{IC7300_ALL_RX_MODES,kHz(12.5)},
{IC7300_ALL_RX_MODES,kHz(20)},
{IC7300_ALL_RX_MODES,kHz(25)},
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 = {
@ -198,15 +220,23 @@ const struct rig_caps ic7300_caps = {
.set_ant = NULL, /*automatically set by rig depending band */
.get_ant = NULL,
.set_rit = icom_set_rit,
.set_rit = ic7300_set_rit,
.get_rit = ic7300_get_rit,
// the 7300 has only one register for both RIT and Delta TX
// you can turn one or both on -- but both end up just being in sync
// so we'll just reuse the rit settings
.get_xit = ic7300_get_rit,
.set_xit = ic7300_set_xit,
.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_ext_level = icom_set_ext_level,
.get_ext_level = icom_get_ext_level,
.set_func = ic7300_set_func,
.get_func = ic7300_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,
@ -214,7 +244,7 @@ const struct rig_caps ic7300_caps = {
.get_ptt = icom_get_ptt,
.get_dcd = icom_get_dcd,
.set_ts = icom_set_ts,
.get_ts = NULL,
.get_ts = icom_get_ts,
.set_rptr_shift = icom_set_rptr_shift,
.get_rptr_shift = NULL,
.set_rptr_offs = icom_set_rptr_offs,
@ -229,6 +259,143 @@ const struct rig_caps ic7300_caps = {
.get_split_mode = icom_get_split_mode,
.set_split_vfo = icom_set_split_vfo,
.get_split_vfo = NULL,
.set_powerstat = icom_set_powerstat,
.power2mW = icom_power2mW,
.mW2power = icom_mW2power,
.send_morse = icom_send_morse
};
int ic7300_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *ts)
{
unsigned char tsbuf[MAXFRAMELEN];
int ts_len, retval;
retval = icom_transaction (rig, 0x21, 0x00, NULL, 0, tsbuf, &ts_len);
if (retval != RIG_OK)
return retval;
/*
* tsbuf nibbles should contain 10,1,1000,100 hz digits and 00=+, 01=- bit
*/
rig_debug(RIG_DEBUG_VERBOSE,"ts_len=%d\n",ts_len);
if (ts_len != 5) {
rig_debug(RIG_DEBUG_ERR,"ic7300_get_ts: wrong frame len=%d\n",
ts_len);
return -RIG_ERJCTED;
}
*ts = tsbuf[2] & 0x0f * 1;
*ts += (tsbuf[2] >> 4) * 10;
*ts += (tsbuf[3]& 0x0f) * 100;
*ts += (tsbuf[3] >> 4) * 1000;
if (tsbuf[4]!=0) *ts *= -1;
return RIG_OK;
}
static int xit_flag = 0;
int ic7300_set_rit(RIG *rig, vfo_t vfo, shortfreq_t ts)
{
unsigned char tsbuf[8];
char tmpbuf[8];
unsigned char ackbuf[16];
int ack_len;
int retval;
rig_debug(RIG_DEBUG_VERBOSE,"ic7300_set_rit: ts=%d\n",ts);
tsbuf[2] = 0;
// set sign bit
if (ts < 0) tsbuf[2] = 1;
snprintf(tmpbuf,sizeof(tmpbuf),"%04d",abs(ts));
unsigned int b1,b2;
sscanf(tmpbuf,"%02x%02x",&b1,&b2);
tsbuf[1] = b1;
tsbuf[0] = b2;
if (ts != 0) {
retval = icom_transaction (rig, 0x21, 0x00, tsbuf, 3, ackbuf, &ack_len);
if (retval != RIG_OK)
return retval;
}
if (ts == 0) { // turn off both rit/xit
retval = ic7300_set_func(rig,vfo,RIG_FUNC_XIT,0);
if (retval != RIG_OK) return retval;
retval = ic7300_set_func(rig,vfo,RIG_FUNC_RIT,0);
}
else {
if (xit_flag) retval = ic7300_set_func(rig,vfo,RIG_FUNC_XIT,1);
else retval = ic7300_set_func(rig,vfo,RIG_FUNC_RIT,1);
}
return retval;
}
int ic7300_set_xit(RIG *rig, vfo_t vfo, shortfreq_t ts)
{
int retval;
xit_flag = 1;
retval = ic7300_set_rit(rig,vfo,ts);
xit_flag = 0;
return retval;
}
int ic7300_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
{
unsigned char ackbuf[16];
int ack_len;
int retval;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
if (!rig || !status)
return -RIG_EINVAL;
switch (func) {
case RIG_FUNC_RIT:
retval = icom_transaction (rig, 0x21, 0x01, NULL, 0, ackbuf, &ack_len);
if (retval != RIG_OK) return retval;
if (ack_len != 3) return RIG_BUSERROR;
*status = ackbuf[2];
break;
case RIG_FUNC_XIT:
retval = icom_transaction (rig, 0x21, 0x02, NULL, 0, ackbuf, &ack_len);
if (ack_len != 3) return RIG_BUSERROR;
*status = ackbuf[2];
break;
default:
return icom_get_func(rig, vfo, func, status);
}
return retval;
}
int ic7300_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
{
unsigned char ts_buf[4];
unsigned char ackbuf[8];
int ack_len;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
if (!rig)
return -RIG_EINVAL;
switch (func) {
case RIG_FUNC_RIT:
ts_buf[0] = status;
return icom_transaction (rig, 0x21, 0x01, ts_buf, 1, ackbuf, &ack_len);
case RIG_FUNC_XIT:
ts_buf[0] = status;
return icom_transaction (rig, 0x21, 0x02, ts_buf, 1, ackbuf, &ack_len);
default:
return icom_set_func(rig, vfo, func, status);
}
return RIG_OK;
}

Wyświetl plik

@ -221,7 +221,7 @@ const struct ts_sc_list ic7200_ts_sc_list[] = {
};
const struct ts_sc_list ic7300_ts_sc_list[] = {
{ 10, 0x00 }, /* Manual says "Send/read the tuning step OFF" */
{ 1, 0x00 }, /* Manual says "Send/read the tuning step OFF" */
{ 100, 0x01 },
{ kHz(1), 0x02 },
{ kHz(5), 0x03 },
@ -378,6 +378,7 @@ int icom_init(RIG *rig)
priv_caps = (const struct icom_priv_caps *) caps->priv;
priv = (struct icom_priv_data*)calloc(1, sizeof(struct icom_priv_data));
if (!priv) {
/* whoops! memory shortage! */
@ -396,6 +397,8 @@ int icom_init(RIG *rig)
priv->re_civ_addr = priv_caps->re_civ_addr;
priv->civ_731_mode = priv_caps->civ_731_mode;
priv->no_xchg = priv_caps->no_xchg;
priv->civ_version = priv_caps->civ_version;
rig_debug(RIG_DEBUG_TRACE,"icom_init: civ_version=%d\n", priv->civ_version);
return RIG_OK;
}
@ -923,6 +926,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo)
int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
{
struct rig_state *rs;
struct icom_priv_data *priv;
unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
int ack_len=sizeof(ackbuf), lvl_len;
int lvl_cn, lvl_sc; /* Command Number, Subcommand */
@ -930,6 +934,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
int i, retval;
rs = &rig->state;
priv = (struct icom_priv_data*)rs->priv;
/*
@ -956,7 +961,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
break;
}
}
if (rig->caps->rig_model == RIG_MODEL_IC7300) {
if (priv->civ_version == 1) {
switch (level) {
case RIG_LEVEL_KEYSPD:
if (val.i < 6) val.i = 6;
@ -1097,9 +1102,18 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
lvl_sc = S_LVL_VOXGAIN;
}
break;
case RIG_LEVEL_VOXDELAY: /* IC-910H */
lvl_cn = C_CTL_MEM;
lvl_sc = S_MEM_VOXDELAY;
case RIG_LEVEL_VOXDELAY:
if (priv->civ_version == 1) {
lvl_cn = C_CTL_MEM;
lvl_sc = 0x05; // plus 0191 and value 0-20 = 0-2 secs
lvl_len = 2;
lvlbuf[0] = 0x01;
lvlbuf[1] = 0x91;
}
else { /* IC-910H */
lvl_cn = C_CTL_MEM;
lvl_sc = S_MEM_VOXDELAY;
}
break;
case RIG_LEVEL_ANTIVOX:
if (rig->caps->rig_model == RIG_MODEL_IC910) {
@ -1135,7 +1149,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
* Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL
*
* TODO (missing RIG_LEVEL):
* - S_RFML: Read real RFpower-meter level
* - S_RiML: Read real RFpower-meter level
* - S_CMP: Read COMP-meter level
* - S_VD : Read Vd-meter level
* - S_ID : Read Id-meter level
@ -1143,6 +1157,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
{
struct rig_state *rs;
struct icom_priv_data *priv;
unsigned char lvlbuf[MAXFRAMELEN], lvl2buf[MAXFRAMELEN];
int lvl_len, lvl2_len;
int lvl_cn, lvl_sc; /* Command Number, Subcommand */
@ -1151,6 +1166,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
int retval;
rs = &rig->state;
priv = (struct icom_priv_data*)rs->priv;
lvl2_len = 0;
@ -1275,6 +1291,13 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
lvl_sc = S_LVL_ANTIVOX;
}
break;
/* Not implemented yet
case TOK_LEVEL_MONITOR:
lvl_cn = C_CTL_MEM;
lvl_sc = S_MEM_MONITOR;
break;
*/
default:
rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d", level);
return -RIG_EINVAL;
@ -1310,6 +1333,9 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
icom_val = from_bcd_be(lvlbuf+cmdhead, lvl_len*2);
switch (level) {
case RIG_LEVEL_STRENGTH:
val->i = round(rig_raw2val(icom_val, &rig->caps->str_cal));
break;
case RIG_LEVEL_RAWSTR:
/* raw value */
val->i = icom_val;
@ -1370,7 +1396,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
}
}
else if ((rig->caps->rig_model == RIG_MODEL_IC7300)&&(level==RIG_LEVEL_KEYSPD)){
else if ((priv->civ_version == 1)&&(level==RIG_LEVEL_KEYSPD)){
switch (level) {
case RIG_LEVEL_KEYSPD:
val->i = val->i*(42.0/255)+6+.5;
@ -1384,6 +1410,41 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
return RIG_OK;
}
/*
* icom_set_ext_level
* Assumes rig!=NULL, rig->state.priv!=NULL
*
*/
int icom_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val)
{
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
switch (token) {
case TOK_LEVEL_MONITOR:
rig_debug(RIG_DEBUG_VERBOSE, "TOK_LEVEL_MONITOR\n", __func__);
break;
default: return -RIG_EINVAL;
}
return RIG_OK;
}
/*
* icom_get_ext_level
* Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL
*
*/
int icom_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val)
{
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
switch (token) {
case TOK_LEVEL_MONITOR:
rig_debug(RIG_DEBUG_VERBOSE, "TOK_LEVEL_MONITOR\n", __func__);
break;
default: return -RIG_EINVAL;
}
return RIG_OK;
}
/*
* Assumes rig!=NULL, rig->state.priv!=NULL
*/
@ -2208,9 +2269,17 @@ int icom_get_ts(RIG *rig, vfo_t vfo, shortfreq_t *ts)
*/
int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
{
struct icom_priv_data *priv;
struct rig_state *rs;
unsigned char fctbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
int fct_len, acklen, retval;
int fct_cn, fct_sc; /* Command Number, Subcommand */
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
rs = &rig->state;
priv = (struct icom_priv_data*)rs->priv;
/* r8500, the problem rig */
int r8500 = (rig->caps->rig_model == RIG_MODEL_ICR8500)? 1 : 0;
@ -2226,10 +2295,16 @@ int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
fct_sc = (r8500)?(status)?S_FUNC_AGCON:S_FUNC_AGCOFF:S_FUNC_AGC;
/* fct_sc = S_FUNC_AGC; */
/* note: should it be a LEVEL only, and no func? --SF */
if (status != 0)
if (priv->civ_version == 1) {
fct_len = 1;
fctbuf[0] = status;
}
else if (status != 0) {
fctbuf[0] = 0x03; /* default to 0x03 in IC746 pro super-fast */
else
}
else {
fctbuf[0] = 0x02;
}
break;
case RIG_FUNC_NB:
fct_cn = C_CTL_FUNC;
@ -2452,6 +2527,8 @@ These are very much rig specific and should probably be in rig files. These are
*/
int icom_set_parm(RIG *rig, setting_t parm, value_t val)
{
struct rig_state *rs;
struct icom_priv_data *priv;
unsigned char prmbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
int ack_len=sizeof(ackbuf), prm_len;
int prm_cn, prm_sc;
@ -2459,6 +2536,9 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
int retval;
int min,hr,sec;
rs = &rig->state;
priv = (struct icom_priv_data*)rs->priv;
switch (parm) {
case RIG_PARM_ANN:
if ((val.i == RIG_ANN_FREQ) || (val.i == RIG_ANN_RXMODE)) {
@ -2496,26 +2576,54 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
icom_val = val.f * 255;
prm_len = 3;
prmbuf[0] = S_PRM_BACKLT;
to_bcd_be(prmbuf+1, (long long)icom_val, (prm_len-1)*2);
if (priv->civ_version == 1) {
prm_sc = 0x05;
prm_len = 4;
prmbuf[0] = 0x00;
prmbuf[1] = 0x81;
to_bcd_be(prmbuf+2, (long long)icom_val, (prm_len-1)*2);
}
else {
to_bcd_be(prmbuf+1, (long long)icom_val, (prm_len-1)*2);
}
break;
case RIG_PARM_BEEP:
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
prm_len = 2;
prmbuf[0] = S_PRM_BEEP;
prmbuf[1] = val.i;
if (priv->civ_version == 1) {
prm_sc = 0x05;
prm_len = 3;
prmbuf[0] = 0x00;
prmbuf[1] = 0x23;
prmbuf[2] = val.i;
}
else {
prm_sc = S_MEM_MODE_SLCT;
prm_len = 2;
prmbuf[0] = S_PRM_BEEP;
prmbuf[1] = val.i;
}
break;
case RIG_PARM_TIME:
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
hr = (float)val.i/3600.0;
min = (float)(val.i - (hr*3600))/60.0;
sec = (val.i - (hr*3600) - (min*60));
prm_len = 4;
prmbuf[0] = S_PRM_TIME;
to_bcd_be(prmbuf+1, (long long)hr, 2);
to_bcd_be(prmbuf+2, (long long)min, 2);
to_bcd_be(prmbuf+3, (long long)sec, 2);
if (priv->civ_version == 1) {
prm_sc = 0x05;
prm_len = 4;
prmbuf[0] = 0x00;
prmbuf[1] = 0x95;
to_bcd_be(prmbuf+2, (long long)hr, 2);
to_bcd_be(prmbuf+3, (long long)min, 2);
}
else {
prm_sc = S_MEM_MODE_SLCT;
prm_len = 4;
prmbuf[0] = S_PRM_TIME;
to_bcd_be(prmbuf+1, (long long)hr, 2);
to_bcd_be(prmbuf+2, (long long)min, 2);
to_bcd_be(prmbuf+3, (long long)sec, 2);
}
break;
default:
rig_debug(RIG_DEBUG_ERR,"Unsupported set_parm %d\n", parm);
@ -2542,6 +2650,8 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
*/
int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
{
struct rig_state *rs;
struct icom_priv_data *priv;
unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN];
int prm_len, res_len;
int prm_cn, prm_sc;
@ -2550,6 +2660,9 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
int retval;
int min,hr,sec;
rs = &rig->state;
priv = (struct icom_priv_data*)rs->priv;
switch (parm) {
case RIG_PARM_APO:
prm_cn = C_CTL_MEM;
@ -2559,21 +2672,45 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
break;
case RIG_PARM_BACKLIGHT:
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
prm_len = 1;
prmbuf[0] = S_PRM_BACKLT;
if (priv->civ_version == 1) {
prm_sc = 0x05;
prm_len = 2;
prmbuf[0] = 0x00;
prmbuf[1] = 0x81;
}
else {
prm_sc = S_MEM_MODE_SLCT;
prm_len = 1;
prmbuf[0] = S_PRM_BACKLT;
}
break;
case RIG_PARM_BEEP:
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
prm_len = 1;
prmbuf[0] = S_PRM_BEEP;
if (priv->civ_version == 1) {
prm_sc = 0x05;
prm_len = 2;
prmbuf[0] = 0x00;
prmbuf[1] = 0x23;
}
else {
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
prm_len = 1;
prmbuf[0] = S_PRM_BEEP;
}
break;
case RIG_PARM_TIME:
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
prm_len = 1;
prmbuf[0] = S_PRM_TIME;
if (priv->civ_version == 1) {
prm_sc = 0x05;
prm_len = 2;
prmbuf[0] = 0x00;
prmbuf[1] = 0x95;
}
else {
prm_cn = C_CTL_MEM;
prm_sc = S_MEM_MODE_SLCT;
prm_len = 1;
prmbuf[0] = S_PRM_TIME;
}
break;
default:
rig_debug(RIG_DEBUG_ERR,"Unsupported get_parm %d", parm);
@ -2605,12 +2742,26 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
val->i = icom_val;
break;
case RIG_PARM_TIME:
hr = from_bcd_be(resbuf+cmdhead, 2);
min = from_bcd_be(resbuf+cmdhead+1, 2);
sec = from_bcd_be(resbuf+cmdhead+2, 2);
if (priv->civ_version == 1) {
hr = from_bcd_be(resbuf+cmdhead, 2);
min = from_bcd_be(resbuf+cmdhead+1, 2);
sec = from_bcd_be(resbuf+cmdhead+2, 2);
}
else {
hr = from_bcd_be(resbuf+cmdhead+1, 2);
min = from_bcd_be(resbuf+cmdhead+2, 2);
sec = 0;
}
icom_val = (hr*3600)+(min*60)+sec;
val->i = icom_val;
break;
case RIG_PARM_BACKLIGHT:
icom_val = 0;
if (priv->civ_version == 1) {
icom_val = from_bcd_be(resbuf+cmdhead+1, (res_len-1)*2);
val->f = icom_val/255.0*100;
}
break;
default:
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
if (RIG_PARM_IS_FLOAT(parm))
@ -2868,12 +3019,30 @@ int icom_get_dcs_code(RIG *rig, vfo_t vfo, tone_t *code)
*/
int icom_set_powerstat(RIG *rig, powerstat_t status)
{
unsigned char ackbuf[MAXFRAMELEN];
unsigned char ackbuf[200];
int ack_len=sizeof(ackbuf), retval;
int pwr_sc;
unsigned char fe_buf[200]; // for FE's to power up
int fe_len = 0;
pwr_sc = status==RIG_POWER_ON ? S_PWR_ON:S_PWR_OFF;
switch (status) {
case RIG_POWER_ON:
pwr_sc = RIG_POWER_ON;
// ic7300 manual says ~150 for 115,200
// we'll just send 175 to be sure for all speeds
for(fe_len=0;fe_len<175;++fe_len) {
fe_buf[fe_len]=0xfe;
}
break;
default:
pwr_sc = RIG_POWER_OFF;
fe_buf[0] = 0;
}
// we can ignore this retval
// sending more than enough 0xfe's to take up the rs232
icom_transaction(rig, 0xfe, 0xfe, fe_buf, fe_len,
ackbuf, &ack_len);
retval = icom_transaction(rig, C_SET_PWR, pwr_sc, NULL, 0,
ackbuf, &ack_len);
if (retval != RIG_OK)
@ -3058,13 +3227,16 @@ int icom_get_ant(RIG *rig, vfo_t vfo, ant_t *ant)
*/
int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
{
struct rig_state *rs;
struct icom_priv_data *priv;
unsigned char mvbuf[MAXFRAMELEN];
unsigned char ackbuf[MAXFRAMELEN];
int mv_len, ack_len=sizeof(ackbuf), retval;
int mv_len=0, ack_len=sizeof(ackbuf), retval;
int mv_cn, mv_sc;
int vfo_list;
mv_len = 0;
rs = &rig->state;
priv = (struct icom_priv_data*)rs->priv;
switch(op) {
case RIG_OP_CPY:
@ -3104,6 +3276,10 @@ int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
mv_sc = -1;
break;
case RIG_OP_TUNE:
if (priv->civ_version == 1) {
mvbuf[0] = 2;
mv_len = 1;
}
mv_cn = C_CTL_PTT;
mv_sc = S_ANT_TUN;
break;
@ -3227,6 +3403,46 @@ int icom_send_morse (RIG * rig, vfo_t vfo, const char *msg)
return RIG_OK;
}
int icom_power2mW(RIG * rig, unsigned int *mwpower, float power, freq_t freq, rmode_t mode)
{
int rig_id;
rig_id = rig->caps->rig_model;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
switch (rig_id) {
default:
/* Normal 100 Watts */
*mwpower = power * 100000;
break;
}
return RIG_OK;
}
int icom_mW2power(RIG * rig, float *power, unsigned int mwpower, freq_t freq, rmode_t mode)
{
int rig_id;
rig_id = rig->caps->rig_model;
rig_debug(RIG_DEBUG_TRACE, "%s: passed mwpower = %i\n", __func__, mwpower);
rig_debug(RIG_DEBUG_TRACE, "%s: passed freq = %"PRIfreq" Hz\n", __func__, freq);
rig_debug(RIG_DEBUG_TRACE, "%s: passed mode = %i\n", __func__, mode);
if (mwpower > 100000)
return -RIG_EINVAL;
switch (rig_id) {
default: /* Default to a 100W radio */
*power = ((float)mwpower / 100000);
break;
}
return RIG_OK;
}
/*
* icom_decode is called by sa_sigio, when some asynchronous

Wyświetl plik

@ -111,6 +111,7 @@ struct icom_priv_caps {
tokens to bandwidth and
mode */
int serial_full_duplex; /*!< Whether RXD&TXD are not tied together */
unsigned char civ_version; // default to 0, 1=IC7200,IC7300,etc differences
};
@ -121,6 +122,7 @@ struct icom_priv_data {
int no_1a_03_cmd; /* rig doesn't tell IF widths */
int split_on; /* record split state */
pltstate_t *pltstate; /* only on optoscan */
unsigned char civ_version; /* 0=default, 1=new commands for IC7200,IC7300, etc */
};
extern const struct ts_sc_list r8500_ts_sc_list[];
@ -183,6 +185,8 @@ int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op);
int icom_scan(RIG *rig, vfo_t vfo, scan_t scan, int ch);
int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
int icom_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val);
int icom_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val);
int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status);
int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
int icom_set_parm(RIG *rig, setting_t parm, value_t val);
@ -194,6 +198,8 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status);
int icom_set_ant(RIG * rig, vfo_t vfo, ant_t ant);
int icom_get_ant(RIG * rig, vfo_t vfo, ant_t *ant);
int icom_decode_event(RIG *rig);
int icom_power2mW(RIG * rig, unsigned int *mwpower, float power, freq_t freq, rmode_t mode);
int icom_mW2power(RIG * rig, float *power, unsigned int mwpower, freq_t freq, rmode_t mode);
int icom_send_morse (RIG * rig, vfo_t vfo, const char *msg);
extern const struct confparams icom_cfg_params[];

Wyświetl plik

@ -294,6 +294,7 @@
*/
#define S_PWR_OFF 0x00
#define S_PWR_ON 0x01
#define S_PWR_STDBY 0x02
/*
* Transmit control (C_CTL_PTT) subcommands
@ -324,8 +325,8 @@
#define S_MEM_SATMEM 0x01 /* Satellite memory */
#define S_MEM_VOXGAIN 0x02 /* VOX gain level (0=0%, 255=100%) */
#define S_MEM_VOXDELAY 0x03 /* VOX delay (0=0.0 sec, 20=2.0 sec) */
#define S_MEM1_VOXDELAY 0x05 /* VOX delay (0=0.0 sec, 20=2.0 sec) */
#define S_MEM_ANTIVOX 0x04 /* anti VOX setting */
#define S_MEM_ATTLEVEL 0x05 /* Attenuation level (0=0%, 255=100%) */
#define S_MEM_RIT 0x06 /* RIT (0=off, 1=on, 2=sub dial) */
#define S_MEM_SATMODE 0x07 /* Satellite mode (on/off) */
#define S_MEM_BANDSCOPE 0x08 /* Simple bandscope (on/off) */
@ -391,6 +392,7 @@
#define TOK_RTTY_FLTR TOKEN_BACKEND(100)
#define TOK_SSBBASS TOKEN_BACKEND(101)
#define TOK_SQLCTRL TOKEN_BACKEND(102)
#define TOK_LEVEL_MONITOR TOKEN_BACKEND(103)
#endif /* _ICOM_DEFS_H */