pull/1347/head
Mike Black W9MDB 2023-07-18 22:17:09 -05:00
commit 0540fa4f12
5 zmienionych plików z 567 dodań i 123 usunięć

Wyświetl plik

@ -11,7 +11,7 @@ YAESUSRC = ft100.c ft100.h ft747.c ft747.h ft817.c ft817.h ft847.c ft847.h \
## Yaesu radios that use the new Kenwood style CAT commands
NEWCATSRC = newcat.c newcat.h ft450.c ft450.h ft950.c ft950.h ft991.c ft991.h \
ft2000.c ft2000.h ft9000.c ft9000.h ft5000.c ft5000.h ft1200.c ft1200.h \
ft891.c ft891.h ftdx101.c ftdx101.h ftdx101mp.c ft3000.c ftdx10.c
ft891.c ft891.h ftdx101.c ftdx101.h ftdx101mp.c ft3000.c ftdx10.c ft710.h
noinst_LTLIBRARIES = libhamlib-yaesu.la
libhamlib_yaesu_la_SOURCES = yaesu.c yaesu.h level_gran_yaesu.h $(YAESUSRC) $(NEWCATSRC)

Wyświetl plik

@ -4,10 +4,10 @@
* ft710.c - (C) Nate Bargmann 2007 (n0nb at arrl.net)
* (C) Stephane Fillod 2008-2010
* (C) Terry Embry 2008-2009
* (C) Mikael Nousiainen 2020
* (C) Mikael Nousiainen 2023
*
* This shared library provides an API for communicating
* via serial interface to an FTDX10(D/MP) using the "CAT" interface
* via serial interface to an FT-710 using the "CAT" interface
*
*
* This library is free software; you can redistribute it and/or
@ -33,34 +33,16 @@
#include "tones.h"
#include "newcat.h"
#include "yaesu.h"
#include "ftdx10.h" // reuse this until we know different
#include "ft710.h"
const struct newcat_priv_caps ft710_priv_caps =
{
.roofing_filter_count = 6,
.roofing_filters =
{
// The index must match ext level combo index
{ .index = 0, .set_value = '0', .get_value = 0, .width = 12000, .optional = 0 },
{ .index = 1, .set_value = '1', .get_value = '6', .width = 12000, .optional = 0 },
{ .index = 2, .set_value = '2', .get_value = '7', .width = 3000, .optional = 0 },
// { .index = 3, .set_value = '3', .get_value = '8', .width = 1200, .optional = 1 },
{ .index = 4, .set_value = '4', .get_value = '9', .width = 500, .optional = 0 },
{ .index = 5, .set_value = '5', .get_value = 'A', .width = 300, .optional = 0 },
}
.roofing_filter_count = 0,
.roofing_filters = {}
};
const struct confparams ft710_ext_levels[] =
{
{
TOK_ROOFING_FILTER,
"ROOFINGFILTER",
"Roofing filter",
"Roofing filter",
NULL,
RIG_CONF_COMBO,
{ .c = { .combostr = { "AUTO", "12 kHz", "3 kHz", "500 Hz", "300 Hz (optional)", NULL } } }
},
{
TOK_KEYER,
"KEYER",
@ -127,7 +109,7 @@ const struct confparams ft710_ext_levels[] =
int ft710_ext_tokens[] =
{
TOK_ROOFING_FILTER, TOK_KEYER, TOK_APF_FREQ, TOK_APF_WIDTH,
TOK_KEYER, TOK_APF_FREQ, TOK_APF_WIDTH,
TOK_CONTOUR, TOK_CONTOUR_FREQ, TOK_CONTOUR_LEVEL, TOK_CONTOUR_WIDTH,
TOK_BACKEND_NONE
};
@ -137,7 +119,7 @@ const struct rig_caps ft710_caps =
RIG_MODEL(RIG_MODEL_FT710),
.model_name = "FT-710",
.mfg_name = "Yaesu",
.version = NEWCAT_VER ".3",
.version = NEWCAT_VER ".5",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@ -154,10 +136,10 @@ const struct rig_caps ft710_caps =
.post_write_delay = 20,
.timeout = 1000,
.retry = 3,
.has_get_func = FTDX10_FUNCS,
.has_set_func = FTDX10_FUNCS,
.has_get_level = FTDX10_LEVELS,
.has_set_level = RIG_LEVEL_SET(FTDX10_LEVELS),
.has_get_func = FT710_FUNCS,
.has_set_func = FT710_FUNCS,
.has_get_level = FT710_LEVELS,
.has_set_level = RIG_LEVEL_SET(FT710_LEVELS),
.has_get_parm = RIG_PARM_NONE,
.has_set_parm = RIG_PARM_NONE,
.level_gran =
@ -177,14 +159,18 @@ const struct rig_caps ft710_caps =
.max_ifshift = Hz(1200),
.agc_level_count = 5,
.agc_levels = { RIG_AGC_OFF, RIG_AGC_FAST, RIG_AGC_MEDIUM, RIG_AGC_SLOW, RIG_AGC_AUTO },
.vfo_ops = FTDX10_VFO_OPS,
.vfo_ops = FT710_VFO_OPS,
.scan_ops = RIG_SCAN_VFO,
.targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_FUNC | RIG_TARGETABLE_LEVEL | RIG_TARGETABLE_COMMON | RIG_TARGETABLE_TONE | RIG_TARGETABLE_MODE,
.transceive = RIG_TRN_OFF, /* May enable later as the FTDX10 has an Auto Info command */
.targetable_vfo = RIG_TARGETABLE_FREQ,
.transceive = RIG_TRN_OFF, /* May enable later as the FT-710 has an Auto Info command */
.bank_qty = 0,
.chan_desc_sz = 0,
.rfpower_meter_cal = FTDX10_RFPOWER_METER_CAL,
.swr_cal = FTDX10_SWR_CAL,
.rfpower_meter_cal = FT710_RFPOWER_METER_CAL,
.swr_cal = FT710_SWR_CAL,
.str_cal = FT710_STR_CAL,
.id_meter_cal = FT710_ID_CAL,
.vd_meter_cal = FT710_VD_CAL,
.comp_meter_cal = FT710_COMP_CAL,
.chan_list = {
{ 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP },
RIG_CHAN_END,
@ -192,44 +178,44 @@ const struct rig_caps ft710_caps =
.rx_range_list1 = {
/* General coverage + ham, ANT_5 is RX only antenna */
{kHz(30), MHz(60), FTDX10_ALL_RX_MODES, -1, -1, FTDX10_VFO_ALL, FTDX10_TX_ANTS, "USA"},
{kHz(30), MHz(60), FT710_ALL_RX_MODES, -1, -1, FT710_VFO_ALL, FT710_TX_ANTS, "USA"},
RIG_FRNG_END,
},
.tx_range_list1 = { /* the 101DX is 100W and the MP is 200W */
FRQ_RNG_HF(1, FTDX10_OTHER_TX_MODES, W(5), W(200), FTDX10_VFO_ALL, FTDX10_TX_ANTS),
FRQ_RNG_HF(1, FTDX10_AM_TX_MODES, W(2), W(75), FTDX10_VFO_ALL, FTDX10_TX_ANTS), /* AM class */
FRQ_RNG_6m(1, FTDX10_OTHER_TX_MODES, W(5), W(200), FTDX10_VFO_ALL, FTDX10_TX_ANTS),
FRQ_RNG_6m(1, FTDX10_AM_TX_MODES, W(2), W(75), FTDX10_VFO_ALL, FTDX10_TX_ANTS), /* AM class */
FRQ_RNG_HF(1, FT710_OTHER_TX_MODES, W(5), W(200), FT710_VFO_ALL, FT710_TX_ANTS),
FRQ_RNG_HF(1, FT710_AM_TX_MODES, W(2), W(75), FT710_VFO_ALL, FT710_TX_ANTS), /* AM class */
FRQ_RNG_6m(1, FT710_OTHER_TX_MODES, W(5), W(200), FT710_VFO_ALL, FT710_TX_ANTS),
FRQ_RNG_6m(1, FT710_AM_TX_MODES, W(2), W(75), FT710_VFO_ALL, FT710_TX_ANTS), /* AM class */
RIG_FRNG_END,
},
.rx_range_list2 = {
{kHz(30), MHz(60), FTDX10_ALL_RX_MODES, -1, -1, FTDX10_VFO_ALL, FTDX10_TX_ANTS, "EUR"},
{kHz(30), MHz(60), FT710_ALL_RX_MODES, -1, -1, FT710_VFO_ALL, FT710_TX_ANTS, "EUR"},
RIG_FRNG_END,
},
.tx_range_list2 = {
FRQ_RNG_HF(2, FTDX10_OTHER_TX_MODES, W(5), W(200), FTDX10_VFO_ALL, FTDX10_TX_ANTS),
FRQ_RNG_HF(2, FTDX10_AM_TX_MODES, W(2), W(75), FTDX10_VFO_ALL, FTDX10_TX_ANTS), /* AM class */
FRQ_RNG_6m(2, FTDX10_OTHER_TX_MODES, W(5), W(200), FTDX10_VFO_ALL, FTDX10_TX_ANTS),
FRQ_RNG_6m(2, FTDX10_AM_TX_MODES, W(2), W(75), FTDX10_VFO_ALL, FTDX10_TX_ANTS), /* AM class */
FRQ_RNG_4m_REGION2(FTDX10_OTHER_TX_MODES, W(5), W(200), FTDX10_VFO_ALL, FTDX10_TX_ANTS),
FRQ_RNG_4m_REGION2(FTDX10_AM_TX_MODES, W(2), W(75), FTDX10_VFO_ALL, FTDX10_TX_ANTS), /* AM class */
FRQ_RNG_HF(2, FT710_OTHER_TX_MODES, W(5), W(200), FT710_VFO_ALL, FT710_TX_ANTS),
FRQ_RNG_HF(2, FT710_AM_TX_MODES, W(2), W(75), FT710_VFO_ALL, FT710_TX_ANTS), /* AM class */
FRQ_RNG_6m(2, FT710_OTHER_TX_MODES, W(5), W(200), FT710_VFO_ALL, FT710_TX_ANTS),
FRQ_RNG_6m(2, FT710_AM_TX_MODES, W(2), W(75), FT710_VFO_ALL, FT710_TX_ANTS), /* AM class */
FRQ_RNG_4m_REGION2(FT710_OTHER_TX_MODES, W(5), W(200), FT710_VFO_ALL, FT710_TX_ANTS),
FRQ_RNG_4m_REGION2(FT710_AM_TX_MODES, W(2), W(75), FT710_VFO_ALL, FT710_TX_ANTS), /* AM class */
RIG_FRNG_END,
},
.tuning_steps = {
{FTDX10_SSB_CW_RX_MODES, Hz(10)}, /* Normal */
{FTDX10_SSB_CW_RX_MODES, Hz(100)}, /* Fast */
{FT710_SSB_CW_RX_MODES, Hz(10)}, /* Normal */
{FT710_SSB_CW_RX_MODES, Hz(100)}, /* Fast */
{FTDX10_AM_RX_MODES, Hz(100)}, /* Normal */
{FTDX10_AM_RX_MODES, kHz(1)}, /* Fast */
{FT710_AM_RX_MODES, Hz(100)}, /* Normal */
{FT710_AM_RX_MODES, kHz(1)}, /* Fast */
{FTDX10_FM_RX_MODES, Hz(100)}, /* Normal */
{FTDX10_FM_RX_MODES, kHz(1)}, /* Fast */
{FT710_FM_RX_MODES, Hz(100)}, /* Normal */
{FT710_FM_RX_MODES, kHz(1)}, /* Fast */
RIG_TS_END,
@ -237,10 +223,10 @@ const struct rig_caps ft710_caps =
/* mode/filter list, remember that order matters! */
.filters = {
{FTDX10_CW_RTTY_PKT_RX_MODES, Hz(600)}, /* Normal CW, RTTY, PKT/USER */
{FTDX10_CW_RTTY_PKT_RX_MODES, Hz(300)}, /* Narrow CW, RTTY, PKT/USER */
{FTDX10_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide CW, RTTY, PKT/USER */
{FTDX10_CW_RTTY_PKT_RX_MODES, Hz(1200)}, /* Normal CW, RTTY, PKT/USER */
{FT710_CW_RTTY_PKT_RX_MODES, Hz(600)}, /* Normal CW, RTTY, PKT/USER */
{FT710_CW_RTTY_PKT_RX_MODES, Hz(300)}, /* Narrow CW, RTTY, PKT/USER */
{FT710_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide CW, RTTY, PKT/USER */
{FT710_CW_RTTY_PKT_RX_MODES, Hz(1200)}, /* Normal CW, RTTY, PKT/USER */
{RIG_MODE_SSB, Hz(2400)}, /* Normal SSB */
{RIG_MODE_SSB, Hz(1800)}, /* Narrow SSB */
{RIG_MODE_SSB, Hz(3000)}, /* Wide SSB */
@ -248,7 +234,7 @@ const struct rig_caps ft710_caps =
{RIG_MODE_AMN, Hz(6000)}, /* Narrow AM */
{RIG_MODE_FM | RIG_MODE_PKTFM, Hz(16000)}, /* Normal FM */
{RIG_MODE_FMN | RIG_MODE_PKTFMN, Hz(9000)}, /* Narrow FM */
{FTDX10_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY},
{FT710_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY},
RIG_FLT_END,
},
@ -276,10 +262,10 @@ const struct rig_caps ft710_caps =
.get_ptt = newcat_get_ptt,
.set_split_vfo = newcat_set_split_vfo,
.get_split_vfo = newcat_get_split_vfo,
.set_rit = newcat_set_rit,
.get_rit = newcat_get_rit,
.set_xit = newcat_set_xit,
.get_xit = newcat_get_xit,
.set_rit = newcat_set_clarifier_frequency,
.get_rit = newcat_get_clarifier_frequency,
.set_xit = newcat_set_clarifier_frequency,
.get_xit = newcat_get_clarifier_frequency,
.set_ant = NULL,
.get_ant = NULL,
.get_func = newcat_get_func,

186
rigs/yaesu/ft710.h 100644
Wyświetl plik

@ -0,0 +1,186 @@
/*
* hamlib - (C) Frank Singleton 2000 (javabear at users.sourceforge.net)
*
* FT710.h - (C) Nate Bargmann 2007 (n0nb at arrl.net)
* (C) Stephane Fillod 2008-2010
* (C) Michael Black W9MDB 2020
* (C) Mikael Nousiainen 2023
*
* This shared library provides an API for communicating
* via serial interface to an FT-710 using the "CAT" interface
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef _FT710_H
#define _FT710_H 1
#define FT710_VFO_ALL (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM)
/* Receiver caps */
#define FT710_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_AMN|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|\
RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|\
RIG_MODE_FM|RIG_MODE_FMN|RIG_MODE_PKTFMN)
#define FT710_SSB_CW_RX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|\
RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB)
#define FT710_AM_RX_MODES (RIG_MODE_AM|RIG_MODE_AMN)
#define FT710_FM_RX_MODES (RIG_MODE_FM|RIG_MODE_PKTFM|RIG_MODE_FMN|RIG_MODE_PKTFMN)
#define FT710_CW_RTTY_PKT_RX_MODES (RIG_MODE_RTTY|RIG_MODE_RTTYR|\
RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_CW|RIG_MODE_CWR)
/* TRX caps */
#define FT710_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_AMN|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_RTTY| \
RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_FM|RIG_MODE_FMN|RIG_MODE_PKTFMN) /* 100 W class */
#define FT710_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_AMN) /* set 25W max */
#define FT710_LEVELS (RIG_LEVEL_ATT|RIG_LEVEL_PREAMP|\
RIG_LEVEL_ALC|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_SWR|\
RIG_LEVEL_RFPOWER|RIG_LEVEL_RF|RIG_LEVEL_SQL|\
RIG_LEVEL_MICGAIN|RIG_LEVEL_IF|RIG_LEVEL_CWPITCH|\
RIG_LEVEL_KEYSPD|RIG_LEVEL_AF|RIG_LEVEL_AGC|\
RIG_LEVEL_METER|RIG_LEVEL_BKINDL|RIG_LEVEL_SQL|\
RIG_LEVEL_VOXGAIN|RIG_LEVEL_VOXDELAY|RIG_LEVEL_COMP|\
RIG_LEVEL_ANTIVOX|RIG_LEVEL_NR|RIG_LEVEL_NB|RIG_LEVEL_NOTCHF|\
RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|\
RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|\
RIG_LEVEL_BAND_SELECT)
#define FT710_FUNCS (RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_LOCK|\
RIG_FUNC_MON|RIG_FUNC_NB|RIG_FUNC_NR|RIG_FUNC_VOX|\
RIG_FUNC_FBKIN|RIG_FUNC_COMP|RIG_FUNC_ANF|RIG_FUNC_MN|\
RIG_FUNC_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER|RIG_FUNC_APF)
/* TBC */
#define FT710_VFO_OPS (RIG_OP_TUNE|RIG_OP_CPY|RIG_OP_XCHG|\
RIG_OP_UP|RIG_OP_DOWN|RIG_OP_BAND_UP|RIG_OP_BAND_DOWN|\
RIG_OP_TO_VFO|RIG_OP_FROM_VFO|RIG_OP_TOGGLE)
// Borrowed from FLRig -- Thanks to Dave W1HKJ
#define FT710_RFPOWER_METER_CAL \
{ \
5, \
{ \
{27, 5.0f}, \
{94, 25.0f}, \
{147, 50.0f}, \
{176, 75.0f}, \
{205, 100.0f}, \
} \
}
// Based on testing with G3VPX Ian Sumner for the FT7101D
#define FT710_SWR_CAL \
{ \
8, \
{ \
{0, 1.0f}, \
{26, 1.2f}, \
{52, 1.5f}, \
{89, 2.0f}, \
{126, 3.0f}, \
{173, 4.0f}, \
{236, 5.0f}, \
{255, 25.0f}, \
} \
}
/* TBC */
#define FT710_STR_CAL { 16, \
{ \
{ 0, -54 }, /* S0 */ \
{ 12, -48 }, /* S1 */ \
{ 27, -42 }, /* S2 */ \
{ 40, -36 }, /* S3 */ \
{ 55, -30 }, /* S4 */ \
{ 65, -24 }, /* S5 */ \
{ 80, -18 }, /* S6 */ \
{ 95, -12 }, /* S7 */ \
{ 112, -6 }, /* S8 */ \
{ 130, 0 }, /* S9 */ \
{ 150, 10 }, /* +10 */ \
{ 172, 20 }, /* +20 */ \
{ 190, 30 }, /* +30 */ \
{ 220, 40 }, /* +40 */ \
{ 240, 50 }, /* +50 */ \
{ 255, 60 }, /* +60 */ \
} }
#define FT710_ID_CAL { 7, \
{ \
{ 0, 0.0f }, \
{ 53, 5.0f }, \
{ 65, 6.0f }, \
{ 78, 7.0f }, \
{ 86, 8.0f }, \
{ 98, 9.0f }, \
{ 107, 10.0f } \
} \
}
/* TBC */
#define FT710_VD_CAL { 2, \
{ \
{ 0, 0.0f }, \
{ 192, 13.8f }, \
} \
}
#define FT710_COMP_CAL { 9, \
{ \
{ 0, 0.0f }, \
{ 40, 2.5f }, \
{ 60, 5.0f }, \
{ 85, 7.5f }, \
{ 135, 10.0f }, \
{ 150, 12.5f }, \
{ 175, 15.0f }, \
{ 195, 17.5f }, \
{ 220, 20.0f } \
} \
}
/*
* Other features (used by rig_caps)
*/
#define FT710_TX_ANTS RIG_ANT_CURR
#define FT710_MEM_CHNL_LENGTH 1 /* 0x10 P1 = 01 return size */
#define FT710_OP_DATA_LENGTH 19 /* 0x10 P1 = 03 return size */
#define FT710_VFO_DATA_LENGTH 18 /* 0x10 P1 = 03 return size -- A & B returned */
#define FT710_MEM_CHNL_DATA_LENGTH 19 /* 0x10 P1 = 04, P4 = 0x01-0x20 return size */
#define FT710_STATUS_FLAGS_LENGTH 5 /* 0xf7, 0xfa return size */
#define FT710_ALL_DATA_LENGTH 649 /* 0x10 P1 = 00 return size */
/* Timing values in mS */
/* Delay between bytes sent
* Should not exceed value set in CAT TOT menu (rig default is 10 mSec)
*/
#define FT710_WRITE_DELAY 0
/* Delay sequential fast writes */
#define FT710_POST_WRITE_DELAY 5
#endif /* _FT710_H */

Wyświetl plik

@ -257,6 +257,7 @@ static const yaesu_newcat_commands_t valid_commands[] =
{"BS", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"BU", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"BY", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"CF", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE },
{"CH", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"CN", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"CO", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
@ -278,7 +279,7 @@ static const yaesu_newcat_commands_t valid_commands[] =
{"FK", FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE },
{"FN", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE },
{"FR", FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"FS", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"FS", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE },
{"FT", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"GT", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"ID", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
@ -329,7 +330,7 @@ static const yaesu_newcat_commands_t valid_commands[] =
{"RO", FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE },
{"RP", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE },
{"RS", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"RT", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"RT", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE },
{"RU", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"SC", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"SD", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
@ -357,7 +358,7 @@ static const yaesu_newcat_commands_t valid_commands[] =
{"VT", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE },
{"VV", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE },
{"VX", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"XT", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE },
{"XT", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE },
{"ZI", FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE },
} ;
@ -399,6 +400,8 @@ static int set_roofing_filter(RIG *rig, vfo_t vfo, int index);
static int set_roofing_filter_for_width(RIG *rig, vfo_t vfo, int width);
static int get_roofing_filter(RIG *rig, vfo_t vfo,
struct newcat_roofing_filter **roofing_filter);
static int newcat_set_clarifier(RIG *rig, vfo_t vfo, int rx, int tx);
static int newcat_get_clarifier(RIG *rig, vfo_t vfo, int *rx, int *tx);
static int newcat_set_apf_frequency(RIG *rig, vfo_t vfo, int freq);
static int newcat_get_apf_frequency(RIG *rig, vfo_t vfo, int *freq);
static int newcat_set_apf_width(RIG *rig, vfo_t vfo, int choice);
@ -2251,6 +2254,28 @@ int newcat_set_rptr_offs(RIG *rig, vfo_t vfo, shortfreq_t offs)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "%s%04li%c", command, offs,
cat_term);
}
else if (is_ft710)
{
if (freq >= 28000000 && freq <= 29700000)
{
strcpy(command, "EX010318");
}
else if (freq >= 50000000 && freq <= 54000000)
{
strcpy(command, "EX010319");
}
else
{
// only valid on 10m and 6m bands
RETURNFUNC(-RIG_EINVAL);
}
// Step size is 1 kHz
offs /= 1000;
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "%s%04li%c", command, offs,
cat_term);
}
else if (is_ftdx1200)
{
if (freq >= 28000000 && freq <= 29700000)
@ -2465,6 +2490,26 @@ int newcat_get_rptr_offs(RIG *rig, vfo_t vfo, shortfreq_t *offs)
// Step size is 1 kHz
step = 1000;
}
else if (is_ft710)
{
if (freq >= 28000000 && freq <= 29700000)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX010318%c", cat_term);
}
else if (freq >= 50000000 && freq <= 54000000)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX010319%c", cat_term);
}
else
{
// only valid on 10m and 6m bands
*offs = 0;
RETURNFUNC(RIG_OK);
}
// Step size is 1 kHz
step = 1000;
}
else if (is_ftdx1200)
{
if (freq >= 28000000 && freq <= 29700000)
@ -3979,7 +4024,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ft950 || is_ftdx1200 || is_ftdx3000 || is_ft891 || is_ft991
if (is_ft950 || is_ftdx1200 || is_ftdx3000 || is_ft891 || is_ft991 || is_ft710
|| is_ftdx101d || is_ftdx101mp || is_ftdx10)
{
scale = 100.;
@ -4023,7 +4068,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
fpf = newcat_scale_float(255, val.f);
if (is_ftdx10 || is_ft710) { main_sub_vfo = '0'; }
if (is_ftdx10) { main_sub_vfo = '0'; }
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AG%c%03d%c", main_sub_vfo, fpf,
cat_term);
@ -4196,7 +4241,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
|| is_ftdx101mp)
{
newcat_get_mode(rig, vfo, &mode, &width);
@ -4204,7 +4249,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
if (val.f > 1.0) { RETURNFUNC(-RIG_EINVAL); }
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710
|| is_ftdx101d
|| is_ftdx101mp
|| is_ftdx10)
@ -4219,7 +4264,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "MG%03d%c", fpf, cat_term);
// Some Yaesu rigs reject this command in RTTY modes
if (is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
|| is_ftdx101mp)
{
if (mode & RIG_MODE_RTTY || mode & RIG_MODE_RTTYR)
@ -4395,7 +4440,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
scale = 255;
}
if (is_ftdx10 || is_ft710) { main_sub_vfo = 0; }
if (is_ftdx10) { main_sub_vfo = '0'; }
fpf = newcat_scale_float(scale, val.f);
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "RG%c%03d%c", main_sub_vfo, fpf,
@ -4496,7 +4541,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
millis = dot10ths_to_millis(val.i, keyspd.i);
if (is_ftdx101d || is_ftdx101mp || is_ftdx10)
if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710)
{
if (millis <= 30) { SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "SD00;"); }
else if (millis <= 50) { SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "SD01;"); }
@ -4579,7 +4624,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ft891 || is_ft991 || is_ftdx101d || is_ftdx101mp || is_ftdx10)
if (is_ft891 || is_ft991 || is_ft710 || is_ftdx101d || is_ftdx101mp || is_ftdx10)
{
scale = 100;
}
@ -4623,7 +4668,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "VD%04d%c", val.i, cat_term);
}
else if (is_ftdx101d || is_ftdx101mp || is_ftdx10) // new lookup table argument
else if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710) // new lookup table argument
{
rig_debug(RIG_DEBUG_TRACE, "%s: ft101 #1 val.i=%d\n", __func__, val.i);
@ -4679,7 +4724,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
break;
case RIG_LEVEL_ANTIVOX:
if (is_ftdx101d || is_ftdx101mp || is_ftdx10)
if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710)
{
fpf = newcat_scale_float(100, val.f);
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AV%03d%c", fpf, cat_term);
@ -4789,7 +4834,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
if (val.f > 1.0) { RETURNFUNC(-RIG_EINVAL); }
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710
|| is_ftdx101d
|| is_ftdx101mp
|| is_ftdx10)
@ -4833,7 +4878,8 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
RETURNFUNC(-RIG_ENAVAIL);
}
fpf = newcat_scale_float(10, val.f);
// Do not scale the value, level maximum value is set to 10
fpf = val.f;
if (fpf < 0)
{
@ -5021,7 +5067,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
|| is_ftdx101mp)
{
newcat_get_mode(rig, vfo, &mode, &width);
@ -5030,7 +5076,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "MG%c", cat_term);
// Some Yaesu rigs reject this command in RTTY modes
if (is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
|| is_ftdx101mp)
{
if (mode & RIG_MODE_RTTY || mode & RIG_MODE_RTTYR)
@ -5300,7 +5346,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
case RIG_LEVEL_ANTIVOX:
if (is_ftdx101d || is_ftdx101mp || is_ftdx10)
if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AV%c", cat_term);
}
@ -5420,7 +5466,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
{
case RIG_LEVEL_RFPOWER:
if (is_ft950 || is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891
|| is_ft991
|| is_ft991 || is_ft710
|| is_ftdx101d || is_ftdx101mp || is_ftdx10)
{
scale = 100.;
@ -5452,7 +5498,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
case RIG_LEVEL_ANTIVOX:
val->f = (float) atoi(retlvl) / 100.;
val->f = ((float) atoi(retlvl)) / 100.;
break;
case RIG_LEVEL_SWR:
@ -5591,7 +5637,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
case RIG_LEVEL_MICGAIN:
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710
|| is_ftdx101d
|| is_ftdx101mp
|| is_ftdx10)
@ -5624,7 +5670,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
case RIG_LEVEL_SQL:
if (is_ft891 || is_ft991 || is_ftdx101d || is_ftdx101mp || is_ftdx10)
if (is_ft891 || is_ft991 || is_ft710 || is_ftdx101d || is_ftdx101mp || is_ftdx10)
{
scale = 100.;
}
@ -5642,7 +5688,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
int millis;
value_t keyspd;
if (is_ftdx101d || is_ftdx101mp || is_ftdx10)
if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710)
{
switch (raw_value)
{
@ -5763,7 +5809,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
case RIG_LEVEL_VOXDELAY:
val->i = atoi(retlvl);
if (is_ftdx101d || is_ftdx101mp)
if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710)
{
switch (val->i)
{
@ -5916,7 +5962,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
case RIG_LEVEL_MONITOR_GAIN:
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710
|| is_ftdx101d
|| is_ftdx101mp)
{
@ -5927,11 +5973,12 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
scale = 255.;
}
val->f = (float)atoi(retlvl) / scale;
val->f = ((float) atoi(retlvl)) / scale;
break;
case RIG_LEVEL_NB:
val->f = (float)(atoi(retlvl) / 10.);
// Do not scale the value, level maximum value is set to 10
val->f = (float) atoi(retlvl);
break;
case RIG_LEVEL_TEMP_METER:
@ -6216,13 +6263,13 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
|| is_ftdx101mp)
{
newcat_get_mode(rig, vfo, &mode, &width);
}
if (is_ft891 || is_ft991 || is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm
if (is_ft891 || is_ft991 || is_ft710 || is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm
|| is_ftdx101d
|| is_ftdx101mp)
{
@ -6237,7 +6284,7 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
}
// Some Yaesu rigs reject this command in AM/FM/RTTY modes
if (is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d
|| is_ftdx101mp)
{
if (mode & RIG_MODE_AM || mode & RIG_MODE_FM || mode & RIG_MODE_AMN
@ -6274,23 +6321,37 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
break;
case RIG_FUNC_RIT:
if (!newcat_valid_command(rig, "RT"))
if (is_ft710)
{
RETURNFUNC(-RIG_ENAVAIL);
RETURNFUNC(newcat_set_clarifier(rig, vfo, status, -1));
}
else
{
if (!newcat_valid_command(rig, "RT"))
{
RETURNFUNC(-RIG_ENAVAIL);
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "RT%d%c", status ? 1 : 0,
cat_term);
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "RT%d%c", status ? 1 : 0,
cat_term);
}
break;
case RIG_FUNC_XIT:
if (!newcat_valid_command(rig, "XT"))
if (is_ft710)
{
RETURNFUNC(-RIG_ENAVAIL);
RETURNFUNC(newcat_set_clarifier(rig, vfo, -1, status));
}
else
{
if (!newcat_valid_command(rig, "XT"))
{
RETURNFUNC(-RIG_ENAVAIL);
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "XT%d%c", status ? 1 : 0,
cat_term);
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "XT%d%c", status ? 1 : 0,
cat_term);
}
break;
case RIG_FUNC_APF:
@ -6299,13 +6360,12 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ftdx101d || is_ftdx101mp)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c2%04d%c", main_sub_vfo,
status ? 1 : 0, cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft710 || is_ft991 || is_ft891)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO02%04d%c", status ? 1 : 0,
cat_term);
@ -6325,6 +6385,8 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
RETURNFUNC(-RIG_ENIMPL);
}
priv->question_mark_response_means_rejected = 1;
break;
default:
@ -6518,7 +6580,7 @@ int newcat_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
RETURNFUNC(-RIG_ENAVAIL);
}
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991
if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710
|| is_ftdx101d
|| is_ftdx101mp)
{
@ -6550,21 +6612,35 @@ int newcat_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
break;
case RIG_FUNC_RIT:
if (!newcat_valid_command(rig, "RT"))
if (is_ft710)
{
RETURNFUNC(-RIG_ENAVAIL);
RETURNFUNC(newcat_get_clarifier(rig, vfo, status, NULL));
}
else
{
if (!newcat_valid_command(rig, "RT"))
{
RETURNFUNC(-RIG_ENAVAIL);
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "RT%c", cat_term);
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "RT%c", cat_term);
}
break;
case RIG_FUNC_XIT:
if (!newcat_valid_command(rig, "XT"))
if (is_ft710)
{
RETURNFUNC(-RIG_ENAVAIL);
RETURNFUNC(newcat_get_clarifier(rig, vfo, NULL, status));
}
else
{
if (!newcat_valid_command(rig, "XT"))
{
RETURNFUNC(-RIG_ENAVAIL);
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "XT%c", cat_term);
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "XT%c", cat_term);
}
break;
case RIG_FUNC_APF:
@ -6578,7 +6654,7 @@ int newcat_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c2%c", main_sub_vfo,
cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft710 || is_ft991 || is_ft891)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO02%c", cat_term);
}
@ -6692,11 +6768,7 @@ int newcat_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
break;
case RIG_FUNC_APF:
if (is_ftdx101d || is_ftdx101mp)
{
*status = (retfunc[last_char_index] == '1') ? 1 : 0;
}
else if (is_ftdx10 || is_ft991 || is_ft891)
if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
*status = (retfunc[last_char_index] == '1') ? 1 : 0;
}
@ -6751,7 +6823,7 @@ int newcat_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val)
RETURNFUNC(set_roofing_filter(rig, vfo, val.i));
case TOK_KEYER:
if (!newcat_valid_command(rig, "ML"))
if (!newcat_valid_command(rig, "KR"))
{
RETURNFUNC(-RIG_ENAVAIL);
}
@ -7135,7 +7207,14 @@ int newcat_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
switch (op)
{
case RIG_OP_TUNE:
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AC002%c", cat_term);
if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AC003%c", cat_term);
}
else
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AC002%c", cat_term);
}
break;
case RIG_OP_CPY:
@ -11306,6 +11385,170 @@ int newcat_send_voice_mem(RIG *rig, vfo_t vfo, int ch)
RETURNFUNC2(newcat_set_cmd(rig));
}
static int newcat_set_clarifier(RIG *rig, vfo_t vfo, int rx, int tx)
{
struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv;
char main_sub_vfo = '0';
int result;
if (!newcat_valid_command(rig, "CF"))
{
RETURNFUNC2(-RIG_ENAVAIL);
}
if (rig->caps->targetable_vfo & RIG_TARGETABLE_FREQ)
{
main_sub_vfo = (RIG_VFO_B == vfo || RIG_VFO_SUB == vfo) ? '1' : '0';
}
// Negative value keeps the current state for RIT/XIT
if (rx < 0 || tx < 0)
{
int current_rx, current_tx;
result = newcat_get_clarifier(rig, vfo, &current_rx, &current_tx);
if (result == RIG_OK)
{
if (rx < 0)
{
rx = current_rx;
}
if (tx < 0)
{
tx = current_tx;
}
}
else
{
if (rx < 0)
{
rx = 0;
}
if (tx < 0)
{
tx = 0;
}
}
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CF%c00%d%d000%c", main_sub_vfo,
rx ? 1 : 0, tx ? 1 : 0, cat_term);
RETURNFUNC2(newcat_set_cmd(rig));
}
static int newcat_get_clarifier(RIG *rig, vfo_t vfo, int *rx, int *tx)
{
struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv;
char main_sub_vfo = '0';
int err;
int ret_data_len;
char *ret_data;
if (!newcat_valid_command(rig, "CF"))
{
RETURNFUNC2(-RIG_ENAVAIL);
}
if (rig->caps->targetable_vfo & RIG_TARGETABLE_FREQ)
{
main_sub_vfo = (RIG_VFO_B == vfo || RIG_VFO_SUB == vfo) ? '1' : '0';
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CF%c00%c", main_sub_vfo, cat_term);
if ((err = newcat_get_cmd(rig)) != RIG_OK)
{
RETURNFUNC2(err);
}
ret_data_len = strlen(priv->ret_data);
/* skip command */
ret_data = priv->ret_data + strlen(priv->cmd_str) - 1;
rig_debug(RIG_DEBUG_TRACE, "%s: ret_data='%s'\n", __func__, ret_data);
/* chop term */
priv->ret_data[ret_data_len - 1] = '\0';
if (rx != NULL)
{
*rx = (ret_data[0] == '1') ? 1 : 0;
}
if (tx != NULL)
{
*tx = (ret_data[1] == '1') ? 1 : 0;
}
RETURNFUNC2(RIG_OK);
}
int newcat_set_clarifier_frequency(RIG *rig, vfo_t vfo, shortfreq_t freq)
{
struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv;
char main_sub_vfo = '0';
if (!newcat_valid_command(rig, "CF"))
{
RETURNFUNC2(-RIG_ENAVAIL);
}
if (rig->caps->targetable_vfo & RIG_TARGETABLE_FREQ)
{
main_sub_vfo = (RIG_VFO_B == vfo || RIG_VFO_SUB == vfo) ? '1' : '0';
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CF%c01%+05d%c", main_sub_vfo,
(int) freq, cat_term);
RETURNFUNC2(newcat_set_cmd(rig));
}
int newcat_get_clarifier_frequency(RIG *rig, vfo_t vfo, shortfreq_t *freq)
{
struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv;
char main_sub_vfo = '0';
int err;
int ret_data_len;
char *ret_data;
int freq_result;
int result;
if (!newcat_valid_command(rig, "CF"))
{
RETURNFUNC2(-RIG_ENAVAIL);
}
if (rig->caps->targetable_vfo & RIG_TARGETABLE_FREQ)
{
main_sub_vfo = (RIG_VFO_B == vfo || RIG_VFO_SUB == vfo) ? '1' : '0';
}
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CF%c01%c", main_sub_vfo, cat_term);
if ((err = newcat_get_cmd(rig)) != RIG_OK)
{
RETURNFUNC2(err);
}
ret_data_len = strlen(priv->ret_data);
/* skip command */
ret_data = priv->ret_data + strlen(priv->cmd_str) - 1;
rig_debug(RIG_DEBUG_TRACE, "%s: ret_data='%s'\n", __func__, ret_data);
/* chop term */
priv->ret_data[ret_data_len - 1] = '\0';
result = sscanf(ret_data, "%05d", &freq_result);
if (result != 1)
{
rig_debug(RIG_DEBUG_ERR, "%s: error parsing clarifier frequency: %s\n", __func__, ret_data);
RETURNFUNC2(-RIG_EPROTO);
}
*freq = (shortfreq_t) freq_result;
RETURNFUNC2(RIG_OK);
}
static int newcat_set_apf_frequency(RIG *rig, vfo_t vfo, int freq)
{
struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv;
@ -11322,7 +11565,7 @@ static int newcat_set_apf_frequency(RIG *rig, vfo_t vfo, int freq)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c3%04d%c", main_sub_vfo,
(freq + 250) / 10, cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO03%04d%c", (freq + 250) / 10,
cat_term);
@ -11358,7 +11601,7 @@ static int newcat_get_apf_frequency(RIG *rig, vfo_t vfo, int *freq)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c3%c", main_sub_vfo,
cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO03%c", cat_term);
}
@ -11406,6 +11649,11 @@ static int newcat_set_apf_width(RIG *rig, vfo_t vfo, int choice)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030201%d%c", choice,
cat_term);
}
else if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030204%d%c", choice,
cat_term);
}
else if (is_ft991)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX111%d%c", choice, cat_term);
@ -11446,6 +11694,10 @@ static int newcat_get_apf_width(RIG *rig, vfo_t vfo, int *choice)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030201%c", cat_term);
}
else if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030204%c", cat_term);
}
else if (is_ft991)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX111%c", cat_term);
@ -11500,7 +11752,7 @@ static int newcat_set_contour(RIG *rig, vfo_t vfo, int status)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c0%04d%c", main_sub_vfo,
status ? 1 : 0, cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO00%04d%c", status ? 1 : 0,
cat_term);
@ -11542,7 +11794,7 @@ static int newcat_get_contour(RIG *rig, vfo_t vfo, int *status)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c0%c", main_sub_vfo,
cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO00%c", cat_term);
}
@ -11596,7 +11848,7 @@ static int newcat_set_contour_frequency(RIG *rig, vfo_t vfo, int freq)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c1%04d%c", main_sub_vfo,
freq, cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
// Range is 10..3200 Hz
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO01%04d%c", freq, cat_term);
@ -11639,7 +11891,7 @@ static int newcat_get_contour_frequency(RIG *rig, vfo_t vfo, int *freq)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO%c1%c", main_sub_vfo,
cat_term);
}
else if (is_ftdx10 || is_ft991 || is_ft891)
else if (is_ftdx10 || is_ft991 || is_ft891 || is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "CO01%c", cat_term);
}
@ -11702,6 +11954,11 @@ static int newcat_set_contour_level(RIG *rig, vfo_t vfo, int level)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030202%+03d%c", level,
cat_term);
}
else if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030205%+03d%c", level,
cat_term);
}
else if (is_ft991)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX112%+03d%c", level, cat_term);
@ -11743,6 +12000,10 @@ static int newcat_get_contour_level(RIG *rig, vfo_t vfo, int *level)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030202%c", cat_term);
}
else if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030205%c", cat_term);
}
else if (is_ft991)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX112%c", cat_term);
@ -11796,6 +12057,11 @@ static int newcat_set_contour_width(RIG *rig, vfo_t vfo, int width)
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030203%02d%c", width,
cat_term);
}
else if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030206%02d%c", width,
cat_term);
}
else if (is_ft991)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX113%02d%c", width, cat_term);
@ -11836,6 +12102,10 @@ static int newcat_get_contour_width(RIG *rig, vfo_t vfo, int *width)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030203%c", cat_term);
}
else if (is_ft710)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX030206%c", cat_term);
}
else if (is_ft991)
{
SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "EX113%c", cat_term);

Wyświetl plik

@ -204,6 +204,8 @@ int newcat_get_rit(RIG * rig, vfo_t vfo, shortfreq_t * rit);
int newcat_set_rit(RIG * rig, vfo_t vfo, shortfreq_t rit);
int newcat_get_xit(RIG * rig, vfo_t vfo, shortfreq_t * xit);
int newcat_set_xit(RIG * rig, vfo_t vfo, shortfreq_t xit);
int newcat_get_clarifier_frequency(RIG *rig, vfo_t vfo, shortfreq_t *freq);
int newcat_set_clarifier_frequency(RIG *rig, vfo_t vfo, shortfreq_t freq);
int newcat_power2mW(RIG * rig, unsigned int *mwpower, float power, freq_t freq, rmode_t mode);
int newcat_mW2power(RIG * rig, float *power, unsigned int mwpower, freq_t freq, rmode_t mode);
int newcat_set_split_vfo(RIG * rig, vfo_t vfo, split_t split, vfo_t tx_vfo);