diff --git a/yaesu/ft757gx.c b/yaesu/ft757gx.c index 508a68638..7f42baa67 100644 --- a/yaesu/ft757gx.c +++ b/yaesu/ft757gx.c @@ -2,12 +2,14 @@ * hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com) * * ft757gx.c - (C) Stephane Fillod 2004 + * (C) Nate Bargmann 2008 + * * This shared library provides an API for communicating - * via serial interface to an FT-757GX using the "CAT" interface - * box (FIF-232C) or similar + * via serial interface to an FT-757GX/FT-757GXII using the + * "CAT" interface box (FIF-232C) or similar. * * - * $Id: ft757gx.c,v 1.4 2006-10-07 15:51:38 csete Exp $ + * $Id: ft757gx.c,v 1.5 2008-01-10 14:19:19 n0nb Exp $ * * * This library is free software; you can redistribute it and/or @@ -32,7 +34,7 @@ * * 1. Allow cached reads * 2. set_mem/get_mem, vfo_op, get_channel, set_split/get_split, - * set_func/get_func + * set_func/get_func * */ @@ -41,8 +43,8 @@ #endif #include -#include /* String function definitions */ -#include /* UNIX standard function definitions */ +#include /* String function definitions */ +#include /* UNIX standard function definitions */ #include "hamlib/rig.h" #include "serial.h" @@ -51,331 +53,267 @@ #include "ft757gx.h" -static int ft757_init(RIG *rig); -static int ft757_cleanup(RIG *rig); -static int ft757_open(RIG *rig); - -static int ft757_set_freq(RIG *rig, vfo_t vfo, freq_t freq); -static int ft757_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); - -static int ft757_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); /* select mode */ -static int ft757_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); /* get mode */ - -static int ft757_set_vfo(RIG *rig, vfo_t vfo); /* select vfo */ -static int ft757_get_vfo(RIG *rig, vfo_t *vfo); /* get vfo */ - -static int ft757_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt); -static int ft757_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); - - - /* Private helper function prototypes */ - static int ft757_get_update_data(RIG *rig); static int mode2rig(RIG *rig, rmode_t mode, pbwidth_t width); static int rig2mode(RIG *rig, int md, rmode_t *mode, pbwidth_t *width); -/* - * Some useful offsets in the status update map (offset) - * - * Status Update Chart, FT757GXII - */ -#define STATUS_CURR_FREQ 6 /* Operating Frequency */ -#define STATUS_CURR_MODE 10 -#define STATUS_VFOA_FREQ 11 -#define STATUS_VFOA_MODE 15 -#define STATUS_VFOB_FREQ 16 -#define STATUS_VFOB_MODE 20 - - -#define MODE_LSB 0x0 -#define MODE_USB 0x1 -#define MODE_CWW 0x2 -#define MODE_CWN 0x3 -#define MODE_AM 0x4 -#define MODE_FM 0x5 - -/* - * Receiver caps - */ - -#define FT757GX_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) - - -/* - * TX caps - */ - -#define FT757GX_ALL_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) - - /* * future - private data * */ - struct ft757_priv_data { - unsigned char pacing; /* pacing value */ - unsigned int read_update_delay; /* depends on pacing value */ - unsigned char current_vfo; /* active VFO from last cmd , can be either RIG_VFO_A or RIG_VFO_B only */ - unsigned char update_data[FT757GX_STATUS_UPDATE_DATA_LENGTH]; /* returned data */ + unsigned char pacing; /* pacing value */ + unsigned int read_update_delay; /* depends on pacing value */ + unsigned char current_vfo; /* active VFO from last cmd , can be either RIG_VFO_A or RIG_VFO_B only */ + unsigned char update_data[FT757GX_STATUS_UPDATE_DATA_LENGTH]; /* returned data */ }; /* - * ft757gx rigs capabilities. + * ft757gx rig capabilities. * Also this struct is READONLY! */ - const struct rig_caps ft757gx_caps = { - .rig_model = RIG_MODEL_FT757, - .model_name = "FT-757GX", - .mfg_name = "Yaesu", - .version = "0.3", - .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, - .rig_type = RIG_TYPE_MOBILE, - .ptt_type = RIG_PTT_NONE, - .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 = FT757GX_WRITE_DELAY, - .post_write_delay = FT757GX_POST_WRITE_DELAY, - .timeout = 2000, - .retry = 0, - .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, - .ctcss_list = NULL, - .dcs_list = NULL, - .preamp = { RIG_DBLST_END, }, - .attenuator = { RIG_DBLST_END, }, - .max_rit = Hz(9999), - .max_xit = Hz(0), - .max_ifshift = Hz(0), - .targetable_vfo = 0, - .transceive = RIG_TRN_OFF, - .bank_qty = 0, - .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END, }, /* FIXME: memory channel list:20 */ + .rig_model = RIG_MODEL_FT757, + .model_name = "FT-757GX", + .mfg_name = "Yaesu", + .version = "0.3.1", + .copyright = "LGPL", + .status = RIG_STATUS_ALPHA, + .rig_type = RIG_TYPE_MOBILE, + .ptt_type = RIG_PTT_NONE, + .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 = FT757GX_WRITE_DELAY, + .post_write_delay = FT757GX_POST_WRITE_DELAY, + .timeout = 2000, + .retry = 0, + .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, + .ctcss_list = NULL, + .dcs_list = NULL, + .preamp = { RIG_DBLST_END, }, + .attenuator = { RIG_DBLST_END, }, + .max_rit = Hz(9999), + .max_xit = Hz(0), + .max_ifshift = Hz(0), + .targetable_vfo = 0, + .transceive = RIG_TRN_OFF, + .bank_qty = 0, + .chan_desc_sz = 0, + .chan_list = { RIG_CHAN_END, }, /* FIXME: memory channel list:20 */ - .rx_range_list1 = { RIG_FRNG_END, }, /* FIXME: enter region 1 setting */ + .rx_range_list1 = { RIG_FRNG_END, }, /* FIXME: enter region 1 setting */ - .tx_range_list1 = { RIG_FRNG_END, }, + .tx_range_list1 = { RIG_FRNG_END, }, - .rx_range_list2 = { { .start = kHz(500), .end = 29999990, - .modes = FT757GX_ALL_RX_MODES,.low_power = -1,.high_power = -1}, - RIG_FRNG_END, }, /* rx range */ + .rx_range_list2 = { { .start = kHz(500), .end = 29999990, + .modes = FT757GX_ALL_RX_MODES,.low_power = -1,.high_power = -1}, + RIG_FRNG_END, }, /* rx range */ - .tx_range_list2 = { {kHz(1500),1999900,FT757GX_ALL_TX_MODES,.low_power = 5000,.high_power = 100000}, - - {.start = kHz(3500),3999900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = kHz(7000),7499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(10),10499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(14),14499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(18),18499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(21),21499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = kHz(24500),24999900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(28),29999900,FT757GX_ALL_TX_MODES,5000,100000}, - - RIG_FRNG_END, }, + .tx_range_list2 = { {kHz(1500),1999900,FT757GX_ALL_TX_MODES,.low_power = 5000,.high_power = 100000}, - - .tuning_steps = { - {FT757GX_ALL_RX_MODES,10}, - {FT757GX_ALL_RX_MODES,100}, - RIG_TS_END, - }, + {.start = kHz(3500),3999900,FT757GX_ALL_TX_MODES,5000,100000}, - /* mode/filter list, .remember = order matters! */ - .filters = { - RIG_FLT_END, - }, + {.start = kHz(7000),7499900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = MHz(10),10499900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = MHz(14),14499900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = MHz(18),18499900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = MHz(21),21499900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = kHz(24500),24999900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = MHz(28),29999900,FT757GX_ALL_TX_MODES,5000,100000}, + + RIG_FRNG_END, }, - .priv = NULL, /* private data */ + .tuning_steps = { + {FT757GX_ALL_RX_MODES,10}, + {FT757GX_ALL_RX_MODES,100}, + RIG_TS_END, + }, - .rig_init = ft757_init, - .rig_cleanup = ft757_cleanup, - .rig_open = ft757_open, /* port opened */ - .rig_close = NULL, /* port closed */ + /* mode/filter list, .remember = order matters! */ + .filters = { + RIG_FLT_END, + }, - .set_freq = ft757_set_freq, /* set freq */ - .get_freq = NULL, /* get freq */ - .set_mode = NULL, /* set mode */ - .get_mode = NULL, /* get mode */ - .set_vfo = ft757_set_vfo, /* set vfo */ - .get_vfo = NULL, /* get vfo */ - .set_ptt = NULL, /* set ptt */ - .get_ptt = NULL, /* get ptt */ + .priv = NULL, /* private data */ + + .rig_init = ft757_init, + .rig_cleanup = ft757_cleanup, + .rig_open = ft757_open, /* port opened */ + .rig_close = NULL, /* port closed */ + + .set_freq = ft757_set_freq, /* set freq */ + .get_freq = NULL, /* get freq */ + .set_mode = NULL, /* set mode */ + .get_mode = NULL, /* get mode */ + .set_vfo = ft757_set_vfo, /* set vfo */ + + .get_vfo = NULL, /* get vfo */ + .set_ptt = NULL, /* set ptt */ + .get_ptt = NULL, /* get ptt */ }; -/* TODO: get better measure numbers */ -#define FT757GXII_STR_CAL { 2, { \ - { 0, -60 }, /* S0 -6dB */ \ - { 15, 60 } /* +60 */ \ - } } - -#define FT757_MEM_CAP { \ - .freq = 1, \ - .mode = 1, \ - .width = 1 \ - } - +/* + * ft757gx2 rig capabilities. + * Also this struct is READONLY! + */ const struct rig_caps ft757gx2_caps = { - .rig_model = RIG_MODEL_FT757GXII, - .model_name = "FT-757GXII", - .mfg_name = "Yaesu", - .version = "0.2", - .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, - .rig_type = RIG_TYPE_MOBILE, - .ptt_type = RIG_PTT_SERIAL_DTR, /* pin4? */ - .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 = FT757GX_WRITE_DELAY, - .post_write_delay = FT757GX_POST_WRITE_DELAY, - .timeout = 2000, - .retry = 0, - .has_get_func = RIG_FUNC_LOCK, - .has_set_func = RIG_FUNC_LOCK, - .has_get_level = RIG_LEVEL_RAWSTR, - .has_set_level = RIG_LEVEL_NONE, - .has_get_parm = RIG_PARM_NONE, - .has_set_parm = RIG_PARM_NONE, - .vfo_ops = RIG_OP_CPY | RIG_OP_FROM_VFO | RIG_OP_TO_VFO | - RIG_OP_UP | RIG_OP_DOWN, - .ctcss_list = NULL, - .dcs_list = NULL, - .preamp = { RIG_DBLST_END, }, - .attenuator = { RIG_DBLST_END, }, - .max_rit = Hz(0), - .max_xit = Hz(0), - .max_ifshift = Hz(0), - .targetable_vfo = 0, - .transceive = RIG_TRN_OFF, - .bank_qty = 0, - .chan_desc_sz = 0, - .chan_list = { - { 0, 9, RIG_MTYPE_MEM, FT757_MEM_CAP }, - RIG_CHAN_END - }, + .rig_model = RIG_MODEL_FT757GXII, + .model_name = "FT-757GXII", + .mfg_name = "Yaesu", + .version = "0.2.1", + .copyright = "LGPL", + .status = RIG_STATUS_ALPHA, + .rig_type = RIG_TYPE_MOBILE, + .ptt_type = RIG_PTT_SERIAL_DTR, /* pin4? */ + .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 = FT757GX_WRITE_DELAY, + .post_write_delay = FT757GX_POST_WRITE_DELAY, + .timeout = 2000, + .retry = 0, + .has_get_func = RIG_FUNC_LOCK, + .has_set_func = RIG_FUNC_LOCK, + .has_get_level = RIG_LEVEL_RAWSTR, + .has_set_level = RIG_LEVEL_NONE, + .has_get_parm = RIG_PARM_NONE, + .has_set_parm = RIG_PARM_NONE, + .vfo_ops = RIG_OP_CPY | RIG_OP_FROM_VFO | RIG_OP_TO_VFO | + RIG_OP_UP | RIG_OP_DOWN, + .ctcss_list = NULL, + .dcs_list = NULL, + .preamp = { RIG_DBLST_END, }, + .attenuator = { RIG_DBLST_END, }, + .max_rit = Hz(0), + .max_xit = Hz(0), + .max_ifshift = Hz(0), + .targetable_vfo = 0, + .transceive = RIG_TRN_OFF, + .bank_qty = 0, + .chan_desc_sz = 0, + .chan_list = { + { 0, 9, RIG_MTYPE_MEM, FT757_MEM_CAP }, + RIG_CHAN_END + }, - .rx_range_list1 = { RIG_FRNG_END, }, /* FIXME: enter region 1 setting */ + .rx_range_list1 = { RIG_FRNG_END, }, /* FIXME: enter region 1 setting */ - .tx_range_list1 = { RIG_FRNG_END, }, + .tx_range_list1 = { RIG_FRNG_END, }, - .rx_range_list2 = { { .start = kHz(150), .end = 29999990, - .modes = FT757GX_ALL_RX_MODES,.low_power = -1,.high_power = -1}, - RIG_FRNG_END, }, /* rx range */ + .rx_range_list2 = { { .start = kHz(150), .end = 29999990, + .modes = FT757GX_ALL_RX_MODES,.low_power = -1,.high_power = -1}, + RIG_FRNG_END, }, /* rx range */ - /* FIXME: 10m is "less" and AM is 25W carrier */ - .tx_range_list2 = { {kHz(1500),1999900,FT757GX_ALL_TX_MODES,.low_power = 5000,.high_power = 100000}, - - {.start = kHz(3500),3999900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = kHz(7000),7499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(10),10499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(14),14499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(18),18499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(21),21499900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = kHz(24500),24999900,FT757GX_ALL_TX_MODES,5000,100000}, - - {.start = MHz(28),29999900,FT757GX_ALL_TX_MODES,5000,100000}, - - RIG_FRNG_END, }, + /* FIXME: 10m is "less" and AM is 25W carrier */ + .tx_range_list2 = { {kHz(1500),1999900,FT757GX_ALL_TX_MODES,.low_power = 5000,.high_power = 100000}, - - .tuning_steps = { - {FT757GX_ALL_RX_MODES,10}, - RIG_TS_END, - }, + {.start = kHz(3500),3999900,FT757GX_ALL_TX_MODES,5000,100000}, - /* mode/filter list, .remember = order matters! */ - .filters = { - {RIG_MODE_SSB|RIG_MODE_CW, kHz(2.7)}, - {RIG_MODE_CW, Hz(600)}, /* narrow */ - {RIG_MODE_AM, kHz(6)}, - {RIG_MODE_FM, kHz(15)}, + {.start = kHz(7000),7499900,FT757GX_ALL_TX_MODES,5000,100000}, - RIG_FLT_END, - }, + {.start = MHz(10),10499900,FT757GX_ALL_TX_MODES,5000,100000}, - .str_cal = FT757GXII_STR_CAL, + {.start = MHz(14),14499900,FT757GX_ALL_TX_MODES,5000,100000}, - .priv = NULL, /* private data */ + {.start = MHz(18),18499900,FT757GX_ALL_TX_MODES,5000,100000}, - .rig_init = ft757_init, - .rig_cleanup = ft757_cleanup, - .rig_open = ft757_open, /* port opened */ - .rig_close = NULL, /* port closed */ + {.start = MHz(21),21499900,FT757GX_ALL_TX_MODES,5000,100000}, - .set_freq = ft757_set_freq, /* set freq */ - .get_freq = ft757_get_freq, /* get freq */ - .set_mode = ft757_set_mode, /* set mode */ - .get_mode = ft757_get_mode, /* get mode */ - .set_vfo = ft757_set_vfo, /* set vfo */ - .get_vfo = ft757_get_vfo, /* get vfo */ - .get_level = ft757_get_level, - .get_ptt = ft757_get_ptt, /* get ptt */ + {.start = kHz(24500),24999900,FT757GX_ALL_TX_MODES,5000,100000}, + + {.start = MHz(28),29999900,FT757GX_ALL_TX_MODES,5000,100000}, + + RIG_FRNG_END, }, + + + .tuning_steps = { + {FT757GX_ALL_RX_MODES,10}, + RIG_TS_END, + }, + + /* mode/filter list, .remember = order matters! */ + .filters = { + {RIG_MODE_SSB|RIG_MODE_CW, kHz(2.7)}, + {RIG_MODE_CW, Hz(600)}, /* narrow */ + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_FM, kHz(15)}, + + RIG_FLT_END, + }, + + .str_cal = FT757GXII_STR_CAL, + + .priv = NULL, /* private data */ + + .rig_init = ft757_init, + .rig_cleanup = ft757_cleanup, + .rig_open = ft757_open, /* port opened */ + .rig_close = NULL, /* port closed */ + + .set_freq = ft757_set_freq, /* set freq */ + .get_freq = ft757_get_freq, /* get freq */ + .set_mode = ft757_set_mode, /* set mode */ + .get_mode = ft757_get_mode, /* get mode */ + .set_vfo = ft757_set_vfo, /* set vfo */ + .get_vfo = ft757_get_vfo, /* get vfo */ + .get_level = ft757_get_level, + .get_ptt = ft757_get_ptt, /* get ptt */ }; - /* * _init * */ +int ft757_init(RIG *rig) +{ + struct ft757_priv_data *p; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); -int ft757_init(RIG *rig) { - struct ft757_priv_data *p; + if (!rig) + return -RIG_EINVAL; - if (!rig) - return -RIG_EINVAL; + p = (struct ft757_priv_data *)malloc(sizeof(struct ft757_priv_data)); + if (!p) /* whoops! memory shortage! */ + return -RIG_ENOMEM; - p = (struct ft757_priv_data*)malloc(sizeof(struct ft757_priv_data)); - if (!p) /* whoops! memory shortage! */ - return -RIG_ENOMEM; - - rig_debug(RIG_DEBUG_VERBOSE,"%s called\n", __FUNCTION__); + /* TODO: read pacing from preferences */ - /* TODO: read pacing from preferences */ - - p->pacing = FT757GX_PACING_DEFAULT_VALUE; /* set pacing to minimum for now */ - p->read_update_delay = FT757GX_DEFAULT_READ_TIMEOUT; /* set update timeout to safe value */ - p->current_vfo = RIG_VFO_A; /* default to VFO_A ? */ - rig->state.priv = (void*)p; + p->pacing = FT757GX_PACING_DEFAULT_VALUE; /* set pacing to minimum for now */ + p->read_update_delay = FT757GX_DEFAULT_READ_TIMEOUT; /* set update timeout to safe value */ + p->current_vfo = RIG_VFO_A; /* default to VFO_A ? */ + rig->state.priv = (void *)p; - return RIG_OK; + return RIG_OK; } @@ -384,17 +322,18 @@ int ft757_init(RIG *rig) { * the serial port is closed by the frontend */ -int ft757_cleanup(RIG *rig) { - if (!rig) - return -RIG_EINVAL; - - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __FUNCTION__); +int ft757_cleanup(RIG *rig) +{ + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - if (rig->state.priv) - free(rig->state.priv); - rig->state.priv = NULL; + if (!rig) + return -RIG_EINVAL; - return RIG_OK; + if (rig->state.priv) + free(rig->state.priv); + rig->state.priv = NULL; + + return RIG_OK; } /* @@ -404,28 +343,23 @@ int ft757_cleanup(RIG *rig) { int ft757_open(RIG *rig) { - unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x0e}; - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; - int retval; - - serial_flush(&rig->state.rigport); + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; + int retval; - /* send 0 delay PACING cmd to rig */ - write_block(&rig->state.rigport, (char *) cmd, YAESU_CMD_LENGTH); + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - /* read back the 75 status bytes */ - retval = read_block(&rig->state.rigport, - (char *) priv->update_data, - FT757GX_STATUS_UPDATE_DATA_LENGTH); + if (!rig) + return -RIG_EINVAL; + + /* read back the 75 status bytes */ + retval = ft757_get_update_data(rig); + if (retval < 0) { + memset(priv->update_data, 0, FT757GX_STATUS_UPDATE_DATA_LENGTH); - if (retval != FT757GX_STATUS_UPDATE_DATA_LENGTH) { + return retval; + } - rig_debug(RIG_DEBUG_ERR,"%s: update_data failed %d\n", - __FUNCTION__, retval); - memset(priv->update_data,0,FT757GX_STATUS_UPDATE_DATA_LENGTH); - } - - return RIG_OK; + return RIG_OK; } @@ -437,86 +371,108 @@ int ft757_open(RIG *rig) int ft757_set_freq(RIG *rig, vfo_t vfo, freq_t freq) { - unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x0a}; + unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x0a}; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - /* fill in first four bytes */ - to_bcd(cmd, freq/10, 8); + if (!rig) + return -RIG_EINVAL; + + /* fill in first four bytes */ + to_bcd(cmd, freq/10, BCD_LEN); - return write_block(&rig->state.rigport, (char *) cmd, YAESU_CMD_LENGTH); + return write_block(&rig->state.rigport, (char *)cmd, YAESU_CMD_LENGTH); } + int ft757_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { - unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x0c}; + unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x0c}; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - /* fill in p1 */ - cmd[3] = mode2rig(rig, mode, width); + if (!rig) + return -RIG_EINVAL; - return write_block(&rig->state.rigport, (char *) cmd, YAESU_CMD_LENGTH); + rig_debug(RIG_DEBUG_TRACE, "%s: mode = %d, width = %d\n", + __func__, mode, width); + + if (mode == RIG_MODE_NONE) + return -RIG_EINVAL; + + /* fill in p1 */ + cmd[3] = mode2rig(rig, mode, width); + + return write_block(&rig->state.rigport, (char *)cmd, YAESU_CMD_LENGTH); } - /* * Return Freq */ int ft757_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) { - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; - int retval; + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; + int retval; - retval = ft757_get_update_data(rig); /* get whole shebang from rig */ - if (retval < 0) - return retval; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - /* grab freq and convert */ + if (!rig) + return -RIG_EINVAL; + + retval = ft757_get_update_data(rig); /* get whole shebang from rig */ + if (retval < 0) + return retval; - switch(vfo) { - case RIG_VFO_CURR: - *freq = from_bcd_be(priv->update_data+STATUS_CURR_FREQ, 8); - break; - case RIG_VFO_A: - *freq = from_bcd_be(priv->update_data+STATUS_VFOA_FREQ, 8); - break; - case RIG_VFO_B: - *freq = from_bcd_be(priv->update_data+STATUS_VFOB_FREQ, 8); - break; - default: - return -RIG_EINVAL; /* sorry, wrong VFO */ - } + /* grab freq (little endian format) and convert */ + switch(vfo) { + case RIG_VFO_CURR: + *freq = from_bcd(priv->update_data+STATUS_CURR_FREQ, BCD_LEN); + break; + case RIG_VFO_A: + *freq = from_bcd(priv->update_data+STATUS_VFOA_FREQ, BCD_LEN); + break; + case RIG_VFO_B: + *freq = from_bcd(priv->update_data+STATUS_VFOB_FREQ, BCD_LEN); + break; + default: + return -RIG_EINVAL; /* sorry, wrong VFO */ + } - return RIG_OK; + return RIG_OK; } - int ft757_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; - int retval; + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; + int retval; - retval = ft757_get_update_data(rig); /* get whole shebang from rig */ - if (retval < 0) - return retval; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - switch(vfo) { - case RIG_VFO_CURR: - retval = rig2mode(rig, priv->update_data[STATUS_CURR_MODE], mode, width); - break; - case RIG_VFO_A: - retval = rig2mode(rig, priv->update_data[STATUS_VFOA_MODE], mode, width); - break; - case RIG_VFO_B: - retval = rig2mode(rig, priv->update_data[STATUS_VFOB_MODE], mode, width); - break; - default: - return -RIG_EINVAL; /* sorry, wrong VFO */ - } + if (!rig) + return -RIG_EINVAL; + + retval = ft757_get_update_data(rig); /* get whole shebang from rig */ + if (retval < 0) + return retval; - return retval; + switch(vfo) { + case RIG_VFO_CURR: + retval = rig2mode(rig, priv->update_data[STATUS_CURR_MODE], mode, width); + break; + case RIG_VFO_A: + retval = rig2mode(rig, priv->update_data[STATUS_VFOA_MODE], mode, width); + break; + case RIG_VFO_B: + retval = rig2mode(rig, priv->update_data[STATUS_VFOB_MODE], mode, width); + break; + default: + return -RIG_EINVAL; /* sorry, wrong VFO */ + } + + return retval; } @@ -525,89 +481,113 @@ int ft757_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) * requests. * */ -int ft757_set_vfo(RIG *rig, vfo_t vfo) { - unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x05}; - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; +int ft757_set_vfo(RIG *rig, vfo_t vfo) +{ + unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x05}; + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; - switch(vfo) { - case RIG_VFO_CURR: - return RIG_OK; - case RIG_VFO_A: - cmd[3] = 0x00; - break; - case RIG_VFO_B: - cmd[3] = 0x01; - break; - default: - return -RIG_EINVAL; /* sorry, wrong VFO */ - } + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - priv->current_vfo = vfo; + if (!rig) + return -RIG_EINVAL; - return write_block(&rig->state.rigport, (char *) cmd, YAESU_CMD_LENGTH); + switch(vfo) { + case RIG_VFO_CURR: + return RIG_OK; + case RIG_VFO_A: + cmd[3] = 0x00; /* VFO A */ + break; + case RIG_VFO_B: + cmd[3] = 0x01; /* VFO B */ + break; + default: + return -RIG_EINVAL; /* sorry, wrong VFO */ + } + + priv->current_vfo = vfo; + + return write_block(&rig->state.rigport, (char *)cmd, YAESU_CMD_LENGTH); } -int ft757_get_vfo(RIG *rig, vfo_t *vfo) { - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; - int retval; +int ft757_get_vfo(RIG *rig, vfo_t *vfo) +{ + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; + int retval; - retval = ft757_get_update_data(rig); /* get whole shebang from rig */ - if (retval < 0) - return retval; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); + + if (!rig) + return -RIG_EINVAL; - if (priv->update_data[0] & 0x10) - return RIG_VFO_MEM; - else - if (priv->update_data[0] & 0x08) - return RIG_VFO_B; - else - return RIG_VFO_A; + retval = ft757_get_update_data(rig); /* get whole shebang from rig */ + if (retval < 0) + return retval; - return RIG_OK; + if (priv->update_data[0] & 0x10) + return RIG_VFO_MEM; + else + if (priv->update_data[0] & 0x08) + return RIG_VFO_B; + else + return RIG_VFO_A; + + return RIG_OK; } + int ft757_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) { - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; - int retval; + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; + int retval; - retval = ft757_get_update_data(rig); /* get whole shebang from rig */ - if (retval < 0) - return retval; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); + + if (!rig) + return -RIG_EINVAL; - *ptt = priv->update_data[0] & 0x20 ? RIG_PTT_ON : RIG_PTT_OFF; - return RIG_OK; + retval = ft757_get_update_data(rig); /* get whole shebang from rig */ + if (retval < 0) + return retval; + + *ptt = priv->update_data[0] & 0x20 ? RIG_PTT_ON : RIG_PTT_OFF; + return RIG_OK; } + int ft757_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { - unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x01, 0x10}; - int retval; - - if (level != RIG_LEVEL_RAWSTR) - return -RIG_EINVAL; + unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x01, 0x10}; + int retval; - serial_flush(&rig->state.rigport); + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - /* send READ STATUS(Meter only) cmd to rig */ - retval = write_block(&rig->state.rigport, (char *) cmd, YAESU_CMD_LENGTH); - if (retval < 0) - return retval; + if (!rig) + return -RIG_EINVAL; + + if (level != RIG_LEVEL_RAWSTR) + return -RIG_EINVAL; - /* read back the 1 byte */ - retval = read_block(&rig->state.rigport, (char *) cmd, 1); + serial_flush(&rig->state.rigport); - if (retval != 1) { - rig_debug(RIG_DEBUG_ERR,"%s: read meter failed %d\n", - __FUNCTION__,retval); + /* send READ STATUS(Meter only) cmd to rig */ + retval = write_block(&rig->state.rigport, (char *)cmd, YAESU_CMD_LENGTH); + if (retval < 0) + return retval; - return retval < 0 ? retval : -RIG_EIO; - } - val->i = cmd[0]; + /* read back the 1 byte */ + retval = read_block(&rig->state.rigport, (char *)cmd, 1); - return RIG_OK; + if (retval != 1) { + rig_debug(RIG_DEBUG_ERR,"%s: read meter failed %d.\n", + __func__, retval); + + return retval < 0 ? retval : -RIG_EIO; + } + val->i = cmd[0]; + + return RIG_OK; } @@ -620,79 +600,113 @@ int ft757_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int ft757_get_update_data(RIG *rig) { - unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x10}; - struct ft757_priv_data *priv = (struct ft757_priv_data*)rig->state.priv; - int retval; - - serial_flush(&rig->state.rigport); + unsigned char cmd[YAESU_CMD_LENGTH] = { 0x00, 0x00, 0x00, 0x00, 0x10}; + struct ft757_priv_data *priv = (struct ft757_priv_data *)rig->state.priv; + int retval; - /* send READ STATUS cmd to rig */ - retval = write_block(&rig->state.rigport, (char *) cmd, YAESU_CMD_LENGTH); - if (retval < 0) - return retval; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - /* read back the 75 status bytes */ - retval = read_block(&rig->state.rigport, - (char *) priv->update_data, - FT757GX_STATUS_UPDATE_DATA_LENGTH); + if (!rig) + return -RIG_EINVAL; + + serial_flush(&rig->state.rigport); - if (retval != FT757GX_STATUS_UPDATE_DATA_LENGTH) { + /* send READ STATUS cmd to rig */ + retval = write_block(&rig->state.rigport, (char *)cmd, YAESU_CMD_LENGTH); + if (retval < 0) + return retval; - rig_debug(RIG_DEBUG_ERR,"%s: read update_data failed %d\n", - __FUNCTION__,retval); + /* read back the 75 status bytes */ + retval = read_block(&rig->state.rigport, + (char *)priv->update_data, + FT757GX_STATUS_UPDATE_DATA_LENGTH); - return retval < 0 ? retval : -RIG_EIO; - } + if (retval != FT757GX_STATUS_UPDATE_DATA_LENGTH) { + rig_debug(RIG_DEBUG_ERR,"%s: read update_data failed, %d octects of %d read.\n", + __func__, retval, FT757GX_STATUS_UPDATE_DATA_LENGTH); - return RIG_OK; + return retval < 0 ? retval : -RIG_EIO; + } + + return RIG_OK; } int mode2rig(RIG *rig, rmode_t mode, pbwidth_t width) { - int md; + int md; - /* - * translate mode from generic to ft757 specific - */ - switch(mode) { - case RIG_MODE_AM: md = MODE_AM; break; - case RIG_MODE_USB: md = MODE_USB; break; - case RIG_MODE_LSB: md = MODE_LSB; break; - case RIG_MODE_FM: md = MODE_FM; break; - case RIG_MODE_CW: - if (width != RIG_PASSBAND_NORMAL || - width < rig_passband_normal(rig, mode)) - md = MODE_CWN; - else - md = MODE_CWW; - break; - default: - return -RIG_EINVAL; /* sorry, wrong MODE */ - } - return md; + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); + + if (!rig) + return -RIG_EINVAL; + + /* + * translate mode from generic to ft757 specific + */ + switch(mode) { + case RIG_MODE_AM: + md = MODE_AM; + break; + case RIG_MODE_USB: + md = MODE_USB; + break; + case RIG_MODE_LSB: + md = MODE_LSB; + break; + case RIG_MODE_FM: + md = MODE_FM; + break; + case RIG_MODE_CW: + if (width == RIG_PASSBAND_NORMAL || + width >= rig_passband_normal(rig, mode)) + md = MODE_CWW; + else + md = MODE_CWN; + break; + default: + return -RIG_EINVAL; /* sorry, wrong MODE */ + } + + return md; } + int rig2mode(RIG *rig, int md, rmode_t *mode, pbwidth_t *width) { - /* - * translate mode from ft757 specific to generic - */ - switch(md) { - case MODE_AM: *mode = RIG_MODE_AM; break; - case MODE_USB: *mode = RIG_MODE_USB; break; - case MODE_LSB: *mode = RIG_MODE_LSB; break; - case MODE_FM: *mode = RIG_MODE_FM; break; - case MODE_CWW: - case MODE_CWN: *mode = RIG_MODE_CW; break; - default: - return -RIG_EINVAL; /* sorry, wrong MODE */ - } - if (md == MODE_CWN) - *width = rig_passband_narrow(rig, *mode); - else - *width = rig_passband_normal(rig, *mode); + rig_debug(RIG_DEBUG_VERBOSE, "%s called.\n", __func__); - return RIG_OK; + if (!rig) + return -RIG_EINVAL; + + /* + * translate mode from ft757 specific to generic + */ + switch(md) { + case MODE_AM: + *mode = RIG_MODE_AM; + break; + case MODE_USB: + *mode = RIG_MODE_USB; + break; + case MODE_LSB: + *mode = RIG_MODE_LSB; + break; + case MODE_FM: + *mode = RIG_MODE_FM; + break; + case MODE_CWW: + case MODE_CWN: + *mode = RIG_MODE_CW; + break; + default: + return -RIG_EINVAL; /* sorry, wrong MODE */ + } + if (md == MODE_CWN) + *width = rig_passband_narrow(rig, *mode); + else + *width = rig_passband_normal(rig, *mode); + + return RIG_OK; } diff --git a/yaesu/ft757gx.h b/yaesu/ft757gx.h index 765f8416c..39bab09ff 100644 --- a/yaesu/ft757gx.h +++ b/yaesu/ft757gx.h @@ -7,7 +7,7 @@ * box (FIF-232C) or similar (max232 + some capacitors :-) * * - * $Id: ft757gx.h,v 1.2 2004-08-08 19:15:31 fillods Exp $ + * $Id: ft757gx.h,v 1.3 2008-01-10 14:19:19 n0nb Exp $ * * * This library is free software; you can redistribute it and/or @@ -30,22 +30,85 @@ #ifndef _FT757GX_H #define _FT757GX_H 1 -#define FT757GX_STATUS_UPDATE_DATA_LENGTH 75 +#define FT757GX_STATUS_UPDATE_DATA_LENGTH 75 -#define FT757GX_PACING_INTERVAL 5 -#define FT757GX_PACING_DEFAULT_VALUE 0 -#define FT757GX_WRITE_DELAY 50 +#define FT757GX_PACING_INTERVAL 0 +#define FT757GX_PACING_DEFAULT_VALUE 0 +#define FT757GX_WRITE_DELAY 50 + +/* number of BCD digits--2 digits per octet */ +#define BCD_LEN 8 /* Sequential fast writes confuse my FT757GX without this delay */ - -#define FT757GX_POST_WRITE_DELAY 5 +#define FT757GX_POST_WRITE_DELAY 5 /* Rough safe value for default timeout */ - #define FT757GX_DEFAULT_READ_TIMEOUT 345 * ( 3 + (FT757GX_PACING_INTERVAL * FT757GX_PACING_DEFAULT_VALUE)) +/* + * Some useful offsets in the status update map (offset = book byte value - 1) + * + * Status Update Chart, FT757GXII + */ +#define STATUS_CURR_FREQ 5 /* Operating Frequency */ +#define STATUS_CURR_MODE 9 +#define STATUS_VFOA_FREQ 10 +#define STATUS_VFOA_MODE 14 +#define STATUS_VFOB_FREQ 15 +#define STATUS_VFOB_MODE 19 + +/* Mode values for both set and get */ +#define MODE_LSB 0x00 +#define MODE_USB 0x01 +#define MODE_CWW 0x02 +#define MODE_CWN 0x03 +#define MODE_AM 0x04 +#define MODE_FM 0x05 + + +/* TODO: get better measure numbers */ +#define FT757GXII_STR_CAL { 2, { \ + { 0, -60 }, /* S0 -6dB */ \ + { 15, 60 } /* +60 */ \ + } } + +#define FT757_MEM_CAP { \ + .freq = 1, \ + .mode = 1, \ + .width = 1 \ + } + + +/* + * Receiver caps + */ +#define FT757GX_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) + + +/* + * TX caps + */ +#define FT757GX_ALL_TX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) + + +/* Backend fucntion prototypes. These map to frontend functions. */ +static int ft757_init(RIG *rig); +static int ft757_cleanup(RIG *rig); +static int ft757_open(RIG *rig); + +static int ft757_set_freq(RIG *rig, vfo_t vfo, freq_t freq); +static int ft757_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); + +static int ft757_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); /* select mode */ +static int ft757_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); /* get mode */ + +static int ft757_set_vfo(RIG *rig, vfo_t vfo); /* select vfo */ +static int ft757_get_vfo(RIG *rig, vfo_t *vfo); /* get vfo */ + +static int ft757_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt); +static int ft757_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); #endif /* _FT757GX_H */