kopia lustrzana https://github.com/Hamlib/Hamlib
Patch from Dave, W1HKJ:
1. the FT-450 transceiver does not respond to the "VS;" command and responds with "?;" which is not a documented response. That appears to be the "what's that" response. So the new_cat code needs to recognize that and just keep on going. 2. the transceiver expects a full 8 digits when setting frequency. As originally written the transceiver would accept frequences >= 1000000 but reject all below that value. 3. Code for get_mode, set_mode, and set_ptt functions. 4. Rig status changed to RIG_STATUS_BETA. git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2420 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.8
rodzic
d84fe82d47
commit
96d58a3a34
|
@ -7,7 +7,7 @@
|
||||||
* via serial interface to an FT-450 using the "CAT" interface
|
* via serial interface to an FT-450 using the "CAT" interface
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* $Id: ft450.c,v 1.2 2008-09-22 21:30:29 fillods Exp $
|
* $Id: ft450.c,v 1.3 2008-10-25 14:37:19 fillods Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -49,9 +49,9 @@ const struct rig_caps ft450_caps = {
|
||||||
.rig_model = RIG_MODEL_FT450,
|
.rig_model = RIG_MODEL_FT450,
|
||||||
.model_name = "FT-450",
|
.model_name = "FT-450",
|
||||||
.mfg_name = "Yaesu",
|
.mfg_name = "Yaesu",
|
||||||
.version = "0.0.1",
|
.version = NEWCAT_VER ".0",
|
||||||
.copyright = "LGPL",
|
.copyright = "LGPL",
|
||||||
.status = RIG_STATUS_ALPHA,
|
.status = RIG_STATUS_BETA,
|
||||||
.rig_type = RIG_TYPE_TRANSCEIVER,
|
.rig_type = RIG_TYPE_TRANSCEIVER,
|
||||||
.ptt_type = RIG_PTT_RIG,
|
.ptt_type = RIG_PTT_RIG,
|
||||||
.dcd_type = RIG_DCD_NONE,
|
.dcd_type = RIG_DCD_NONE,
|
||||||
|
@ -87,7 +87,7 @@ const struct rig_caps ft450_caps = {
|
||||||
.chan_list = { RIG_CHAN_END, },
|
.chan_list = { RIG_CHAN_END, },
|
||||||
|
|
||||||
.rx_range_list1 = {
|
.rx_range_list1 = {
|
||||||
{kHz(30), MHz(56), FT450_ALL_RX_MODES, -1, -1, FT450_VFO_ALL, FT450_ANTS}, /* General coverage + ham */
|
{kHz(30), MHz(60), FT450_ALL_RX_MODES, -1, -1, FT450_VFO_ALL, FT450_ANTS}, /* General coverage + ham */
|
||||||
RIG_FRNG_END,
|
RIG_FRNG_END,
|
||||||
}, /* FIXME: Are these the correct Region 1 values? */
|
}, /* FIXME: Are these the correct Region 1 values? */
|
||||||
|
|
||||||
|
@ -149,11 +149,11 @@ const struct rig_caps ft450_caps = {
|
||||||
|
|
||||||
.set_freq = newcat_set_freq,
|
.set_freq = newcat_set_freq,
|
||||||
.get_freq = newcat_get_freq,
|
.get_freq = newcat_get_freq,
|
||||||
// .set_mode = newcat_set_mode,
|
.set_mode = newcat_set_mode,
|
||||||
// .get_mode = newcat_get_mode,
|
.get_mode = newcat_get_mode,
|
||||||
.set_vfo = newcat_set_vfo,
|
.set_vfo = newcat_set_vfo,
|
||||||
.get_vfo = newcat_get_vfo,
|
.get_vfo = newcat_get_vfo,
|
||||||
// .set_ptt = newcat_set_ptt,
|
.set_ptt = newcat_set_ptt,
|
||||||
// .get_ptt = newcat_get_ptt,
|
// .get_ptt = newcat_get_ptt,
|
||||||
// .set_split_vfo = newcat_set_split_vfo,
|
// .set_split_vfo = newcat_set_split_vfo,
|
||||||
// .get_split_vfo = newcat_get_split_vfo,
|
// .get_split_vfo = newcat_get_split_vfo,
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* via serial interface to an FT-950 using the "CAT" interface
|
* via serial interface to an FT-950 using the "CAT" interface
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* $Id: ft950.c,v 1.1 2008-09-22 21:31:04 fillods Exp $
|
* $Id: ft950.c,v 1.2 2008-10-25 14:37:19 fillods Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -49,7 +49,7 @@ const struct rig_caps ft950_caps = {
|
||||||
.rig_model = RIG_MODEL_FT950,
|
.rig_model = RIG_MODEL_FT950,
|
||||||
.model_name = "FT-950",
|
.model_name = "FT-950",
|
||||||
.mfg_name = "Yaesu",
|
.mfg_name = "Yaesu",
|
||||||
.version = "0.0.1",
|
.version = NEWCAT_VER ".0",
|
||||||
.copyright = "LGPL",
|
.copyright = "LGPL",
|
||||||
.status = RIG_STATUS_ALPHA,
|
.status = RIG_STATUS_ALPHA,
|
||||||
.rig_type = RIG_TYPE_TRANSCEIVER,
|
.rig_type = RIG_TYPE_TRANSCEIVER,
|
||||||
|
@ -149,11 +149,11 @@ const struct rig_caps ft950_caps = {
|
||||||
|
|
||||||
.set_freq = newcat_set_freq,
|
.set_freq = newcat_set_freq,
|
||||||
.get_freq = newcat_get_freq,
|
.get_freq = newcat_get_freq,
|
||||||
// .set_mode = newcat_set_mode,
|
.set_mode = newcat_set_mode,
|
||||||
// .get_mode = newcat_get_mode,
|
.get_mode = newcat_get_mode,
|
||||||
.set_vfo = newcat_set_vfo,
|
.set_vfo = newcat_set_vfo,
|
||||||
.get_vfo = newcat_get_vfo,
|
.get_vfo = newcat_get_vfo,
|
||||||
// .set_ptt = newcat_set_ptt,
|
.set_ptt = newcat_set_ptt,
|
||||||
// .get_ptt = newcat_get_ptt,
|
// .get_ptt = newcat_get_ptt,
|
||||||
// .set_split_vfo = newcat_set_split_vfo,
|
// .set_split_vfo = newcat_set_split_vfo,
|
||||||
// .get_split_vfo = newcat_get_split_vfo,
|
// .get_split_vfo = newcat_get_split_vfo,
|
||||||
|
|
216
yaesu/newcat.c
216
yaesu/newcat.c
|
@ -12,7 +12,7 @@
|
||||||
* FT-950, FT-450. Much testing remains. -N0NB
|
* FT-950, FT-450. Much testing remains. -N0NB
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* $Id: newcat.c,v 1.4 2008-09-22 21:34:45 fillods Exp $
|
* $Id: newcat.c,v 1.5 2008-10-25 14:37:19 fillods Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -220,7 +220,10 @@ int newcat_init(RIG *rig) {
|
||||||
/* TODO: read pacing from preferences */
|
/* TODO: read pacing from preferences */
|
||||||
// priv->pacing = NEWCAT_PACING_DEFAULT_VALUE; /* set pacing to minimum for now */
|
// priv->pacing = NEWCAT_PACING_DEFAULT_VALUE; /* set pacing to minimum for now */
|
||||||
priv->read_update_delay = NEWCAT_DEFAULT_READ_TIMEOUT; /* set update timeout to safe value */
|
priv->read_update_delay = NEWCAT_DEFAULT_READ_TIMEOUT; /* set update timeout to safe value */
|
||||||
priv->current_vfo = RIG_VFO_MAIN; /* default to whatever */
|
|
||||||
|
// priv->current_vfo = RIG_VFO_MAIN; /* default to whatever */
|
||||||
|
priv->current_vfo = RIG_VFO_A;
|
||||||
|
|
||||||
rig->state.priv = (void *)priv;
|
rig->state.priv = (void *)priv;
|
||||||
|
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
|
@ -306,11 +309,10 @@ int newcat_close(RIG *rig) {
|
||||||
|
|
||||||
int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) {
|
int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) {
|
||||||
const struct rig_caps *caps;
|
const struct rig_caps *caps;
|
||||||
char command[3];
|
|
||||||
struct newcat_priv_data *priv;
|
struct newcat_priv_data *priv;
|
||||||
struct rig_state *state;
|
struct rig_state *state;
|
||||||
char c;
|
char c;
|
||||||
int err, len;
|
int err;
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
@ -353,18 +355,18 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) {
|
||||||
return -RIG_ENIMPL; /* Only VFO_A or VFO_B are valid */
|
return -RIG_ENIMPL; /* Only VFO_A or VFO_B are valid */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CAT command/terminator plus variable length frequency
|
// W1HKJ
|
||||||
* string length plus '\0' string terminator
|
// creation of the priv structure guarantees that the string can be NEWCAT_DATA_LEN
|
||||||
*/
|
// bytes in length. the snprintf will only allow (NEWCAT_DATA_LEN - 1) chars
|
||||||
len = snprintf(NULL, 0, "F%c%d%c", c, (int)freq, cat_term) + 1;
|
// followed by the NULL terminator.
|
||||||
if (len < 0)
|
// CAT command string for setting frequency requires that 8 digits be sent
|
||||||
return -RIG_EINTERNAL; /* bad news */
|
// including leading fill zeros
|
||||||
|
|
||||||
/* Build the command string */
|
snprintf(priv->cmd_str, sizeof(priv->cmd_str), "F%c%08d%c", c, (int)freq, cat_term);
|
||||||
snprintf(command, sizeof(command) - 1, "F%c", c);
|
#if 0
|
||||||
if (!newcat_valid_command(rig, command))
|
if (!newcat_valid_command(rig, command))
|
||||||
return RIG_ENAVAIL;
|
return RIG_ENAVAIL;
|
||||||
snprintf(priv->cmd_str, len, "%s%d%c", command, (int)freq, cat_term);
|
#endif
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_TRACE, "%s: cmd_str = %s\n", __func__, priv->cmd_str);
|
rig_debug(RIG_DEBUG_TRACE, "%s: cmd_str = %s\n", __func__, priv->cmd_str);
|
||||||
|
|
||||||
|
@ -464,10 +466,160 @@ int newcat_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
int newcat_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
|
||||||
int (*set_mode) (RIG * rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
|
{
|
||||||
int (*get_mode) (RIG * rig, vfo_t vfo, rmode_t * mode, pbwidth_t * width);
|
struct newcat_priv_data *priv;
|
||||||
#endif
|
struct rig_state *state;
|
||||||
|
int err;
|
||||||
|
char cmdstr[] = "MD0x;";
|
||||||
|
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!rig)
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
|
priv = (struct newcat_priv_data *)rig->state.priv;
|
||||||
|
state = &rig->state;
|
||||||
|
|
||||||
|
if (vfo != RIG_VFO_CURR)
|
||||||
|
return -RIG_ENTARGET;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE,"ft450: generic mode = %x \n", mode);
|
||||||
|
|
||||||
|
switch(mode) {
|
||||||
|
case RIG_MODE_LSB:
|
||||||
|
cmdstr[3] = '1';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_USB:
|
||||||
|
cmdstr[3] = '2';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_CW:
|
||||||
|
cmdstr[3] = '3';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_WFM:
|
||||||
|
cmdstr[3] = '4';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_AM:
|
||||||
|
cmdstr[3] = '5';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_RTTY:
|
||||||
|
cmdstr[3] = '6';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_CWR:
|
||||||
|
cmdstr[3] = '7';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_PKTLSB:
|
||||||
|
cmdstr[3] = '8';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_RTTYR:
|
||||||
|
cmdstr[3] = '9';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_FM:
|
||||||
|
cmdstr[3] = 'B';
|
||||||
|
break;
|
||||||
|
case RIG_MODE_PKTUSB:
|
||||||
|
cmdstr[3] = 'C';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = write_block(&state->rigport, cmdstr, strlen(cmdstr));
|
||||||
|
if (err != RIG_OK)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int newcat_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
|
||||||
|
{
|
||||||
|
struct newcat_priv_data *priv;
|
||||||
|
struct rig_state *state;
|
||||||
|
char c;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||||
|
|
||||||
|
if (!rig)
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
|
priv = (struct newcat_priv_data *)rig->state.priv;
|
||||||
|
state = &rig->state;
|
||||||
|
|
||||||
|
/* Build the command string */
|
||||||
|
snprintf(priv->cmd_str, sizeof(priv->cmd_str), "MD0;");
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: cmd_str = %s\n", __func__, priv->cmd_str);
|
||||||
|
|
||||||
|
/* Get VFO */
|
||||||
|
err = write_block(&state->rigport, priv->cmd_str, strlen(priv->cmd_str));
|
||||||
|
if (err != RIG_OK)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
err = read_string(&state->rigport, priv->ret_data, sizeof(priv->ret_data),
|
||||||
|
&cat_term, sizeof(cat_term));
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* Check that command termination is correct */
|
||||||
|
if (strchr(&cat_term, priv->ret_data[strlen(priv->ret_data) - 1]) == NULL) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: Command is not correctly terminated '%s'\n",
|
||||||
|
__func__, priv->ret_data);
|
||||||
|
|
||||||
|
return -RIG_EPROTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: read count = %d, ret_data = %s\n",
|
||||||
|
__func__, err, priv->ret_data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The current mode value is a digit '0' ... 'C'
|
||||||
|
* embedded at ret_data[3] in the read string.
|
||||||
|
*/
|
||||||
|
c = priv->ret_data[3];
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case '1':
|
||||||
|
*mode = RIG_MODE_LSB;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
*mode = RIG_MODE_USB;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
*mode = RIG_MODE_CW;
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
*mode = RIG_MODE_WFM;
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
*mode = RIG_MODE_AM;
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
*mode = RIG_MODE_RTTY;
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
*mode = RIG_MODE_CWR;
|
||||||
|
break;
|
||||||
|
case '8':
|
||||||
|
*mode = RIG_MODE_PKTLSB;
|
||||||
|
break;
|
||||||
|
case '9':
|
||||||
|
*mode = RIG_MODE_RTTYR;
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
*mode = RIG_MODE_FM;
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
*mode = RIG_MODE_PKTUSB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RIG_OK;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rig_set_vfo
|
* rig_set_vfo
|
||||||
|
@ -602,6 +754,13 @@ int newcat_get_vfo(RIG *rig, vfo_t *vfo) {
|
||||||
* The current VFO value is a digit ('0' or '1' ('A' or 'B' respectively))
|
* The current VFO value is a digit ('0' or '1' ('A' or 'B' respectively))
|
||||||
* embedded at ret_data[2] in the read string.
|
* embedded at ret_data[2] in the read string.
|
||||||
*/
|
*/
|
||||||
|
if (strcmp(priv->ret_data, "?;") == 0) {
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "Unrecognized command, setting VFO to A\n");
|
||||||
|
*vfo = RIG_VFO_A;
|
||||||
|
priv->current_vfo = RIG_VFO_A;
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
c = priv->ret_data[2];
|
c = priv->ret_data[2];
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
@ -646,11 +805,28 @@ int newcat_get_vfo(RIG *rig, vfo_t *vfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int newcat_set_ptt(RIG * rig, vfo_t vfo, ptt_t ptt)
|
int newcat_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt)
|
||||||
{
|
{
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
struct newcat_priv_data *priv;
|
||||||
|
struct rig_state *state;
|
||||||
|
int err;
|
||||||
|
char txon[] = "TX1;";
|
||||||
|
char txoff[] = "TX0;";
|
||||||
|
|
||||||
return RIG_ENAVAIL;
|
priv = (struct newcat_priv_data *)rig->state.priv;
|
||||||
|
state = &rig->state;
|
||||||
|
|
||||||
|
switch(ptt) {
|
||||||
|
case RIG_PTT_ON:
|
||||||
|
err = write_block(&state->rigport, txon, strlen(txon));
|
||||||
|
break;
|
||||||
|
case RIG_PTT_OFF:
|
||||||
|
err = write_block(&state->rigport, txoff, strlen(txoff));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* FT-950, FT-450. Much testing remains. -N0NB
|
* FT-950, FT-450. Much testing remains. -N0NB
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* $Id: newcat.h,v 1.4 2008-09-22 21:34:45 fillods Exp $
|
* $Id: newcat.h,v 1.5 2008-10-25 14:37:19 fillods Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
@ -49,6 +49,9 @@
|
||||||
|
|
||||||
typedef char ncboolean;
|
typedef char ncboolean;
|
||||||
|
|
||||||
|
/* shared function version */
|
||||||
|
#define NEWCAT_VER "0.1"
|
||||||
|
|
||||||
/* Hopefully large enough for future use, 128 chars plus '\0' */
|
/* Hopefully large enough for future use, 128 chars plus '\0' */
|
||||||
#define NEWCAT_DATA_LEN 129
|
#define NEWCAT_DATA_LEN 129
|
||||||
|
|
||||||
|
@ -94,4 +97,9 @@ int newcat_get_vfo(RIG *rig, vfo_t *vfo);
|
||||||
|
|
||||||
ncboolean newcat_valid_command(RIG *rig, char *command);
|
ncboolean newcat_valid_command(RIG *rig, char *command);
|
||||||
|
|
||||||
|
int newcat_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
|
||||||
|
int newcat_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width);
|
||||||
|
|
||||||
|
int newcat_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt);
|
||||||
|
|
||||||
#endif /* _NEWCAT_H */
|
#endif /* _NEWCAT_H */
|
||||||
|
|
Ładowanie…
Reference in New Issue