From bb11fa910772610447e215f5845cc8753033fac1 Mon Sep 17 00:00:00 2001 From: dl1ksv Date: Mon, 29 May 2017 13:12:52 +0200 Subject: [PATCH] Initial controls for the rs-hfiq sdr --- include/hamlib/riglist.h | 1 + kit/Android.mk | 2 +- kit/Makefile.am | 2 +- kit/kit.c | 1 + kit/kit.h | 1 + kit/rs_hfiq.c | 198 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 kit/rs_hfiq.c diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index 1155d6e2c..6fc9fd8fa 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -492,6 +492,7 @@ #define RIG_MODEL_SI570PEABERRY1 RIG_MAKE_MODEL(RIG_KIT, 16) /* Peaberry V1 */ #define RIG_MODEL_SI570PEABERRY2 RIG_MAKE_MODEL(RIG_KIT, 17) /* Peaberry V2 */ #define RIG_MODEL_FUNCUBEDONGLEPLUS RIG_MAKE_MODEL(RIG_KIT, 18) /* FunCUBE Dongle Pro+ */ +#define RIG_MODEL_RSHFIQ RIG_MAKE_MODEL(RIG_KIT, 19) /* RS-HFIQ */ /* * SW/FM/TV tuner cards supported by Video4Linux,*BSD, .. diff --git a/kit/Android.mk b/kit/Android.mk index b517f020a..e0988cd73 100644 --- a/kit/Android.mk +++ b/kit/Android.mk @@ -4,7 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := elektor304.c drt1.c dwt.c usrp.c elektor507.c \ dds60.c miniVNA.c si570avrusb.c funcube.c fifisdr.c hiqsdr.c \ - pcrotor.c kit.c + pcrotor.c kit.c rs_hfiq.c LOCAL_MODULE := kit LOCAL_CFLAGS := -DHAVE_CONFIG_H diff --git a/kit/Makefile.am b/kit/Makefile.am index 8024b2aba..08dcdca4e 100644 --- a/kit/Makefile.am +++ b/kit/Makefile.am @@ -4,7 +4,7 @@ AM_CFLAGS += $(LIBUSB_CFLAGS) KITSRC = elektor304.c drt1.c dwt.c usrp.c elektor507.c dds60.c miniVNA.c \ si570avrusb.c si570avrusb.h funcube.c funcube.h fifisdr.c hiqsdr.c \ - kit.c kit.h usrp_impl.h + kit.c kit.h usrp_impl.h rs_hfiq.c if HAVE_USRP # Append to the already defined AM_CXXFLAGS that exists outside the conditional. diff --git a/kit/kit.c b/kit/kit.c index 138c3ed27..32f5e6b6a 100644 --- a/kit/kit.c +++ b/kit/kit.c @@ -45,6 +45,7 @@ DECLARE_INITRIG_BACKEND(kit) rig_register(&dds60_caps); rig_register(&miniVNA_caps); rig_register(&hiqsdr_caps); + rig_register(&rshfiq_caps); #if (defined(HAVE_LIBUSB) && (defined(HAVE_LIBUSB_H) || defined(HAVE_LIBUSB_1_0_LIBUSB_H))) rig_register(&si570avrusb_caps); diff --git a/kit/kit.h b/kit/kit.h index cac42bd31..29fb58842 100644 --- a/kit/kit.h +++ b/kit/kit.h @@ -41,6 +41,7 @@ extern const struct rig_caps funcubeplus_caps; extern const struct rig_caps fifisdr_caps; extern const struct rig_caps hiqsdr_caps; extern const struct rig_caps fasdr_caps; +extern const struct rig_caps rshfiq_caps; extern const struct rot_caps pcrotor_caps; diff --git a/kit/rs_hfiq.c b/kit/rs_hfiq.c new file mode 100644 index 000000000..0bf8ec5fa --- /dev/null +++ b/kit/rs_hfiq.c @@ -0,0 +1,198 @@ +/* + * Hamlib rs-hfiq backend - main file + * Copyright (c) 2017 by Volker Schroer + * + * + * 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 + * + */ +/* + * + * For informations about the controls see + * https://sites.google.com/site/rshfiqtransceiver/home/technical-data/interface-commands + * + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include /* String function definitions */ +#include /* UNIX standard function definitions */ + +#include "hamlib/rig.h" +#include "serial.h" + + +static int rshfiq_open(RIG *rig) +{ + int retval; + int flag; + char versionstr[20]; + char stopset[2]; + stopset[0]='\r'; + stopset[1]='\n'; + + rig_debug(RIG_DEBUG_TRACE, "%s: Port = %s\n", __func__,rig->state.rigport.pathname ); + rig->state.rigport.timeout=2000; + rig->state.rigport.retry=1; + retval=serial_open(&rig->state.rigport); + if( retval != RIG_OK) + return retval; + retval=ser_get_dtr(&rig->state.rigport, &flag); + if(retval == RIG_OK) + rig_debug(RIG_DEBUG_TRACE, "%s: DTR: %d\n", __func__,flag); + else + rig_debug(RIG_DEBUG_TRACE, "%s: Could not get DTR\n", __func__); + if(flag == 0) + { + flag=1; // Set DTR + retval=ser_set_dtr(&rig->state.rigport, flag); + if(retval == RIG_OK) + rig_debug(RIG_DEBUG_TRACE, "%s: set DTR\n", __func__); + } + serial_flush(&rig->state.rigport); + + sprintf(versionstr,"*w\r"); + rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s\n", __func__, versionstr); + retval = write_block(&rig->state.rigport, versionstr, strlen(versionstr)); + if (retval != RIG_OK) + return retval; + retval =read_string(&rig->state.rigport,versionstr,20,stopset,2); + if(retval <=0) + { // Just one retry if the arduino is just booting + retval = write_block(&rig->state.rigport, versionstr, strlen(versionstr)); + if (retval != RIG_OK) + return retval; + retval =read_string(&rig->state.rigport,versionstr,20,stopset,2); + if(retval <= 0 ) + return retval; + } + versionstr[retval]=0; + rig_debug(RIG_DEBUG_TRACE, "%s: Rigversion = %s\n", __func__, versionstr); + if(!strstr(versionstr,"RS-HFIQ")) + { + rig_debug(RIG_DEBUG_WARN, "%s: Invalid Rigversion: %s\n",__func__, versionstr); + return -RIG_ECONF; + } + return RIG_OK; +} + +static int rshfiq_set_freq(RIG *rig, vfo_t vfo, freq_t freq) +{ + char fstr[8]; + char cmdstr[15]; + int retval; + + sprintf(fstr,"%lu", (unsigned long int)(freq)); + rig_debug(RIG_DEBUG_TRACE,"%s called: %s %s\n", __FUNCTION__, + rig_strvfo(vfo), fstr); + + serial_flush(&rig->state.rigport); + + sprintf(cmdstr,"*f%lu\r",(unsigned long int)(freq)); + + retval = write_block(&rig->state.rigport, cmdstr, strlen(cmdstr)); + if (retval != RIG_OK) + return retval; + + return RIG_OK; +} +static int rshfiq_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) +{ + char cmdstr[15]; + char stopset[2]; + stopset[0]='\r'; + stopset[1]='\n'; + int retval; + serial_flush(&rig->state.rigport); + + sprintf(cmdstr,"*f?\r"); + + rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s\n", __func__, cmdstr); + + retval = write_block(&rig->state.rigport, cmdstr, strlen(cmdstr)); + if (retval != RIG_OK) + return retval; + retval =read_string(&rig->state.rigport,cmdstr,9,stopset,2); + if(retval <=0) + return retval; + cmdstr[retval]=0; + *freq = atoi(cmdstr); + return RIG_OK; +} + +static int rshfiq_set_ptt(RIG *rig, vfo_t vfo,ptt_t ptt) +{ + char cmdstr[5]; + cmdstr[0]='*'; + cmdstr[1]='x'; + cmdstr[3]='\r'; + cmdstr[4]=0; + int retval; + if(ptt == RIG_PTT_ON) + cmdstr[2]='1'; + else + cmdstr[2]='0'; + rig_debug(RIG_DEBUG_TRACE, "%s: cmdstr = %s\n", __func__, cmdstr); + + retval = write_block(&rig->state.rigport, cmdstr, strlen(cmdstr)); + return retval; +} + +const struct rig_caps rshfiq_caps = { + .rig_model = RIG_MODEL_RSHFIQ, + .model_name = "RS-HFIQ", + .mfg_name = "HobbyPCB", + .version = "0.1", + .copyright = "LGPL", + .status = RIG_STATUS_ALPHA, + .rig_type = RIG_TYPE_TRANSCEIVER, + .ptt_type = RIG_PTT_RIG, + .port_type = RIG_PORT_SERIAL, + .dcd_type = RIG_DCD_NONE, + .serial_rate_min = 57600, + .serial_rate_max = 57600, + .serial_data_bits = 8, + .serial_stop_bits = 1, + .serial_parity = RIG_PARITY_NONE, + .serial_handshake = RIG_HANDSHAKE_NONE, + .write_delay = 0, + .post_write_delay = 1, + .timeout = 1000, + .retry = 3, + + .rx_range_list1 = { {.start=kHz(3500),.end=MHz(30),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + RIG_FRNG_END, }, + .rx_range_list2 = { {.start=kHz(3500),.end=MHz(30),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + RIG_FRNG_END, }, + .tx_range_list1 = { {.start=kHz(3500),.end=kHz(3800),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + {.start=kHz(7000),.end=kHz(7200),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + {.start=kHz(10100),.end=kHz(10150),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + {.start=MHz(14),.end=kHz(14350),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + {.start=MHz(21),.end=kHz(21450),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + {.start=kHz(24890),.end=kHz(24990),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + {.start=MHz(28),.end=kHz(29700),.modes=RIG_MODE_NONE, .low_power=-1,.high_power=-1,RIG_VFO_A}, + RIG_FRNG_END, }, + .tuning_steps = { {RIG_MODE_NONE,Hz(1)}, RIG_TS_END, }, + + .rig_open = rshfiq_open, + .get_freq = rshfiq_get_freq, + .set_freq = rshfiq_set_freq, + .set_ptt = rshfiq_set_ptt, + +}; +