Hamlib/rigs/yaesu/ft980.h

461 wiersze
15 KiB
C

/*
* hamlib - (C) Stephane Fillod 2002, 2003 (fillods at users.sourceforge.net)
*
* ft980.h - (C) Mat Breton, 2020
*
* This shared library provides an API for communicating
* via serial interface to an FT-990 using the "CAT" interface
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/* This file is a bit of a hack at the moment, containing both public and private declarations
* ToDo: Fix this point later, but temporarily necessary to sort stuff out right now
*/
#ifndef _FT980_H
#define _FT980_H 1
/* Lets make the Linters Happy - remove later*/
#ifndef _RIG_H
#include "hamlib/rig.h"
#endif
#ifndef _YAESU_H
#include "yaesu.h"
#endif
#ifndef _BANDPLAN_H
#include "bandplan.h"
#endif
/* End of Happy Linter Section */
/*************************************************************************************
* Semi-Public prototypes: need to be placed before the caps construct
* HAMLIB API implementation
*/
static int ft980_init(RIG *rig);
static int ft980_cleanup(RIG *rig);
static int ft980_open(RIG *rig);
static int ft980_close(RIG *rig);
static int ft980_set_freq(RIG *rig, vfo_t vfo, freq_t freq);
static int ft980_get_freq(RIG *rig, vfo_t vfo, freq_t *freq);
static int ft980_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
static int ft980_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width);
static int ft980_set_mem(RIG *rig, vfo_t vfo, int ch);
static int ft980_get_mem(RIG *rig, vfo_t vfo, int *ch);
static int ft980_set_vfo(RIG *rig, vfo_t vfo);
static int ft980_get_vfo(RIG *rig, vfo_t *vfo);
#if 0
static int ft980_set_rit(RIG *rig, vfo_t vfo, shortfreq_t rit);
static int ft980_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *rit);
static int ft980_set_xit(RIG *rig, vfo_t vfo, shortfreq_t xit);
static int ft980_get_xit(RIG *rig, vfo_t vfo, shortfreq_t *xit);
static int ft980_set_split_vfo(RIG *rig, vfo_t vfo, split_t split,
vfo_t tx_vfo);
static int ft980_set_split_freq(RIG *rig, vfo_t vfo, freq_t freq);
static int ft980_set_split_mode(RIG *rig, vfo_t vfo, rmode_t mode,
pbwidth_t width);
static int ft980_set_rptr_shift(RIG *rig, vfo_t vfo, rptr_shift_t shift);
static int ft980_set_rptr_offs(RIG *rig, vfo_t vfo, shortfreq_t offs);
#endif
/*************************************************************************************
* Constants (enums and defines, w/ a couple typedefs thrown in)
*/
/* Handy constants */
#ifndef TRUE
#define TRUE 1
#endif
#define ON TRUE
#ifndef FALSE
#define FALSE 0
#endif
#define OFF FALSE
/* FT-980 Status Return Message Lengths */
#define FT980_ALL_STATUS_LENGTH 148
#define FT980_OTHER_STATUS_LENGTH 22
#define FT980_RPTRSPLT_STATUS_LENGTH 6
#define FT980_UPDN_STATUS_LENGTH 5
#define FT980_ONEBYTE_STATUS_LENGTH 1
/* FT-980 Timing Constants (for caps structure)*/
/* Serial write timing values, in mS */
#define FT980_WRITE_DELAY 80
/* Delay sequential fast writes */
#define FT980_POST_WRITE_DELAY 5
/* Serial write timing values, in mS */
#define FT980_PACING_INTERVAL 5
/* The following may be deprecated into rig.c cache with 4.1 release*/
#define FT980_CACHE_TIMEOUT 500
/* Rough safe value for default read timeout = # bytes x (xmit speed + pacing_interval) x safety factor
#define FT980_DEFAULT_READ_TIMEOUT FT980_ALL_DATA_LENGTH * ( 1.7 + FT980_PACING_INTERVAL) * 6
*/
#define FT980_DEFAULT_READ_TIMEOUT 2000
/* FT-980 Configuration Constants (for caps structure)*/
#define FT980_MODES (RIG_MODE_LSB|RIG_MODE_USB|RIG_MODE_CW|RIG_MODE_AM|RIG_MODE_RTTY|RIG_MODE_FM)
#define FT980_ANTS (RIG_ANT_1)
/* */
#define FT980_VFOS (RIG_VFO_CURR|RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM)
/* TODO: RIG_OP_TO_VFO|RIG_OP_FROM_VFO|RIG_OP_BAND_UP|RIG_OP_BAND_DOWN */
#define FT980_VFO_OPS (RIG_OP_NONE)
/* TODO: RIG_OP_TO_VFO|RIG_OP_FROM_VFO|RIG_OP_BAND_UP|RIG_OP_BAND_DOWN
#define FT890_VFO_OPS (RIG_OP_TO_VFO|RIG_OP_FROM_VFO|RIG_OP_CPY|RIG_OP_UP|RIG_OP_DOWN)
*/
/*
* ft980 rigs capabilities.
*
* Protocol is documented in FT 980 Technical Supplement, page 13.
*
*/
#define FT980_MEM_CAP { \
.freq = 1, \
.mode = 1, \
.width = 1, \
}
const struct rig_caps ft980_caps =
{
RIG_MODEL(RIG_MODEL_FT980),
.model_name = "FT-980",
.mfg_name = "Yaesu",
.version = "20200114.0",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
.ptt_type = RIG_PTT_SERIAL_RTS,
.dcd_type = RIG_DCD_NONE,
.port_type = RIG_PORT_SERIAL,
.serial_rate_min = 4800,
.serial_rate_max = 4800,
.serial_data_bits = 8,
.serial_stop_bits = 2,
.serial_parity = RIG_PARITY_NONE,
.serial_handshake = RIG_HANDSHAKE_NONE,
.write_delay = FT980_WRITE_DELAY,
.post_write_delay = FT980_POST_WRITE_DELAY,
.timeout = FT980_DEFAULT_READ_TIMEOUT,
.retry = 3,
.has_get_func = RIG_FUNC_NONE,
.has_set_func = RIG_FUNC_NONE,
.has_get_level = RIG_LEVEL_NONE,
.has_set_level = RIG_LEVEL_NONE,
.has_get_parm = RIG_PARM_NONE,
.has_set_parm = RIG_PARM_NONE,
.vfo_ops = FT980_VFO_OPS,
.preamp = { RIG_DBLST_END, },
.attenuator = { RIG_DBLST_END, },
.max_rit = Hz(10000),
.max_xit = Hz(10000),
.max_ifshift = Hz(1500),
.targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE,
.transceive = RIG_TRN_OFF,
.bank_qty = 0,
.chan_desc_sz = 0,
.chan_list = {
{1, 16, RIG_MTYPE_MEM, FT980_MEM_CAP},
},
.rx_range_list1 = {
{kHz(150), MHz(30) - 100, FT980_MODES, -1, -1, FT980_VFOS, FT980_ANTS},
RIG_FRNG_END,
},
.tx_range_list1 = {
FRQ_RNG_HF(1, RIG_MODE_SSB | RIG_MODE_CW, W(5), W(100), FT980_VFOS, FT980_ANTS),
FRQ_RNG_HF(1, RIG_MODE_FM | RIG_MODE_RTTY, W(2), W(50), FT980_VFOS, FT980_ANTS),
FRQ_RNG_HF(1, RIG_MODE_AM, W(2), W(25), FT980_VFOS, FT980_ANTS),
RIG_FRNG_END,
},
.rx_range_list2 = {
{kHz(150), MHz(30) - 100, FT980_MODES, -1, -1, FT980_VFOS, FT980_ANTS},
RIG_FRNG_END,
},
.tx_range_list2 = {
FRQ_RNG_HF(2, RIG_MODE_SSB | RIG_MODE_CW, W(5), W(100), FT980_VFOS, FT980_ANTS),
FRQ_RNG_HF(2, RIG_MODE_FM | RIG_MODE_RTTY, W(2), W(50), FT980_VFOS, FT980_ANTS),
FRQ_RNG_HF(2, RIG_MODE_AM, W(2), W(25), FT980_VFOS, FT980_ANTS),
RIG_FRNG_END,
},
.tuning_steps = {
{FT980_MODES, Hz(10)},
{FT980_MODES, kHz(5)},
{FT980_MODES, kHz(500)},
RIG_TS_END,
},
/* mode/filter list, remember: order matters! */
.filters = {
{RIG_MODE_SSB | RIG_MODE_CW | RIG_MODE_RTTY, kHz(2.5)},
{RIG_MODE_CW, Hz(300)},
{RIG_MODE_FM, kHz(12)},
{RIG_MODE_AM, kHz(5)},
{RIG_MODE_AM, kHz(3)},
RIG_FLT_END,
},
.rig_init = ft980_init,
.rig_cleanup = ft980_cleanup,
.rig_open = ft980_open,
.rig_close = ft980_close,
.set_freq = ft980_set_freq,
.get_freq = ft980_get_freq,
.set_mode = ft980_set_mode,
.get_mode = ft980_get_mode,
.set_mem = ft980_set_mem,
.get_mem = ft980_get_mem,
.get_vfo = ft980_get_vfo,
.set_vfo = ft980_set_vfo,
#ifdef XXREMOVEDXX
.set_split_vfo = ft980_set_split_vfo,
.set_split_freq = ft980_set_split_freq,
.set_split_mode = ft980_set_split_mode,
.set_rptr_shift = ft980_set_rptr_shift,
.set_rptr_offs = ft980_set_rptr_offs,
#endif
};
/* FT-980 Status Return Lengths (for memory structure)*/
#define FT980_ALL_STATUS_LENGTH 148
#define FT980_OTHER_STATUS_LENGTH 22
#define FT980_RPTRSPLT_STATUS_LENGTH 6
#define FT980_UPDN_STATUS_LENGTH 5
#define FT980_ONEBYTE_STATUS_LENGTH 1
/* Do not change the order of the memory structure */
typedef struct _ft980_memory_t
{
unsigned char mem_16[4];
unsigned char vfo_16;
unsigned char mode_16;
unsigned char mem_15[4];
unsigned char vfo_15;
unsigned char mode_15;
unsigned char mem_14[4];
unsigned char vfo_14;
unsigned char mode_14;
unsigned char mem_13[4];
unsigned char vfo_13;
unsigned char mode_13;
unsigned char mem_12[4];
unsigned char vfo_12;
unsigned char mode_12;
unsigned char mem_11[4];
unsigned char vfo_11;
unsigned char mode_11;
unsigned char mem_10[4];
unsigned char vfo_10;
unsigned char mode_10;
unsigned char mem_9[4];
unsigned char vfo_9;
unsigned char mode_9;
unsigned char mem_8[4];
unsigned char vfo_8;
unsigned char mode_8;
unsigned char mem_7[4];
unsigned char vfo_7;
unsigned char mode_7;
unsigned char mem_6[4];
unsigned char vfo_6;
unsigned char mode_6;
unsigned char mem_5[4];
unsigned char vfo_5;
unsigned char mode_5;
unsigned char mem_4[4];
unsigned char vfo_4;
unsigned char mode_4;
unsigned char mem_3[4];
unsigned char vfo_3;
unsigned char mode_3;
unsigned char mem_2[4];
unsigned char vfo_2;
unsigned char mode_2;
unsigned char mem_1[4];
unsigned char vfo_1;
unsigned char mode_1;
unsigned char clar_freq[4];
unsigned char gen_vfo_freq[4];
unsigned char ham_vfo_freq[4];
unsigned char vfo; /* ??? */
unsigned char mode; /* ??? */
unsigned char mem_shift_freq[4];
unsigned char mem_clar_freq[4];
unsigned char mem_vfo;
unsigned char mem_mode;
unsigned char ldb_flag;
unsigned char ext_ctl_flag;
unsigned char if_shift;
unsigned char rptr_split_code;
unsigned char fsk_shift;
unsigned char if_width;
unsigned char mem_shift_flag;
unsigned char clar_flag;
unsigned char tab_flag;
unsigned char freq_select_sws;
unsigned char offset_sw;
unsigned char mode_sw;
unsigned char mem_ch_sw;
unsigned char lower_tab_freq[4];
unsigned char upper_tab_freq[4];
unsigned char op_vfo;
unsigned char op_mode;
unsigned char op_freq[4];
unsigned char status_flag_bits;
} _ft980_memory_t;
/*
* Start of Return Status Code Defines
* These are the memory decode define (for the _ft980_memory_structure)
*/
/* status_flag_bits: STATUS FLAG BYTE BIT decode MASKS */
#define FT_980_STATUSFLAG_TXRX_MASK 0x01
#define FT_980_STATUSFLAG_SPLIT_MASK 0x08
#define FT_980_STATUSFLAG_VFO_MASK 0x20
#define FT_980_STATUSFLAG_UPDN_MASK 0X30
#define FT_980_STATUSFLAG_CLAR_MASK 0x40
/* op_vfo: VFO decode: Main, Gen, and 3 unused AUX */
#define FT980_VFO_HAM_SEL 0x80
#define FT980_VFO_GEN_SEL 0x00
#define FT980_VFO_AUX1_SEL 0x81
#define FT980_VFO_AUX2_SEL 0x82
#define FT980_VFO_AUX3_SEL 0x83
/* freq_select_sws: Frequency source decode, either a VFO, Mem, or Split */
#define FT980_FREQ_SRC_SW_VFO 0x00
#define FT980_FREQ_SRC_SW_MR 0x01
#define FT980_FREQ_SRC_SW_RXM 0x02
#define FT980_FREQ_SRC_SW_RXV 0x03
/* Clarifier Active Decode Masks */
#define FT980_CLAR_RX_FLAG 0x20
#define FT980_CLAR_TX_FLAG 0x40
/* FSK Shift Decode */
#define FT980_FSK_SHIFT_INT 0x00
#define FT980_FSK_SHIFT_425 0x40
#define FT980_FSK_SHIFT_850 0x80
#define FT980_FSK_SHIFT_170 0xC0
/* Repeater Split Codes */
/* TBD: Is this table even needed */
/*
* Start of Command Code Defines
*/
static const unsigned char cmd_OK[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x0B};
static const unsigned char cmd_ON_OFF[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x00};
/* Opcodes 00 to 0B */
enum ft980_native_cmd_e {
FT980_CMD_TOGGLE_EXT_CNTL = 0x00,
FT980_CMD_ALL_STATUS_CHECK = 0x01,
FT980_CMD_UP_10HZ = 0x02,
FT980_CMD_DN_10HZ = 0x03,
FT980_CMD_IF_WIDTH = 0x04,
FT980_CMD_IF_SHIFT = 0x05,
FT980_CMD_FSK_FREQ = 0x06,
FT980_CMD_RPTR_SPLIT_CODE = 0x07,
FT980_CMD_FREQ = 0x08,
FT980_CMD_LDB_SET = 0x09,
FT980_CMD_USER_PROG = 0x0A,
FT980_CMD0A_OK_SIGNAL = 0x0B
};
/* OpCode command 0x0A byte 3 sub-codes */
/* The first 16 subcodes 00-0F are to command the memory channel */
// Operating Mode Status
enum ft980_native_cmd0A_e {
FT980_CMD0A_MD_LSB = 0x10,
FT980_CMD0A_MD_USB = 0x11,
FT980_CMD0A_MD_CW = 0x12,
FT980_CMD0A_MD_CWN = 0x13,
FT980_CMD0A_MD_AM = 0x14,
FT980_CMD0A_MD_AMN = 0x15,
FT980_CMD0A_MD_RTTY = 0x16,
FT980_CMD0A_MD_FM = 0x17,
FT980_CMD0A_SHOW_OFFSET = 0x1B,
/* Frequency Source Select */
FT980_CMD0A_FREQ_SEL_RXM = 0x1C,
FT980_CMD0A_FREQ_SEL_RXV = 0x1D,
FT980_CMD0A_FREQ_SEL_MR = 0x1E,
FT980_CMD0A_FREQ_SEL_VFO = 0x1F,
/* VFO Select; Question ... how do you set AUX1,2,3? */
FT980_CMD0A_VFO_SEL_GEN = 0x21,
FT980_CMD0A_VFO_SEL_HAM = 0x22,
/* Set Tab to Current Operating Frequency */
FT980_CMD0A_SET_UPPER_TAB = 0x23,
FT980_CMD0A_SET_LOWER_TAB = 0x24,
FT980_CMD0A_TOGGLE_TABS = 0x25,
/* Clarifier Commands */
FT980_CMD0A_TOGGLE_TX_CLAR = 0x26,
FT980_CMD0A_TOGGLE_RX_CLAR = 0x27,
/* Memory Commands */
FT980_CMD0A_MEM_SHIFT = 0x28,
FT980_CMD0A_MEM_WRITE = 0x29,
/* More Frequency Skips */
FT980_CMD0A_UP_100Hz = 0x18,
FT980_CMD0A_DN_100Hz = 0x20,
FT980_CMD0A_UP_5KHz = 0x2C,
FT980_CMD0A_DN_5KHz = 0x2B,
FT980_CMD0A_BANDUP = 0x2F,
FT980_CMD0A_BANDOWN = 0x2D
/* Missing 0A Sub-op-codes: 19,1A,2A,2E, after 2F */
};
/* End of OpCode command 0x0A byte 3 sub-codes */
/*************************************************************************************
* Macro Definitions
*/
#define UPDATE_DATA_OFS(p, o) (((unsigned char*)((p)+1))-(o))
#endif /* _FT980_H */