From d54912e375cb0ad00acf8bd5b7ecdeabac6e5b8d Mon Sep 17 00:00:00 2001 From: Mikael Nousiainen Date: Wed, 12 Jul 2023 00:29:32 +0300 Subject: [PATCH 1/4] FT-710 fixes, part 1 --- rigs/yaesu/Makefile.am | 2 +- rigs/yaesu/ft710.c | 100 ++++++++++++++++++----------------------- rigs/yaesu/newcat.c | 51 ++++++++++++++++++++- 3 files changed, 94 insertions(+), 59 deletions(-) diff --git a/rigs/yaesu/Makefile.am b/rigs/yaesu/Makefile.am index 776e96abe..39130a8eb 100644 --- a/rigs/yaesu/Makefile.am +++ b/rigs/yaesu/Makefile.am @@ -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) diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 9fcb5f585..92a2aae04 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -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 ".4", .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 | RIG_TARGETABLE_FUNC | RIG_TARGETABLE_LEVEL, + .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, }, diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index f198cc095..fedc46383 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2250,6 +2250,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) @@ -2464,6 +2486,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) @@ -7124,7 +7166,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: From c1829e3de0ffcd59128330bbc1635c5a3aba83e1 Mon Sep 17 00:00:00 2001 From: Mikael Nousiainen Date: Wed, 12 Jul 2023 00:36:49 +0300 Subject: [PATCH 2/4] Add ft710.h --- rigs/yaesu/ft710.h | 186 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 rigs/yaesu/ft710.h diff --git a/rigs/yaesu/ft710.h b/rigs/yaesu/ft710.h new file mode 100644 index 000000000..a10524000 --- /dev/null +++ b/rigs/yaesu/ft710.h @@ -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 */ From ebc10b84f4885eff15b1ea0d4027a5de8ee4a155 Mon Sep 17 00:00:00 2001 From: Mikael Nousiainen Date: Tue, 18 Jul 2023 23:31:15 +0300 Subject: [PATCH 3/4] Fix more FT-710 issues and implement the new CF clarifier command --- rigs/yaesu/ft710.c | 10 +- rigs/yaesu/newcat.c | 341 ++++++++++++++++++++++++++++++++++++-------- rigs/yaesu/newcat.h | 2 + 3 files changed, 288 insertions(+), 65 deletions(-) diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 92a2aae04..5290f525d 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -161,7 +161,7 @@ const struct rig_caps ft710_caps = .agc_levels = { RIG_AGC_OFF, RIG_AGC_FAST, RIG_AGC_MEDIUM, RIG_AGC_SLOW, RIG_AGC_AUTO }, .vfo_ops = FT710_VFO_OPS, .scan_ops = RIG_SCAN_VFO, - .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_FUNC | RIG_TARGETABLE_LEVEL, + .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, @@ -262,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, diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index fedc46383..d2feda5d2 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -256,6 +256,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 }, @@ -277,7 +278,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 }, @@ -328,7 +329,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 }, @@ -356,7 +357,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 }, } ; @@ -398,6 +399,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); @@ -4010,7 +4013,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.; @@ -4054,7 +4057,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); @@ -4227,7 +4230,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); @@ -4235,7 +4238,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) @@ -4250,7 +4253,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) @@ -4426,7 +4429,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, @@ -4527,7 +4530,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;"); } @@ -4610,7 +4613,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; } @@ -4654,7 +4657,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); @@ -4710,7 +4713,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); @@ -4820,7 +4823,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) @@ -4864,7 +4867,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) { @@ -5052,7 +5056,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); @@ -5061,7 +5065,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) @@ -5331,7 +5335,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); } @@ -5451,7 +5455,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.; @@ -5483,7 +5487,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: @@ -5622,7 +5626,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) @@ -5655,7 +5659,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.; } @@ -5673,7 +5677,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) { @@ -5794,7 +5798,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) { @@ -5947,7 +5951,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) { @@ -5958,11 +5962,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: @@ -6247,13 +6252,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) { @@ -6268,7 +6273,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 @@ -6305,23 +6310,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: @@ -6330,13 +6349,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); @@ -6356,6 +6374,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: @@ -6549,7 +6569,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) { @@ -6581,21 +6601,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: @@ -6609,7 +6643,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); } @@ -6723,11 +6757,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; } @@ -6782,7 +6812,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); } @@ -11344,6 +11374,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, ¤t_rx, ¤t_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; @@ -11360,7 +11554,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); @@ -11396,7 +11590,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); } @@ -11444,6 +11638,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); @@ -11484,6 +11683,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); @@ -11538,7 +11741,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); @@ -11580,7 +11783,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); } @@ -11634,7 +11837,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); @@ -11677,7 +11880,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); } @@ -11740,6 +11943,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); @@ -11781,6 +11989,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); @@ -11834,6 +12046,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); @@ -11874,6 +12091,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); diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 282aa32f0..1bdc232d8 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -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); From d0fba93c654bcbdc4e9c06f0bb78e4288b99f63a Mon Sep 17 00:00:00 2001 From: Mikael Nousiainen Date: Tue, 18 Jul 2023 23:32:36 +0300 Subject: [PATCH 4/4] Bump version for FT-710 --- rigs/yaesu/ft710.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 5290f525d..68c065644 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -119,7 +119,7 @@ const struct rig_caps ft710_caps = RIG_MODEL(RIG_MODEL_FT710), .model_name = "FT-710", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".4", + .version = NEWCAT_VER ".5", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER,