Added ft847_send_priv_cmd(), converted some part of API

to use this. Added _set_mode to work now.
TODO: put _send_priv_cmd into yaesu.[ch] so ft747
can use also.
Turned on PTT also (stand back)..


git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@298 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.1.0
Frank Singleton, VK3FCS 2000-12-20 06:33:59 +00:00
rodzic ab3750173d
commit 7c74e25db9
1 zmienionych plików z 139 dodań i 67 usunięć

Wyświetl plik

@ -6,7 +6,7 @@
* via serial interface to an FT-847 using the "CAT" interface. * via serial interface to an FT-847 using the "CAT" interface.
* *
* *
* $Id: ft847.c,v 1.26 2000-12-18 05:17:45 javabear Exp $ * $Id: ft847.c,v 1.27 2000-12-20 06:33:59 javabear Exp $
* *
* *
* *
@ -32,6 +32,16 @@
* - create yaesu.h for common command structure etc.. * - create yaesu.h for common command structure etc..
*/ */
/*
* Notes on limitations in RIG control capabilities. These are
* related to the Yaesu's FT847 design, not my program :-)
*
* 1. Rig opcodes allow only 10Hz resolution.
* 2. Cannot select VFO
*
*
*
*/
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> /* Standard input/output definitions */ #include <stdio.h> /* Standard input/output definitions */
@ -50,6 +60,8 @@
/* prototypes */ /* prototypes */
static int ft847_send_priv_cmd(RIG *rig, unsigned char ci);
/* Native ft847 cmd set prototypes. These are READ ONLY as each */ /* Native ft847 cmd set prototypes. These are READ ONLY as each */
/* rig instance will copy from these and modify if required . */ /* rig instance will copy from these and modify if required . */
@ -145,27 +157,18 @@ static const ft847_cmd_set_t ncmd[] = {
* Receiver caps * Receiver caps
*/ */
#if 0
#define FT847_ALL_RX_MODES (RIG_MODE_AM| RIG_MODE_CW| RIG_MODE_USB| RIG_MODE_LSB| RIG_MODE_RTTY| RIG_MODE_FM| RIG_MODE_WFM| RIG_MODE_NFM| RIG_MODE_NAM| RIG_MODE_CWR)
#define FT847_SSB_CW_RX_MODES (RIG_MODE_CW| RIG_MODE_USB| RIG_MODE_LSB| RIG_MODE_NCW)
#define FT847_AM_FM_RX_MODES (RIG_MODE_AM| RIG_MODE_NAM |RIG_MODE_FM |RIG_MODE_NFM )
#else
#define FT847_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM) #define FT847_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM)
#define FT847_SSB_CW_RX_MODES (RIG_MODE_CW|RIG_MODE_USB|RIG_MODE_LSB) #define FT847_SSB_CW_RX_MODES (RIG_MODE_CW|RIG_MODE_USB|RIG_MODE_LSB)
#define FT847_AM_FM_RX_MODES (RIG_MODE_AM|RIG_MODE_FM) #define FT847_AM_FM_RX_MODES (RIG_MODE_AM|RIG_MODE_FM)
#endif
/* tx doesn't have WFM. /* tx doesn't have WFM.
* 100W in 160-6m (25 watts AM carrier) * 100W in 160-6m (25 watts AM carrier)
* 50W in 2m/70cm (12.5 watts AM carrier) * 50W in 2m/70cm (12.5 watts AM carrier)
*/ */
#if 0
#define FT847_OTHER_TX_MODES (RIG_MODE_AM| RIG_MODE_CW| RIG_MODE_USB| RIG_MODE_LSB| RIG_MODE_RTTY| RIG_MODE_FM| RIG_MODE_NFM| RIG_MODE_NAM| RIG_MODE_CWR)
#define FT847_AM_TX_MODES (RIG_MODE_AM| RIG_MODE_NAM)
#else
#define FT847_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM) #define FT847_OTHER_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM)
#define FT847_AM_TX_MODES (RIG_MODE_AM) #define FT847_AM_TX_MODES (RIG_MODE_AM)
#endif
#define FT847_FUNC_ALL (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN) /* fix */ #define FT847_FUNC_ALL (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN) /* fix */
@ -174,9 +177,11 @@ static const ft847_cmd_set_t ncmd[] = {
* Notice that some rigs share the same functions. * Notice that some rigs share the same functions.
* Also this struct is READONLY! * Also this struct is READONLY!
*/ */
const struct rig_caps ft847_caps = { const struct rig_caps ft847_caps = {
RIG_MODEL_FT847, "FT-847", "Yaesu", "0.1", RIG_STATUS_ALPHA, RIG_MODEL_FT847, "FT-847", "Yaesu", "0.1", RIG_STATUS_ALPHA,
RIG_TYPE_TRANSCEIVER,RIG_PTT_NONE, 4800, 57600, 8, 2, RIG_PARITY_NONE, RIG_TYPE_TRANSCEIVER,RIG_PTT_RIG, 4800, 57600, 8, 2, RIG_PARITY_NONE,
RIG_HANDSHAKE_NONE,FT847_WRITE_DELAY ,FT847_POST_WRITE_DELAY, 100, 0, FT847_FUNC_ALL, 0, 0, 78, RIG_TRN_OFF, RIG_HANDSHAKE_NONE,FT847_WRITE_DELAY ,FT847_POST_WRITE_DELAY, 100, 0, FT847_FUNC_ALL, 0, 0, 78, RIG_TRN_OFF,
{ {100000,76000000,FT847_ALL_RX_MODES,-1,-1}, /* rx range begin */ { {100000,76000000,FT847_ALL_RX_MODES,-1,-1}, /* rx range begin */
{108000000,174000000,FT847_ALL_RX_MODES,-1,-1}, {108000000,174000000,FT847_ALL_RX_MODES,-1,-1},
@ -276,12 +281,12 @@ int ft847_init(RIG *rig) {
rig_debug(RIG_DEBUG_VERBOSE,"ft847:ft847_init called \n"); rig_debug(RIG_DEBUG_VERBOSE,"ft847:ft847_init called \n");
/* /*
* Copy native cmd set to private cmd storage area * Copy complete native cmd set to private cmd storage area
*/ */
memcpy(p->pcs,ncmd,sizeof(ncmd)); memcpy(p->pcs,ncmd,sizeof(ncmd));
p->current_vfo = RIG_VFO_A; /* default to VFO_A */ p->current_vfo = RIG_VFO_MAIN; /* default to VFO_MAIN */
rig->state.priv = (void*)p; rig->state.priv = (void*)p;
return RIG_OK; return RIG_OK;
@ -301,6 +306,8 @@ int ft847_cleanup(RIG *rig) {
free(rig->state.priv); free(rig->state.priv);
rig->state.priv = NULL; rig->state.priv = NULL;
rig_debug(RIG_DEBUG_VERBOSE,"ft847:ft847_cleanup called \n");
return RIG_OK; return RIG_OK;
} }
@ -311,23 +318,12 @@ int ft847_cleanup(RIG *rig) {
*/ */
int ft847_open(RIG *rig) { int ft847_open(RIG *rig) {
struct rig_state *rig_s;
struct ft847_priv_data *p;
unsigned char *cmd; /* points to sequence to send */
unsigned char cmd_index; /* index of sequence to send */
if (!rig)
return -RIG_EINVAL;
p = (struct ft847_priv_data*)rig->state.priv;
rig_s = &rig->state;
/* Good time to set CAT ON */ /* Good time to set CAT ON */
cmd_index = FT_847_NATIVE_CAT_ON; rig_debug(RIG_DEBUG_VERBOSE,"ft847:ft847_open called \n");
cmd = (unsigned char *) p->pcs[cmd_index].nseq; /* get native sequence */
write_block(rig_s->fd, cmd, FT847_CMD_LENGTH, rig_s->write_delay, rig_s->post_write_delay); ft847_send_priv_cmd(rig,FT_847_NATIVE_CAT_ON);
return RIG_OK; return RIG_OK;
} }
@ -338,6 +334,24 @@ int ft847_open(RIG *rig) {
*/ */
int ft847_close(RIG *rig) { int ft847_close(RIG *rig) {
/* Good time to set CAT OFF */
rig_debug(RIG_DEBUG_VERBOSE,"ft847:ft847_close called \n");
ft847_send_priv_cmd(rig,FT_847_NATIVE_CAT_OFF);
return RIG_OK;
}
/*
* private helper function to send a private command
* sequence . Must only be complete sequences.
*
*/
static int ft847_send_priv_cmd(RIG *rig, unsigned char ci) {
struct rig_state *rig_s; struct rig_state *rig_s;
struct ft847_priv_data *p; struct ft847_priv_data *p;
unsigned char *cmd; /* points to sequence to send */ unsigned char *cmd; /* points to sequence to send */
@ -346,21 +360,28 @@ int ft847_close(RIG *rig) {
if (!rig) if (!rig)
return -RIG_EINVAL; return -RIG_EINVAL;
p = (struct ft847_priv_data*)rig->state.priv; p = (struct ft847_priv_data*)rig->state.priv;
rig_s = &rig->state; rig_s = &rig->state;
/* Good time to set CAT OFF */ cmd_index = ci; /* get command */
if (! p->pcs[cmd_index].ncomp) {
rig_debug(RIG_DEBUG_VERBOSE,"ft847: Attempt to send incomplete sequence \n");
return -RIG_EINVAL;
}
cmd_index = FT_847_NATIVE_CAT_OFF;
cmd = (unsigned char *) p->pcs[cmd_index].nseq; /* get native sequence */ cmd = (unsigned char *) p->pcs[cmd_index].nseq; /* get native sequence */
write_block(rig_s->fd, cmd, FT847_CMD_LENGTH, rig_s->write_delay, rig_s->post_write_delay); write_block(rig_s->fd, cmd, FT847_CMD_LENGTH, rig_s->write_delay, rig_s->post_write_delay);
return RIG_OK; return RIG_OK;
} }
/* /*
* Example of wrapping backend function inside frontend API * Set frequency to freq Hz. Note 10 Hz resolution -- YUK -- FS
* *
*/ */
@ -385,28 +406,18 @@ int ft847_set_freq(RIG *rig, vfo_t vfo, freq_t freq) {
* Copy native cmd freq_set to private cmd storage area * Copy native cmd freq_set to private cmd storage area
*/ */
/*
* TODO Is VFO_B = SAT_RX ? -- FS
*/
rig_debug(RIG_DEBUG_VERBOSE,"ft847: vfo =%i \n", vfo); rig_debug(RIG_DEBUG_VERBOSE,"ft847: vfo =%i \n", vfo);
switch(vfo) { switch(vfo) {
case RIG_VFO_A: case RIG_VFO_MAIN:
cmd_index = FT_847_NATIVE_CAT_SET_FREQ_MAIN; cmd_index = FT_847_NATIVE_CAT_SET_FREQ_MAIN;
break; break;
case RIG_VFO_B:
cmd_index = FT_847_NATIVE_CAT_SET_FREQ_SAT_RX_VFO;
break;
case RIG_VFO_CURR: case RIG_VFO_CURR:
switch(p->current_vfo) { /* what is my active VFO ? */ switch(p->current_vfo) { /* what is my active VFO ? */
case RIG_VFO_A: case RIG_VFO_MAIN:
cmd_index = FT_847_NATIVE_CAT_SET_FREQ_MAIN; cmd_index = FT_847_NATIVE_CAT_SET_FREQ_MAIN;
break; break;
case RIG_VFO_B:
cmd_index = FT_847_NATIVE_CAT_SET_FREQ_SAT_RX_VFO;
break;
default: default:
rig_debug(RIG_DEBUG_VERBOSE,"ft847: Unknown default VFO \n"); rig_debug(RIG_DEBUG_VERBOSE,"ft847: Unknown default VFO \n");
return -RIG_EINVAL; /* sorry, wrong current VFO */ return -RIG_EINVAL; /* sorry, wrong current VFO */
@ -435,8 +446,79 @@ int ft847_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) {
return -RIG_ENIMPL; return -RIG_ENIMPL;
} }
int ft847_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { int ft847_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) {
return -RIG_ENIMPL; unsigned char cmd_index; /* index of sequence to send */
/*
* translate mode from generic to ft847 specific
*/
rig_debug(RIG_DEBUG_VERBOSE,"ft847: generic mode = %x \n", mode);
switch(mode) {
case RIG_MODE_AM:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_AM;
break;
case RIG_MODE_CW:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_CW;
break;
case RIG_MODE_USB:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_USB;
break;
case RIG_MODE_LSB:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_LSB;
break;
case RIG_MODE_FM:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_FM;
break;
default:
return -RIG_EINVAL; /* sorry, wrong MODE */
}
/*
* Now set width
*/
switch(width) {
case RIG_PASSBAND_NORMAL: /* easy case , no change to native sequence */
ft847_send_priv_cmd(rig,cmd_index); /* TODO -- check return codes */
return RIG_OK; /* I am out of here .. */
case RIG_PASSBAND_WIDE:
return -RIG_EINVAL; /* sorry, WIDE WIDTH is not supported */
case RIG_PASSBAND_NARROW: /* must set narrow */
switch(mode) {
case RIG_MODE_AM:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_AMN;
break;
case RIG_MODE_FM:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_FMN;
break;
case RIG_MODE_CW:
cmd_index = FT_847_NATIVE_CAT_SET_MODE_MAIN_CWN;
break;
default:
return -RIG_EINVAL; /* sorry, wrong MODE/WIDTH combo */
}
break;
default:
return -RIG_EINVAL; /* sorry, wrong WIDTH requested */
}
/*
* Now send the command
*/
ft847_send_priv_cmd(rig,cmd_index);
return RIG_OK;
} }
int ft847_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { int ft847_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) {
@ -458,7 +540,7 @@ int ft847_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) {
* Try later -- FS * Try later -- FS
* *
* *
* Also, handle only VFO_A and VFO_B . Add SAT VFO's later. * Also, RIG can handle only VFO_MAIN . Add SAT VFO's later.
* *
*/ */
@ -478,21 +560,21 @@ int ft847_set_vfo(RIG *rig, vfo_t vfo) {
*/ */
switch(vfo) { switch(vfo) {
case RIG_VFO_A: case RIG_VFO_MAIN:
p->current_vfo = vfo; /* update active VFO */
break;
case RIG_VFO_B:
p->current_vfo = vfo; /* update active VFO */ p->current_vfo = vfo; /* update active VFO */
break; break;
default: default:
return -RIG_EINVAL; /* sorry, wrong VFO */ return -RIG_EINVAL; /* sorry, wrong VFO */
} }
return RIG_OK; return RIG_OK;
} }
int ft847_get_vfo(RIG *rig, vfo_t *vfo) { int ft847_get_vfo(RIG *rig, vfo_t *vfo) {
return -RIG_ENIMPL; return -RIG_ENIMPL;
} }
@ -505,20 +587,9 @@ int ft847_get_vfo(RIG *rig, vfo_t *vfo) {
int ft847_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) { int ft847_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) {
struct rig_state *rig_s;
struct ft847_priv_data *p;
unsigned char *cmd; /* points to sequence to send */
unsigned char cmd_index; /* index of sequence to send */ unsigned char cmd_index; /* index of sequence to send */
if (!rig) rig_debug(RIG_DEBUG_VERBOSE,"ft847:ft847_set_ptt called \n");
return -RIG_EINVAL;
p = (struct ft847_priv_data*)rig->state.priv;
rig_s = &rig->state;
/*
* TODO : check for errors -- FS
*/
switch(ptt) { switch(ptt) {
case RIG_PTT_ON: case RIG_PTT_ON:
@ -535,8 +606,7 @@ int ft847_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) {
* phew! now send cmd to rig * phew! now send cmd to rig
*/ */
cmd = (unsigned char *) p->pcs[cmd_index].nseq; /* get native sequence */ ft847_send_priv_cmd(rig,cmd_index);
write_block(rig_s->fd, cmd, FT847_CMD_LENGTH, rig_s->write_delay, rig_s->post_write_delay);
return RIG_OK; /* good */ return RIG_OK; /* good */
@ -548,6 +618,9 @@ int ft847_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) {
} }
#if 0
int ft847_set_freq_main_vfo_hz(RIG *rig, freq_t freq, rmode_t mode) { int ft847_set_freq_main_vfo_hz(RIG *rig, freq_t freq, rmode_t mode) {
struct ft847_priv_data *p; struct ft847_priv_data *p;
struct rig_state *rig_s; struct rig_state *rig_s;
@ -589,7 +662,6 @@ int ft847_set_freq_main_vfo_hz(RIG *rig, freq_t freq, rmode_t mode) {
#if 0
#define TRUE 1; #define TRUE 1;
#define FALSE 0; #define FALSE 0;