Correct ts440 for an iflen of 38 chars

Bill reports his TS-440 returns 38 chars instead of the default 29.
This patch defines iflen of 38 for the ts440 backend and implements
necssary support in the ic10 backend.

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@3067 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.13
Nate Bargmann, N0NB 2011-03-07 23:36:41 +00:00
rodzic 4e31ac1e39
commit e6176ab20f
3 zmienionych plików z 73 dodań i 26 usunięć

Wyświetl plik

@ -30,6 +30,7 @@
#include <string.h> /* String function definitions */ #include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */ #include <unistd.h> /* UNIX standard function definitions */
#include <math.h> #include <math.h>
#include <ctype.h> /* character class tests */
#include "hamlib/rig.h" #include "hamlib/rig.h"
#include "serial.h" #include "serial.h"
@ -39,6 +40,34 @@
#include "kenwood.h" #include "kenwood.h"
#include "ic10.h" #include "ic10.h"
/****
* ic10_cmd_trim
* gobbles up additional spaces at the end of a line
*
****/
int ic10_cmd_trim (char *data, int data_len) {
int i;
rig_debug(RIG_DEBUG_TRACE, "%s: incoming data_len is '%d'\n",
__func__, data_len);
/* suck up additional spaces at end of the data buffer */
for (i=data_len; !isdigit(data[i-1]); i--) {
data_len = data_len-1;
rig_debug(RIG_DEBUG_TRACE,"%s: data['%d'] is '%c'\n",
__func__, i-1, data[i-1]);
rig_debug(RIG_DEBUG_TRACE,"%s: For i='%d' data_len is now '%d'\n",
__func__, i, data_len);
}
rig_debug(RIG_DEBUG_TRACE, "%s: finished loop.. i='%d' data_len='%d' data[i-1]='%c'\n",
__func__, i, data_len, data[i-1]);
return data_len;
}
/** /**
* ic10_transaction * ic10_transaction
* Assumes rig!=NULL rig->state!=NULL rig->caps!=NULL * Assumes rig!=NULL rig->state!=NULL rig->caps!=NULL
@ -134,7 +163,7 @@ int ic10_get_vfo(RIG *rig, vfo_t *vfo)
struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv; struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv;
char vfobuf[50]; char vfobuf[50];
unsigned char c; unsigned char c;
int retval; int retval, iflen;
/* query RX VFO */ /* query RX VFO */
@ -142,11 +171,13 @@ int ic10_get_vfo(RIG *rig, vfo_t *vfo)
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
/* trim extra spaces */
iflen = ic10_cmd_trim(vfobuf, priv->if_len);
/* IFggmmmkkkhhh snnnzrx yytdfcp */ /* IFggmmmkkkhhh snnnzrx yytdfcp */
/* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */ /* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */
c = vfobuf[priv->if_len - 3]; c = vfobuf[iflen - 3];
switch (c) { switch (c) {
case '0': *vfo = RIG_VFO_A; break; case '0': *vfo = RIG_VFO_A; break;
case '1': *vfo = RIG_VFO_B; break; case '1': *vfo = RIG_VFO_B; break;
@ -174,16 +205,19 @@ int ic10_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, vfo_t *txvfo)
{ {
struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv; struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv;
char infobuf[50]; char infobuf[50];
int retval; int retval, iflen;
retval = get_ic10_if (rig, infobuf); retval = get_ic10_if (rig, infobuf);
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
/* trim extra spaces */
iflen = ic10_cmd_trim(infobuf, priv->if_len);
/* IFggmmmkkkhhh snnnzrx yytdfcp */ /* IFggmmmkkkhhh snnnzrx yytdfcp */
/* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */ /* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */
*split = infobuf[priv->if_len-1] == '0' ? RIG_SPLIT_OFF : RIG_SPLIT_ON; *split = infobuf[iflen-1] == '0' ? RIG_SPLIT_OFF : RIG_SPLIT_ON;
return RIG_OK; return RIG_OK;
} }
@ -198,17 +232,20 @@ int ic10_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv; struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv;
char modebuf[50]; char modebuf[50];
unsigned char c; unsigned char c;
int retval; int retval, iflen;
/* query RX VFO */ /* query RX VFO */
retval = get_ic10_if (rig, modebuf); retval = get_ic10_if (rig, modebuf);
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
/* trim extra spaces */
iflen = ic10_cmd_trim(modebuf, priv->if_len);
/* IFggmmmkkkhhh snnnzrx yytdfcp */ /* IFggmmmkkkhhh snnnzrx yytdfcp */
/* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */ /* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */
c = modebuf[priv->if_len-4]; c = modebuf[iflen-4];
switch (c) { switch (c) {
case MD_CW : *mode = RIG_MODE_CW; break; case MD_CW : *mode = RIG_MODE_CW; break;
case MD_USB : *mode = RIG_MODE_USB; break; case MD_USB : *mode = RIG_MODE_USB; break;
@ -302,16 +339,16 @@ int ic10_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
tvfo=rig->state.current_vfo; tvfo=rig->state.current_vfo;
else else
tvfo=vfo; tvfo=vfo;
switch (tvfo) { switch (tvfo) {
case RIG_VFO_A: vfo_letter = 'A'; break; case RIG_VFO_A: vfo_letter = 'A'; break;
case RIG_VFO_B: vfo_letter = 'B'; break; case RIG_VFO_B: vfo_letter = 'B'; break;
default: default:
rig_debug(RIG_DEBUG_ERR,"%s: unsupported VFO %d\n", rig_debug(RIG_DEBUG_ERR,"%s: unsupported VFO %d\n",
__func__,vfo); __func__,vfo);
return -RIG_EINVAL; return -RIG_EINVAL;
} }
freq_len = sprintf(freqbuf,"F%c%011"PRIll";", vfo_letter, (int64_t)freq); freq_len = sprintf(freqbuf,"F%c%011"PRIll";", vfo_letter, (int64_t)freq);
retval = ic10_transaction (rig, freqbuf, freq_len, ackbuf, &ack_len); retval = ic10_transaction (rig, freqbuf, freq_len, ackbuf, &ack_len);
@ -370,16 +407,19 @@ int ic10_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt)
{ {
struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv; struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv;
char infobuf[50]; char infobuf[50];
int retval; int retval, iflen;
retval = get_ic10_if (rig, infobuf); retval = get_ic10_if (rig, infobuf);
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
/* trim extra spaces */
iflen = ic10_cmd_trim(infobuf, priv->if_len);
/* IFggmmmkkkhhh snnnzrx yytdfcp */ /* IFggmmmkkkhhh snnnzrx yytdfcp */
/* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */ /* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */
*ptt = infobuf[priv->if_len-5] == '0' ? RIG_PTT_OFF : RIG_PTT_ON; *ptt = infobuf[iflen-5] == '0' ? RIG_PTT_OFF : RIG_PTT_ON;
return RIG_OK; return RIG_OK;
} }
@ -403,7 +443,7 @@ int ic10_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt)
__func__,ptt); __func__,ptt);
return -RIG_EINVAL; return -RIG_EINVAL;
} }
ptt_len = sprintf(pttbuf,"%cX;", ptt_letter); ptt_len = sprintf(pttbuf,"%cX;", ptt_letter);
retval = ic10_transaction (rig, pttbuf, ptt_len, ackbuf, &ack_len); retval = ic10_transaction (rig, pttbuf, ptt_len, ackbuf, &ack_len);
@ -419,15 +459,18 @@ int ic10_get_mem(RIG *rig, vfo_t vfo, int *ch)
{ {
struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv; struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv;
char membuf[50]; char membuf[50];
int retval; int retval, iflen;
retval = get_ic10_if (rig, membuf); retval = get_ic10_if (rig, membuf);
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
/* trim extra spaces */
iflen = ic10_cmd_trim(membuf, priv->if_len);
/* IFggmmmkkkhhh snnnzrx yytdfcp */ /* IFggmmmkkkhhh snnnzrx yytdfcp */
/* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */ /* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */
membuf[priv->if_len-5] = '\0'; membuf[iflen-5] = '\0';
*ch = atoi(membuf+priv->if_len-7); *ch = atoi(membuf+priv->if_len-7);
return RIG_OK; return RIG_OK;
@ -444,7 +487,7 @@ int ic10_set_mem(RIG *rig, vfo_t vfo, int ch)
int mem_len, ack_len, retval; int mem_len, ack_len, retval;
mem_len = sprintf(membuf, "MC %02d;", ch); mem_len = sprintf(membuf, "MC %02d;", ch);
retval = ic10_transaction (rig, membuf, mem_len, ackbuf, &ack_len); retval = ic10_transaction (rig, membuf, mem_len, ackbuf, &ack_len);
return retval; return retval;
@ -658,7 +701,7 @@ int ic10_set_parm(RIG *rig, setting_t parm, value_t val)
__func__,parm); __func__,parm);
return -RIG_EINVAL; return -RIG_EINVAL;
} }
return RIG_OK; return RIG_OK;
} }
@ -678,7 +721,7 @@ int ic10_get_parm(RIG *rig, setting_t parm, value_t *val)
retval = ic10_transaction (rig, "CK1;", 4, lvlbuf, &lvl_len); retval = ic10_transaction (rig, "CK1;", 4, lvlbuf, &lvl_len);
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
/* "CK1hhmmss;"*/ /* "CK1hhmmss;"*/
if (lvl_len != 10) { if (lvl_len != 10) {
rig_debug(RIG_DEBUG_ERR,"%s: wrong answer len=%d\n", rig_debug(RIG_DEBUG_ERR,"%s: wrong answer len=%d\n",
@ -828,7 +871,7 @@ const char* ic10_get_info(RIG *rig)
{ {
char firmbuf[50]; char firmbuf[50];
int firm_len, retval; int firm_len, retval;
firm_len = 6; firm_len = 6;
retval = ic10_transaction (rig, "ID;", 3, firmbuf, &firm_len); retval = ic10_transaction (rig, "ID;", 3, firmbuf, &firm_len);
if (retval != RIG_OK) if (retval != RIG_OK)
@ -856,7 +899,7 @@ int ic10_decode_event (RIG *rig)
{ {
struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv; struct kenwood_priv_caps *priv = (struct kenwood_priv_caps *)rig->caps->priv;
char asyncbuf[128],c; char asyncbuf[128],c;
int retval,async_len=128; int retval,async_len=128, iflen;
vfo_t vfo; vfo_t vfo;
freq_t freq; freq_t freq;
rmode_t mode; rmode_t mode;
@ -880,10 +923,13 @@ int ic10_decode_event (RIG *rig)
return -RIG_ENIMPL; return -RIG_ENIMPL;
} }
/* trim extra spaces */
iflen = ic10_cmd_trim(asyncbuf, priv->if_len);
/* IFggmmmkkkhhh snnnzrx yytdfcp */ /* IFggmmmkkkhhh snnnzrx yytdfcp */
/* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */ /* IFggmmmkkkhhhxxxxxrrrrrssxcctmfcp */
c = asyncbuf[priv->if_len-3]; c = asyncbuf[iflen-3];
switch (c) { switch (c) {
case '0': vfo = RIG_VFO_A; break; case '0': vfo = RIG_VFO_A; break;
case '1': vfo = RIG_VFO_B; break; case '1': vfo = RIG_VFO_B; break;
@ -894,7 +940,7 @@ int ic10_decode_event (RIG *rig)
return -RIG_EPROTO; return -RIG_EPROTO;
} }
c = asyncbuf[priv->if_len-4]; c = asyncbuf[iflen-4];
switch (c) { switch (c) {
case MD_CW : mode = RIG_MODE_CW; break; case MD_CW : mode = RIG_MODE_CW; break;
case MD_USB : mode = RIG_MODE_USB; break; case MD_USB : mode = RIG_MODE_USB; break;
@ -909,11 +955,11 @@ int ic10_decode_event (RIG *rig)
return -RIG_EINVAL; return -RIG_EINVAL;
} }
ptt = asyncbuf[priv->if_len-5] == '0' ? RIG_PTT_OFF : RIG_PTT_ON; ptt = asyncbuf[iflen-5] == '0' ? RIG_PTT_OFF : RIG_PTT_ON;
asyncbuf[13] = '\0'; asyncbuf[13] = '\0';
sscanf(asyncbuf+2, "%011"SCNfreq, &freq); sscanf(asyncbuf+2, "%011"SCNfreq, &freq);
/* Callback execution */ /* Callback execution */
if (rig->callbacks.vfo_event) { if (rig->callbacks.vfo_event) {
rig->callbacks.vfo_event(rig, vfo, rig->callbacks.vfo_arg); rig->callbacks.vfo_event(rig, vfo, rig->callbacks.vfo_arg);

Wyświetl plik

@ -25,6 +25,7 @@
#define IC10_VER "0.6" #define IC10_VER "0.6"
int ic10_cmd_trim (char *data, int data_len);
int ic10_transaction (RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len); int ic10_transaction (RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len);
int ic10_set_vfo(RIG *rig, vfo_t vfo); int ic10_set_vfo(RIG *rig, vfo_t vfo);
int ic10_get_vfo(RIG *rig, vfo_t *vfo); int ic10_get_vfo(RIG *rig, vfo_t *vfo);

Wyświetl plik

@ -46,7 +46,7 @@
static struct kenwood_priv_caps ts440_priv_caps = { static struct kenwood_priv_caps ts440_priv_caps = {
.cmdtrm = EOM_KEN, .cmdtrm = EOM_KEN,
.if_len = 29, .if_len = 38,
}; };
/* /*
@ -76,8 +76,8 @@ const struct rig_caps ts440_caps = {
.serial_stop_bits = 2, .serial_stop_bits = 2,
.serial_parity = RIG_PARITY_NONE, .serial_parity = RIG_PARITY_NONE,
.serial_handshake = RIG_HANDSHAKE_HARDWARE, .serial_handshake = RIG_HANDSHAKE_HARDWARE,
.write_delay = 0, .write_delay = 20,
.post_write_delay = 0, .post_write_delay = 30,
.timeout = 200, .timeout = 200,
.retry = 3, .retry = 3,