From ad4536d022a92e89987bc48630d79fb888b1b10a Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Sun, 7 Oct 2018 08:11:30 -0500 Subject: [PATCH] Fix icmarine duplicate read --- icmarine/icm802.c | 4 +-- icmarine/icmarine.c | 83 +++++++++++++++++++++++++++++++++------------ icmarine/icmarine.h | 2 +- 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/icmarine/icm802.c b/icmarine/icm802.c index 56b914ea8..391c11f34 100644 --- a/icmarine/icm802.c +++ b/icmarine/icm802.c @@ -58,9 +58,9 @@ const struct rig_caps icm802_caps = { .rig_model = RIG_MODEL_IC_M802, .model_name = "IC-M802", .mfg_name = "Icom", -.version = BACKEND_VER, +.version = BACKEND_VER".1", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, +.status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/icmarine/icmarine.c b/icmarine/icmarine.c index 0d20d3a15..969265df7 100644 --- a/icmarine/icmarine.c +++ b/icmarine/icmarine.c @@ -220,14 +220,14 @@ int icmarine_transaction(RIG *rig, const char *cmd, const char *param, char *res int cmd_len = 0; unsigned csum = 0; + rig_debug(RIG_DEBUG_TRACE, "%s: cmd='%s', param=%s\n",__FUNCTION__,cmd,param); + rs = &rig->state; priv = (struct icmarine_priv_data *)rs->priv; serial_flush(&rs->rigport); /* command formating */ - cmdbuf[BUFSZ]='\0'; - cmd_len = snprintf(cmdbuf, BUFSZ, "$PICOA,%02u,%02u,%s", CONTROLLER_ID, priv->remote_id, @@ -258,8 +258,6 @@ int icmarine_transaction(RIG *rig, const char *cmd, const char *param, char *res if (retval < OFFSET_CMD+5) return -RIG_EPROTO; - respbuf[retval] = 0; - /* check response */ if (memcmp(respbuf, "$PICOA,", strlen("$PICOA,"))) return -RIG_EPROTO; @@ -274,20 +272,22 @@ int icmarine_transaction(RIG *rig, const char *cmd, const char *param, char *res return -RIG_ERJCTED; } - /* So this is a query */ - retval = read_string(&rs->rigport, respbuf, BUFSZ, LF, strlen(LF)); - if (retval < 0) - return retval; - - /* strip *checksum and CR/LF from string */ - respbuf[retval-5] = 0; - - p = strchr(respbuf+OFFSET_CMD, ','); + /* strip from *checksum and after */ + char *strip = strrchr(respbuf,'*'); + if (strip) { + *strip = 0; + } + else { + rig_debug(RIG_DEBUG_ERR, "%s: checksum not in response? response='%s'\n",__FUNCTION__,respbuf); + return -RIG_EPROTO; + } + p = strrchr(respbuf, ','); if (p) strncpy(response, p+1, BUFSZ); else return -RIG_EPROTO; + rig_debug(RIG_DEBUG_VERBOSE, "%s: returning response='%s'\n", __FUNCTION__,response); return RIG_OK; } @@ -297,6 +297,8 @@ int icmarine_set_freq(RIG *rig, vfo_t vfo, freq_t freq) char freqbuf[BUFSZ]; struct icmarine_priv_data *priv; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + priv = (struct icmarine_priv_data*)rig->state.priv; sprintf(freqbuf, "%.6f", freq/MHz(1)); @@ -318,6 +320,8 @@ int icmarine_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) char freqbuf[BUFSZ] = ""; double d; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + retval = icmarine_transaction (rig, CMD_RXFREQ, NULL, freqbuf); if (retval != RIG_OK) return retval; @@ -325,8 +329,10 @@ int icmarine_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (freqbuf[0] == '\0') { *freq = 0; } else { - if (sscanf(freqbuf, "%lf", &d) != 1) + if (sscanf(freqbuf, "%lf", &d) != 1) { + rig_debug(RIG_DEBUG_ERR,"%s: sscanf('%s') failed\n",__FUNCTION__,freqbuf); return -RIG_EPROTO; + } *freq = (freq_t)(d*MHz(1)); } @@ -338,6 +344,8 @@ int icmarine_set_tx_freq(RIG *rig, vfo_t vfo, freq_t freq) { char freqbuf[BUFSZ]; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + sprintf(freqbuf, "%.6f", freq/MHz(1)); return icmarine_transaction (rig, CMD_TXFREQ, freqbuf, NULL); @@ -349,6 +357,8 @@ int icmarine_get_tx_freq(RIG *rig, vfo_t vfo, freq_t *freq) char freqbuf[BUFSZ] = ""; double d; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + retval = icmarine_transaction (rig, CMD_TXFREQ, NULL, freqbuf); if (retval != RIG_OK) return retval; @@ -369,8 +379,9 @@ int icmarine_set_split_vfo(RIG *rig, vfo_t rx_vfo, split_t split, vfo_t tx_vfo) { struct icmarine_priv_data *priv; - priv = (struct icmarine_priv_data *)rig->state.priv; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + priv = (struct icmarine_priv_data *)rig->state.priv; /* when disabling split mode */ if (RIG_SPLIT_ON == priv->split && @@ -390,6 +401,8 @@ int icmarine_get_split_vfo(RIG *rig, vfo_t rx_vfo, split_t *split, vfo_t *tx_vfo { struct icmarine_priv_data *priv; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + priv = (struct icmarine_priv_data *)rig->state.priv; *split = priv->split; @@ -403,6 +416,8 @@ int icmarine_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { const char *pmode; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + switch (mode) { case RIG_MODE_CW: pmode = MD_CW; break; case RIG_MODE_USB: pmode = MD_USB; break; @@ -424,11 +439,12 @@ int icmarine_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) int retval; char modebuf[BUFSZ]; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + retval = icmarine_transaction (rig, CMD_MODE, NULL, modebuf); if (retval != RIG_OK) return retval; - if (!memcmp(modebuf, MD_LSB, strlen(MD_LSB))) *mode = RIG_MODE_LSB; else if (!memcmp(modebuf, MD_USB, strlen(MD_USB))) @@ -453,8 +469,15 @@ int icmarine_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) */ int icmarine_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) { - return icmarine_transaction (rig, CMD_PTT, + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + + int retval = icmarine_transaction (rig, CMD_PTT, ptt == RIG_PTT_ON ? "TX" : "RX", NULL); + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: transaction failed\n",__FUNCTION__); + return retval; + } + return RIG_OK; } int icmarine_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) @@ -462,17 +485,23 @@ int icmarine_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) char pttbuf[BUFSZ]; int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + retval = icmarine_transaction (rig, CMD_PTT, NULL, pttbuf); - if (retval != RIG_OK) + if (retval != RIG_OK) { + rig_debug(RIG_DEBUG_ERR, "%s: transaction failed\n",__FUNCTION__); return retval; + } - if (!strcmp(pttbuf, "TX")) + if (strncmp(pttbuf, "TX",2)==0) *ptt = RIG_PTT_ON; - else if (!strcmp(pttbuf, "RX")) + else if (strncmp(pttbuf, "RX",2)==0) *ptt = RIG_PTT_OFF; - else + else { + rig_debug(RIG_DEBUG_ERR, "%s: invalid pttbuf='%s'\n",__FUNCTION__,pttbuf); retval = -RIG_EPROTO; + } return retval; } @@ -482,6 +511,8 @@ int icmarine_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) char dcdbuf[BUFSZ]; int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + retval = icmarine_transaction (rig, CMD_SQLS, NULL, dcdbuf); if (retval != RIG_OK) @@ -499,6 +530,8 @@ int icmarine_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) int icmarine_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op) { + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + if (RIG_OP_TUNE != op && RIG_OP_NONE != op) return -RIG_EINVAL; @@ -510,6 +543,8 @@ int icmarine_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) { int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + switch(func) { case RIG_FUNC_NB: retval = icmarine_transaction (rig, CMD_NB, status ? "ON":"OFF", NULL); @@ -527,6 +562,8 @@ int icmarine_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) char funcbuf[BUFSZ]; int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + switch(func) { case RIG_FUNC_NB: retval = icmarine_transaction (rig, CMD_NB, NULL, funcbuf); @@ -547,6 +584,8 @@ int icmarine_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) char lvlbuf[BUFSZ]; int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + switch(level) { case RIG_LEVEL_AF: sprintf(lvlbuf, "%u", (unsigned)(val.f * 255)); @@ -580,6 +619,8 @@ int icmarine_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) char lvlbuf[BUFSZ]; int retval; + rig_debug(RIG_DEBUG_TRACE, "%s:\n",__FUNCTION__); + switch(level) { case RIG_LEVEL_RAWSTR: retval = icmarine_transaction (rig, CMD_SMETER, NULL, lvlbuf); diff --git a/icmarine/icmarine.h b/icmarine/icmarine.h index dd002a4d1..ca097eea8 100644 --- a/icmarine/icmarine.h +++ b/icmarine/icmarine.h @@ -30,7 +30,7 @@ #include #endif -#define BACKEND_VER "0.1" +#define BACKEND_VER "0.2" struct icmarine_priv_caps { unsigned char default_remote_id; /* the remote default equipment's ID */