diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index bb9a1f3d6..b456bea1b 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -476,6 +476,7 @@ #define RIG_RS 27 #define RIG_BACKEND_RS "rs" #define RIG_MODEL_ESMC RIG_MAKE_MODEL(RIG_RS, 1) +#define RIG_MODEL_EB200 RIG_MAKE_MODEL(RIG_RS, 2) /* diff --git a/rs/Makefile.am b/rs/Makefile.am index a3d082b34..05523d508 100644 --- a/rs/Makefile.am +++ b/rs/Makefile.am @@ -1,4 +1,4 @@ -RSSRC = esmc.c +RSSRC = esmc.c eb200.c lib_LTLIBRARIES = hamlib-rs.la hamlib_rs_la_SOURCES = $(RSSRC) rs.c diff --git a/rs/eb200.c b/rs/eb200.c new file mode 100644 index 000000000..50051b776 --- /dev/null +++ b/rs/eb200.c @@ -0,0 +1,179 @@ +/* + * Hamlib R&S backend - EB200 description + * Copyright (c) 2009-2010 by Stephane Fillod + * + * + * 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: PULSE and IQ ? */ +#define EB200_MODES (RIG_MODE_SSB|RIG_MODE_CW|RIG_MODE_AM|RIG_MODE_FM|RIG_MODE_WFM) + +#define EB200_FUNC (RIG_FUNC_SQL|RIG_FUNC_AFC|RIG_FUNC_LOCK) + +#define EB200_LEVEL_ALL (RIG_LEVEL_ATT|RIG_LEVEL_SQL|RIG_LEVEL_AGC|\ + RIG_LEVEL_RF|RIG_LEVEL_AF|RIG_LEVEL_STRENGTH) + +#define EB200_PARM_ALL (RIG_PARM_NONE) + +#define EB200_VFO (RIG_VFO_A) + +#define EB200_VFO_OPS (RIG_OP_NONE) + +#define EB200_ANTS (RIG_ANT_1) + +#define EB200_MEM_CAP { \ + .freq = 1, \ + .mode = 1, \ + .width = 1, \ + .ant = 1, \ + .funcs = EB200_FUNC, \ + .levels = RIG_LEVEL_SET(EB200_LEVEL_ALL), \ + .channel_desc=1, \ + .flags = RIG_CHFLAG_SKIP, \ +} + + +/* + * EB200 rig capabilities. + * + * Needs option ESMBR2 for computer operation RS-232C + * + * TODO + * - set/get_channels + * - get_dcd + * - set_ant + */ + +const struct rig_caps eb200_caps = { +.rig_model = RIG_MODEL_EB200, +.model_name = "EB200", +.mfg_name = "Rohde&Schwarz", +.version = "0.1", +.copyright = "LGPL", +.status = RIG_STATUS_UNTESTED, +.rig_type = RIG_TYPE_RECEIVER, +.ptt_type = RIG_PTT_NONE, +.dcd_type = RIG_DCD_NONE, +.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 = EB200_FUNC, +.has_set_func = EB200_FUNC, +.has_get_level = EB200_LEVEL_ALL, +.has_set_level = RIG_LEVEL_SET(EB200_LEVEL_ALL), +.has_get_parm = EB200_PARM_ALL, +.has_set_parm = RIG_PARM_SET(EB200_PARM_ALL), +.level_gran = {}, +.parm_gran = {}, +.ctcss_list = NULL, +.dcs_list = NULL, +.preamp = { RIG_DBLST_END }, +.attenuator = { 32, 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 = EB200_VFO_OPS, + +.chan_list = { + { 0, 999, RIG_MTYPE_MEM, EB200_MEM_CAP }, + RIG_CHAN_END, + }, + +.rx_range_list1 = { + {kHz(10),GHz(3),EB200_MODES,-1,-1,EB200_VFO,EB200_ANTS}, + RIG_FRNG_END, + }, +.tx_range_list1 = { RIG_FRNG_END, }, +.rx_range_list2 = { + {kHz(10),GHz(3),EB200_MODES,-1,-1,EB200_VFO,EB200_ANTS}, + RIG_FRNG_END, + }, +.tx_range_list2 = { RIG_FRNG_END, }, + +.tuning_steps = { + {EB200_MODES,1}, + {EB200_MODES,10}, + {EB200_MODES,100}, + {EB200_MODES,1000}, + RIG_TS_END, + }, + + /* mode/filter list, remember: order matters! */ +.filters = { + {RIG_MODE_WFM, kHz(150)}, + {RIG_MODE_FM|RIG_MODE_AM, kHz(15)}, + {EB200_MODES, kHz(2.4)}, + {EB200_MODES, kHz(1.5)}, + {EB200_MODES, Hz(150)}, + {EB200_MODES, Hz(300)}, + {EB200_MODES, Hz(600)}, + {EB200_MODES, kHz(6)}, + {EB200_MODES, kHz(9)}, + {EB200_MODES, kHz(15)}, + {EB200_MODES, kHz(30)}, + {EB200_MODES, kHz(50)}, + {EB200_MODES, kHz(120)}, + RIG_FLT_END, + }, +.priv = NULL, + +.set_freq = rs_set_freq, +.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, +.get_info = rs_get_info, +.reset = rs_reset, + +#if 0 +/* TODO */ +.rig_open = rs_rig_open, +.set_channel = rs_set_channel, +.get_channel = rs_get_channel, +#endif +}; + +/* + * Function definitions below + */ + diff --git a/rs/rs.c b/rs/rs.c index e0bfd8109..f9ec27b81 100644 --- a/rs/rs.c +++ b/rs/rs.c @@ -33,6 +33,7 @@ #include "serial.h" #include "misc.h" #include "register.h" +#include "num_stdio.h" #include "rs.h" @@ -185,6 +186,7 @@ int rs_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) switch (func) { case RIG_FUNC_AFC: sfunc = "FREQ:AFC"; break; case RIG_FUNC_SQL: sfunc = "OUTP:SQU"; break; + case RIG_FUNC_LOCK: sfunc = "DISP:ENAB"; break; default: return -RIG_EINVAL; } @@ -201,8 +203,9 @@ int rs_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) int buf_len, retval; switch (func) { - case RIG_FUNC_AFC: sfunc = "FREQ:AFC?"; break; - case RIG_FUNC_SQL: sfunc = "OUTP:SQU?"; break; + case RIG_FUNC_AFC: sfunc = BOM "FREQ:AFC?" EOM; break; + case RIG_FUNC_SQL: sfunc = BOM "OUTP:SQU?" EOM; break; + case RIG_FUNC_LOCK: sfunc = BOM "DISP:ENAB?" EOM; break; default: return -RIG_EINVAL; } @@ -211,7 +214,7 @@ int rs_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) if (retval < 0) return retval; - *status = (memcmp(buf, "ON", 2) == 0) ? 1 : 0; + *status = (!memcmp(buf, "ON", 2) || !memcmp(buf, "1", 1)) ? 1 : 0; return retval; } @@ -226,6 +229,12 @@ int rs_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) len = sprintf(buf, BOM "INP:ATT:STAT %s" EOM, val.i ? "ON" : "OFF"); break; case RIG_LEVEL_SQL: + /* dBuV */ + len = sprintf(buf, BOM "OUTP:SQU:THR %d" EOM, (int) (20 + val.f*20)); + break; + case RIG_LEVEL_AF: + len = num_sprintf(buf, BOM "SYST:AUD:VOL %.1f" EOM, val.f); + break; case RIG_LEVEL_AGC: case RIG_LEVEL_RF: return -RIG_ENIMPL; @@ -246,7 +255,7 @@ int rs_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) switch (level) { case RIG_LEVEL_STRENGTH: slevel = BOM "SENS:DATA? \"VOLT:AC\"" EOM; break; case RIG_LEVEL_ATT: slevel = BOM "INP:ATT:STAT?" EOM; break; - break; + case RIG_LEVEL_AF: slevel = BOM "SYST:AUD:VOL?" EOM; break; case RIG_LEVEL_SQL: case RIG_LEVEL_AGC: case RIG_LEVEL_RF: @@ -268,7 +277,11 @@ int rs_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->i -= 34; break; case RIG_LEVEL_ATT: - val->i = (memcmp(buf, "ON", 2) == 0) ? rig->state.attenuator[0] : 0; + val->i = (!memcmp(buf, "ON", 2) || !memcmp(buf, "1", 1)) ? rig->state.attenuator[0] : 0; + break; + case RIG_LEVEL_AF: + if (num_sscanf(buf, "%f", &val->f) != 1) + return -RIG_EPROTO; break; default: return -RIG_EINVAL; @@ -291,6 +304,18 @@ const char * rs_get_info(RIG *rig) return infobuf; } +int rs_reset(RIG *rig, reset_t reset) +{ + int retval; + +#define RST_CMD BOM "*RST" EOM + + retval = rs_transaction(rig, RST_CMD, strlen(RST_CMD), NULL, NULL); + + return retval; +} + + /* * initrigs_rs is called by rig_backend_load */ @@ -299,6 +324,7 @@ DECLARE_INITRIG_BACKEND(rs) rig_debug(RIG_DEBUG_VERBOSE, "rs: _init called\n"); rig_register(&esmc_caps); + rig_register(&eb200_caps); return RIG_OK; } diff --git a/rs/rs.h b/rs/rs.h index 24c2cab45..f93e3db89 100644 --- a/rs/rs.h +++ b/rs/rs.h @@ -1,8 +1,7 @@ /* * Hamlib R&S backend - main header - * Copyright (c) 2009 by Stephane Fillod + * Copyright (c) 2009-2010 by Stephane Fillod * - * $Id: rs.h,v 1.1 2009/08/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 @@ -34,8 +33,10 @@ int rs_set_func(RIG *rig, vfo_t vfo, setting_t func, int status); int rs_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status); int rs_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); int rs_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); +int rs_reset(RIG *rig, reset_t reset); const char * rs_get_info(RIG *rig); extern const struct rig_caps esmc_caps; +extern const struct rig_caps eb200_caps; #endif /* _RS_H */