kopia lustrzana https://github.com/Hamlib/Hamlib
commit
00fb911ce7
|
@ -80,7 +80,9 @@ static const struct icom_priv_caps IC7200_priv_caps = {
|
||||||
0x76, /* default address */
|
0x76, /* default address */
|
||||||
0, /* 731 mode */
|
0, /* 731 mode */
|
||||||
0, /* no XCHG */
|
0, /* no XCHG */
|
||||||
ic7200_ts_sc_list
|
ic7200_ts_sc_list,
|
||||||
|
.civ_version = 1 /* new version of some commands, e.g. ic7200/7300 */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
225
icom/ic7300.c
225
icom/ic7300.c
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Hamlib CI-V backend - description of IC-7300 and variations
|
* Hamlib CI-V backend - description of IC-7300 and variations
|
||||||
* Adapted by J.Watson from IC-7000 code (c) 2004 by Stephane Fillod
|
* 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
|
* 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
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#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_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_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_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_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 */
|
#define IC7300_ANTS (RIG_ANT_1) /* ant-1 is Hf-6m */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: This is a guess real measures please!
|
* FIXME: This is a guess real measures please!
|
||||||
*/
|
*/
|
||||||
#define IC7300_STR_CAL { 2, \
|
#define IC7300_STR_CAL { 3, \
|
||||||
{ \
|
{ \
|
||||||
{ 0, -60 }, \
|
{ 0, -54 }, \
|
||||||
{ 255, 60 } \
|
{ 120, 0 }, \
|
||||||
|
{ 241, 64 } \
|
||||||
} }
|
} }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -80,22 +81,41 @@ static const struct icom_priv_caps IC7300_priv_caps = {
|
||||||
0x94, /* default address */
|
0x94, /* default address */
|
||||||
0, /* 731 mode */
|
0, /* 731 mode */
|
||||||
0, /* no XCHG */
|
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 = {
|
const struct rig_caps ic7300_caps = {
|
||||||
.rig_model = RIG_MODEL_IC7300,
|
.rig_model = RIG_MODEL_IC7300,
|
||||||
.model_name = "IC-7300",
|
.model_name = "IC-7300",
|
||||||
.mfg_name = "Icom",
|
.mfg_name = "Icom",
|
||||||
.version = BACKEND_VER,
|
.version = BACKEND_VER ".1",
|
||||||
.copyright = "LGPL",
|
.copyright = "LGPL",
|
||||||
.status = RIG_STATUS_ALPHA,
|
.status = RIG_STATUS_STABLE,
|
||||||
.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,
|
||||||
.port_type = RIG_PORT_SERIAL,
|
.port_type = RIG_PORT_SERIAL,
|
||||||
.serial_rate_min = 300,
|
.serial_rate_min = 4800,
|
||||||
.serial_rate_max = 19200,
|
.serial_rate_max = 19200,
|
||||||
.serial_data_bits = 8,
|
.serial_data_bits = 8,
|
||||||
.serial_stop_bits = 1,
|
.serial_stop_bits = 1,
|
||||||
|
@ -115,10 +135,11 @@ const struct rig_caps ic7300_caps = {
|
||||||
[LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } },
|
[LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } },
|
||||||
},
|
},
|
||||||
.parm_gran = {},
|
.parm_gran = {},
|
||||||
|
.extlevels = ic7300_ext_levels,
|
||||||
.ctcss_list = full_ctcss_list,
|
.ctcss_list = full_ctcss_list,
|
||||||
.dcs_list = NULL,
|
.dcs_list = NULL,
|
||||||
.preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess*/
|
.preamp = { 1, 2, RIG_DBLST_END, },
|
||||||
.attenuator = { 20, RIG_DBLST_END, }, /* value taken from p.45 of manual*/
|
.attenuator = { 1, RIG_DBLST_END, }, /* value taken from p.45 of manual*/
|
||||||
.max_rit = Hz(9999),
|
.max_rit = Hz(9999),
|
||||||
.max_xit = Hz(9999),
|
.max_xit = Hz(9999),
|
||||||
.max_ifshift = Hz(0),
|
.max_ifshift = Hz(0),
|
||||||
|
@ -130,8 +151,8 @@ const struct rig_caps ic7300_caps = {
|
||||||
.chan_desc_sz = 0,
|
.chan_desc_sz = 0,
|
||||||
|
|
||||||
.chan_list = {
|
.chan_list = {
|
||||||
{ 1, 199, RIG_MTYPE_MEM },
|
{ 1, 99, RIG_MTYPE_MEM },
|
||||||
{ 200, 201, RIG_MTYPE_EDGE }, /* two by two */
|
{ 100, 101, RIG_MTYPE_EDGE }, /* two by two */
|
||||||
RIG_CHAN_END,
|
RIG_CHAN_END,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -152,13 +173,14 @@ const struct rig_caps ic7300_caps = {
|
||||||
RIG_FRNG_END, },
|
RIG_FRNG_END, },
|
||||||
|
|
||||||
.tuning_steps = {
|
.tuning_steps = {
|
||||||
{IC7300_1HZ_TS_MODES,1},
|
{IC7300_ALL_RX_MODES,Hz(1)},
|
||||||
{IC7300_NOT_TS_MODES,10},
|
|
||||||
{IC7300_ALL_RX_MODES,Hz(100)},
|
|
||||||
{IC7300_ALL_RX_MODES,kHz(1)},
|
{IC7300_ALL_RX_MODES,kHz(1)},
|
||||||
{IC7300_ALL_RX_MODES,kHz(5)},
|
{IC7300_ALL_RX_MODES,kHz(5)},
|
||||||
{IC7300_ALL_RX_MODES,kHz(9)},
|
{IC7300_ALL_RX_MODES,kHz(9)},
|
||||||
{IC7300_ALL_RX_MODES,kHz(10)},
|
{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,
|
RIG_TS_END,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -198,15 +220,23 @@ const struct rig_caps ic7300_caps = {
|
||||||
.set_ant = NULL, /*automatically set by rig depending band */
|
.set_ant = NULL, /*automatically set by rig depending band */
|
||||||
.get_ant = NULL,
|
.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,
|
.decode_event = icom_decode_event,
|
||||||
.set_level = icom_set_level,
|
.set_level = icom_set_level,
|
||||||
.get_level = icom_get_level,
|
.get_level = icom_get_level,
|
||||||
.set_func = icom_set_func,
|
.set_ext_level = icom_set_ext_level,
|
||||||
.get_func = icom_get_func,
|
.get_ext_level = icom_get_ext_level,
|
||||||
.set_parm = NULL,
|
.set_func = ic7300_set_func,
|
||||||
.get_parm = NULL,
|
.get_func = ic7300_get_func,
|
||||||
|
.set_parm = icom_set_parm,
|
||||||
|
.get_parm = icom_get_parm,
|
||||||
.set_mem = icom_set_mem,
|
.set_mem = icom_set_mem,
|
||||||
.vfo_op = icom_vfo_op,
|
.vfo_op = icom_vfo_op,
|
||||||
.scan = icom_scan,
|
.scan = icom_scan,
|
||||||
|
@ -214,7 +244,7 @@ const struct rig_caps ic7300_caps = {
|
||||||
.get_ptt = icom_get_ptt,
|
.get_ptt = icom_get_ptt,
|
||||||
.get_dcd = icom_get_dcd,
|
.get_dcd = icom_get_dcd,
|
||||||
.set_ts = icom_set_ts,
|
.set_ts = icom_set_ts,
|
||||||
.get_ts = NULL,
|
.get_ts = icom_get_ts,
|
||||||
.set_rptr_shift = icom_set_rptr_shift,
|
.set_rptr_shift = icom_set_rptr_shift,
|
||||||
.get_rptr_shift = NULL,
|
.get_rptr_shift = NULL,
|
||||||
.set_rptr_offs = icom_set_rptr_offs,
|
.set_rptr_offs = icom_set_rptr_offs,
|
||||||
|
@ -229,6 +259,143 @@ const struct rig_caps ic7300_caps = {
|
||||||
.get_split_mode = icom_get_split_mode,
|
.get_split_mode = icom_get_split_mode,
|
||||||
.set_split_vfo = icom_set_split_vfo,
|
.set_split_vfo = icom_set_split_vfo,
|
||||||
.get_split_vfo = NULL,
|
.get_split_vfo = NULL,
|
||||||
|
.set_powerstat = icom_set_powerstat,
|
||||||
|
.power2mW = icom_power2mW,
|
||||||
|
.mW2power = icom_mW2power,
|
||||||
.send_morse = icom_send_morse
|
.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;
|
||||||
|
}
|
||||||
|
|
240
icom/icom.c
240
icom/icom.c
|
@ -221,7 +221,7 @@ const struct ts_sc_list ic7200_ts_sc_list[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct ts_sc_list ic7300_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 },
|
{ 100, 0x01 },
|
||||||
{ kHz(1), 0x02 },
|
{ kHz(1), 0x02 },
|
||||||
{ kHz(5), 0x03 },
|
{ kHz(5), 0x03 },
|
||||||
|
@ -378,6 +378,7 @@ int icom_init(RIG *rig)
|
||||||
|
|
||||||
priv_caps = (const struct icom_priv_caps *) caps->priv;
|
priv_caps = (const struct icom_priv_caps *) caps->priv;
|
||||||
|
|
||||||
|
|
||||||
priv = (struct icom_priv_data*)calloc(1, sizeof(struct icom_priv_data));
|
priv = (struct icom_priv_data*)calloc(1, sizeof(struct icom_priv_data));
|
||||||
if (!priv) {
|
if (!priv) {
|
||||||
/* whoops! memory shortage! */
|
/* whoops! memory shortage! */
|
||||||
|
@ -396,6 +397,8 @@ int icom_init(RIG *rig)
|
||||||
priv->re_civ_addr = priv_caps->re_civ_addr;
|
priv->re_civ_addr = priv_caps->re_civ_addr;
|
||||||
priv->civ_731_mode = priv_caps->civ_731_mode;
|
priv->civ_731_mode = priv_caps->civ_731_mode;
|
||||||
priv->no_xchg = priv_caps->no_xchg;
|
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;
|
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)
|
int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
|
||||||
{
|
{
|
||||||
struct rig_state *rs;
|
struct rig_state *rs;
|
||||||
|
struct icom_priv_data *priv;
|
||||||
unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||||
int ack_len=sizeof(ackbuf), lvl_len;
|
int ack_len=sizeof(ackbuf), lvl_len;
|
||||||
int lvl_cn, lvl_sc; /* Command Number, Subcommand */
|
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;
|
int i, retval;
|
||||||
|
|
||||||
rs = &rig->state;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rig->caps->rig_model == RIG_MODEL_IC7300) {
|
if (priv->civ_version == 1) {
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case RIG_LEVEL_KEYSPD:
|
case RIG_LEVEL_KEYSPD:
|
||||||
if (val.i < 6) val.i = 6;
|
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;
|
lvl_sc = S_LVL_VOXGAIN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_LEVEL_VOXDELAY: /* IC-910H */
|
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_cn = C_CTL_MEM;
|
||||||
lvl_sc = S_MEM_VOXDELAY;
|
lvl_sc = S_MEM_VOXDELAY;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_LEVEL_ANTIVOX:
|
case RIG_LEVEL_ANTIVOX:
|
||||||
if (rig->caps->rig_model == RIG_MODEL_IC910) {
|
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
|
* Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL
|
||||||
*
|
*
|
||||||
* TODO (missing RIG_LEVEL):
|
* 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_CMP: Read COMP-meter level
|
||||||
* - S_VD : Read Vd-meter level
|
* - S_VD : Read Vd-meter level
|
||||||
* - S_ID : Read Id-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)
|
int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
{
|
{
|
||||||
struct rig_state *rs;
|
struct rig_state *rs;
|
||||||
|
struct icom_priv_data *priv;
|
||||||
unsigned char lvlbuf[MAXFRAMELEN], lvl2buf[MAXFRAMELEN];
|
unsigned char lvlbuf[MAXFRAMELEN], lvl2buf[MAXFRAMELEN];
|
||||||
int lvl_len, lvl2_len;
|
int lvl_len, lvl2_len;
|
||||||
int lvl_cn, lvl_sc; /* Command Number, Subcommand */
|
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;
|
int retval;
|
||||||
|
|
||||||
rs = &rig->state;
|
rs = &rig->state;
|
||||||
|
priv = (struct icom_priv_data*)rs->priv;
|
||||||
|
|
||||||
lvl2_len = 0;
|
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;
|
lvl_sc = S_LVL_ANTIVOX;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
/* Not implemented yet
|
||||||
|
case TOK_LEVEL_MONITOR:
|
||||||
|
lvl_cn = C_CTL_MEM;
|
||||||
|
lvl_sc = S_MEM_MONITOR;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d", level);
|
rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d", level);
|
||||||
return -RIG_EINVAL;
|
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);
|
icom_val = from_bcd_be(lvlbuf+cmdhead, lvl_len*2);
|
||||||
|
|
||||||
switch (level) {
|
switch (level) {
|
||||||
|
case RIG_LEVEL_STRENGTH:
|
||||||
|
val->i = round(rig_raw2val(icom_val, &rig->caps->str_cal));
|
||||||
|
break;
|
||||||
case RIG_LEVEL_RAWSTR:
|
case RIG_LEVEL_RAWSTR:
|
||||||
/* raw value */
|
/* raw value */
|
||||||
val->i = icom_val;
|
val->i = icom_val;
|
||||||
|
@ -1370,7 +1396,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
break;
|
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) {
|
switch (level) {
|
||||||
case RIG_LEVEL_KEYSPD:
|
case RIG_LEVEL_KEYSPD:
|
||||||
val->i = val->i*(42.0/255)+6+.5;
|
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;
|
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
|
* 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)
|
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];
|
unsigned char fctbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||||
int fct_len, acklen, retval;
|
int fct_len, acklen, retval;
|
||||||
int fct_cn, fct_sc; /* Command Number, Subcommand */
|
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 */
|
/* r8500, the problem rig */
|
||||||
int r8500 = (rig->caps->rig_model == RIG_MODEL_ICR8500)? 1 : 0;
|
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 = (r8500)?(status)?S_FUNC_AGCON:S_FUNC_AGCOFF:S_FUNC_AGC;
|
||||||
/* fct_sc = S_FUNC_AGC; */
|
/* fct_sc = S_FUNC_AGC; */
|
||||||
/* note: should it be a LEVEL only, and no func? --SF */
|
/* 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 */
|
fctbuf[0] = 0x03; /* default to 0x03 in IC746 pro super-fast */
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
fctbuf[0] = 0x02;
|
fctbuf[0] = 0x02;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_FUNC_NB:
|
case RIG_FUNC_NB:
|
||||||
fct_cn = C_CTL_FUNC;
|
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)
|
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];
|
unsigned char prmbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
|
||||||
int ack_len=sizeof(ackbuf), prm_len;
|
int ack_len=sizeof(ackbuf), prm_len;
|
||||||
int prm_cn, prm_sc;
|
int prm_cn, prm_sc;
|
||||||
|
@ -2459,6 +2536,9 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val)
|
||||||
int retval;
|
int retval;
|
||||||
int min,hr,sec;
|
int min,hr,sec;
|
||||||
|
|
||||||
|
rs = &rig->state;
|
||||||
|
priv = (struct icom_priv_data*)rs->priv;
|
||||||
|
|
||||||
switch (parm) {
|
switch (parm) {
|
||||||
case RIG_PARM_ANN:
|
case RIG_PARM_ANN:
|
||||||
if ((val.i == RIG_ANN_FREQ) || (val.i == RIG_ANN_RXMODE)) {
|
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;
|
icom_val = val.f * 255;
|
||||||
prm_len = 3;
|
prm_len = 3;
|
||||||
prmbuf[0] = S_PRM_BACKLT;
|
prmbuf[0] = S_PRM_BACKLT;
|
||||||
|
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);
|
to_bcd_be(prmbuf+1, (long long)icom_val, (prm_len-1)*2);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_BEEP:
|
case RIG_PARM_BEEP:
|
||||||
prm_cn = C_CTL_MEM;
|
prm_cn = C_CTL_MEM;
|
||||||
|
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_sc = S_MEM_MODE_SLCT;
|
||||||
prm_len = 2;
|
prm_len = 2;
|
||||||
prmbuf[0] = S_PRM_BEEP;
|
prmbuf[0] = S_PRM_BEEP;
|
||||||
prmbuf[1] = val.i;
|
prmbuf[1] = val.i;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_TIME:
|
case RIG_PARM_TIME:
|
||||||
prm_cn = C_CTL_MEM;
|
prm_cn = C_CTL_MEM;
|
||||||
prm_sc = S_MEM_MODE_SLCT;
|
|
||||||
hr = (float)val.i/3600.0;
|
hr = (float)val.i/3600.0;
|
||||||
min = (float)(val.i - (hr*3600))/60.0;
|
min = (float)(val.i - (hr*3600))/60.0;
|
||||||
sec = (val.i - (hr*3600) - (min*60));
|
sec = (val.i - (hr*3600) - (min*60));
|
||||||
|
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;
|
prm_len = 4;
|
||||||
prmbuf[0] = S_PRM_TIME;
|
prmbuf[0] = S_PRM_TIME;
|
||||||
to_bcd_be(prmbuf+1, (long long)hr, 2);
|
to_bcd_be(prmbuf+1, (long long)hr, 2);
|
||||||
to_bcd_be(prmbuf+2, (long long)min, 2);
|
to_bcd_be(prmbuf+2, (long long)min, 2);
|
||||||
to_bcd_be(prmbuf+3, (long long)sec, 2);
|
to_bcd_be(prmbuf+3, (long long)sec, 2);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rig_debug(RIG_DEBUG_ERR,"Unsupported set_parm %d\n", parm);
|
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)
|
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];
|
unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN];
|
||||||
int prm_len, res_len;
|
int prm_len, res_len;
|
||||||
int prm_cn, prm_sc;
|
int prm_cn, prm_sc;
|
||||||
|
@ -2550,6 +2660,9 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
int retval;
|
int retval;
|
||||||
int min,hr,sec;
|
int min,hr,sec;
|
||||||
|
|
||||||
|
rs = &rig->state;
|
||||||
|
priv = (struct icom_priv_data*)rs->priv;
|
||||||
|
|
||||||
switch (parm) {
|
switch (parm) {
|
||||||
case RIG_PARM_APO:
|
case RIG_PARM_APO:
|
||||||
prm_cn = C_CTL_MEM;
|
prm_cn = C_CTL_MEM;
|
||||||
|
@ -2559,21 +2672,45 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val)
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_BACKLIGHT:
|
case RIG_PARM_BACKLIGHT:
|
||||||
prm_cn = C_CTL_MEM;
|
prm_cn = C_CTL_MEM;
|
||||||
|
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_sc = S_MEM_MODE_SLCT;
|
||||||
prm_len = 1;
|
prm_len = 1;
|
||||||
prmbuf[0] = S_PRM_BACKLT;
|
prmbuf[0] = S_PRM_BACKLT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_BEEP:
|
case RIG_PARM_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_cn = C_CTL_MEM;
|
||||||
prm_sc = S_MEM_MODE_SLCT;
|
prm_sc = S_MEM_MODE_SLCT;
|
||||||
prm_len = 1;
|
prm_len = 1;
|
||||||
prmbuf[0] = S_PRM_BEEP;
|
prmbuf[0] = S_PRM_BEEP;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_TIME:
|
case RIG_PARM_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_cn = C_CTL_MEM;
|
||||||
prm_sc = S_MEM_MODE_SLCT;
|
prm_sc = S_MEM_MODE_SLCT;
|
||||||
prm_len = 1;
|
prm_len = 1;
|
||||||
prmbuf[0] = S_PRM_TIME;
|
prmbuf[0] = S_PRM_TIME;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rig_debug(RIG_DEBUG_ERR,"Unsupported get_parm %d", parm);
|
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;
|
val->i = icom_val;
|
||||||
break;
|
break;
|
||||||
case RIG_PARM_TIME:
|
case RIG_PARM_TIME:
|
||||||
|
if (priv->civ_version == 1) {
|
||||||
hr = from_bcd_be(resbuf+cmdhead, 2);
|
hr = from_bcd_be(resbuf+cmdhead, 2);
|
||||||
min = from_bcd_be(resbuf+cmdhead+1, 2);
|
min = from_bcd_be(resbuf+cmdhead+1, 2);
|
||||||
sec = from_bcd_be(resbuf+cmdhead+2, 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;
|
icom_val = (hr*3600)+(min*60)+sec;
|
||||||
val->i = icom_val;
|
val->i = icom_val;
|
||||||
break;
|
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:
|
default:
|
||||||
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
|
icom_val = from_bcd_be(resbuf+cmdhead, res_len*2);
|
||||||
if (RIG_PARM_IS_FLOAT(parm))
|
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)
|
int icom_set_powerstat(RIG *rig, powerstat_t status)
|
||||||
{
|
{
|
||||||
unsigned char ackbuf[MAXFRAMELEN];
|
unsigned char ackbuf[200];
|
||||||
int ack_len=sizeof(ackbuf), retval;
|
int ack_len=sizeof(ackbuf), retval;
|
||||||
int pwr_sc;
|
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,
|
retval = icom_transaction(rig, C_SET_PWR, pwr_sc, NULL, 0,
|
||||||
ackbuf, &ack_len);
|
ackbuf, &ack_len);
|
||||||
if (retval != RIG_OK)
|
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)
|
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 mvbuf[MAXFRAMELEN];
|
||||||
unsigned char ackbuf[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 mv_cn, mv_sc;
|
||||||
int vfo_list;
|
int vfo_list;
|
||||||
|
|
||||||
mv_len = 0;
|
rs = &rig->state;
|
||||||
|
priv = (struct icom_priv_data*)rs->priv;
|
||||||
|
|
||||||
switch(op) {
|
switch(op) {
|
||||||
case RIG_OP_CPY:
|
case RIG_OP_CPY:
|
||||||
|
@ -3104,6 +3276,10 @@ int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
|
||||||
mv_sc = -1;
|
mv_sc = -1;
|
||||||
break;
|
break;
|
||||||
case RIG_OP_TUNE:
|
case RIG_OP_TUNE:
|
||||||
|
if (priv->civ_version == 1) {
|
||||||
|
mvbuf[0] = 2;
|
||||||
|
mv_len = 1;
|
||||||
|
}
|
||||||
mv_cn = C_CTL_PTT;
|
mv_cn = C_CTL_PTT;
|
||||||
mv_sc = S_ANT_TUN;
|
mv_sc = S_ANT_TUN;
|
||||||
break;
|
break;
|
||||||
|
@ -3227,6 +3403,46 @@ int icom_send_morse (RIG * rig, vfo_t vfo, const char *msg)
|
||||||
|
|
||||||
return RIG_OK;
|
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
|
* icom_decode is called by sa_sigio, when some asynchronous
|
||||||
|
|
|
@ -111,6 +111,7 @@ struct icom_priv_caps {
|
||||||
tokens to bandwidth and
|
tokens to bandwidth and
|
||||||
mode */
|
mode */
|
||||||
int serial_full_duplex; /*!< Whether RXD&TXD are not tied together */
|
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 no_1a_03_cmd; /* rig doesn't tell IF widths */
|
||||||
int split_on; /* record split state */
|
int split_on; /* record split state */
|
||||||
pltstate_t *pltstate; /* only on optoscan */
|
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[];
|
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_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_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_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_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_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
|
||||||
int icom_set_parm(RIG *rig, setting_t parm, value_t val);
|
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_set_ant(RIG * rig, vfo_t vfo, ant_t ant);
|
||||||
int icom_get_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_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);
|
int icom_send_morse (RIG * rig, vfo_t vfo, const char *msg);
|
||||||
|
|
||||||
extern const struct confparams icom_cfg_params[];
|
extern const struct confparams icom_cfg_params[];
|
||||||
|
|
|
@ -294,6 +294,7 @@
|
||||||
*/
|
*/
|
||||||
#define S_PWR_OFF 0x00
|
#define S_PWR_OFF 0x00
|
||||||
#define S_PWR_ON 0x01
|
#define S_PWR_ON 0x01
|
||||||
|
#define S_PWR_STDBY 0x02
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Transmit control (C_CTL_PTT) subcommands
|
* Transmit control (C_CTL_PTT) subcommands
|
||||||
|
@ -324,8 +325,8 @@
|
||||||
#define S_MEM_SATMEM 0x01 /* Satellite memory */
|
#define S_MEM_SATMEM 0x01 /* Satellite memory */
|
||||||
#define S_MEM_VOXGAIN 0x02 /* VOX gain level (0=0%, 255=100%) */
|
#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_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_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_RIT 0x06 /* RIT (0=off, 1=on, 2=sub dial) */
|
||||||
#define S_MEM_SATMODE 0x07 /* Satellite mode (on/off) */
|
#define S_MEM_SATMODE 0x07 /* Satellite mode (on/off) */
|
||||||
#define S_MEM_BANDSCOPE 0x08 /* Simple bandscope (on/off) */
|
#define S_MEM_BANDSCOPE 0x08 /* Simple bandscope (on/off) */
|
||||||
|
@ -391,6 +392,7 @@
|
||||||
#define TOK_RTTY_FLTR TOKEN_BACKEND(100)
|
#define TOK_RTTY_FLTR TOKEN_BACKEND(100)
|
||||||
#define TOK_SSBBASS TOKEN_BACKEND(101)
|
#define TOK_SSBBASS TOKEN_BACKEND(101)
|
||||||
#define TOK_SQLCTRL TOKEN_BACKEND(102)
|
#define TOK_SQLCTRL TOKEN_BACKEND(102)
|
||||||
|
#define TOK_LEVEL_MONITOR TOKEN_BACKEND(103)
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ICOM_DEFS_H */
|
#endif /* _ICOM_DEFS_H */
|
||||||
|
|
Ładowanie…
Reference in New Issue