From 836d82f7b3956f8a22b061825f7faedc739a4b70 Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Fri, 16 Oct 2020 17:26:02 -0500 Subject: [PATCH] Add stop_morse to Icom rigs https://github.com/Hamlib/Hamlib/issues/240 (cherry picked from commit 28b7543de660c432b22d0035b250d32fb91797e4) --- rigs/icom/ic7100.c | 3 ++- rigs/icom/ic7300.c | 3 +++ rigs/icom/ic7410.c | 1 + rigs/icom/ic7610.c | 2 +- rigs/icom/ic7700.c | 3 ++- rigs/icom/ic7800.c | 3 ++- rigs/icom/ic785x.c | 3 ++- rigs/icom/icom.c | 33 +++++++++++++++++++++++++++++++++ rigs/icom/icom.h | 19 ++++++++++++------- 9 files changed, 58 insertions(+), 12 deletions(-) diff --git a/rigs/icom/ic7100.c b/rigs/icom/ic7100.c index 1f303f536..3fd0e0857 100644 --- a/rigs/icom/ic7100.c +++ b/rigs/icom/ic7100.c @@ -391,5 +391,6 @@ const struct rig_caps ic7100_caps = .get_split_mode = icom_get_split_mode, .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat, - .send_morse = icom_send_morse + .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse }; diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 18f65120b..7f3f86f7d 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -444,6 +444,7 @@ const struct rig_caps ic7300_caps = .power2mW = icom_power2mW, .mW2power = icom_mW2power, .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse, .send_voice_mem = icom_send_voice_mem }; @@ -689,6 +690,7 @@ const struct rig_caps ic9700_caps = .power2mW = icom_power2mW, .mW2power = icom_mW2power, .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse, .send_voice_mem = icom_send_voice_mem }; @@ -892,6 +894,7 @@ const struct rig_caps ic705_caps = .power2mW = icom_power2mW, .mW2power = icom_mW2power, .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse, .send_voice_mem = icom_send_voice_mem }; diff --git a/rigs/icom/ic7410.c b/rigs/icom/ic7410.c index be1942270..48ee78424 100644 --- a/rigs/icom/ic7410.c +++ b/rigs/icom/ic7410.c @@ -273,5 +273,6 @@ const struct rig_caps ic7410_caps = .set_split_vfo = icom_set_split_vfo, .get_split_vfo = icom_mem_get_split_vfo, .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse, }; diff --git a/rigs/icom/ic7610.c b/rigs/icom/ic7610.c index a121bbd3f..9a80a9d87 100644 --- a/rigs/icom/ic7610.c +++ b/rigs/icom/ic7610.c @@ -327,5 +327,5 @@ const struct rig_caps ic7610_caps = .get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat, - .send_morse = icom_send_morse + .stop_morse = icom_stop_morse }; diff --git a/rigs/icom/ic7700.c b/rigs/icom/ic7700.c index 03d2f7c88..20d801823 100644 --- a/rigs/icom/ic7700.c +++ b/rigs/icom/ic7700.c @@ -312,5 +312,6 @@ const struct rig_caps ic7700_caps = .get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat, - .send_morse = icom_send_morse + .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse }; diff --git a/rigs/icom/ic7800.c b/rigs/icom/ic7800.c index ef9b83ef9..268cd5685 100644 --- a/rigs/icom/ic7800.c +++ b/rigs/icom/ic7800.c @@ -315,7 +315,8 @@ const struct rig_caps ic7800_caps = .get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat, - .send_morse = icom_send_morse + .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse }; /* diff --git a/rigs/icom/ic785x.c b/rigs/icom/ic785x.c index 6f7fb9a39..fcfe6fd2a 100644 --- a/rigs/icom/ic785x.c +++ b/rigs/icom/ic785x.c @@ -321,7 +321,8 @@ const struct rig_caps ic785x_caps = .get_split_vfo = icom_get_split_vfo, .set_powerstat = icom_set_powerstat, .get_powerstat = icom_get_powerstat, - .send_morse = icom_send_morse + .send_morse = icom_send_morse, + .stop_morse = icom_stop_morse }; diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 9ad5e8d17..c709d9762 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -6798,6 +6798,39 @@ int icom_send_morse(RIG *rig, vfo_t vfo, const char *msg) return RIG_OK; } +/* + * icom_stop_morse + * Assumes rig!=NULL, msg!=NULL + */ +int icom_stop_morse(RIG *rig, vfo_t vfo) +{ + unsigned char ackbuf[MAXFRAMELEN]; + unsigned char cmd[MAXFRAMELEN]; + int ack_len = sizeof(ackbuf), retval; + int len; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + + cmd[0] = 0xff; + + retval = icom_transaction(rig, C_SND_CW, -1, (unsigned char *) cmd, 1, + ackbuf, &ack_len); + + if (retval != RIG_OK) + { + return retval; + } + + if (ack_len != 1 || ackbuf[0] != ACK) + { + rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, + ackbuf[0], ack_len); + return -RIG_ERJCTED; + } + + return RIG_OK; +} + int icom_power2mW(RIG *rig, unsigned int *mwpower, float power, freq_t freq, rmode_t mode) { diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 438f0b28e..0e27ae9f4 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -31,7 +31,7 @@ #include #endif -#define BACKEND_VER "20200912" +#define BACKEND_VER "20201016" /* * defines used by comp_cal_str in rig.c @@ -115,8 +115,10 @@ typedef enum CMD_PARAM_TYPE_FUNC, } cmd_param_t; -struct cmdparams { /* Lookup table item for levels & parms */ - union { +struct cmdparams /* Lookup table item for levels & parms */ +{ + union + { setting_t s; /* Level or parm */ token_t t; /* TOKEN_BACKEND */ } id; @@ -175,7 +177,8 @@ struct icom_priv_caps int offs_len; /* Number of bytes in offset frequency field. 0 defaults to 3 */ int serial_USB_echo_check; /* Flag to test USB echo state */ int agc_levels_present; /* Flag to indicate that agc_levels array is populated */ - struct icom_agc_level agc_levels[RIG_AGC_LAST + 1]; /* Icom rig-specific AGC levels, the last entry should have level -1 */ + struct icom_agc_level agc_levels[RIG_AGC_LAST + + 1]; /* Icom rig-specific AGC levels, the last entry should have level -1 */ struct cmdparams *extcmds; /* Pointer to extended operations array */ }; @@ -191,8 +194,8 @@ struct icom_priv_data int serial_USB_echo_off; /* USB is not set to echo */ /* we track vfos internally for use with different functions like split */ /* this allows queries using CURR_VFO and Main/Sub to behave */ - vfo_t rx_vfo; - vfo_t tx_vfo; + vfo_t rx_vfo; + vfo_t tx_vfo; freq_t curr_freq; // our current freq depending on which vfo is selected freq_t main_freq; // track last setting of main -- not being used yet freq_t sub_freq; // track last setting of sub -- not being used yet @@ -297,13 +300,15 @@ int icom_get_conf(RIG *rig, token_t token, char *val); int icom_set_powerstat(RIG *rig, powerstat_t status); int icom_get_powerstat(RIG *rig, powerstat_t *status); int icom_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option); -int icom_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, ant_t *ant_curr, ant_t *ant_tx, ant_t *ant_rx); +int icom_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, + ant_t *ant_curr, ant_t *ant_tx, ant_t *ant_rx); int icom_decode_event(RIG *rig); int icom_power2mW(RIG *rig, unsigned int *mwpower, float power, freq_t freq, rmode_t mode); int icom_mW2power(RIG *rig, float *power, unsigned int mwpower, freq_t freq, rmode_t mode); int icom_send_morse(RIG *rig, vfo_t vfo, const char *msg); +int icom_stop_morse(RIG *rig, vfo_t vfo); int icom_send_voice_mem(RIG *rig, vfo_t vfo, int bank); /* Exposed routines */ int icom_get_split_vfos(RIG *rig, vfo_t *rx_vfo, vfo_t *tx_vfo);