From 45a8c5c575cc840d395fe5057b2271d7b4473bb0 Mon Sep 17 00:00:00 2001 From: Mikael Nousiainen Date: Sat, 1 Jun 2019 09:51:17 +0300 Subject: [PATCH] More fixes to many Icom HF rig backends: tuner function, VFO tune op, rig-specific AGC levels, basic set of filters where missing, get/set split, get/set powerstat, make get/set RIT/XIT commands shared functions, add new level for Noise Blanker level, fix RIG_MODE_PKTAM and add missing PKT modes for many rigs, add dual-watch function. Add RIT/XIT functions for TS-480 and TS-890. --- icom/ic7000.c | 56 +-- icom/ic7100.c | 40 +- icom/ic7200.c | 23 +- icom/ic7300.c | 287 +++---------- icom/ic7410.c | 20 +- icom/ic746.c | 47 ++- icom/ic756.c | 129 ++++-- icom/ic7600.c | 66 +-- icom/ic7610.c | 66 +-- icom/ic7700.c | 62 +-- icom/ic7800.c | 64 +-- icom/ic785x.c | 61 +-- icom/icom.c | 939 +++++++++++++++++++++++++------------------ icom/icom.h | 10 + icom/icom_defs.h | 9 + include/hamlib/rig.h | 8 +- kenwood/ts480.c | 4 +- src/misc.c | 1 + 18 files changed, 1014 insertions(+), 878 deletions(-) diff --git a/icom/ic7000.c b/icom/ic7000.c index 0e7ffa987..fd6aa58a7 100644 --- a/icom/ic7000.c +++ b/icom/ic7000.c @@ -46,7 +46,7 @@ #define IC7000_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 IC7000_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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC7000_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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC7000_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) #define IC7000_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_APO|RIG_PARM_TIME|RIG_PARM_BEEP) @@ -129,23 +129,26 @@ .levels = RIG_LEVEL_SET(IC7000_LEVELS), \ } -int ic7000_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op); int ic7000_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); int ic7000_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); /* * IC-7000 rig capabilities. - * - * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps IC7000_priv_caps = { - 0x70, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic7000_ts_sc_list + 0x70, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic7000_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; - const struct rig_caps ic7000_caps = { .rig_model = RIG_MODEL_IC7000, .model_name = "IC-7000", @@ -293,7 +296,7 @@ const struct rig_caps ic7000_caps = { .get_parm = NULL, .set_mem = icom_set_mem, .set_bank = icom_set_bank, -.vfo_op = ic7000_vfo_op, +.vfo_op = icom_vfo_op, .scan = icom_scan, .set_ptt = icom_set_ptt, .get_ptt = icom_get_ptt, @@ -319,39 +322,6 @@ const struct rig_caps ic7000_caps = { }; -int ic7000_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op) -{ - unsigned char mvbuf[MAXFRAMELEN]; - unsigned char ackbuf[MAXFRAMELEN]; - int mv_len=0, ack_len=sizeof(ackbuf), retval; - int mv_cn, mv_sc; - - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - - switch(op) { - case RIG_OP_TUNE: - mv_cn = C_CTL_PTT; - mv_sc = S_ANT_TUN; - mvbuf[0] = 2; - mv_len = 1; - break; - default: - return icom_vfo_op(rig, vfo, op); - } - - retval = icom_transaction (rig, mv_cn, mv_sc, mvbuf, mv_len, ackbuf, &ack_len); - if (retval != RIG_OK) - return retval; - - if (ack_len != 1 || ackbuf[0] != ACK) { - if (op != RIG_OP_XCHG) - rig_debug(RIG_DEBUG_ERR,"icom_vfo_op: ack NG (%#.2x), len=%d\n", ackbuf[0], ack_len); - return -RIG_ERJCTED; - } - - return RIG_OK; -} - int ic7000_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { unsigned char cmdbuf[MAXFRAMELEN]; diff --git a/icom/ic7100.c b/icom/ic7100.c index 70717d252..6ceb486e9 100644 --- a/icom/ic7100.c +++ b/icom/ic7100.c @@ -34,9 +34,10 @@ #define IC7100_MODES (RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_CWR|\ - RIG_MODE_AM|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_RTTYR) + RIG_MODE_AM|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_RTTYR|\ + RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTAM|RIG_MODE_PKTFM) -#define IC7100_OTHER_TX_MODES ((IC7100_MODES) & ~RIG_MODE_AM) +#define IC7100_OTHER_TX_MODES ((IC7100_MODES) & ~(RIG_MODE_AM|RIG_MODE_PKTAM)) #define IC7100_VFO_ALL (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) @@ -63,7 +64,8 @@ RIG_FUNC_VSC| \ RIG_FUNC_MN| \ RIG_FUNC_LOCK| \ - RIG_FUNC_SCOPE) + RIG_FUNC_SCOPE| \ + RIG_FUNC_TUNER) #define IC7100_LEVEL_ALL (RIG_LEVEL_AF| \ RIG_LEVEL_RF| \ @@ -93,7 +95,8 @@ RIG_LEVEL_COMP_METER| \ RIG_LEVEL_VD_METER| \ RIG_LEVEL_ID_METER| \ - RIG_LEVEL_MONITOR_GAIN) + RIG_LEVEL_MONITOR_GAIN| \ + RIG_LEVEL_NB) #define IC7100_PARM_ALL (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) @@ -155,13 +158,21 @@ int ic7100_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); int ic7100_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); /* + * IC-7100 rig capabilities. */ static const struct icom_priv_caps ic7100_priv_caps = { 0x88, /* default address */ 0, /* 731 mode */ 0, /* no XCHG */ ic7100_ts_sc_list, /* FIXME */ - .civ_version = 1 + .civ_version = 1, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; const struct rig_caps ic7100_caps = { @@ -267,10 +278,19 @@ const struct rig_caps ic7100_caps = { RIG_TS_END, }, /* mode/filter list, remember: order matters! */ .filters = { - {RIG_MODE_CW | RIG_MODE_SSB | RIG_MODE_RTTY, kHz(2.4)}, /* builtin */ - {RIG_MODE_CW | RIG_MODE_RTTY, Hz(500)}, - {RIG_MODE_FM, kHz(15)}, /* builtin */ - {RIG_MODE_FM|RIG_MODE_AM, kHz(6)}, /* builtin */ + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(10)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(7)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, Hz(500)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, Hz(250)}, + {RIG_MODE_CW|RIG_MODE_CWR, kHz(1.2)}, + {RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, RIG_FLT_END, }, .str_cal = IC7100_STR_CAL, .swr_cal = IC7100_SWR_CAL, @@ -332,11 +352,13 @@ const struct rig_caps ic7100_caps = { .get_dcd = icom_get_dcd, .decode_event = icom_decode_event, .set_split_vfo = icom_set_split_vfo, +.get_split_vfo = icom_get_split_vfo, .set_split_freq = icom_set_split_freq, .get_split_freq = icom_get_split_freq, .set_split_mode = icom_set_split_mode, .get_split_mode = icom_get_split_mode, .set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_powerstat, .send_morse = icom_send_morse }; diff --git a/icom/ic7200.c b/icom/ic7200.c index 19a2bec68..19ccdb8dc 100644 --- a/icom/ic7200.c +++ b/icom/ic7200.c @@ -50,9 +50,9 @@ #define IC7200_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR) #define IC7200_AM_TX_MODES (RIG_MODE_AM) -#define IC7200_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 IC7200_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_ARO|RIG_FUNC_TUNER) -#define IC7200_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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER) +#define IC7200_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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_NB) #define IC7200_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) #define IC7200_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_APO|RIG_PARM_TIME|RIG_PARM_BEEP) @@ -100,15 +100,20 @@ int ic7200_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps IC7200_priv_caps = { - 0x76, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic7200_ts_sc_list, - .civ_version = 1 /* new version of some commands, e.g. ic7200/7300 */ - + 0x76, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic7200_ts_sc_list, + .civ_version = 1, /* new version of some commands, e.g. ic7200/7300 */ + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_SLOW, .icom_level = 2 }, + { .level = -1, .icom_level = 0 }, + }, }; - const struct rig_caps ic7200_caps = { .rig_model = RIG_MODEL_IC7200, .model_name = "IC-7200", diff --git a/icom/ic7300.c b/icom/ic7300.c index 89db47f7b..97a926fd8 100644 --- a/icom/ic7300.c +++ b/icom/ic7300.c @@ -47,7 +47,7 @@ #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|RIG_FUNC_SCOPE|RIG_FUNC_TUNER) -#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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN) +#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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC7300_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) #define IC7300_PARMS (RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP) @@ -115,14 +115,12 @@ { 241, 25.0f } \ } } -#define IC7300_AGC_OFF 0x00 -#define IC7300_AGC_FAST 0x01 -#define IC7300_AGC_MID 0x02 -#define IC7300_AGC_SLOW 0x03 /* * IC9700 items that differ from IC7300 */ +#define IC9700_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_SCOPE) + #define IC9700_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) #define IC9700_ALL_TX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR|RIG_MODE_DD) #define IC9700_ALL_RX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR|RIG_MODE_DD) @@ -183,31 +181,38 @@ /* * IC-7300 rig capabilities. - * - * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps IC7300_priv_caps = { - 0x94, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic7300_ts_sc_list, - .civ_version = 1 /* new version of some commands, e.g. ic7200/7300 */ + 0x94, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic7300_ts_sc_list, + .civ_version = 1, /* new version of some commands, e.g. ic7200/7300 */ + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; static const struct icom_priv_caps IC9700_priv_caps = { - 0xA2, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic7300_ts_sc_list, - .civ_version = 1, /* new version of some commands, e.g. ic7200/7300 */ - .serial_USB_echo_check = 1 /* USB CI-V may not echo */ + 0xA2, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic7300_ts_sc_list, + .civ_version = 1, /* new version of some commands, e.g. ic7200/7300 */ + .serial_USB_echo_check = 1, /* USB CI-V may not echo */ + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; -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); int ic7300_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); int ic7300_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); int ic9700_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); @@ -302,9 +307,9 @@ const struct rig_caps ic7300_caps = { /* 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 = { - {RIG_MODE_SSB, kHz(2.4)}, - {RIG_MODE_SSB, kHz(1.8)}, - {RIG_MODE_SSB, kHz(3)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, Hz(500)}, {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR, Hz(250)}, {RIG_MODE_CW|RIG_MODE_CWR, kHz(1.2)}, @@ -312,9 +317,9 @@ const struct rig_caps ic7300_caps = { {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, - {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(10)}, {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(7)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, RIG_FLT_END, }, @@ -345,21 +350,18 @@ const struct rig_caps ic7300_caps = { .set_ant = NULL, .get_ant = NULL, -.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, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, +.get_xit = icom_get_rit_new, +.set_xit = icom_set_xit_new, .decode_event = icom_decode_event, .set_level = ic7300_set_level, .get_level = ic7300_get_level, .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_func = icom_set_func, +.get_func = icom_get_func, .set_parm = icom_set_parm, .get_parm = icom_get_parm, .set_mem = icom_set_mem, @@ -385,6 +387,7 @@ const struct rig_caps ic7300_caps = { .set_split_vfo = icom_set_split_vfo, .get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_powerstat, .power2mW = icom_power2mW, .mW2power = icom_mW2power, .send_morse = icom_send_morse @@ -412,8 +415,8 @@ const struct rig_caps ic9700_caps = { .post_write_delay = 0, .timeout = 1000, .retry = 3, -.has_get_func = IC7300_FUNCS, -.has_set_func = IC7300_FUNCS, +.has_get_func = IC9700_FUNCS, +.has_set_func = IC9700_FUNCS, .has_get_level = IC7300_LEVELS, .has_set_level = RIG_LEVEL_SET(IC7300_LEVELS), .has_get_parm = IC7300_PARMS, @@ -488,8 +491,8 @@ const struct rig_caps ic9700_caps = { {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(7)}, {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(10)}, - {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(7)}, RIG_FLT_END, }, @@ -520,21 +523,16 @@ const struct rig_caps ic9700_caps = { .set_ant = NULL, .get_ant = NULL, -.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, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, .decode_event = icom_decode_event, .set_level = ic9700_set_level, .get_level = ic9700_get_level, .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_func = icom_set_func, +.get_func = icom_get_func, .set_parm = icom_set_parm, .get_parm = icom_get_parm, .set_mem = icom_set_mem, @@ -560,155 +558,13 @@ const struct rig_caps ic9700_caps = { .set_split_vfo = icom_set_split_vfo, .get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_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, "%s: wrong frame len=%d\n", __func__, ts_len); - return -RIG_ERJCTED; - } - - *ts = (shortfreq_t) from_bcd(tsbuf + 2, 4); - if (tsbuf[4] != 0) { - *ts *= -1; - } - - return RIG_OK; -} - -static int ic7300_set_it(RIG *rig, vfo_t vfo, shortfreq_t ts, int set_xit) { - unsigned char tsbuf[8]; - unsigned char ackbuf[16]; - int ack_len; - int retval; - - rig_debug(RIG_DEBUG_VERBOSE, "%s: ts=%d\n", __func__, ts); - - to_bcd(tsbuf, abs((int) ts), 4); - // set sign bit - tsbuf[2] = (ts < 0) ? 1 : 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 { - retval = ic7300_set_func(rig, vfo, set_xit ? RIG_FUNC_XIT : RIG_FUNC_RIT, 1); - } - return retval; -} - -int ic7300_set_rit(RIG *rig, vfo_t vfo, shortfreq_t ts) -{ - return ic7300_set_it(rig, vfo, ts, 0); -} - -int ic7300_set_xit(RIG *rig, vfo_t vfo, shortfreq_t ts) -{ - return ic7300_set_it(rig, vfo, ts, 1); -} - -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; - - case RIG_FUNC_TUNER: - retval = icom_transaction(rig, 0x1C, 0x01, NULL, 0, ackbuf, &ack_len); - if (ack_len == 3) { - *status = ackbuf[2]; // 0x01 = enabled, 0x00 = disabled, 0x02 = tuning in progress - } else { - return RIG_BUSERROR; - } - 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); - - case RIG_FUNC_TUNER: - if (status == 0 || status == 1 || status == 2) { // 0=off, 1 = on, 2 = begin tuning - ts_buf[0] = status; - return icom_transaction(rig, 0x1C, 0x01, ts_buf, 1, ackbuf, &ack_len); - } else { - return -1; // perhaps some other reply would be more informative - } - - default: - return icom_set_func(rig, vfo, func, status); - } -} - int ic7300_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { unsigned char cmdbuf[MAXFRAMELEN]; @@ -716,29 +572,10 @@ int ic7300_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); switch (level) { - case RIG_LEVEL_AGC: - switch (val.i) { - case RIG_AGC_OFF: - val.i = IC7300_AGC_OFF; - break; - case RIG_AGC_SLOW: - val.i = IC7300_AGC_SLOW; - break; - case RIG_AGC_MEDIUM: - val.i = IC7300_AGC_MID; - break; - case RIG_AGC_FAST: - val.i = IC7300_AGC_FAST; - break; - default: - rig_debug(RIG_DEBUG_ERR, "Unsupported LEVEL_AGC %d", val.i); - return -RIG_EINVAL; - } - return icom_set_level_raw(rig, level, C_CTL_FUNC, S_FUNC_AGC, 0, NULL, 1, val); case RIG_LEVEL_VOXDELAY: cmdbuf[0] = 0x01; cmdbuf[1] = 0x91; - return icom_set_level_raw(rig, level, C_CTL_MEM, 0x05, 2, cmdbuf, 1, val); + return icom_set_level_raw(rig, level, C_CTL_MEM, S_MEM_PARM, 2, cmdbuf, 1, val); default: return icom_set_level(rig, vfo, level, val); } @@ -747,40 +584,14 @@ int ic7300_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) int ic7300_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { unsigned char cmdbuf[MAXFRAMELEN]; - value_t temp_val; - int retval; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); switch (level) { - case RIG_LEVEL_AGC: - retval = icom_get_level_raw(rig, level, C_CTL_FUNC, S_FUNC_AGC, 0, NULL, &temp_val); - if (retval != RIG_OK) { - return retval; - } - - switch (temp_val.i) { - case IC7300_AGC_OFF: - val->i = RIG_AGC_OFF; - break; - case IC7300_AGC_SLOW: - val->i = RIG_AGC_SLOW; - break; - case IC7300_AGC_MID: - val->i = RIG_AGC_MEDIUM; - break; - case IC7300_AGC_FAST: - val->i = RIG_AGC_FAST; - break; - default: - rig_debug(RIG_DEBUG_ERR, "Unexpected Icom AGC value 0x%02x", temp_val.i); - return -RIG_EPROTO; - } - break; case RIG_LEVEL_VOXDELAY: cmdbuf[0] = 0x01; cmdbuf[1] = 0x91; - return icom_get_level_raw(rig, level, C_CTL_MEM, 0x05, 2, cmdbuf, val); + return icom_get_level_raw(rig, level, C_CTL_MEM, S_MEM_PARM, 2, cmdbuf, val); default: return icom_get_level(rig, vfo, level, val); } diff --git a/icom/ic7410.c b/icom/ic7410.c index 2f6b74c87..9442a77fa 100644 --- a/icom/ic7410.c +++ b/icom/ic7410.c @@ -41,7 +41,7 @@ #define IC7410_ALL_RX_MODES IC7410_OTHER_TX_MODES | IC7410_AM_TX_MODES #define IC7410_1HZ_TS_MODES IC7410_ALL_RX_MODES -#define IC7410_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) +#define IC7410_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_TUNER) #define IC7410_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER) @@ -90,14 +90,20 @@ int ic7410_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); /* * IC-7410 rig capabilities. - * - * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps ic7410_priv_caps = { - 0x80, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x80, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_SLOW, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_FAST, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; diff --git a/icom/ic746.c b/icom/ic746.c index 6176e09a4..4b8b20ccf 100644 --- a/icom/ic746.c +++ b/icom/ic746.c @@ -58,9 +58,9 @@ #define IC746_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_FM) #define IC746_AM_TX_MODES (RIG_MODE_AM) -#define IC746_FUNC_ALL (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_RF|RIG_FUNC_ANF|RIG_FUNC_APF|RIG_FUNC_VSC|RIG_FUNC_RESUME|RIG_FUNC_ARO) +#define IC746_FUNC_ALL (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_RF|RIG_FUNC_ANF|RIG_FUNC_APF|RIG_FUNC_RESUME|RIG_FUNC_ARO) -#define IC746_LEVEL_ALL (RIG_LEVEL_AF|RIG_LEVEL_RF|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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR) +#define IC746_LEVEL_ALL (RIG_LEVEL_AF|RIG_LEVEL_RF|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_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_APF) #define IC746_GET_PARM (RIG_PARM_BACKLIGHT|RIG_PARM_BEEP) #define IC746_SET_PARM (RIG_PARM_BACKLIGHT|RIG_PARM_BEEP|RIG_PARM_ANN) @@ -68,7 +68,7 @@ #define IC746_VFO_ALL (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) #define IC746_ANTS (RIG_ANT_1|RIG_ANT_2) -#define IC746_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE) +#define IC746_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) #define IC746_SCAN_OPS (RIG_SCAN_VFO|RIG_SCAN_MEM|RIG_SCAN_SLCT|RIG_SCAN_PROG|RIG_SCAN_DELTA) @@ -158,13 +158,20 @@ static int ic746pro_get_ext_parm(RIG *rig, token_t token, value_t *val); /* - * ic746 rig capabilities. + * IC-746 rig capabilities. */ static const struct icom_priv_caps ic746_priv_caps = { - 0x56, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x56, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_SLOW, .icom_level = 2 }, + { .level = -1, .icom_level = 0 }, + }, }; const struct rig_caps ic746_caps = { @@ -365,13 +372,21 @@ static const struct confparams ic746pro_ext_parms[] = { /* - * ic746pro rig capabilities. + * IC-746pro rig capabilities. */ static const struct icom_priv_caps ic746pro_priv_caps = { - 0x66, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x66, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_SLOW, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_FAST, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; const struct rig_caps ic746pro_caps = { @@ -395,8 +410,8 @@ const struct rig_caps ic746pro_caps = { .post_write_delay = 0, .timeout = 1000, .retry = 3, -.has_get_func = IC746_FUNC_ALL, -.has_set_func = IC746_FUNC_ALL, +.has_get_func = IC746_FUNC_ALL|RIG_FUNC_TUNER|RIG_FUNC_VSC, +.has_set_func = IC746_FUNC_ALL|RIG_FUNC_TUNER|RIG_FUNC_VSC, .has_get_level = IC746_LEVEL_ALL, .has_set_level = RIG_LEVEL_SET(IC746_LEVEL_ALL), .has_get_parm = IC746_GET_PARM, @@ -414,7 +429,7 @@ const struct rig_caps ic746pro_caps = { .max_xit = Hz(0), .max_ifshift = Hz(0), .targetable_vfo = 0, -.vfo_ops = IC746_VFO_OPS, +.vfo_ops = IC746_VFO_OPS|RIG_OP_TUNE, .scan_ops = IC746_SCAN_OPS, .transceive = RIG_TRN_RIG, .bank_qty = 0, diff --git a/icom/ic756.c b/icom/ic756.c index 6791593cf..d779dae72 100644 --- a/icom/ic756.c +++ b/icom/ic756.c @@ -47,8 +47,9 @@ #define IC756_AM_TX_MODES (RIG_MODE_AM) #define IC756PRO_FUNC_ALL (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_RF|RIG_FUNC_ANF) +#define IC756PRO_FUNC_SET (IC756PRO_FUNC_ALL|RIG_FUNC_DUAL_WATCH) -#define IC756PRO_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_COMP|RIG_LEVEL_BALANCE) +#define IC756PRO_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_COMP) /* Note that RIG_LEVEL_VOXGAIN and RIG_LEVEL_ANTIVOX are incorrectly handled in icom.c for * this model. @@ -81,6 +82,7 @@ { 247 ,60 } \ } } +int ic756_set_func(RIG *rig, vfo_t vfo, setting_t func, int status); int ic756pro2_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); int ic756pro2_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); @@ -111,14 +113,21 @@ static int r2i_mode(RIG *rig, rmode_t mode, pbwidth_t width, } /* - * ic756 rig capabilities. + * IC-756 rig capabilities. */ static const struct icom_priv_caps ic756_priv_caps = { - 0x50, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756_ts_sc_list, - .r2i_mode = r2i_mode + 0x50, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756_ts_sc_list, + .r2i_mode = r2i_mode, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; const struct rig_caps ic756_caps = { @@ -232,7 +241,7 @@ const struct rig_caps ic756_caps = { .decode_event = icom_decode_event, .set_level = icom_set_level, .get_level = icom_get_level, -.set_func = icom_set_func, +.set_func = ic756_set_func, .get_func = icom_get_func, .set_mem = icom_set_mem, .vfo_op = icom_vfo_op, @@ -253,15 +262,22 @@ const struct rig_caps ic756_caps = { /* - * ic756pro rig capabilities. - * TODO: check every parameter, - * add antenna capabilities + * IC-756pro rig capabilities. + * + * TODO: check every parameter, add antenna capabilities */ static const struct icom_priv_caps ic756pro_priv_caps = { - 0x5c, /* default address */ - 0, /* 731 mode */ + 0x5c, /* default address */ + 0, /* 731 mode */ 0, /* no XCHG */ - ic756pro_ts_sc_list + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; const struct rig_caps ic756pro_caps = { @@ -286,7 +302,7 @@ const struct rig_caps ic756pro_caps = { .timeout = 1000, .retry = 3, .has_get_func = IC756PRO_FUNC_ALL, -.has_set_func = IC756PRO_FUNC_ALL, +.has_set_func = IC756PRO_FUNC_SET, .has_get_level = IC756PRO_LEVEL_ALL, .has_set_level = RIG_LEVEL_SET(IC756PRO_LEVEL_ALL), .has_get_parm = RIG_PARM_NONE, @@ -374,7 +390,7 @@ const struct rig_caps ic756pro_caps = { .decode_event = icom_decode_event, .set_level = icom_set_level, .get_level = icom_get_level, -.set_func = icom_set_func, +.set_func = ic756_set_func, .get_func = icom_get_func, .set_mem = icom_set_mem, .vfo_op = icom_vfo_op, @@ -403,15 +419,22 @@ const struct rig_caps ic756pro_caps = { }; /* - * ic756proII rig capabilities. - * TODO: check every parameter, - * add antenna capabilities + * IC-756proII rig capabilities. + * + * TODO: check every parameter, add antenna capabilities */ static const struct icom_priv_caps ic756pro2_priv_caps = { - 0x64, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x64, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; /* @@ -494,7 +517,7 @@ const struct rig_caps ic756pro2_caps = { .timeout = 1000, .retry = 3, .has_get_func = IC756PRO_FUNC_ALL, -.has_set_func = IC756PRO_FUNC_ALL, +.has_set_func = IC756PRO_FUNC_SET, .has_get_level = IC756PROII_LEVEL_ALL, .has_set_level = RIG_LEVEL_SET(IC756PROII_LEVEL_ALL), .has_get_parm = RIG_PARM_NONE, @@ -584,7 +607,7 @@ const struct rig_caps ic756pro2_caps = { .decode_event = icom_decode_event, .set_level = ic756pro2_set_level, .get_level = ic756pro2_get_level, -.set_func = icom_set_func, +.set_func = ic756_set_func, .get_func = icom_get_func, .set_mem = icom_set_mem, .vfo_op = icom_vfo_op, @@ -765,16 +788,22 @@ static int ic756pro2_get_ext_parm(RIG *rig, token_t token, value_t *val) /* - * ic756proIII rig capabilities. + * IC-756proIII rig capabilities. * - * TODO: check every parameter, - * add antenna capabilities + * TODO: check every parameter, add antenna capabilities */ static const struct icom_priv_caps ic756pro3_priv_caps = { - 0x6e, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x6e, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; @@ -783,7 +812,7 @@ static const struct icom_priv_caps ic756pro3_priv_caps = { #define IC756PROIII_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM) #define IC756PROIII_AM_TX_MODES (RIG_MODE_AM) -#define IC756PROIII_LEVEL_ALL (IC756PROII_LEVEL_ALL|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC756PROIII_LEVEL_ALL (IC756PROII_LEVEL_ALL|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_NB) #define IC756PROIII_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_APO|RIG_PARM_TIME) @@ -858,8 +887,8 @@ const struct rig_caps ic756pro3_caps = { .post_write_delay = 0, .timeout = 1000, .retry = 3, -.has_get_func = IC756PRO_FUNC_ALL, -.has_set_func = IC756PRO_FUNC_ALL, +.has_get_func = IC756PRO_FUNC_ALL|RIG_FUNC_TUNER, +.has_set_func = IC756PRO_FUNC_SET|RIG_FUNC_TUNER, .has_get_level = IC756PROIII_LEVEL_ALL, .has_set_level = RIG_LEVEL_SET(IC756PROIII_LEVEL_ALL), .has_get_parm = IC756PROIII_PARMS, @@ -962,7 +991,7 @@ const struct rig_caps ic756pro3_caps = { .get_parm = icom_get_parm, .set_level = ic756pro2_set_level, .get_level = ic756pro2_get_level, -.set_func = icom_set_func, +.set_func = ic756_set_func, .get_func = icom_get_func, .set_mem = icom_set_mem, .vfo_op = icom_vfo_op, @@ -988,6 +1017,34 @@ const struct rig_caps ic756pro3_caps = { .get_ext_parm = ic756pro2_get_ext_parm, }; +int ic756_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) +{ + unsigned char fctbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN]; + int fct_len = 0, acklen, retval; + int fct_cn, fct_sc; /* Command Number, Subcommand */ + + switch (func) { + case RIG_FUNC_DUAL_WATCH: + fct_cn = C_SET_VFO; + fct_sc = status ? S_DUAL_ON : S_DUAL_OFF; + break; + default: + return icom_set_func(rig, vfo, func, status); + } + + retval = icom_transaction(rig, fct_cn, fct_sc, fctbuf, fct_len, ackbuf, &acklen); + if (retval != RIG_OK) { + return retval; + } + + if (acklen != 1) { + rig_debug(RIG_DEBUG_ERR, "%s: wrong frame len=%d\n", __func__, acklen); + return -RIG_EPROTO; + } + + return RIG_OK; +} + int ic756pro2_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { unsigned char cmdbuf[MAXFRAMELEN]; diff --git a/icom/ic7600.c b/icom/ic7600.c index 9da5f4386..b5648401c 100644 --- a/icom/ic7600.c +++ b/icom/ic7600.c @@ -36,14 +36,14 @@ #include "misc.h" #include "bandplan.h" -#define IC7600_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) +#define IC7600_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTAM|RIG_MODE_PKTFM) #define IC7600_1HZ_TS_MODES IC7600_ALL_RX_MODES -#define IC7600_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) -#define IC7600_AM_TX_MODES (RIG_MODE_AM) +#define IC7600_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM) +#define IC7600_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) -#define IC7600_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) +#define IC7600_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|RIG_FUNC_TUNER|RIG_FUNC_APF|RIG_FUNC_DUAL_WATCH) -#define IC7600_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC7600_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC7600_VFOS (RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) #define IC7600_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) @@ -129,11 +129,18 @@ int ic7600_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps ic7600_priv_caps = { - 0x7a, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list, - .civ_version = 1 + 0x7a, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .civ_version = 1, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; @@ -225,17 +232,23 @@ const struct rig_caps ic7600_caps = { {IC7600_ALL_RX_MODES,kHz(25)}, RIG_TS_END, }, - /* mode/filter list, remember: order matters! */ +/* 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 = { - {RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(500)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(350)}, - {RIG_MODE_AM, kHz(6)}, - {RIG_MODE_AM, kHz(2.4)}, - {RIG_MODE_FM, kHz(12)}, - {RIG_MODE_FM, kHz(8)}, /* TBC */ - RIG_FLT_END, - }, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(500)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(250)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PSK|RIG_MODE_PSKR, kHz(1.2)}, + {RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(10)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(7)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + RIG_FLT_END, +}, .str_cal = IC7600_STR_CAL, .swr_cal = IC7600_SWR_CAL, .alc_cal = IC7600_ALC_CAL, @@ -262,7 +275,10 @@ const struct rig_caps ic7600_caps = { .set_ant = icom_set_ant, .get_ant = icom_get_ant, -.set_rit = icom_set_rit, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, +.get_xit = icom_get_rit_new, +.set_xit = icom_set_xit_new, .decode_event = icom_decode_event, .set_level = ic7600_set_level, @@ -279,10 +295,6 @@ const struct rig_caps ic7600_caps = { .get_dcd = icom_get_dcd, .set_ts = icom_set_ts, .get_ts = icom_get_ts, -.set_rptr_shift = icom_set_rptr_shift, -.get_rptr_shift = icom_get_rptr_shift, -.set_rptr_offs = icom_set_rptr_offs, -.get_rptr_offs = icom_get_rptr_offs, .set_ctcss_tone = icom_set_ctcss_tone, .get_ctcss_tone = icom_get_ctcss_tone, .set_ctcss_sql = icom_set_ctcss_sql, @@ -292,7 +304,9 @@ const struct rig_caps ic7600_caps = { .set_split_mode = icom_set_split_mode, .get_split_mode = icom_get_split_mode, .set_split_vfo = icom_set_split_vfo, -.get_split_vfo = icom_mem_get_split_vfo, +.get_split_vfo = icom_get_split_vfo, +.set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_powerstat, .send_morse = icom_send_morse }; diff --git a/icom/ic7610.c b/icom/ic7610.c index 7781c57f8..f40759675 100644 --- a/icom/ic7610.c +++ b/icom/ic7610.c @@ -37,14 +37,14 @@ #include "misc.h" #include "bandplan.h" -#define IC7610_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) +#define IC7610_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTAM|RIG_MODE_PKTFM) #define IC7610_1HZ_TS_MODES IC7610_ALL_RX_MODES -#define IC7610_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) -#define IC7610_AM_TX_MODES (RIG_MODE_AM) +#define IC7610_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM) +#define IC7610_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) -#define IC7610_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) +#define IC7610_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|RIG_FUNC_TUNER|RIG_FUNC_APF|RIG_FUNC_DUAL_WATCH) -#define IC7610_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC7610_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC7610_VFOS (RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) #define IC7610_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) @@ -130,11 +130,18 @@ int ic7610_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps ic7610_priv_caps = { - 0x98, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list, - .civ_version = 1 + 0x98, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .civ_version = 1, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; @@ -226,17 +233,23 @@ const struct rig_caps ic7610_caps = { {IC7610_ALL_RX_MODES,kHz(25)}, RIG_TS_END, }, - /* mode/filter list, remember: order matters! */ +/* 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 = { - {RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(500)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(350)}, - {RIG_MODE_AM, kHz(6)}, - {RIG_MODE_AM, kHz(2.4)}, - {RIG_MODE_FM, kHz(12)}, - {RIG_MODE_FM, kHz(8)}, /* TBC */ - RIG_FLT_END, - }, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(500)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(250)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PSK|RIG_MODE_PSKR, kHz(1.2)}, + {RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(10)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(7)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + RIG_FLT_END, +}, .str_cal = IC7610_STR_CAL, .swr_cal = IC7610_SWR_CAL, .alc_cal = IC7610_ALC_CAL, @@ -263,7 +276,10 @@ const struct rig_caps ic7610_caps = { .set_ant = icom_set_ant, .get_ant = icom_get_ant, -.set_rit = icom_set_rit, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, +.get_xit = icom_get_rit_new, +.set_xit = icom_set_xit_new, .decode_event = icom_decode_event, .set_level = ic7610_set_level, @@ -280,10 +296,6 @@ const struct rig_caps ic7610_caps = { .get_dcd = icom_get_dcd, .set_ts = icom_set_ts, .get_ts = icom_get_ts, -.set_rptr_shift = icom_set_rptr_shift, -.get_rptr_shift = icom_get_rptr_shift, -.set_rptr_offs = icom_set_rptr_offs, -.get_rptr_offs = icom_get_rptr_offs, .set_ctcss_tone = icom_set_ctcss_tone, .get_ctcss_tone = icom_get_ctcss_tone, .set_ctcss_sql = icom_set_ctcss_sql, @@ -293,7 +305,9 @@ const struct rig_caps ic7610_caps = { .set_split_mode = icom_set_split_mode, .get_split_mode = icom_get_split_mode, .set_split_vfo = icom_set_split_vfo, -.get_split_vfo = icom_mem_get_split_vfo, +.get_split_vfo = icom_get_split_vfo, +.set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_powerstat, .send_morse = icom_send_morse }; diff --git a/icom/ic7700.c b/icom/ic7700.c index 7adabda89..3638c955e 100644 --- a/icom/ic7700.c +++ b/icom/ic7700.c @@ -37,13 +37,13 @@ #include "bandplan.h" #define IC7700_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_PSK|RIG_MODE_PSKR) -#define IC7700_AM_TX_MODES (RIG_MODE_AM) +#define IC7700_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) #define IC7700_ALL_RX_MODES IC7700_OTHER_TX_MODES | IC7700_AM_TX_MODES #define IC7700_1HZ_TS_MODES IC7700_ALL_RX_MODES -#define IC7700_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) +#define IC7700_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_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER|RIG_FUNC_APF) -#define IC7700_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC7700_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC7700_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) #define IC7700_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) @@ -114,10 +114,18 @@ int ic7700_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps ic7700_priv_caps = { - 0x74, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x74, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; @@ -211,16 +219,21 @@ const struct rig_caps ic7700_caps = { }, /* mode/filter list, remember: order matters! */ .filters = { - {RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(400)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(1000)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(50)}, - {RIG_MODE_AM, kHz(6)}, - {RIG_MODE_AM, kHz(2.4)}, - {RIG_MODE_FM, kHz(12)}, - {RIG_MODE_FM, kHz(8)}, /* TBC */ - RIG_FLT_END, - }, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(400)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(50)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PSK|RIG_MODE_PSKR, kHz(1.0)}, + {RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(12)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(8)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + RIG_FLT_END, + }, .str_cal = IC7700_STR_CAL, .swr_cal = IC7700_SWR_CAL, .alc_cal = IC7700_ALC_CAL, @@ -247,7 +260,10 @@ const struct rig_caps ic7700_caps = { .set_ant = icom_set_ant, .get_ant = icom_get_ant, -.set_rit = icom_set_rit, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, +.get_xit = icom_get_rit_new, +.set_xit = icom_set_xit_new, .decode_event = icom_decode_event, .set_level = ic7700_set_level, @@ -264,10 +280,6 @@ const struct rig_caps ic7700_caps = { .get_dcd = icom_get_dcd, .set_ts = icom_set_ts, .get_ts = icom_get_ts, -.set_rptr_shift = icom_set_rptr_shift, -.get_rptr_shift = icom_get_rptr_shift, -.set_rptr_offs = icom_set_rptr_offs, -.get_rptr_offs = icom_get_rptr_offs, .set_ctcss_tone = icom_set_ctcss_tone, .get_ctcss_tone = icom_get_ctcss_tone, .set_ctcss_sql = icom_set_ctcss_sql, @@ -277,8 +289,10 @@ const struct rig_caps ic7700_caps = { .set_split_mode = icom_set_split_mode, .get_split_mode = icom_get_split_mode, .set_split_vfo = icom_set_split_vfo, -.get_split_vfo = icom_mem_get_split_vfo, - +.get_split_vfo = icom_get_split_vfo, +.set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_powerstat, +.send_morse = icom_send_morse }; int ic7700_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) diff --git a/icom/ic7800.c b/icom/ic7800.c index 513666e32..365a83222 100644 --- a/icom/ic7800.c +++ b/icom/ic7800.c @@ -36,14 +36,14 @@ #include "misc.h" #include "bandplan.h" -#define IC7800_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) +#define IC7800_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTAM|RIG_MODE_PKTFM) #define IC7800_1HZ_TS_MODES IC7800_ALL_RX_MODES -#define IC7800_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) -#define IC7800_AM_TX_MODES (RIG_MODE_AM) +#define IC7800_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM) +#define IC7800_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) -#define IC7800_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) +#define IC7800_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_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER|RIG_FUNC_APF|RIG_FUNC_DUAL_WATCH) -#define IC7800_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC7800_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC7800_VFOS (RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) #define IC7800_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) @@ -114,10 +114,18 @@ int ic7800_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps ic7800_priv_caps = { - 0x6a, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x6a, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; @@ -211,14 +219,21 @@ const struct rig_caps ic7800_caps = { }, /* mode/filter list, remember: order matters! */ .filters = { - {RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(500)}, - {RIG_MODE_AM, kHz(6)}, - {RIG_MODE_AM, kHz(2.4)}, - {RIG_MODE_FM, kHz(15)}, - {RIG_MODE_FM, kHz(8)}, - RIG_FLT_END, - }, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(400)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(50)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PSK|RIG_MODE_PSKR, kHz(1.0)}, + {RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(12)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(8)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + RIG_FLT_END, + }, .str_cal = IC7800_STR_CAL, .swr_cal = IC7800_SWR_CAL, .alc_cal = IC7800_ALC_CAL, @@ -245,7 +260,10 @@ const struct rig_caps ic7800_caps = { .set_ant = icom_set_ant, .get_ant = icom_get_ant, -.set_rit = icom_set_rit, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, +.get_xit = icom_get_rit_new, +.set_xit = icom_set_xit_new, .decode_event = icom_decode_event, .set_level = ic7800_set_level, @@ -262,10 +280,6 @@ const struct rig_caps ic7800_caps = { .get_dcd = icom_get_dcd, .set_ts = icom_set_ts, .get_ts = icom_get_ts, -.set_rptr_shift = icom_set_rptr_shift, -.get_rptr_shift = icom_get_rptr_shift, -.set_rptr_offs = icom_set_rptr_offs, -.get_rptr_offs = icom_get_rptr_offs, .set_ctcss_tone = icom_set_ctcss_tone, .get_ctcss_tone = icom_get_ctcss_tone, .set_ctcss_sql = icom_set_ctcss_sql, @@ -275,8 +289,10 @@ const struct rig_caps ic7800_caps = { .set_split_mode = icom_set_split_mode, .get_split_mode = icom_get_split_mode, .set_split_vfo = icom_set_split_vfo, -.get_split_vfo = icom_mem_get_split_vfo, - +.get_split_vfo = icom_get_split_vfo, +.set_powerstat = icom_set_powerstat, +.get_powerstat = icom_get_powerstat, +.send_morse = icom_send_morse }; /* diff --git a/icom/ic785x.c b/icom/ic785x.c index 03f76da60..b7b82c5f5 100644 --- a/icom/ic785x.c +++ b/icom/ic785x.c @@ -37,14 +37,14 @@ #include "misc.h" #include "bandplan.h" -#define IC785x_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) +#define IC785x_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTAM|RIG_MODE_PKTFM) #define IC785x_1HZ_TS_MODES IC785x_ALL_RX_MODES -#define IC785x_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR) -#define IC785x_AM_TX_MODES (RIG_MODE_AM) +#define IC785x_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM|RIG_MODE_PSK|RIG_MODE_PSKR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM) +#define IC785x_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) -#define IC785x_FUNCS (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_VSC|RIG_FUNC_LOCK) +#define IC785x_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_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER|RIG_FUNC_APF|RIG_FUNC_DUAL_WATCH) -#define IC785x_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN) +#define IC785x_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_APF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define IC785x_VFOS (RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) #define IC785x_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT) @@ -119,10 +119,18 @@ int ic785x_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); * TODO: complete command set (esp. the $1A bunch!) and testing.. */ static const struct icom_priv_caps ic785x_priv_caps = { - 0x8e, /* default address */ - 0, /* 731 mode */ - 0, /* no XCHG */ - ic756pro_ts_sc_list + 0x8e, /* default address */ + 0, /* 731 mode */ + 0, /* no XCHG */ + ic756pro_ts_sc_list, + .agc_levels_present = 1, + .agc_levels = { + { .level = RIG_AGC_OFF, .icom_level = 0 }, + { .level = RIG_AGC_FAST, .icom_level = 1 }, + { .level = RIG_AGC_MEDIUM, .icom_level = 2 }, + { .level = RIG_AGC_SLOW, .icom_level = 3 }, + { .level = -1, .icom_level = 0 }, + }, }; @@ -216,14 +224,21 @@ const struct rig_caps ic785x_caps = { }, /* mode/filter list, remember: order matters! */ .filters = { - {RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, - {RIG_MODE_CW|RIG_MODE_CWR, Hz(500)}, - {RIG_MODE_AM, kHz(6)}, - {RIG_MODE_AM, kHz(2.4)}, - {RIG_MODE_FM, kHz(15)}, - {RIG_MODE_FM, kHz(8)}, - RIG_FLT_END, - }, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(2.4)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(1.8)}, + {RIG_MODE_SSB|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB, kHz(3)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(400)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PSK|RIG_MODE_PSKR, Hz(50)}, + {RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PSK|RIG_MODE_PSKR, kHz(1.0)}, + {RIG_MODE_RTTY|RIG_MODE_RTTYR, kHz(2.4)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(6)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(3)}, + {RIG_MODE_AM|RIG_MODE_PKTAM, kHz(9)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(12)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(8)}, + {RIG_MODE_FM|RIG_MODE_PKTFM, kHz(15)}, + RIG_FLT_END, + }, .str_cal = IC785x_STR_CAL, .swr_cal = IC785x_SWR_CAL, .alc_cal = IC785x_ALC_CAL, @@ -250,7 +265,10 @@ const struct rig_caps ic785x_caps = { .set_ant = icom_set_ant, .get_ant = icom_get_ant, -.set_rit = icom_set_rit, +.set_rit = icom_set_rit_new, +.get_rit = icom_get_rit_new, +.get_xit = icom_get_rit_new, +.set_xit = icom_set_xit_new, .decode_event = icom_decode_event, .set_level = ic785x_set_level, @@ -267,10 +285,6 @@ const struct rig_caps ic785x_caps = { .get_dcd = icom_get_dcd, .set_ts = icom_set_ts, .get_ts = icom_get_ts, -.set_rptr_shift = icom_set_rptr_shift, -.get_rptr_shift = icom_get_rptr_shift, -.set_rptr_offs = icom_set_rptr_offs, -.get_rptr_offs = icom_get_rptr_offs, .set_ctcss_tone = icom_set_ctcss_tone, .get_ctcss_tone = icom_get_ctcss_tone, .set_ctcss_sql = icom_set_ctcss_sql, @@ -280,9 +294,10 @@ const struct rig_caps ic785x_caps = { .set_split_mode = icom_set_split_mode, .get_split_mode = icom_get_split_mode, .set_split_vfo = icom_set_split_vfo, -.get_split_vfo = icom_mem_get_split_vfo, +.get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat, +.send_morse = icom_send_morse }; diff --git a/icom/icom.c b/icom/icom.c index dcbed2af6..70d420ea5 100644 --- a/icom/icom.c +++ b/icom/icom.c @@ -719,6 +719,73 @@ int icom_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit) return RIG_OK; } +int icom_get_rit_new(RIG *rig, vfo_t vfo, shortfreq_t *ts) +{ + unsigned char tsbuf[MAXFRAMELEN]; + int ts_len, retval; + + retval = icom_transaction(rig, C_CTL_RIT, S_RIT_FREQ, 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, "%s: wrong frame len=%d\n", __func__, ts_len); + return -RIG_ERJCTED; + } + + *ts = (shortfreq_t) from_bcd(tsbuf + 2, 4); + if (tsbuf[4] != 0) { + *ts *= -1; + } + + return RIG_OK; +} + +// The Icom rigs have only one register for both RIT and Delta TX +// you can turn one or both on -- but both end up just being in sync. +static int icom_set_it_new(RIG *rig, vfo_t vfo, shortfreq_t ts, int set_xit) { + unsigned char tsbuf[8]; + unsigned char ackbuf[16]; + int ack_len; + int retval; + + rig_debug(RIG_DEBUG_VERBOSE, "%s: ts=%d\n", __func__, ts); + + to_bcd(tsbuf, abs((int) ts), 4); + // set sign bit + tsbuf[2] = (ts < 0) ? 1 : 0; + + retval = icom_transaction(rig, C_CTL_RIT, S_RIT_FREQ, tsbuf, 3, ackbuf, &ack_len); + if (retval != RIG_OK) { + return retval; + } + + if (ts == 0) { // Turn off both RIT/XIT + retval = icom_set_func(rig, vfo, RIG_FUNC_XIT, 0); + if (retval != RIG_OK) { + return retval; + } + retval = icom_set_func(rig, vfo, RIG_FUNC_RIT, 0); + } else { + retval = icom_set_func(rig, vfo, set_xit ? RIG_FUNC_XIT : RIG_FUNC_RIT, 1); + } + return retval; +} + +int icom_set_rit_new(RIG *rig, vfo_t vfo, shortfreq_t ts) +{ + return icom_set_it_new(rig, vfo, ts, 0); +} + +int icom_set_xit_new(RIG *rig, vfo_t vfo, shortfreq_t ts) +{ + return icom_set_it_new(rig, vfo, ts, 1); +} /* icom_get_dsp_flt returns the dsp filter width in hz or 0 if the command is not implemented or error. @@ -830,55 +897,63 @@ int icom_set_dsp_flt(RIG *rig, rmode_t mode, pbwidth_t width) { */ int icom_set_mode_with_data (RIG * rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { - int retval; - unsigned char datamode; - unsigned char ackbuf[MAXFRAMELEN]; - int ack_len=sizeof(ackbuf); - rmode_t icom_mode; - unsigned char dm_sub_cmd = RIG_MODEL_IC7200 == rig->caps->rig_model ? 0x04 : S_MEM_DATA_MODE; + int retval; + unsigned char datamode; + unsigned char ackbuf[MAXFRAMELEN]; + int ack_len = sizeof(ackbuf); + rmode_t icom_mode; + unsigned char dm_sub_cmd = RIG_MODEL_IC7200 == rig->caps->rig_model ? 0x04 : S_MEM_DATA_MODE; - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - switch (mode) - { - case RIG_MODE_PKTUSB: icom_mode = RIG_MODE_USB; break; - case RIG_MODE_PKTLSB: icom_mode = RIG_MODE_LSB; break; - case RIG_MODE_PKTFM: icom_mode = RIG_MODE_FM; break; - default: icom_mode = mode; break; - }; + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - retval = icom_set_mode (rig, vfo, icom_mode, width); + switch (mode) { + case RIG_MODE_PKTUSB: + icom_mode = RIG_MODE_USB; + break; + case RIG_MODE_PKTLSB: + icom_mode = RIG_MODE_LSB; + break; + case RIG_MODE_PKTFM: + icom_mode = RIG_MODE_FM; + break; + case RIG_MODE_PKTAM: + icom_mode = RIG_MODE_AM; + break; + default: + icom_mode = mode; + break; + } - if (RIG_OK == retval) - { - if (RIG_MODE_PKTUSB == mode || RIG_MODE_PKTLSB == mode || RIG_MODE_PKTFM == mode) - { - datamode = 0x01; /* some rigs (e.g. IC-7700 & IC-7800) - have D1/2/3 but we cannot know - which to set so just set D1 */ - } - else - { - datamode = 0x00; + retval = icom_set_mode(rig, vfo, icom_mode, width); + + if (RIG_OK == retval) { + switch (mode) { + case RIG_MODE_PKTUSB: + case RIG_MODE_PKTLSB: + case RIG_MODE_PKTFM: + case RIG_MODE_PKTAM: + /* some rigs (e.g. IC-7700 & IC-7800) + have D1/2/3 but we cannot know + which to set so just set D1 */ + datamode = 0x01; + break; + default: + datamode = 0x00; + break; } - retval = icom_transaction (rig, C_CTL_MEM, dm_sub_cmd, &datamode, 1, - ackbuf, &ack_len); - if (retval != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR,"%s: protocol error (%#.2x), " - "len=%d\n", __FUNCTION__,ackbuf[0],ack_len); - } - else - { - if (ack_len != 1 || ackbuf[0] != ACK) - { - rig_debug(RIG_DEBUG_ERR,"%s: command not supported ? (%#.2x), " - "len=%d\n", __FUNCTION__,ackbuf[0],ack_len); + retval = icom_transaction(rig, C_CTL_MEM, dm_sub_cmd, &datamode, 1, ackbuf, &ack_len); + + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: protocol error (%#.2x), len=%d\n", __FUNCTION__, ackbuf[0], ack_len); + } else { + if (ack_len != 1 || ackbuf[0] != ACK) { + rig_debug(RIG_DEBUG_ERR, "%s: command not supported ? (%#.2x), len=%d\n", __FUNCTION__, ackbuf[0], ack_len); } } } - return retval; + return retval; } /* @@ -952,56 +1027,71 @@ int icom_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) */ int icom_get_mode_with_data(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { - unsigned char databuf[MAXFRAMELEN]; - int data_len, retval; - unsigned char dm_sub_cmd = RIG_MODEL_IC7200 == rig->caps->rig_model ? 0x04 : S_MEM_DATA_MODE; + unsigned char databuf[MAXFRAMELEN]; + int data_len, retval; + unsigned char dm_sub_cmd = RIG_MODEL_IC7200 == rig->caps->rig_model ? 0x04 : S_MEM_DATA_MODE; - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - retval = icom_get_mode (rig, vfo, mode, width); + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + retval = icom_get_mode(rig, vfo, mode, width); - if (RIG_OK == retval && (RIG_MODE_USB == *mode || RIG_MODE_LSB == *mode || RIG_MODE_FM == *mode)) - { + if (retval != RIG_OK) { + return retval; + } + + switch (*mode) { + case RIG_MODE_USB: + case RIG_MODE_LSB: + case RIG_MODE_AM: + case RIG_MODE_FM: /* * fetch data mode on/off */ - retval = icom_transaction (rig, C_CTL_MEM, dm_sub_cmd, 0, 0, - databuf, &data_len); - if (retval != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR,"%s: protocol error (%#.2x), " - "len=%d\n", __FUNCTION__, databuf[0], data_len); + retval = icom_transaction(rig, C_CTL_MEM, dm_sub_cmd, 0, 0, databuf, &data_len); + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: protocol error (%#.2x), len=%d\n", __FUNCTION__, databuf[0], data_len); return -RIG_ERJCTED; - } + } /* * databuf should contain Cn,Sc,D0[,D1] */ data_len -= 2; - if (1 > data_len || data_len > 2) /* manual says 1 byte answer - but at least IC756 ProIII - sends 2 - second byte - appears to be same as - second byte from 04 command - which is filter preset - number, whatever it is we - ignore it */ - { - rig_debug(RIG_DEBUG_ERR,"%s: wrong frame len=%d\n", - __FUNCTION__, data_len); + if (1 > data_len || data_len > 2) { + /* manual says 1 byte answer + but at least IC756 ProIII + sends 2 - second byte + appears to be same as + second byte from 04 command + which is filter preset + number, whatever it is we + ignore it */ + rig_debug(RIG_DEBUG_ERR, "%s: wrong frame len=%d\n", __FUNCTION__, data_len); return -RIG_ERJCTED; - } - if (databuf[2]) /* 0x01/0x02/0x03 -> data mode, 0x00 -> not data mode */ - { - switch (*mode) - { - case RIG_MODE_USB: *mode = RIG_MODE_PKTUSB; break; - case RIG_MODE_LSB: *mode = RIG_MODE_PKTLSB; break; - case RIG_MODE_FM: *mode = RIG_MODE_PKTFM; break; - default: break; - } - } + } + + if (databuf[2]) { /* 0x01/0x02/0x03 -> data mode, 0x00 -> not data mode */ + switch (*mode) { + case RIG_MODE_USB: + *mode = RIG_MODE_PKTUSB; + break; + case RIG_MODE_LSB: + *mode = RIG_MODE_PKTLSB; + break; + case RIG_MODE_AM: + *mode = RIG_MODE_PKTAM; + break; + case RIG_MODE_FM: + *mode = RIG_MODE_PKTFM; + break; + default: + break; + } + } + default: + break; } - return retval; + + return retval; } /* @@ -1170,6 +1260,9 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) rs = &rig->state; priv = (struct icom_priv_data*)rs->priv; + const struct icom_priv_caps *priv_caps = + (const struct icom_priv_caps*) rig->caps->priv; + /* * So far, levels of float type are in [0.0..1.0] range */ @@ -1276,6 +1369,10 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) lvl_cn = C_CTL_LVL; lvl_sc = S_LVL_NR; break; + case RIG_LEVEL_NB: + lvl_cn = C_CTL_LVL; + lvl_sc = S_LVL_NB; + break; case RIG_LEVEL_PBT_IN: lvl_cn = C_CTL_LVL; lvl_sc = S_LVL_PBTIN; @@ -1316,20 +1413,45 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) lvl_cn = C_CTL_LVL; lvl_sc = S_LVL_COMP; break; - case RIG_LEVEL_AGC: - lvl_cn = C_CTL_FUNC; - lvl_sc = S_FUNC_AGC; - lvl_len = 1; - switch (val.i) { - case RIG_AGC_SLOW: lvlbuf[0] = D_AGC_SLOW; break; - case RIG_AGC_MEDIUM: lvlbuf[0] = D_AGC_MID; break; - case RIG_AGC_FAST: lvlbuf[0] = D_AGC_FAST; break; - case RIG_AGC_SUPERFAST: lvlbuf[0] = D_AGC_SUPERFAST; break; - default: - rig_debug(RIG_DEBUG_ERR,"Unsupported LEVEL_AGC %d", val.i); + case RIG_LEVEL_AGC: + lvl_cn = C_CTL_FUNC; + lvl_sc = S_FUNC_AGC; + lvl_len = 1; + + if (priv_caps->agc_levels_present) { + int found = 0; + + for (i = 0; i <= RIG_AGC_LAST && priv_caps->agc_levels[i].level >= 0; i++) { + if (priv_caps->agc_levels[i].level == val.i) { + lvlbuf[0] = priv_caps->agc_levels[i].icom_level; + found = 1; + break; + } + } + if (!found) { return -RIG_EINVAL; + } + } else { + // Legacy mapping that does not apply to all rigs + switch (val.i) { + case RIG_AGC_SLOW: + lvlbuf[0] = D_AGC_SLOW; + break; + case RIG_AGC_MEDIUM: + lvlbuf[0] = D_AGC_MID; + break; + case RIG_AGC_FAST: + lvlbuf[0] = D_AGC_FAST; + break; + case RIG_AGC_SUPERFAST: + lvlbuf[0] = D_AGC_SUPERFAST; + break; + default: + rig_debug(RIG_DEBUG_ERR, "Unsupported LEVEL_AGC %d", val.i); + return -RIG_EINVAL; + } } - break; + break; case RIG_LEVEL_BKINDL: lvl_cn = C_CTL_LVL; lvl_sc = S_LVL_BKINDL; @@ -1399,6 +1521,9 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) rs = &rig->state; priv = (struct icom_priv_data*)rs->priv; + const struct icom_priv_caps *priv_caps = + (const struct icom_priv_caps*) rig->caps->priv; + lvl2_len = 0; switch (level) { @@ -1463,6 +1588,10 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) lvl_cn = C_CTL_LVL; lvl_sc = S_LVL_NR; break; + case RIG_LEVEL_NB: + lvl_cn = C_CTL_LVL; + lvl_sc = S_LVL_NB; + break; case RIG_LEVEL_PBT_IN: lvl_cn = C_CTL_LVL; lvl_sc = S_LVL_PBTIN; @@ -1578,17 +1707,41 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) /* raw value */ val->i = icom_val; break; - case RIG_LEVEL_AGC: - switch (icom_val) { - case D_AGC_SLOW: val->i = RIG_AGC_SLOW; break; - case D_AGC_MID: val->i = RIG_AGC_MEDIUM; break; - case D_AGC_FAST: val->i = RIG_AGC_FAST; break; - case D_AGC_SUPERFAST: val->i = RIG_AGC_SUPERFAST; break; - default: - rig_debug(RIG_DEBUG_ERR,"Unexpected AGC 0x%02x", icom_val); + case RIG_LEVEL_AGC: + if (priv_caps->agc_levels_present) { + int found = 0; + + for (int i = 0; i <= RIG_AGC_LAST && priv_caps->agc_levels[i].level >= 0; i++) { + if (priv_caps->agc_levels[i].icom_level == icom_val) { + val->i = priv_caps->agc_levels[i].level; + found = 1; + break; + } + } + if (!found) { + rig_debug(RIG_DEBUG_ERR, "Unexpected AGC 0x%02x", icom_val); return -RIG_EPROTO; + } + } else { + switch (icom_val) { + case D_AGC_SLOW: + val->i = RIG_AGC_SLOW; + break; + case D_AGC_MID: + val->i = RIG_AGC_MEDIUM; + break; + case D_AGC_FAST: + val->i = RIG_AGC_FAST; + break; + case D_AGC_SUPERFAST: + val->i = RIG_AGC_SUPERFAST; + break; + default: + rig_debug(RIG_DEBUG_ERR, "Unexpected AGC 0x%02x", icom_val); + return -RIG_EPROTO; + } } - break; + break; case RIG_LEVEL_ALC: if (rig->caps->alc_cal.size == 0) { val->f = rig_raw2val_float(icom_val, &icom_default_alc_cal); @@ -2643,113 +2796,111 @@ 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 */ + 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__); + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - rs = &rig->state; - priv = (struct icom_priv_data*)rs->priv; + 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; + /* r8500, the problem rig */ + int r8500 = (rig->caps->rig_model == RIG_MODEL_ICR8500) ? 1 : 0; - /* - * except for IC-R8500 - */ - fctbuf[0] = status? 0x01:0x00; - fct_len = r8500 ? 0 : 1; + /* + * except for IC-R8500 + */ + fctbuf[0] = status ? 0x01 : 0x00; + fct_len = r8500 ? 0 : 1; - switch (func) { - case RIG_FUNC_FAGC: - fct_cn = C_CTL_FUNC; - 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 (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 { - fctbuf[0] = 0x02; - } - break; - case RIG_FUNC_NB: - fct_cn = C_CTL_FUNC; - fct_sc = (r8500)?(status)?S_FUNC_NBON:S_FUNC_NBOFF:S_FUNC_NB; - /* fct_sc = S_FUNC_NB; */ - break; - case RIG_FUNC_COMP: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_COMP; - break; - case RIG_FUNC_VOX: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_VOX; - break; - case RIG_FUNC_TONE: /* repeater tone */ - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_TONE; - break; - case RIG_FUNC_TSQL: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_TSQL; - break; - case RIG_FUNC_SBKIN: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_BKIN; - if (status != 0) - fctbuf[0] = 0x01; - else - fctbuf[0] = 0x00; - break; - case RIG_FUNC_FBKIN: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_BKIN; - if (status != 0) - fctbuf[0] = 0x02; - else - fctbuf[0] = 0x00; - break; - case RIG_FUNC_ANF: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_ANF; - break; - case RIG_FUNC_NR: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_NR; - break; - case RIG_FUNC_APF: - fct_cn = C_CTL_FUNC; - fct_sc = (r8500)?(status)?S_FUNC_APFON:S_FUNC_APFOFF:S_FUNC_APF; - /* fct_sc = S_FUNC_APF; */ - break; - case RIG_FUNC_MON: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_MON; - break; - case RIG_FUNC_MN: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_MN; - break; - case RIG_FUNC_RF: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_RF; - break; - case RIG_FUNC_VSC: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_VSC; - break; - case RIG_FUNC_LOCK: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_DIAL_LK; - break; + switch (func) { + case RIG_FUNC_FAGC: + fct_cn = C_CTL_FUNC; + 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 (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 { + fctbuf[0] = 0x02; + } + break; + case RIG_FUNC_NB: + fct_cn = C_CTL_FUNC; + fct_sc = (r8500) ? (status) ? S_FUNC_NBON : S_FUNC_NBOFF : S_FUNC_NB; + /* fct_sc = S_FUNC_NB; */ + break; + case RIG_FUNC_COMP: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_COMP; + break; + case RIG_FUNC_VOX: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_VOX; + break; + case RIG_FUNC_TONE: /* repeater tone */ + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_TONE; + break; + case RIG_FUNC_TSQL: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_TSQL; + break; + case RIG_FUNC_SBKIN: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_BKIN; + if (status != 0) + fctbuf[0] = 0x01; + else + fctbuf[0] = 0x00; + break; + case RIG_FUNC_FBKIN: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_BKIN; + if (status != 0) + fctbuf[0] = 0x02; + else + fctbuf[0] = 0x00; + break; + case RIG_FUNC_ANF: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_ANF; + break; + case RIG_FUNC_NR: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_NR; + break; + case RIG_FUNC_APF: + fct_cn = C_CTL_FUNC; + fct_sc = (r8500) ? (status) ? S_FUNC_APFON : S_FUNC_APFOFF : S_FUNC_APF; + /* fct_sc = S_FUNC_APF; */ + break; + case RIG_FUNC_MON: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_MON; + break; + case RIG_FUNC_MN: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_MN; + break; + case RIG_FUNC_RF: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_RF; + break; + case RIG_FUNC_VSC: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_VSC; + break; + case RIG_FUNC_LOCK: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_DIAL_LK; + break; case RIG_FUNC_AFC: /* IC-910H */ fct_cn = C_CTL_FUNC; fct_sc = S_FUNC_AFC; @@ -2759,55 +2910,69 @@ int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) fct_sc = S_MEM_SATMODE; break; case RIG_FUNC_SCOPE: - if (priv->civ_version == 1) { /* IC-7200/7300 */ - fct_cn = 0x27; - fct_sc = 0x10; - fctbuf[0] = status; - fct_len = 1; - } - else { /* IC-910H */ - fct_cn = C_CTL_MEM; - fct_sc = S_MEM_BANDSCOPE; - } - break; - case RIG_FUNC_RESUME: /* IC-910H & IC-746-Pro*/ - fct_cn = C_CTL_SCAN; - fct_sc = status ? S_SCAN_RSMON : S_SCAN_RSMOFF; - fct_len = 0; - break; - case RIG_FUNC_DSQL: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_DSQL; - break; - case RIG_FUNC_AFLT: - fct_cn = C_CTL_MEM; - fct_sc = S_MEM_AFLT; - break; - case RIG_FUNC_ANL: - fct_cn = C_CTL_MEM; - fct_sc = S_MEM_ANL; - break; - case RIG_FUNC_AIP: /* IC-R8600 IP+ function, misusing AIP since RIG_FUNC_ word is full (32 bit) */ - fct_cn = C_CTL_MEM; /* 1a */ - fct_sc = S_FUNC_IPPLUS; - break; - default: - rig_debug(RIG_DEBUG_ERR,"Unsupported set_func %d", func); - return -RIG_EINVAL; - } + if (priv->civ_version == 1) { /* IC-7200/7300 */ + fct_cn = 0x27; + fct_sc = 0x10; + fctbuf[0] = status; + fct_len = 1; + } else { /* IC-910H */ + fct_cn = C_CTL_MEM; + fct_sc = S_MEM_BANDSCOPE; + } + break; + case RIG_FUNC_RESUME: /* IC-910H & IC-746-Pro*/ + fct_cn = C_CTL_SCAN; + fct_sc = status ? S_SCAN_RSMON : S_SCAN_RSMOFF; + fct_len = 0; + break; + case RIG_FUNC_DSQL: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_DSQL; + break; + case RIG_FUNC_AFLT: + fct_cn = C_CTL_MEM; + fct_sc = S_MEM_AFLT; + break; + case RIG_FUNC_ANL: + fct_cn = C_CTL_MEM; + fct_sc = S_MEM_ANL; + break; + case RIG_FUNC_AIP: /* IC-R8600 IP+ function, misusing AIP since RIG_FUNC_ word is full (32 bit) */ + fct_cn = C_CTL_MEM; /* 1a */ + fct_sc = S_FUNC_IPPLUS; + break; + case RIG_FUNC_RIT: + fct_cn = C_CTL_RIT; + fct_sc = S_RIT; + break; + case RIG_FUNC_XIT: + fct_cn = C_CTL_RIT; + fct_sc = S_XIT; + break; + case RIG_FUNC_TUNER: + fct_cn = C_CTL_PTT; + fct_sc = S_ANT_TUN; + break; + case RIG_FUNC_DUAL_WATCH: + fct_cn = C_SET_VFO; + fct_sc = S_DUAL; + break; + default: + rig_debug(RIG_DEBUG_ERR, "Unsupported set_func %d", func); + return -RIG_EINVAL; + } - retval = icom_transaction(rig, fct_cn, fct_sc, fctbuf, fct_len, - ackbuf, &acklen); - if (retval != RIG_OK) - return retval; + retval = icom_transaction(rig, fct_cn, fct_sc, fctbuf, fct_len, ackbuf, &acklen); + if (retval != RIG_OK) { + return retval; + } - if (acklen != 1) { - rig_debug(RIG_DEBUG_ERR,"icom_set_func: wrong frame len=%d\n", - acklen); - return -RIG_EPROTO; - } + if (acklen != 1) { + rig_debug(RIG_DEBUG_ERR, "icom_set_func: wrong frame len=%d\n", acklen); + return -RIG_EPROTO; + } - return RIG_OK; + return RIG_OK; } /* @@ -2817,74 +2982,74 @@ 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) { - unsigned char ackbuf[MAXFRAMELEN]; - int ack_len=sizeof(ackbuf), retval; - int fct_cn, fct_sc; /* Command Number, Subcommand */ + unsigned char ackbuf[MAXFRAMELEN]; + int ack_len = sizeof(ackbuf), retval; + int fct_cn, fct_sc; /* Command Number, Subcommand */ - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - switch (func) { - case RIG_FUNC_FAGC: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_AGC; /* default to 0x01=slow 0x03=super-fast */ - break; - case RIG_FUNC_NB: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_NB; - break; - case RIG_FUNC_COMP: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_COMP; - break; - case RIG_FUNC_VOX: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_VOX; - break; - case RIG_FUNC_TONE: /* repeater tone */ - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_TONE; - break; - case RIG_FUNC_TSQL: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_TSQL; - break; - case RIG_FUNC_SBKIN: /* returns 1 for semi and 2 for full adjusted below */ - case RIG_FUNC_FBKIN: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_BKIN; - break; - case RIG_FUNC_ANF: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_ANF; - break; - case RIG_FUNC_NR: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_NR; - break; - case RIG_FUNC_APF: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_APF; - break; - case RIG_FUNC_MON: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_MON; - break; - case RIG_FUNC_MN: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_MN; - break; - case RIG_FUNC_RF: + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + switch (func) { + case RIG_FUNC_FAGC: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_AGC; /* default to 0x01=slow 0x03=super-fast */ + break; + case RIG_FUNC_NB: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_NB; + break; + case RIG_FUNC_COMP: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_COMP; + break; + case RIG_FUNC_VOX: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_VOX; + break; + case RIG_FUNC_TONE: /* repeater tone */ + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_TONE; + break; + case RIG_FUNC_TSQL: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_TSQL; + break; + case RIG_FUNC_SBKIN: /* returns 1 for semi and 2 for full adjusted below */ + case RIG_FUNC_FBKIN: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_BKIN; + break; + case RIG_FUNC_ANF: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_ANF; + break; + case RIG_FUNC_NR: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_NR; + break; + case RIG_FUNC_APF: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_APF; + break; + case RIG_FUNC_MON: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_MON; + break; + case RIG_FUNC_MN: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_MN; + break; + case RIG_FUNC_RF: fct_cn = C_CTL_FUNC; fct_sc = S_FUNC_RF; break; - case RIG_FUNC_VSC: + case RIG_FUNC_VSC: fct_cn = C_CTL_FUNC; fct_sc = S_FUNC_VSC; break; - case RIG_FUNC_LOCK: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_DIAL_LK; - break; - case RIG_FUNC_AFC: /* IC-910H */ + case RIG_FUNC_LOCK: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_DIAL_LK; + break; + case RIG_FUNC_AFC: /* IC-910H */ fct_cn = C_CTL_FUNC; fct_sc = S_FUNC_AFC; break; @@ -2896,43 +3061,59 @@ int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) fct_cn = C_CTL_MEM; fct_sc = S_MEM_BANDSCOPE; break; - case RIG_FUNC_AIP: /* IC-R8600 IP+ function, misusing AIP since RIG_FUNC_ word is full (32 bit) */ - fct_cn = C_CTL_MEM; /* 1a */ - fct_sc = S_FUNC_IPPLUS; - break; - case RIG_FUNC_DSQL: - fct_cn = C_CTL_FUNC; - fct_sc = S_FUNC_DSQL; - break; - case RIG_FUNC_AFLT: - fct_cn = C_CTL_MEM; - fct_sc = S_MEM_AFLT; - break; - case RIG_FUNC_ANL: - fct_cn = C_CTL_MEM; - fct_sc = S_MEM_ANL; - break; - default: - rig_debug(RIG_DEBUG_ERR,"Unsupported get_func %d", func); - return -RIG_EINVAL; - } + case RIG_FUNC_AIP: /* IC-R8600 IP+ function, misusing AIP since RIG_FUNC_ word is full (32 bit) */ + fct_cn = C_CTL_MEM; /* 1a */ + fct_sc = S_FUNC_IPPLUS; + break; + case RIG_FUNC_DSQL: + fct_cn = C_CTL_FUNC; + fct_sc = S_FUNC_DSQL; + break; + case RIG_FUNC_AFLT: + fct_cn = C_CTL_MEM; + fct_sc = S_MEM_AFLT; + break; + case RIG_FUNC_ANL: + fct_cn = C_CTL_MEM; + fct_sc = S_MEM_ANL; + break; + case RIG_FUNC_RIT: + fct_cn = C_CTL_RIT; + fct_sc = S_RIT; + break; + case RIG_FUNC_XIT: + fct_cn = C_CTL_RIT; + fct_sc = S_XIT; + break; + case RIG_FUNC_TUNER: + fct_cn = C_CTL_PTT; + fct_sc = S_ANT_TUN; + break; + case RIG_FUNC_DUAL_WATCH: + fct_cn = C_SET_VFO; + fct_sc = S_DUAL; + break; + default: + rig_debug(RIG_DEBUG_ERR, "Unsupported get_func %d", func); + return -RIG_EINVAL; + } - retval = icom_transaction (rig, fct_cn, fct_sc, NULL, 0, - ackbuf, &ack_len); - if (retval != RIG_OK) - return retval; + retval = icom_transaction(rig, fct_cn, fct_sc, NULL, 0, ackbuf, &ack_len); + if (retval != RIG_OK) { + return retval; + } - if (ack_len != 3) { - rig_debug(RIG_DEBUG_ERR,"icom_get_func: wrong frame len=%d\n", - ack_len); - return -RIG_EPROTO; - } - if (func != RIG_FUNC_FBKIN) - *status = ackbuf[2]; - else - *status = ackbuf[2] == 2 ? 1 : 0; + if (ack_len != 3) { + rig_debug(RIG_DEBUG_ERR, "icom_get_func: wrong frame len=%d\n", ack_len); + return -RIG_EPROTO; + } + if (func != RIG_FUNC_FBKIN) { + *status = ackbuf[2]; + } else { + *status = ackbuf[2] == 2 ? 1 : 0; + } - return RIG_OK; + return RIG_OK; } /* @@ -3075,14 +3256,12 @@ int icom_set_parm(RIG *rig, setting_t parm, value_t val) return -RIG_EINVAL; } - retval = icom_transaction(rig, prm_cn, prm_sc, prmbuf, prm_len, - ackbuf, &ack_len); + retval = icom_transaction(rig, prm_cn, prm_sc, prmbuf, prm_len, ackbuf, &ack_len); if (retval != RIG_OK) return retval; if (ack_len != 1) { - rig_debug(RIG_DEBUG_ERR,"icom_set_parm: wrong frame len=%d\n", - ack_len); + rig_debug(RIG_DEBUG_ERR,"icom_set_parm: wrong frame len=%d\n", ack_len); return -RIG_EPROTO; } @@ -3100,7 +3279,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN]; int prm_len, res_len; int prm_cn, prm_sc; - int icom_val; + int icom_val = 0; int cmdhead; int retval; int min,hr,sec; @@ -3110,13 +3289,13 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) priv = (struct icom_priv_data*)rs->priv; switch (parm) { - case RIG_PARM_APO: + case RIG_PARM_APO: // TODO: FIXME: rig-specific prm_cn = C_CTL_MEM; prm_sc = S_MEM_MODE_SLCT; prm_len = 1; prmbuf[0] = S_PRM_SLPTM; break; - case RIG_PARM_BACKLIGHT: + case RIG_PARM_BACKLIGHT: // TODO: FIXME: rig-specific if (priv->civ_version == 1) { prm_cn = C_CTL_MEM; prm_sc = 0x05; @@ -3137,7 +3316,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) prmbuf[0] = S_PRM_BACKLT; } break; - case RIG_PARM_KEYLIGHT: + case RIG_PARM_KEYLIGHT: // TODO: FIXME: rig-specific if (priv->civ_version == 1) { prm_cn = C_CTL_MEM; prm_sc = 0x05; @@ -3156,7 +3335,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) return -RIG_EINVAL; } break; - case RIG_PARM_BEEP: + case RIG_PARM_BEEP: // TODO: FIXME: rig-specific if (priv->civ_version == 1) { prm_cn = C_CTL_MEM; prm_sc = 0x05; @@ -3171,7 +3350,7 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) prmbuf[0] = S_PRM_BEEP; } break; - case RIG_PARM_TIME: + case RIG_PARM_TIME: // TODO: FIXME: rig-specific if (priv->civ_version == 1) { prm_cn = C_CTL_MEM; prm_sc = 0x05; @@ -3191,10 +3370,10 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) return -RIG_EINVAL; } - retval = icom_transaction (rig, prm_cn, prm_sc, prmbuf, prm_len, - resbuf, &res_len); - if (retval != RIG_OK) + retval = icom_transaction (rig, prm_cn, prm_sc, prmbuf, prm_len, resbuf, &res_len); + if (retval != RIG_OK) { return retval; + } /* * strbuf should contain Cn,Sc,[pn],Data area @@ -3230,7 +3409,6 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) 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); } else { @@ -3239,7 +3417,6 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) val->f = (float)icom_val/255.0; break; case RIG_PARM_KEYLIGHT: - icom_val = 0; if (priv->civ_version == 1) { icom_val = from_bcd_be(resbuf+cmdhead+1, (res_len-1)*2); } else { @@ -3255,12 +3432,6 @@ int icom_get_parm(RIG *rig, setting_t parm, value_t *val) } val->i = icom_val; break; - default: - icom_val = from_bcd_be(resbuf+cmdhead, res_len*2); - if (RIG_PARM_IS_FLOAT(parm)) - val->f = (float)icom_val/255; - else - val->i = icom_val; } rig_debug(RIG_DEBUG_TRACE,"%s: %d %d %d %f\n", @@ -3532,7 +3703,7 @@ int icom_set_powerstat(RIG *rig, powerstat_t status) rig_debug(RIG_DEBUG_VERBOSE, "%s called status=\n", __func__,status); switch (status) { case RIG_POWER_ON: - pwr_sc = RIG_POWER_ON; + pwr_sc = S_PWR_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) { @@ -3540,17 +3711,17 @@ int icom_set_powerstat(RIG *rig, powerstat_t status) } break; default: - pwr_sc = RIG_POWER_OFF; + pwr_sc = S_PWR_OFF; fe_buf[0] = 0; } // we can ignore this retval // sending more than enough 0xfe's to wake 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); + 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); rig_debug(RIG_DEBUG_VERBOSE, "%s #2 called retval=%d\n", __func__,retval); + int i=0; int retry = 3/rig->state.rigport.retry; if (status==RIG_POWER_ON) { // wait for wakeup only @@ -3756,8 +3927,6 @@ 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=0, ack_len=sizeof(ackbuf), retval; @@ -3765,8 +3934,6 @@ int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op) int vfo_list; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - rs = &rig->state; - priv = (struct icom_priv_data*)rs->priv; switch(op) { case RIG_OP_CPY: @@ -3783,16 +3950,6 @@ int icom_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op) mv_cn = C_SET_VFO; mv_sc = S_XCHNG; break; -#if 0 - case RIG_OP_DUAL_OFF: - mv_cn = C_SET_VFO; - mv_sc = S_DUAL_OFF; - break; - case RIG_OP_DUAL_ON: - mv_cn = C_SET_VFO; - mv_sc = S_DUAL_ON; - break; -#endif case RIG_OP_FROM_VFO: mv_cn = C_WR_MEM; mv_sc = -1; @@ -3806,27 +3963,25 @@ 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; + mvbuf[0] = 2; + mv_len = 1; break; default: rig_debug(RIG_DEBUG_ERR,"Unsupported mem/vfo op %#x", op); return -RIG_EINVAL; } - retval = icom_transaction (rig, mv_cn, mv_sc, mvbuf, mv_len, - ackbuf, &ack_len); - if (retval != RIG_OK) + retval = icom_transaction (rig, mv_cn, mv_sc, mvbuf, mv_len, ackbuf, &ack_len); + if (retval != RIG_OK) { return retval; + } if (ack_len != 1 || ackbuf[0] != ACK) { - if (op != RIG_OP_XCHG) - rig_debug(RIG_DEBUG_ERR,"icom_vfo_op: ack NG (%#.2x), " - "len=%d\n", ackbuf[0], ack_len); + if (op != RIG_OP_XCHG) { + rig_debug(RIG_DEBUG_ERR, "icom_vfo_op: ack NG (%#.2x), len=%d\n", ackbuf[0], ack_len); + } return -RIG_ERJCTED; } diff --git a/icom/icom.h b/icom/icom.h index abb9a2d39..9d633dd65 100644 --- a/icom/icom.h +++ b/icom/icom.h @@ -95,6 +95,11 @@ typedef struct rig_pltstate { int usleep_time; /* dependent on radio module & serial data rate */ } pltstate_t; +struct icom_agc_level { + enum agc_level_e level; /* Hamlib AGC level from agc_level_e enum, the last entry should have level -1 */ + unsigned char icom_level; /* Icom AGC level for C_CTL_FUNC (0x16), S_FUNC_AGC (0x12) command */ +}; + struct icom_priv_caps { unsigned char re_civ_addr; /* the remote dlft equipment's CI-V address*/ int civ_731_mode; /* Off: freqs on 10 digits, On: freqs on 8 digits */ @@ -114,6 +119,8 @@ struct icom_priv_caps { unsigned char civ_version; // default to 0, 1=IC7200,IC7300,etc differences int offs_len; /* Number of bytes in offset frequency field. 0 defaults to 3 */ int serial_USB_echo_check; /* Flag to test USB echo state */ + int agc_levels_present; /* Flag to indicate that agc_levels array is populated */ + struct icom_agc_level agc_levels[RIG_AGC_LAST + 1]; /* Icom rig-specific AGC levels, the last entry should have level -1 */ }; @@ -156,6 +163,9 @@ int icom_cleanup(RIG *rig); int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq); int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); int icom_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit); +int icom_get_rit_new(RIG *rig, vfo_t vfo, shortfreq_t *ts); +int icom_set_rit_new(RIG *rig, vfo_t vfo, shortfreq_t ts); +int icom_set_xit_new(RIG *rig, vfo_t vfo, shortfreq_t ts); int icom_set_mode_with_data(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); int icom_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); int icom_get_mode_with_data(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); diff --git a/icom/icom_defs.h b/icom/icom_defs.h index 92376969e..52c002281 100644 --- a/icom/icom_defs.h +++ b/icom/icom_defs.h @@ -93,6 +93,7 @@ #define C_SET_TONE 0x1b /* Set tone frequency */ #define C_CTL_PTT 0x1c /* Control Transmit On/Off, Sc */ #define C_CTL_DIG 0x20 /* Digital modes settings & status */ +#define C_CTL_RIT 0x21 /* RIT/XIT control */ #define C_SEND_SEL_FREQ 0x25 /* Send/Recv sel/unsel VFO frequency */ #define C_CTL_MTEXT 0x70 /* Microtelecom Extension */ #define C_CTL_MISC 0x7f /* Miscellaneous control, Sc */ @@ -151,6 +152,7 @@ #define S_SUBTOMAIN 0xb1 /* MAIN = SUB */ #define S_DUAL_OFF 0xc0 /* Dual watch off */ #define S_DUAL_ON 0xc1 /* Dual watch on */ +#define S_DUAL 0xc2 /* Dual watch (0 = off, 1 = on) */ #define S_MAIN 0xd0 /* Select MAIN band */ #define S_SUB 0xd1 /* Select SUB band */ #define S_SUB_SEL 0xd2 /* Read/Set Main/Sub selection */ @@ -354,6 +356,13 @@ #define S_PTT 0x00 #define S_ANT_TUN 0x01 /* Auto tuner 0=OFF, 1 = ON, 2=Start Tuning */ +/* + * RIT/XIT control (C_CTL_RIT) subcommands + */ +#define S_RIT_FREQ 0x00 +#define S_RIT 0x01 /* RIT 0 = OFF, 1 = ON */ +#define S_XIT 0x02 /* XIT (delta TX) 0 = OFF, 1 = ON */ + /* * Misc contents (C_CTL_MEM) subcommands applies to newer rigs. * diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 11c22848e..1931c26e4 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -654,6 +654,7 @@ enum agc_level_e { RIG_AGC_AUTO }; +#define RIG_AGC_LAST RIG_AGC_AUTO /** * \brief Level display meters @@ -733,11 +734,12 @@ enum rig_level_e { RIG_LEVEL_VD_METER = CONSTANT_64BIT_FLAG(34), /*!< \c VD_METER -- Input voltage level meter, arg float (V, volts) */ RIG_LEVEL_ID_METER = CONSTANT_64BIT_FLAG(35), /*!< \c ID_METER -- Current draw meter, arg float (A, amperes) */ - RIG_LEVEL_NOTCHF_RAW = CONSTANT_64BIT_FLAG(36), /*!< \c NOTCHF_RAW -- Notch Freq., arg float [0.0 ... 1.0] */ - RIG_LEVEL_MONITOR_GAIN = CONSTANT_64BIT_FLAG(37) /*!< \c MONITOR_GAIN -- Monitor gain (level for monitoring of transmitted audio), arg float [0.0 ... 1.0] */ + RIG_LEVEL_NOTCHF_RAW = CONSTANT_64BIT_FLAG(36), /*!< \c NOTCHF_RAW -- Notch Freq., arg float [0.0 ... 1.0] */ + RIG_LEVEL_MONITOR_GAIN = CONSTANT_64BIT_FLAG(37), /*!< \c MONITOR_GAIN -- Monitor gain (level for monitoring of transmitted audio), arg float [0.0 ... 1.0] */ + RIG_LEVEL_NB = CONSTANT_64BIT_FLAG(38), /*!< \c NB -- Noise Blanker level, arg float [0.0 ... 1.0] */ }; -#define RIG_LEVEL_FLOAT_LIST (RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_APF|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_COMP|RIG_LEVEL_BALANCE|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_MONITOR_GAIN) +#define RIG_LEVEL_FLOAT_LIST (RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_APF|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_COMP|RIG_LEVEL_BALANCE|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB) #define RIG_LEVEL_READONLY_LIST (RIG_LEVEL_SQLSTAT|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_STRENGTH|RIG_LEVEL_RAWSTR|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER) diff --git a/kenwood/ts480.c b/kenwood/ts480.c index b5827aadb..e5dab69ea 100644 --- a/kenwood/ts480.c +++ b/kenwood/ts480.c @@ -39,8 +39,8 @@ #define TS480_VFO (RIG_VFO_A|RIG_VFO_B) #define TS480_LEVEL_ALL (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC) -#define TS480_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC|RIG_FUNC_BC2) -#define TS890_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_NB2|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC|RIG_FUNC_BC2) +#define TS480_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC|RIG_FUNC_BC2|RIG_FUNC_RIT|RIG_FUNC_XIT) +#define TS890_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_NB2|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC|RIG_FUNC_BC2|RIG_FUNC_RIT|RIG_FUNC_XIT) /* diff --git a/src/misc.c b/src/misc.c index c0a91dee7..f5f071c64 100644 --- a/src/misc.c +++ b/src/misc.c @@ -633,6 +633,7 @@ static struct { RIG_LEVEL_ID_METER, "ID_METER" }, { RIG_LEVEL_NOTCHF_RAW, "NOTCHF_RAW" }, { RIG_LEVEL_MONITOR_GAIN, "MONITOR_GAIN" }, + { RIG_LEVEL_NB, "NB" }, { RIG_LEVEL_NONE, "" }, };