[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. f3cb1a09aead849dcfc25
Library to control radio transceivers and receivers
Brought to you by:
n0nb
From: Michael B. <mdb...@us...> - 2020-11-10 05:07:05
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Hamlib -- Ham radio control libraries". The branch, master has been updated via f3cb1a09aead849dcfc25ad53c0f94e1cf5267cd (commit) via 78b469d193e194798b8ba8699b905e4810849b81 (commit) via 0f171f6aa6143659fc8eb129d932c2a6ba4624e2 (commit) via 7b8b96555aa934c586c7e93ff6a4b9d4e03085a9 (commit) via 8f3d5b5a850488b8aeed8deac9fe3dcc955bd022 (commit) via c10606ed4f79322fb1253ff2d6685ec96269864d (commit) via fdbc66b434a38a542cf8220c43dd1b3d1dddb846 (commit) via d114a5e2d669dd8a6f4c2aebc961b585c45a5a3a (commit) via b9815a41656d95649cda4d7df773f8a2d9983692 (commit) via 88cec8450cff870e981f53f632f3acf6839f2f1a (commit) via 7cbe39d5ab130eb38542332515a4573677e5ed10 (commit) via 9a60e32defa48603d42f79ca7c835ac2ae3ed64e (commit) via df5fb8d6c8501917f8cfe742c825a28f13e7cf44 (commit) via 9033fc2e783ba0b1257528ed58037778a48710f0 (commit) via 526fb218522500e2764622302fef4d77c76ab03a (commit) via 0f194c37294954ccc3283e057d018d0e12ce5123 (commit) via 0ad76ba38ae6b89934cf5f3388b2e8c26fc2bdbd (commit) via 5ba6059d2f56c030b5aef74eff96823bc0880860 (commit) from ba5ab4ba70806537f36b6eed2efd6693132b1d50 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit f3cb1a09aead849dcfc25ad53c0f94e1cf5267cd Author: Michael Black W9MDB <mdb...@ya...> Date: Mon Nov 9 23:06:44 2020 -0600 Add FUNC_TUNE to Flex/PowerSDR diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 73267724..65411fbf 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -39,7 +39,7 @@ #define F6K_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_AM|RIG_MODE_FM|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB) -#define F6K_FUNC_ALL (RIG_FUNC_VOX) +#define F6K_FUNC_ALL (RIG_FUNC_VOX|RIG_FUNC_TUNER) #define F6K_LEVEL_ALL (RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW|RIG_LEVEL_KEYSPD) @@ -49,7 +49,7 @@ #define F6K_ANTS (RIG_ANT_1|RIG_ANT_2|RIG_ANT_3) /* PowerSDR differences */ -#define POWERSDR_FUNC_ALL (RIG_FUNC_VOX|RIG_FUNC_SQL|RIG_FUNC_NB|RIG_FUNC_ANF|RIG_FUNC_MUTE|RIG_FUNC_RIT|RIG_FUNC_XIT) +#define POWERSDR_FUNC_ALL (RIG_FUNC_VOX|RIG_FUNC_SQL|RIG_FUNC_NB|RIG_FUNC_ANF|RIG_FUNC_MUTE|RIG_FUNC_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER) #define POWERSDR_LEVEL_ALL (RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW|RIG_LEVEL_KEYSPD|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_MICGAIN|RIG_LEVEL_VOXGAIN|RIG_LEVEL_SQL|RIG_LEVEL_AF|RIG_LEVEL_AGC|RIG_LEVEL_RF|RIG_LEVEL_IF) @@ -941,6 +941,10 @@ int powersdr_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) snprintf(cmd, sizeof(cmd) - 1, "ZZSO%01d", status); break; + case RIG_FUNC_TUNER: + snprintf(cmd, sizeof(cmd) - 1, "ZZTU%01d", status); + break; + default: return kenwood_set_func(rig, vfo, func, status); } @@ -1140,7 +1144,7 @@ const struct rig_caps powersdr_caps = RIG_MODEL(RIG_MODEL_POWERSDR), .model_name = "PowerSDR/Thetis", .mfg_name = "FlexRadio/ANAN", - .version = "20201016.0", + .version = "20201108.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, commit 78b469d193e194798b8ba8699b905e4810849b81 Merge: 9a60e32d 0f171f6a Author: Michael Black <mdb...@ya...> Date: Sun Nov 8 07:31:38 2020 -0600 Merge pull request #435 from mikaelnousiainen/yaesu-ft991-and-ftdx5000-fixes Yaesu newcat backend fixes for multiple rigs commit 0f171f6aa6143659fc8eb129d932c2a6ba4624e2 Merge: 7b8b9655 9a60e32d Author: Mikael Nousiainen <mik...@ik...> Date: Sun Nov 8 15:00:32 2020 +0200 Merge branch 'master' into yaesu-ft991-and-ftdx5000-fixes commit 7b8b96555aa934c586c7e93ff6a4b9d4e03085a9 Author: Mikael Nousiainen <mik...@ik...> Date: Sun Nov 8 13:03:48 2020 +0200 Improve handling of the ? response for Yaesu rigs diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index e58f055a..24e76019 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2920,7 +2920,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) priv->cmd_str[2] = main_sub_vfo; } - // Some Yaesu rigs reject IF shift command in AM/FM modes + // Some Yaesu rigs reject this command in AM/FM modes priv->question_mark_response_means_rejected = 1; break; @@ -2983,6 +2983,9 @@ 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 + priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_METER: @@ -3189,6 +3192,8 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } } + // Some Yaesu rigs reject this command in AM/FM modes + priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_COMP: @@ -3623,9 +3628,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { priv->cmd_str[2] = main_sub_vfo; } - - // Some Yaesu rigs reject IF shift command in AM/FM modes - priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_CWPITCH: @@ -3901,9 +3903,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) err = newcat_get_cmd(rig); - // Clear flag after executing command - priv->question_mark_response_means_rejected = 0; - if (err != RIG_OK) { return err; @@ -4413,6 +4412,8 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) priv->cmd_str[2] = main_sub_vfo; } + // Some Yaesu rigs reject this command in AM/FM modes + priv->question_mark_response_means_rejected = 1; break; case RIG_FUNC_MN: @@ -4429,6 +4430,8 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) priv->cmd_str[2] = main_sub_vfo; } + // Some Yaesu rigs reject this command in AM/FM modes + priv->question_mark_response_means_rejected = 1; break; case RIG_FUNC_FBKIN: @@ -4533,6 +4536,8 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) priv->cmd_str[2] = main_sub_vfo; } + // Some Yaesu rigs reject this command in AM/FM modes + priv->question_mark_response_means_rejected = 1; break; case RIG_FUNC_COMP: @@ -4601,7 +4606,12 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) return -RIG_EINVAL; } - return newcat_set_cmd(rig); + err = newcat_set_cmd(rig); + + // Clear flag after executing command + priv->question_mark_response_means_rejected = 0; + + return err; } @@ -8363,18 +8373,25 @@ int newcat_get_cmd(RIG *rig) break; /* retry */ case '?': - if (priv->question_mark_response_means_rejected) - { - /* Some commands, like MR and MC return "?;" when choosing a channel that doesn't exist */ - rig_debug(RIG_DEBUG_ERR, "%s: Command rejected: '%s'\n", __func__, - priv->cmd_str); - return -RIG_ERJCTED; - } - - /* Rig busy wait please */ - rig_debug(RIG_DEBUG_ERR, "%s: Rig busy\n", __func__); - rc = -RIG_BUSBUSY; - break; /* retry read only */ + /* The ? response is ambiguous and undocumented by Yaesu, but for get commands it seems to + * indicate that the rig rejected the command because the state of the rig is not valid for the command + * or that the command parameter is invalid. Retrying the command does not fix the issue, + * as the error is caused by the an invalid combination of rig state. + * + * For example, the following cases have been observed: + * - MR and MC commands are rejected when referring to an _empty_ memory channel even + * if the channel number is in a valid range + * - BC (ANF) and RL (NR) commands fail in AM/FM modes, because they are + * supported only in SSB/CW/RTTY modes + * - MG (MICGAIN) command fails in RTTY mode, as it's a digital mode + * + * There are many more cases like these and they vary by rig model. + * + * So far, "rig busy" type situations with the ? response have not been observed for get commands. + */ + rig_debug(RIG_DEBUG_ERR, "%s: Command rejected by the rig: '%s'\n", __func__, + priv->cmd_str); + return -RIG_ERJCTED; } continue; @@ -8494,10 +8511,25 @@ int newcat_set_cmd(RIG *rig) break; /* retry */ case '?': + /* The ? response is ambiguous and undocumented by Yaesu. For set commands it seems to indicate: + * 1) either that the rig is busy and the command needs to be retried + * 2) or that the rig rejected the command because the state of the rig is not valid for the command + * or that the command parameter is invalid. Retrying the command does not fix the issue + * in this case, as the error is caused by the an invalid combination of rig state. + * The latter case is consistent with behaviour of get commands. + * + * For example, the following cases have been observed: + * - MR and MC commands are rejected when referring to an _empty_ memory channel even + * if the channel number is in a valid range + * - BC (ANF) and RL (NR) commands fail in AM/FM modes, because they are + * supported only in SSB/CW/RTTY modes + * - MG (MICGAIN) command fails in RTTY mode, as it's a digital mode + * + * There are many more cases like these and they vary by rig model. + */ if (priv->question_mark_response_means_rejected) { - /* Some commands, like MR and MC return "?;" when choosing a channel that doesn't exist */ - rig_debug(RIG_DEBUG_ERR, "%s: Command rejected: '%s'\n", __func__, + rig_debug(RIG_DEBUG_ERR, "%s: Command rejected by the rig: '%s'\n", __func__, priv->cmd_str); return -RIG_ERJCTED; } commit 8f3d5b5a850488b8aeed8deac9fe3dcc955bd022 Author: Mikael Nousiainen <mik...@ik...> Date: Sun Nov 8 00:15:48 2020 +0200 Allow AMN mode on FTDX 5000 and FTDX 3000 -- the rig seems to return it regardless of documentation diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index c630173f..e58f055a 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -6573,6 +6573,7 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) break; case RIG_MODE_AM: + case RIG_MODE_AMN: case RIG_MODE_FM: case RIG_MODE_PKTFM: case RIG_MODE_FMN: @@ -6591,8 +6592,10 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) switch (mode) { case RIG_MODE_AM: + case RIG_MODE_AMN: case RIG_MODE_FM: case RIG_MODE_PKTFM: + case RIG_MODE_FMN: if (width < rig_passband_normal(rig, mode)) { err = newcat_set_narrow(rig, vfo, TRUE); @@ -6602,9 +6605,6 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) err = newcat_set_narrow(rig, vfo, FALSE); } return err; - - case RIG_MODE_FMN: - return RIG_OK; } } // end is_ftdx1200 and is_ftdx3000 else if (is_ftdx5000) @@ -6680,6 +6680,7 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) break; case RIG_MODE_AM: + case RIG_MODE_AMN: case RIG_MODE_FM: case RIG_MODE_PKTFM: case RIG_MODE_FMN: @@ -6698,8 +6699,10 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) switch (mode) { case RIG_MODE_AM: + case RIG_MODE_AMN: case RIG_MODE_FM: case RIG_MODE_PKTFM: + case RIG_MODE_FMN: if (width < rig_passband_normal(rig, mode)) { err = newcat_set_narrow(rig, vfo, TRUE); @@ -6709,9 +6712,6 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) err = newcat_set_narrow(rig, vfo, FALSE); } return err; - - case RIG_MODE_FMN: - return RIG_OK; } } // end is_ftdx5000 else if (is_ftdx101) @@ -7661,6 +7661,10 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) *width = 9000; break; + case RIG_MODE_AMN: + *width = 6000; + break; + default: return -RIG_EINVAL; } /* end switch(mode) */ @@ -7801,6 +7805,10 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) *width = 9000; break; + case RIG_MODE_AMN: + *width = 6000; + break; + default: return -RIG_EINVAL; } /* end switch(mode) */ commit c10606ed4f79322fb1253ff2d6685ec96269864d Author: Mikael Nousiainen <mik...@ik...> Date: Sun Nov 8 00:09:41 2020 +0200 Combine filters on AM/AMN and FM/FMN modes as the narrow setting changes the mode too diff --git a/rigs/yaesu/ft3000.c b/rigs/yaesu/ft3000.c index 6172bd2b..32f24550 100644 --- a/rigs/yaesu/ft3000.c +++ b/rigs/yaesu/ft3000.c @@ -185,14 +185,13 @@ const struct rig_caps ftdx3000_caps = {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(1800)}, /* Normal CW, RTTY, PKT/USER */ {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(500)}, /* Narrow CW, RTTY, PKT/USER */ {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide CW, RTTY, PKT/USER */ - {RIG_MODE_SSB, Hz(2400)}, /* Normal SSB */ - {RIG_MODE_SSB, Hz(1800)}, /* Narrow SSB */ - {RIG_MODE_SSB, Hz(4000)}, /* Wide SSB */ - {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ - {RIG_MODE_AM, Hz(6000)}, /* Narrow AM */ - {FTDX5000_FM_WIDE_RX_MODES, Hz(16000)}, /* Normal FM */ - {FTDX5000_FM_WIDE_RX_MODES, Hz(9000)}, /* Narrow FM */ - {RIG_MODE_FMN, Hz(9000)}, /* Narrow FM */ + {RIG_MODE_SSB, Hz(2400)}, /* Normal SSB */ + {RIG_MODE_SSB, Hz(1800)}, /* Narrow SSB */ + {RIG_MODE_SSB, Hz(4000)}, /* Wide SSB */ + {FTDX5000_AM_RX_MODES, Hz(9000)}, /* Normal AM */ + {FTDX5000_AM_RX_MODES, Hz(6000)}, /* Narrow AM */ + {FTDX5000_FM_RX_MODES, Hz(16000)}, /* Normal FM */ + {FTDX5000_FM_RX_MODES, Hz(9000)}, /* Narrow FM */ {FTDX5000_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY}, RIG_FLT_END, diff --git a/rigs/yaesu/ft5000.c b/rigs/yaesu/ft5000.c index ca94e384..cfb13e23 100644 --- a/rigs/yaesu/ft5000.c +++ b/rigs/yaesu/ft5000.c @@ -183,11 +183,10 @@ const struct rig_caps ftdx5000_caps = {RIG_MODE_SSB, Hz(2400)}, /* Normal SSB */ {RIG_MODE_SSB, Hz(1800)}, /* Narrow SSB */ {RIG_MODE_SSB, Hz(4000)}, /* Wide SSB */ - {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ - {RIG_MODE_AM, Hz(6000)}, /* Narrow AM */ - {FTDX5000_FM_WIDE_RX_MODES, Hz(16000)}, /* Normal FM */ - {FTDX5000_FM_WIDE_RX_MODES, Hz(9000)}, /* Narrow FM */ - {RIG_MODE_FMN, Hz(9000)}, /* Narrow FM */ + {FTDX5000_AM_RX_MODES, Hz(9000)}, /* Normal AM */ + {FTDX5000_AM_RX_MODES, Hz(6000)}, /* Narrow AM */ + {FTDX5000_FM_RX_MODES, Hz(16000)}, /* Normal FM */ + {FTDX5000_FM_RX_MODES, Hz(9000)}, /* Narrow FM */ {FTDX5000_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY}, RIG_FLT_END, diff --git a/rigs/yaesu/ft5000.h b/rigs/yaesu/ft5000.h index 5dc021b1..7b045376 100644 --- a/rigs/yaesu/ft5000.h +++ b/rigs/yaesu/ft5000.h @@ -32,15 +32,14 @@ /* Receiver caps */ -#define FTDX5000_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|\ +#define FTDX5000_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) #define FTDX5000_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 FTDX5000_AM_RX_MODES (RIG_MODE_AM) -#define FTDX5000_FM_WIDE_RX_MODES (RIG_MODE_FM|RIG_MODE_PKTFM) -#define FTDX5000_FM_RX_MODES (FTDX5000_FM_WIDE_RX_MODES|RIG_MODE_FMN) +#define FTDX5000_AM_RX_MODES (RIG_MODE_AM|RIG_MODE_AMN) +#define FTDX5000_FM_RX_MODES (RIG_MODE_FM|RIG_MODE_PKTFM|RIG_MODE_FMN) #define FTDX5000_CW_RTTY_PKT_RX_MODES (RIG_MODE_RTTY|RIG_MODE_RTTYR|\ RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_CW|RIG_MODE_CWR) @@ -48,7 +47,7 @@ #define FTDX5000_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_RTTY| \ RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_FM|RIG_MODE_PKTFM|RIG_MODE_FMN) /* 100 W class */ -#define FTDX5000_AM_TX_MODES (RIG_MODE_AM) /* set 25W max */ +#define FTDX5000_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_AMN) /* set 25W max */ /* TBC */ #define FTDX5000_LEVELS (RIG_LEVEL_ATT|RIG_LEVEL_PREAMP|\ commit fdbc66b434a38a542cf8220c43dd1b3d1dddb846 Author: Mikael Nousiainen <mik...@ik...> Date: Sat Nov 7 23:46:09 2020 +0200 Fix roofing filter selection bug. Get mode for RX bandwidth from function argument. diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 4e0c2eb5..c630173f 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -6941,7 +6941,7 @@ 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) { struct newcat_priv_caps *priv_caps = (struct newcat_priv_caps *)rig->caps->priv; - int index = -1; + int index = 0; int i; rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__); @@ -6971,11 +6971,6 @@ static int set_roofing_filter_for_width(RIG *rig, vfo_t vfo, int width) index = current_filter->index; } - if (index < 0) - { - return -RIG_EINVAL; - } - return set_roofing_filter(rig, vfo, index); } @@ -7069,7 +7064,7 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) if (is_ft950 || is_ftdx5000) { // Some Yaesu rigs cannot query SH in modes such as AM/FM - switch (rig->state.current_mode) + switch (mode) { case RIG_MODE_FM: case RIG_MODE_FMN: commit d114a5e2d669dd8a6f4c2aebc961b585c45a5a3a Author: Mikael Nousiainen <mik...@ik...> Date: Sat Nov 7 23:30:34 2020 +0200 Do not query filter width using SH command with FTDX 5000 in AM/FM modes diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 7755bcf5..4e0c2eb5 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -7047,6 +7047,7 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv; int err; int w; + int sh_command_valid = 1; char narrow = '!'; char cmd[] = "SH"; char main_sub_vfo = '0'; @@ -7065,19 +7066,20 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) return err; } - if (is_ft950) + if (is_ft950 || is_ftdx5000) { - // can't query SH in some modes + // Some Yaesu rigs cannot query SH in modes such as AM/FM switch (rig->state.current_mode) { - case RIG_MODE_FM: *width = 16000; break; - - case RIG_MODE_AM: *width = 9000; break; - - case RIG_MODE_AMN: *width = 6000; break; + case RIG_MODE_FM: + case RIG_MODE_FMN: + case RIG_MODE_PKTFM: + case RIG_MODE_AM: + case RIG_MODE_AMN: + case RIG_MODE_PKTAM: + sh_command_valid = 0; + break; } - - return RIG_OK; } if (rig->caps->targetable_vfo & RIG_TARGETABLE_MODE) @@ -7085,45 +7087,53 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) main_sub_vfo = (RIG_VFO_B == vfo || RIG_VFO_SUB == vfo) ? '1' : '0'; } - snprintf(priv->cmd_str, sizeof(priv->cmd_str), "%s%c%c", cmd, main_sub_vfo, - cat_term); - - /* Get RX BANDWIDTH */ - if (RIG_OK != (err = newcat_get_cmd(rig))) + if (sh_command_valid) { - return err; - } + snprintf(priv->cmd_str, sizeof(priv->cmd_str), "%s%c%c", cmd, main_sub_vfo, + cat_term); - if (strlen(priv->ret_data) == 7) - { - if (sscanf(priv->ret_data, "SH%*1d0%3d", &w) != 1) + err = newcat_get_cmd(rig); + if (err != RIG_OK) { - err = -RIG_EPROTO; + return err; } - } - else if (strlen(priv->ret_data) == 6) - { - if (sscanf(priv->ret_data, "SH%*1d%3d", &w) != 1) + + if (strlen(priv->ret_data) == 7) + { + if (sscanf(priv->ret_data, "SH%*1d0%3d", &w) != 1) + { + err = -RIG_EPROTO; + } + } + else if (strlen(priv->ret_data) == 6) { - err = -RIG_EPROTO; + if (sscanf(priv->ret_data, "SH%*1d%3d", &w) != 1) + { + err = -RIG_EPROTO; + } } + else + { + rig_debug(RIG_DEBUG_ERR, "%s: unknown SH response='%s'\n", __func__, + priv->ret_data); + return -RIG_EPROTO; + } + + if (err != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: unable to parse width from '%s'\n", __func__, + priv->ret_data); + return -RIG_EPROTO; + } + + rig_debug(RIG_DEBUG_TRACE, "%s: w=%d\n", __func__, w); } else { - rig_debug(RIG_DEBUG_ERR, "%s: unknown SH response='%s'\n", __func__, - priv->ret_data); - return -RIG_EPROTO; - } - - if (err != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s: unable to parse width from '%s'\n", __func__, - priv->ret_data); - return -RIG_EPROTO; + // Some Yaesu rigs cannot query filter width using SH command in modes such as AM/FM + w = 0; } - rig_debug(RIG_DEBUG_TRACE, "%s: w=%d\n", __func__, w); - if (is_ft950) { if ((narrow = get_narrow(rig, RIG_VFO_MAIN)) < 0) commit b9815a41656d95649cda4d7df773f8a2d9983692 Author: Mikael Nousiainen <mik...@ik...> Date: Sat Nov 7 22:58:09 2020 +0200 Add RIG_FLT_ANY for FT-991 and FT-891 diff --git a/rigs/yaesu/ft891.c b/rigs/yaesu/ft891.c index 5c5eaaaa..3a73d4fb 100644 --- a/rigs/yaesu/ft891.c +++ b/rigs/yaesu/ft891.c @@ -172,6 +172,7 @@ const struct rig_caps ft891_caps = {RIG_MODE_SSB, Hz(600)}, /* SSB */ {RIG_MODE_SSB, Hz(400)}, /* SSB */ {RIG_MODE_SSB, Hz(200)}, /* SSB */ + {FT891_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY }, {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ {RIG_MODE_AM, Hz(6000)}, /* Narrow AM */ {FT891_FM_RX_MODES, Hz(16000)}, /* Normal FM */ diff --git a/rigs/yaesu/ft991.c b/rigs/yaesu/ft991.c index 7f2a1858..e643c025 100644 --- a/rigs/yaesu/ft991.c +++ b/rigs/yaesu/ft991.c @@ -163,6 +163,7 @@ const struct rig_caps ft991_caps = {RIG_MODE_SSB, Hz(600)}, /* SSB */ {RIG_MODE_SSB, Hz(400)}, /* SSB */ {RIG_MODE_SSB, Hz(200)}, /* SSB */ + {FT991_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY }, {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ {RIG_MODE_AMN, Hz(6000)}, /* Narrow AM */ {FT991_FM_WIDE_RX_MODES, Hz(16000)}, /* Normal FM */ commit 88cec8450cff870e981f53f632f3acf6839f2f1a Author: Mikael Nousiainen <mik...@ik...> Date: Sat Nov 7 19:47:08 2020 +0200 Handle Yaesu rigs rejecting IF shift command without retries diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 2bfc827c..7755bcf5 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2920,6 +2920,8 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) priv->cmd_str[2] = main_sub_vfo; } + // Some Yaesu rigs reject IF shift command in AM/FM modes + priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_CWPITCH: { @@ -3526,7 +3528,12 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) return -RIG_EINVAL; } - return newcat_set_cmd(rig); + err = newcat_set_cmd(rig); + + // Clear flag after executing command + priv->question_mark_response_means_rejected = 0; + + return err; } @@ -3616,6 +3623,9 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { priv->cmd_str[2] = main_sub_vfo; } + + // Some Yaesu rigs reject IF shift command in AM/FM modes + priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_CWPITCH: @@ -3889,7 +3899,12 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return -RIG_EINVAL; } - if (RIG_OK != (err = newcat_get_cmd(rig))) + err = newcat_get_cmd(rig); + + // Clear flag after executing command + priv->question_mark_response_means_rejected = 0; + + if (err != RIG_OK) { return err; } commit 7cbe39d5ab130eb38542332515a4573677e5ed10 Author: Mikael Nousiainen <mik...@ik...> Date: Sat Nov 7 15:03:54 2020 +0200 Add routines to convert between morse code dot duration and milliseconds. Implement Yaesu break-in delay level correctly using these conversion routines. diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 1e1ee9b9..2bfc827c 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -3208,96 +3208,94 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) snprintf(priv->cmd_str, sizeof(priv->cmd_str), "PL%03d%c", fpf, cat_term); break; - case RIG_LEVEL_BKINDL: + case RIG_LEVEL_BKINDL: { + int millis; + value_t keyspd; - /* Standard: word "PARIS" == 50 Unit Intervals, UIs */ - /* 1 dot == 2 UIs */ - /* tenth_dots-per-second -to- milliseconds */ if (!newcat_valid_command(rig, "SD")) { return -RIG_ENAVAIL; } - // we don't get full resolution as long as val->i is in integer tenths - // consider changing this to float or to milliseconds - val.i *= 100; // tenths to ms conversion - - if (is_ftdx101) + // Convert 10/ths of dots to milliseconds using the current key speed + err = newcat_get_level(rig, vfo, RIG_LEVEL_KEYSPD, &keyspd); + if (err != RIG_OK) { - if (val.i <= 30) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD00;"); } - - else if (val.i <= 50) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD01;"); } - - else if (val.i <= 100) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD02;"); } - - else if (val.i <= 150) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD03;"); } - - else if (val.i <= 200) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD04;"); } + return err; + } - else if (val.i <= 250) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD05;"); } + millis = dot10ths_to_millis(val.i, keyspd.i); - else if (val.i > 2900) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD33;"); } - // this covers 300-2900 06-32 - else { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%02d;", 6 + ((val.i - 300) / 100)); } + if (is_ftdx101) + { + 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;"); } + else if (millis <= 100) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD02;"); } + else if (millis <= 150) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD03;"); } + else if (millis <= 200) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD04;"); } + else if (millis <= 250) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD05;"); } + else if (millis > 2900) { snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD33;"); } + else + { + // This covers 300-2900 06-32 + snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%02d;", 6 + ((millis - 300) / 100)); + } } else if (is_ftdx5000) { - if (val.i < 20) + if (millis < 20) { - val.i = 20; + millis = 20; } - - if (val.i > 5000) + if (millis > 5000) { - val.i = 5000; + millis = 5000; } - snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", val.i, cat_term); + snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", millis, cat_term); } else if (is_ft950 || is_ft450 || is_ft891 || is_ft991 || is_ftdx1200 || is_ftdx3000) { - if (val.i < 30) + if (millis < 30) { - val.i = 30; + millis = 30; } - - if (val.i > 3000) + if (millis > 3000) { - val.i = 3000; + millis = 3000; } - snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", val.i, cat_term); + snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", millis, cat_term); } else if (is_ft2000 || is_ftdx9000) { - if (val.i < 0) + if (millis < 0) { - val.i = 0; + millis = 0; } - - if (val.i > 5000) + if (millis > 5000) { - val.i = 5000; + millis = 5000; } - snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", val.i, cat_term); + snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", millis, cat_term); } else // default { - if (val.i < 1) + if (millis < 1) { - val.i = 1; + millis = 1; } - - if (val.i > 5000) + if (millis > 5000) { - val.i = 5000; + millis = 5000; } - snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", val.i, cat_term); + snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%04d%c", millis, cat_term); } break; + } case RIG_LEVEL_SQL: if (!newcat_valid_command(rig, "SQ")) @@ -3711,7 +3709,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return -RIG_ENAVAIL; } - /* should be tenth of dots */ snprintf(priv->cmd_str, sizeof(priv->cmd_str), "SD%c", cat_term); break; @@ -4094,49 +4091,42 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->f = (float)atoi(retlvl) / scale; break; - case RIG_LEVEL_BKINDL: - val->i = atoi(retlvl); /* milliseconds */ + case RIG_LEVEL_BKINDL: { + int raw_value = atoi(retlvl); + int millis; + value_t keyspd; if (is_ftdx101) { - switch (val->i) + switch (raw_value) { - case 0: val->i = 1; break; - - case 1: val->i = 1; break; - - case 2: val->i = 1; break; - - case 3: val->i = 2; break; - - case 4: val->i = 2; break; - - case 5: val->i = 3; break; - - case 6: val->i = 3; break; - - default: val->i = (val->i - 6) + 3; + case 0: millis = 30; break; + case 1: millis = 50; break; + case 2: millis = 100; break; + case 3: millis = 150; break; + case 4: millis = 200; break; + case 5: millis = 250; break; + case 6: millis = 300; break; + default: + millis = (raw_value - 6) * 100 + 300; } - - return RIG_OK; } - - if (val->i < 1) + else { - val->i = 1; + // The rest of Yaesu rigs indicate break-in delay directly as milliseconds + millis = raw_value; } - // The rest of Yaesu rigs indicate break-in delay directly as milliseconds - // TODO: Fix BKINDL conversion from milliseconds ??? - val->i = 5000 / val->i; /* ms -to- tenth_dots-per-second */ - - if (val->i < 1) + // Convert milliseconds to 10/ths of dots using the current key speed + err = newcat_get_level(rig, vfo, RIG_LEVEL_KEYSPD, &keyspd); + if (err != RIG_OK) { - val->i = 1; + return err; } + val->i = millis_to_dot10ths(millis, keyspd.i); break; - + } case RIG_LEVEL_STRENGTH: if (rig->caps->str_cal.size > 0) { @@ -4149,17 +4139,27 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { val->i = round(rig_raw2val(atoi(retlvl), &yaesu_default_str_cal)); } - else // some Yaesu rigs return straight s-meter answers + else { + // Some Yaesu rigs return straight S-meter answers // Return dbS9 -- does >S9 mean 10dB increments? If not, add to rig driver - if (val->i > 0) { val->i = (atoi(retlvl) - 9) * 10; } - else { val->i = (atoi(retlvl) - 9) * 6; } // Return dbS9 does >S9 mean 10dB increments? + if (val->i > 0) + { + val->i = (atoi(retlvl) - 9) * 10; + } + else + { + val->i = (atoi(retlvl) - 9) * 6; + } } break; case RIG_LEVEL_RAWSTR: case RIG_LEVEL_KEYSPD: + val->i = atoi(retlvl); + break; + case RIG_LEVEL_IF: // IS00+0400 rig_debug(RIG_DEBUG_TRACE, "%s: ret_data=%s(%d), retlvl=%s\n", __func__, @@ -4183,9 +4183,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_NR: - - /* ratio 0 - 1.0 */ - if (newcat_is_rig(rig, RIG_MODEL_FT450)) + if (is_ft450) { val->f = (float)(atoi(retlvl) / 11.); } diff --git a/src/misc.c b/src/misc.c index b867c9f3..d4f5e681 100644 --- a/src/misc.c +++ b/src/misc.c @@ -49,6 +49,7 @@ #endif #include <unistd.h> +#include <math.h> #include <hamlib/rig.h> #include <hamlib/amplifier.h> @@ -230,6 +231,48 @@ unsigned long long HAMLIB_API from_bcd_be(const unsigned char bcd_data[], return f; } +/** + * \brief Convert duration of one morse code dot (element) to milliseconds at the given speed. + * \param wpm morse code speed in words per minute + * \return double duration in milliseconds + * + * The morse code speed is calculated using the standard based on word PARIS. + * + * "If you send PARIS 5 times in a minute (5WPM) you have sent 250 elements (using correct spacing). + * 250 elements into 60 seconds per minute = 240 milliseconds per element." + * + * Source: http://kent-engineers.com/codespeed.htm + */ +double morse_code_dot_to_millis(int wpm) +{ + return 240.0 * (5.0 / (double) wpm); +} + +/** + * \brief Convert duration of tenths of morse code dots to milliseconds at the given speed. + * \param tenths_of_dots number of 1/10ths of dots + * \param wpm morse code speed in words per minute + * \return int duration in milliseconds + * + * The morse code speed is calculated using the standard based on word PARIS. + */ +int dot10ths_to_millis(int dot10ths, int wpm) +{ + return ceil(morse_code_dot_to_millis(wpm) * (double) dot10ths / 10.0); +} + +/** + * \brief Convert duration in milliseconds to tenths of morse code dots at the given speed. + * \param millis duration in milliseconds + * \param wpm morse code speed in words per minute + * \return int number of 1/10ths of dots + * + * The morse code speed is calculated using the standard based on word PARIS. + */ +int millis_to_dot10ths(int millis, int wpm) +{ + return ceil(millis / morse_code_dot_to_millis(wpm) * 10.0); +} //! @cond Doxygen_Suppress #ifndef llabs diff --git a/src/misc.h b/src/misc.h index 5378f1da..de88ec68 100644 --- a/src/misc.h +++ b/src/misc.h @@ -72,6 +72,10 @@ extern HAMLIB_EXPORT(unsigned long long) from_bcd_be(const unsigned char bcd_data[], unsigned bcd_len); +extern HAMLIB_EXPORT(double) morse_code_dot_to_millis(int wpm); +extern HAMLIB_EXPORT(int) dot10ths_to_millis(int dot10ths, int wpm); +extern HAMLIB_EXPORT(int) millis_to_dot10ths(int millis, int wpm); + extern HAMLIB_EXPORT(int) sprintf_freq(char *str, freq_t); /* flag that determines if AI mode should be restored on exit on commit 9a60e32defa48603d42f79ca7c835ac2ae3ed64e Author: Michael Black W9MDB <mdb...@ya...> Date: Sat Nov 7 06:45:47 2020 -0600 Fix max macro in kenwood.c -- wasn't being used anyways diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 0565508d..473ff0b2 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -42,7 +42,7 @@ #include "ts990s.h" #ifndef max -#define max(a,b) (((a) (b)) ? (a) : (b)) +#define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif commit df5fb8d6c8501917f8cfe742c825a28f13e7cf44 Author: Mikael Nousiainen <mik...@ik...> Date: Fri Nov 6 23:48:49 2020 +0200 Set narrow filter mode correctly for Yaesu rigs that support it to allow setting DSP filter width correctly. Handle setting of roofing filter and narrow mode for AM/FM modes. diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index a5e1d658..1e1ee9b9 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -6179,6 +6179,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTYR: case RIG_MODE_CW: case RIG_MODE_CWR: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 500 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 100) { w = 3; } else if (width <= 200) { w = 4; } @@ -6195,6 +6202,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_LSB: case RIG_MODE_USB: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 1800 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 200) { w = 1; } else if (width <= 400) { w = 2; } @@ -6218,6 +6232,24 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else { w = 20; } // 3000 Hz break; + case RIG_MODE_AM: + case RIG_MODE_FM: + case RIG_MODE_PKTFM: + case RIG_MODE_FMN: + // Set roofing filter and narrow mode + break; + + default: + return -RIG_EINVAL; + } // end switch(mode) + + if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) + { + return err; + } + + switch (mode) + { case RIG_MODE_AM: case RIG_MODE_FM: case RIG_MODE_PKTFM: @@ -6232,15 +6264,7 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) return err; case RIG_MODE_FMN: - break; - - default: - return -RIG_EINVAL; - } // end switch(mode) - - if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) - { - return err; + return RIG_OK; } } // end is_ft950 */ else if (is_ft891) @@ -6253,6 +6277,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTYR: case RIG_MODE_CW: case RIG_MODE_CWR: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 500 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 50) { w = 1; } else if (width <= 100) { w = 2; } @@ -6275,6 +6306,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_LSB: case RIG_MODE_USB: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 1800 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 200) { w = 1; } else if (width <= 400) { w = 2; } @@ -6329,6 +6367,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTYR: case RIG_MODE_CW: case RIG_MODE_CWR: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 500 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 50) { w = 1; } else if (width <= 100) { w = 2; } @@ -6351,6 +6396,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_LSB: case RIG_MODE_USB: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 1800 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 200) { w = 1; } else if (width <= 400) { w = 2; } @@ -6444,6 +6496,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTYR: case RIG_MODE_CW: case RIG_MODE_CWR: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 500 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 50) { w = 1; } else if (width <= 100) { w = 2; } @@ -6465,6 +6524,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_LSB: case RIG_MODE_USB: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 1800 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 200) { w = 1; } else if (width <= 400) { w = 2; } @@ -6493,6 +6559,24 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else { w = 25; } // 4000 Hz break; + case RIG_MODE_AM: + case RIG_MODE_FM: + case RIG_MODE_PKTFM: + case RIG_MODE_FMN: + // Set roofing filter and narrow mode + break; + + default: + return -RIG_EINVAL; + } // end switch(mode) + + if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) + { + return err; + } + + switch (mode) + { case RIG_MODE_AM: case RIG_MODE_FM: case RIG_MODE_PKTFM: @@ -6506,13 +6590,8 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) } return err; - default: - return -RIG_EINVAL; - } // end switch(mode) - - if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) - { - return err; + case RIG_MODE_FMN: + return RIG_OK; } } // end is_ftdx1200 and is_ftdx3000 else if (is_ftdx5000) @@ -6525,6 +6604,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTYR: case RIG_MODE_CW: case RIG_MODE_CWR: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 500 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 50) { w = 1; } else if (width <= 100) { w = 2; } @@ -6546,6 +6632,13 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_LSB: case RIG_MODE_USB: + // Narrow mode must be chosen correctly before filter width + err = newcat_set_narrow(rig, vfo, width <= 1800 ? TRUE : FALSE); + if (err != RIG_OK) + { + return err; + } + if (width == RIG_PASSBAND_NORMAL) { w = 0; } else if (width <= 200) { w = 1; } else if (width <= 400) { w = 2; } @@ -6573,6 +6666,24 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else { w = 25; } // 4000 Hz break; + case RIG_MODE_AM: + case RIG_MODE_FM: + case RIG_MODE_PKTFM: + case RIG_MODE_FMN: + // Set roofing filter and narrow mode + break; + + default: + return -RIG_EINVAL; + } // end switch(mode) + + if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) + { + return err; + } + + switch (mode) + { case RIG_MODE_AM: case RIG_MODE_FM: case RIG_MODE_PKTFM: @@ -6585,11 +6696,9 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) err = newcat_set_narrow(rig, vfo, FALSE); } return err; - } // end switch(mode) - if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) - { - return err; + case RIG_MODE_FMN: + return RIG_OK; } } // end is_ftdx5000 else if (is_ftdx101) @@ -6650,12 +6759,43 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else if (width <= 3500) { w = 22; } else { w = 23; } // 4000Hz break; + + case RIG_MODE_AM: + case RIG_MODE_AMN: + case RIG_MODE_FM: + case RIG_MODE_PKTFM: + case RIG_MODE_FMN: + // Set roofing filter and narrow mode + break; + + default: + return -RIG_EINVAL; } // end switch(mode) if ((err = set_roofing_filter_for_width(rig, vfo, width)) != RIG_OK) { return err; } + + switch (mode) + { + case RIG_MODE_AM: + case RIG_MODE_FM: + case RIG_MODE_PKTFM: + if (width < rig_passband_normal(rig, mode)) + { + err = newcat_set_narrow(rig, vfo, TRUE); + } + else + { + err = newcat_set_narrow(rig, vfo, FALSE); + } + return err; + + case RIG_MODE_AMN: + case RIG_MODE_FMN: + return RIG_OK; + } } // end is_ftdx101 else { @@ -6694,9 +6834,12 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) } return err; + case RIG_MODE_FMN: + return RIG_OK; + default: return -RIG_EINVAL; - } /* end switch(mode) */ + } /* end switch(mode) */ } /* end else */ commit 9033fc2e783ba0b1257528ed58037778a48710f0 Author: Mikael Nousiainen <mik...@ik...> Date: Fri Nov 6 11:02:36 2020 +0200 Fix default filter width diff --git a/rigs/yaesu/ft5000.c b/rigs/yaesu/ft5000.c index 885bc151..ca94e384 100644 --- a/rigs/yaesu/ft5000.c +++ b/rigs/yaesu/ft5000.c @@ -177,7 +177,7 @@ const struct rig_caps ftdx5000_caps = /* mode/filter list, .remember = order matters! */ .filters = { - {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(1800)}, /* Normal CW, RTTY, PKT/USER */ + {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(1700)}, /* Normal CW, RTTY, PKT/USER */ {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(500)}, /* Narrow CW, RTTY, PKT/USER */ {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide CW, RTTY, PKT/USER */ {RIG_MODE_SSB, Hz(2400)}, /* Normal SSB */ commit 526fb218522500e2764622302fef4d77c76ab03a Author: Mikael Nousiainen <mik...@ik...> Date: Fri Nov 6 10:35:21 2020 +0200 Add RX filter choices for FTDX 5000 and FTDX 3000. Go through the rest of the filter definitions and try to unify and fix any bugs. Add roofing filter support for FT-950 and FT-2000. diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 8a27d782..f0dbd038 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -495,7 +495,7 @@ typedef unsigned int vfo_t; * \brief Macro for bandpass to be set to normal * \def RIG_PASSBAND_NORMAL */ -#define RIG_PASSBAND_NORMAL s_Hz(0) // was 0 but collided with Yasue SH00; capability +#define RIG_PASSBAND_NORMAL s_Hz(0) // was 0 but collided with Yaesu SH00; capability /** * \brief Macro for bandpass to be left alone diff --git a/rigs/yaesu/ft1200.c b/rigs/yaesu/ft1200.c index dcaa1061..14dacd3f 100644 --- a/rigs/yaesu/ft1200.c +++ b/rigs/yaesu/ft1200.c @@ -174,12 +174,11 @@ const struct rig_caps ftdx1200_caps = {FTDX1200_FM_RX_MODES, kHz(1)}, /* Fast */ RIG_TS_END, - }, /* mode/filter list, .remember = order matters! */ .filters = { - {FTDX1200_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Normal CW, RTTY, PKT/USER */ + {FTDX1200_CW_RTTY_PKT_RX_MODES, Hz(1800)}, /* Normal CW, RTTY, PKT/USER */ {FTDX1200_CW_RTTY_PKT_RX_MODES, Hz(500)}, /* Narrow CW, RTTY, PKT/USER */ {FTDX1200_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide CW, RTTY, PKT/USER */ {RIG_MODE_SSB, Hz(2400)}, /* Normal SSB */ @@ -187,8 +186,10 @@ const struct rig_caps ftdx1200_caps = {RIG_MODE_SSB, Hz(4000)}, /* Wide SSB */ {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ {RIG_MODE_AM, Hz(6000)}, /* Narrow AM */ - {FTDX1200_FM_RX_MODES, Hz(12000)}, /* Normal FM */ - {FTDX1200_FM_RX_MODES, Hz(8000)}, /* Narrow FM */ + {FTDX1200_FM_WIDE_RX_MODES, Hz(16000)}, /* Normal FM */ + {FTDX1200_FM_WIDE_RX_MODES, Hz(9000)}, /* Narrow FM */ + {RIG_MODE_FMN, Hz(9000)}, /* Narrow FM */ + {FTDX1200_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY}, RIG_FLT_END, }, diff --git a/rigs/yaesu/ft1200.h b/rigs/yaesu/ft1200.h index 7910be05..88afd85d 100644 --- a/rigs/yaesu/ft1200.h +++ b/rigs/yaesu/ft1200.h @@ -34,12 +34,13 @@ /* Receiver caps */ #define FTDX1200_ALL_RX_MODES (RIG_MODE_AM|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_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_FM|RIG_MODE_FMN) #define FTDX1200_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 FTDX1200_AM_RX_MODES (RIG_MODE_AM) -#define FTDX1200_FM_RX_MODES (RIG_MODE_FM|RIG_MODE_PKTFM) +#define FTDX1200_FM_WIDE_RX_MODES (RIG_MODE_FM|RIG_MODE_PKTFM) +#define FTDX1200_FM_RX_MODES (FTDX1200_FM_WIDE_RX_MODES|RIG_MODE_FMN) #define FTDX1200_CW_RTTY_PKT_RX_MODES (RIG_MODE_RTTY|RIG_MODE_RTTYR|\ RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_CW|RIG_MODE_CWR) diff --git a/rigs/yaesu/ft2000.c b/rigs/yaesu/ft2000.c index 32521f45..af7a73d6 100644 --- a/rigs/yaesu/ft2000.c +++ b/rigs/yaesu/ft2000.c @@ -40,12 +40,49 @@ #include "idx_builtin.h" #include "tones.h" +const struct newcat_priv_caps ft2000_priv_caps = +{ + .roofing_filter_count = 7, + .roofing_filters = + { + // The index must match ext level combo index + { .index = 0, .set_value = '0', .get_value = 0, .width = 15000, .optional = 0 }, + { .index = 1, .set_value = '1', .get_value = '1', .width = 15000, .optional = 0 }, + { .index = 2, .set_value = '2', .get_value = '2', .width = 6000, .optional = 0 }, + { .index = 3, .set_value = '3', .get_value = '3', .width = 3000, .optional = 0 }, + { .index = 4, .set_value = 0, .get_value = '4', .width = 15000, .optional = 0 }, + { .index = 5, .set_value = 0, .get_value = '5', .width = 6000, .optional = 0 }, + { .index = 6, .set_value = 0, .get_value = '6', .width = 3000, .optional = 0 }, + } +}; + +const struct confparams ft2000_ext_levels[] = +{ + { + TOK_ROOFING_FILTER, + "ROOFINGFILTER", + "Roofing filter", + "Roofing filter", + NULL, + RIG_CONF_COMBO, + { .c = { .combostr = { + "AUTO", "15 kHz", "6 kHz", "3 kHz", + "AUTO - 15 kHz", "AUTO - 6 kHz", "AUTO - 3 kHz", + NULL } + } } + }, + { RIG_CONF_END, NULL, } +}; + +int ft2000_ext_tokens[] = +{ + TOK_ROOFING_FILTER, TOK_BACKEND_NONE +}; + + /* - * ft2000 rigs capabilities. - * Also this struct is READONLY! - * + * FT-2000 rig capabilities */ - const struct rig_caps ft2000_caps = { RIG_MODEL(RIG_MODEL_FT2000), @@ -140,7 +177,6 @@ const struct rig_caps ft2000_caps = {FT2000_FM_RX_MODES, kHz(1)}, /* Fast */ RIG_TS_END, - }, /* mode/filter list, .remember = order matters! */ @@ -159,7 +195,10 @@ const struct rig_caps ft2000_caps = RIG_FLT_END, }, - .priv = NULL, + .ext_tokens = ft2000_ext_tokens, + .extlevels = ft2000_ext_levels, + + .priv = &ft2000_priv_caps, .rig_init = newcat_init, .rig_cleanup = newcat_cleanup, @@ -209,5 +248,7 @@ const struct rig_caps ft2000_caps = .get_trn = newcat_get_trn, .set_channel = newcat_set_channel, .get_channel = newcat_get_channel, + .set_ext_level = newcat_set_ext_level, + .get_ext_level = newcat_get_ext_level, }; diff --git a/rigs/yaesu/ft3000.c b/rigs/yaesu/ft3000.c index fcfa6789..6172bd2b 100644 --- a/rigs/yaesu/ft3000.c +++ b/rigs/yaesu/ft3000.c @@ -178,7 +178,6 @@ const struct rig_caps ftdx3000_caps = {FTDX5000_FM_RX_MODES, kHz(1)}, /* Fast */ RIG_TS_END, - }, /* mode/filter list, .remember = order matters! */ @@ -188,11 +187,13 @@ const struct rig_caps ftdx3000_caps = {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide 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 */ + {RIG_MODE_SSB, Hz(4000)}, /* Wide SSB */ {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ {RIG_MODE_AM, Hz(6000)}, /* Narrow AM */ - {FTDX5000_FM_RX_MODES, Hz(15000)}, /* Normal FM */ - {FTDX5000_FM_RX_MODES, Hz(8000)}, /* Narrow FM */ + {FTDX5000_FM_WIDE_RX_MODES, Hz(16000)}, /* Normal FM */ + {FTDX5000_FM_WIDE_RX_MODES, Hz(9000)}, /* Narrow FM */ + {RIG_MODE_FMN, Hz(9000)}, /* Narrow FM */ + {FTDX5000_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY}, RIG_FLT_END, }, diff --git a/rigs/yaesu/ft5000.c b/rigs/yaesu/ft5000.c index d8d53cf1..885bc151 100644 --- a/rigs/yaesu/ft5000.c +++ b/rigs/yaesu/ft5000.c @@ -173,7 +173,6 @@ const struct rig_caps ftdx5000_caps = {FTDX5000_FM_RX_MODES, kHz(1)}, /* Fast */ RIG_TS_END, - }, /* mode/filter list, .remember = order matters! */ @@ -183,11 +182,13 @@ const struct rig_caps ftdx5000_caps = {FTDX5000_CW_RTTY_PKT_RX_MODES, Hz(2400)}, /* Wide 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 */ + {RIG_MODE_SSB, Hz(4000)}, /* Wide SSB */ {RIG_MODE_AM, Hz(9000)}, /* Normal AM */ {RIG_MODE_AM, Hz(6000)}, /* Narrow AM */ - {FTDX5000_FM_RX_MODES, Hz(15000)}, /* Normal FM */ - {FTDX5000_FM_RX_MODES, Hz(8000)}, /* Narrow FM */ + {FTDX5000_FM_WIDE_RX_MODES, Hz(16000)}, /* Normal FM */ + {FTDX5000_FM_WIDE_RX_MODES, Hz(9000)}, /* Narrow FM */ + {RIG_MODE_FMN, Hz(9000)}, /* Narrow FM */ + {FTDX5000_CW_RTTY_PKT_RX_MODES | RIG_MODE_SSB, RIG_FLT_ANY}, RIG_FLT_END, }, diff --git a/rigs/yaesu/ft5000.h b/rigs/yaesu/ft5000.h index 59f6c892..5dc021b1 100644 --- a/rigs/yaesu/ft5000.h +++ b/rigs/yaesu/ft5000.h @@ -39,7 +39,8 @@ #define FTDX5000_SSB_CW_RX_MODES (RI... [truncated message content] |