diff --git a/Makefile.am b/Makefile.am index cc1dbf80c..513f87c66 100644 --- a/Makefile.am +++ b/Makefile.am @@ -17,7 +17,7 @@ SUBDIRS = macros include lib libltdl src @BACKEND_LIST@ @ROT_BACKEND_LIST@ \ DIST_SUBDIRS = macros include lib libltdl src c++ bindings tests doc \ icom kenwood aor yaesu dummy pcr alinco uniden tentec kachina jrc \ rpcrig winradio easycomm fodtrack rpcrot drake rotorez \ - flexradio sartek lowe rft tapr kit skanti wj racal tuner \ + flexradio sartek lowe rft rs tapr kit skanti wj racal tuner \ gs232a heathkit rpm: Makefile diff --git a/configure.ac b/configure.ac index b3d48ed1d..d2e581a85 100644 --- a/configure.ac +++ b/configure.ac @@ -234,7 +234,7 @@ fi AC_SUBST(RIGMATRIX) -BACKEND_LIST="icom kenwood aor yaesu dummy pcr alinco uniden tentec kachina jrc drake lowe rft kit skanti tapr flexradio wj racal tuner" +BACKEND_LIST="icom kenwood aor yaesu dummy pcr alinco uniden tentec kachina jrc drake lowe rft rs kit skanti tapr flexradio wj racal tuner" ROT_BACKEND_LIST="dummy easycomm fodtrack gs232a heathkit kit rotorez sartek" BINDINGS="" BINDING_ALL="" @@ -493,6 +493,7 @@ jrc/Makefile drake/Makefile lowe/Makefile rft/Makefile +rs/Makefile kit/Makefile tapr/Makefile skanti/Makefile diff --git a/rs/Makefile.am b/rs/Makefile.am new file mode 100644 index 000000000..a3d082b34 --- /dev/null +++ b/rs/Makefile.am @@ -0,0 +1,8 @@ +RSSRC = esmc.c + +lib_LTLIBRARIES = hamlib-rs.la +hamlib_rs_la_SOURCES = $(RSSRC) rs.c +hamlib_rs_la_LDFLAGS = -no-undefined -module -avoid-version +hamlib_rs_la_LIBADD = $(top_builddir)/src/libhamlib.la + +noinst_HEADERS = rs.h diff --git a/rs/esmc.c b/rs/esmc.c new file mode 100644 index 000000000..da38c239a --- /dev/null +++ b/rs/esmc.c @@ -0,0 +1,177 @@ +/* + * Hamlib R&S backend - ESMC description + * Copyright (c) 2009 by Stephane Fillod + * + * $Id: ekd500.c,v 1.5 2009/02/20 12:23:46 fillods Exp $ + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include "rs.h" + + +/* TODO: LOG and PULSE ? */ +#define ESMC_MODES (RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_AM|RIG_MODE_FM) + +#define ESMC_FUNC (RIG_FUNC_SQL) + +#define ESMC_LEVEL_ALL (RIG_LEVEL_ATT|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_RF) + +#define ESMC_PARM_ALL (RIG_PARM_NONE) + +#define ESMC_VFO (RIG_VFO_A) + +#define ESMC_VFO_OPS (RIG_OP_NONE) + +#define ESMC_MEM_CAP { \ + .freq = 1, \ + .mode = 1, \ + .width = 1, \ + .ant = 1, \ + .funcs = ESMC_FUNC, \ + .levels = RIG_LEVEL_SET(ESMC_LEVEL_ALL), \ + .channel_desc=1, \ + .flags = RIG_CHFLAG_SKIP, \ +} + + +/* + * ESMC rig capabilities. + * + * Needs option ESMC-R2 for computer operation RS232C/RS422/RS485 + * + * http://www2.rohde-schwarz.com/file/ESMC_25.pdf + */ + +const struct rig_caps esmc_caps = { +.rig_model = RIG_MODEL_ESMC, +.model_name = "ESMC", +.mfg_name = "Rohde&Schwarz", +.version = "0.1", +.copyright = "LGPL", +.status = RIG_STATUS_ALPHA, +.rig_type = RIG_TYPE_RECEIVER, +.ptt_type = RIG_PTT_NONE, +.dcd_type = RIG_DCD_RIG, +.port_type = RIG_PORT_SERIAL, +.serial_rate_min = 300, /* 7E2 */ +.serial_rate_max = 115200, /* 7E1, RTS/CTS */ +.serial_data_bits = 7, +.serial_stop_bits = 1, +.serial_parity = RIG_PARITY_EVEN, +.serial_handshake = RIG_HANDSHAKE_HARDWARE, +.write_delay = 0, +.post_write_delay = 0, +.timeout = 200, +.retry = 3, + +.has_get_func = ESMC_FUNC, +.has_set_func = ESMC_FUNC, +.has_get_level = ESMC_LEVEL_ALL, +.has_set_level = RIG_LEVEL_SET(ESMC_LEVEL_ALL), +.has_get_parm = ESMC_PARM_ALL, +.has_set_parm = RIG_PARM_SET(ESMC_PARM_ALL), +.level_gran = {}, +.parm_gran = {}, +.ctcss_list = NULL, +.dcs_list = NULL, +.preamp = { RIG_DBLST_END }, +.attenuator = { 30, 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 = 7, /* FIXME */ +.vfo_ops = ESMC_VFO_OPS, + +.chan_list = { + //{ 0, 999, RIG_MTYPE_MEM, ESMC_MEM_CAP }, + RIG_CHAN_END, + }, + +/* + * With following options: + * ESMC-T2 20 MHz to 1.3 GHz + * ESMC-T0 0.5 MHz to 30 MHz + * ESMC-FE 20 MHz to 3 GHz + */ +.rx_range_list1 = { + {kHz(20),MHz(650),ESMC_MODES,-1,-1,ESMC_VFO}, + RIG_FRNG_END, + }, +.tx_range_list1 = { RIG_FRNG_END, }, +.rx_range_list2 = { + {kHz(20),MHz(650),ESMC_MODES,-1,-1,ESMC_VFO}, + RIG_FRNG_END, + }, +.tx_range_list2 = { RIG_FRNG_END, }, + +.tuning_steps = { + {ESMC_MODES,1}, + {ESMC_MODES,10}, + {ESMC_MODES,100}, + {ESMC_MODES,1000}, + RIG_TS_END, + }, + + /* mode/filter list, remember: order matters! */ +.filters = { + {ESMC_MODES, kHz(2.5)}, + {ESMC_MODES, kHz(0.5)}, + {ESMC_MODES, kHz(8)}, + {ESMC_MODES, kHz(15)}, + {ESMC_MODES, kHz(30)}, + {ESMC_MODES, kHz(50)}, + {ESMC_MODES, kHz(100)}, + {ESMC_MODES, kHz(200)}, + {ESMC_MODES, kHz(500)}, + {ESMC_MODES, MHz(1)}, + {ESMC_MODES, MHz(2)}, + {ESMC_MODES, MHz(4)}, + {ESMC_MODES, MHz(8)}, + RIG_FLT_END, + }, +.priv = NULL, + +.set_freq = rs_set_freq, + +#if 0 +.rig_open = rs_rig_open, +.get_freq = rs_get_freq, +.set_mode = rs_set_mode, +.get_mode = rs_get_mode, +.set_level = rs_set_level, +.get_level = rs_get_level, +.set_func = rs_set_func, +.get_func = rs_get_func, +.set_channel = rs_set_channel, +.get_channel = rs_get_channel, +#endif +}; + +/* + * Function definitions below + */ + diff --git a/rs/rs.c b/rs/rs.c new file mode 100644 index 000000000..78b90ae3a --- /dev/null +++ b/rs/rs.c @@ -0,0 +1,113 @@ +/* + * Hamlib R&S backend - main file + * Copyright (c) 2009 by Stéphane Fillod + * + * $Id: rft.c,v 1.3 2006/10/07 18:48:34 csete Exp $ + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include /* String function definitions */ +#include /* UNIX standard function definitions */ +#include + +#include "hamlib/rig.h" +#include "serial.h" +#include "misc.h" +#include "register.h" + +#include "rs.h" + + +#define BUFSZ 64 + +#define LF "\x0a" +#define CR "\x0d" +#define BOM CR +#define EOM CR + +/* + * R&S GB2 protocol ? + */ + + +/* + * rs_transaction + * We assume that rig!=NULL, rig->state!= NULL, data!=NULL, data_len!=NULL + */ +int rs_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len) +{ + int retval; + struct rig_state *rs; + + rs = &rig->state; + + serial_flush(&rs->rigport); + + retval = write_block(&rs->rigport, cmd, cmd_len); + if (retval != RIG_OK) + return retval; + + + /* no data expected, TODO: flush input? */ + if (!data || !data_len) + return 0; + + retval = read_string(&rs->rigport, data, BUFSZ, CR, 1); + if (retval == -RIG_ETIMEOUT) + retval = 0; + if (retval < 0) + return retval; + *data_len = retval; + + return RIG_OK; +} + +/* + * rs_set_freq + * Assumes rig!=NULL + */ +int rs_set_freq(RIG *rig, vfo_t vfo, freq_t freq) +{ + char freqbuf[16], ackbuf[16]; + int freq_len, ack_len, retval; + + /* + */ + freq_len = sprintf(freqbuf, BOM "FREQ %f MHz" EOM, freq/1e6); + retval = rs_transaction(rig, freqbuf, freq_len, ackbuf, &ack_len); + + return retval; +} + +/* + * initrigs_rs is called by rig_backend_load + */ +DECLARE_INITRIG_BACKEND(rs) +{ + rig_debug(RIG_DEBUG_VERBOSE, "rs: _init called\n"); + + rig_register(&esmc_caps); + + return RIG_OK; +} + diff --git a/rs/rs.h b/rs/rs.h new file mode 100644 index 000000000..90d36a173 --- /dev/null +++ b/rs/rs.h @@ -0,0 +1,33 @@ +/* + * Hamlib R&S backend - main header + * Copyright (c) 2009 by Stephane Fillod + * + * $Id: rft.h,v 1.1 2003/10/07 22:15:49 fillods Exp $ + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef _RS_H +#define _RS_H 1 + +#include + + +int rs_set_freq(RIG *rig, vfo_t vfo, freq_t freq); + +extern const struct rig_caps esmc_caps; + +#endif /* _RS_H */