aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike McCarrick <mike.mccarrick@gmail.com>2022-12-28 19:41:32 +0100
committerEric Wild <ewild@sysmocom.de>2022-12-28 20:00:26 +0100
commit82d6b6db78c829ddf7511826bd2b64be2bc189d5 (patch)
treedffcb7c83791938d0cac450a3c05ffc1223d4ed6
parentd75ccf8248e895efcd877fb51f9872a2204b978c (diff)
Add support for RFSpace CloudSDR to gr-osmosdrv0.2.4
Signed-off-by: Eric Wild <ewild@sysmocom.de>
-rw-r--r--README2
-rw-r--r--lib/rfspace/rfspace_source_c.cc40
-rw-r--r--lib/rfspace/rfspace_source_c.h3
-rw-r--r--lib/source_impl.cc4
4 files changed, 40 insertions, 9 deletions
diff --git a/README b/README
index c6325c4..81d5399 100644
--- a/README
+++ b/README
@@ -7,7 +7,7 @@ as well supports:
* MSi2500 based DVB-T dongles through libmirisdr
* SDRplay RSP through SDRplay API library
* gnuradio .cfile input through libgnuradio-blocks
- * RFSPACE SDR-IQ, SDR-IP, NetSDR (incl. X2 option)
+ * RFSPACE SDR-IQ, SDR-IP, NetSDR (incl. X2 option), Cloud-IQ, and CloudSDR
* AirSpy Wideband Receiver through libairspy
* CCCamp 2015 rad1o Badge through libhackrf
* Great Scott Gadgets HackRF through libhackrf
diff --git a/lib/rfspace/rfspace_source_c.cc b/lib/rfspace/rfspace_source_c.cc
index 314dfc7..c6510c5 100644
--- a/lib/rfspace/rfspace_source_c.cc
+++ b/lib/rfspace/rfspace_source_c.cc
@@ -122,6 +122,9 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
if ( dict.count("cloudiq") )
dict["rfspace"] = dict["cloudiq"];
+ if ( dict.count("cloudsdr") )
+ dict["rfspace"] = dict["cloudsdr"];
+
if ( dict.count("rfspace") )
{
std::string value = dict["rfspace"];
@@ -146,6 +149,9 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
if ( first.count("cloudiq") )
value = first["cloudiq"];
+ if ( first.count("cloudsdr") )
+ value = first["cloudsdr"];
+
dict["rfspace"] = value;
dict["label"] = first["label"];
}
@@ -291,7 +297,7 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
memset(&host_sa, 0, sizeof(host_sa));
host_sa.sin_family = AF_INET;
host_sa.sin_addr.s_addr = htonl(INADDR_ANY);
- host_sa.sin_port = htons(DEFAULT_PORT);
+ host_sa.sin_port = htons(port); /* host port must match sdr port */
if ( bind(_udp, (struct sockaddr *)&host_sa, sizeof(host_sa)) < 0 )
{
@@ -336,6 +342,8 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
_radio = RFSPACE_NETSDR;
else if ( 0x434C4951 == product_id ) /* CloudIQ Product ID */
_radio = RFSPACE_CLOUDIQ;
+ else if ( 0x434C5344 == product_id ) /* CloudSDR Product ID */
+ _radio = RFSPACE_CLOUDSDR;
else
std::cerr << "UNKNOWN ";
}
@@ -374,7 +382,8 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
if ( RFSPACE_NETSDR == _radio ||
RFSPACE_SDR_IP == _radio ||
- RFSPACE_CLOUDIQ == _radio)
+ RFSPACE_CLOUDIQ == _radio ||
+ RFSPACE_CLOUDSDR == _radio)
{
unsigned char hardver[] = { 0x05, 0x20, 0x04, 0x00, 0x02 };
if ( transaction( hardver, sizeof(hardver), response ) )
@@ -382,7 +391,8 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
}
if ( RFSPACE_NETSDR == _radio ||
- RFSPACE_CLOUDIQ == _radio)
+ RFSPACE_CLOUDIQ == _radio ||
+ RFSPACE_CLOUDSDR == _radio)
{
unsigned char fpgaver[] = { 0x05, 0x20, 0x04, 0x00, 0x03 };
if ( transaction( fpgaver, sizeof(fpgaver), response ) )
@@ -431,7 +441,8 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
set_bandwidth( 0 ); /* switch to automatic filter selection by default */
}
- else if ( RFSPACE_CLOUDIQ == _radio)
+ else if ( RFSPACE_CLOUDIQ == _radio ||
+ RFSPACE_CLOUDSDR == _radio)
{
set_sample_rate( 240000 );
set_bandwidth( 0 );
@@ -440,7 +451,8 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
/* start TCP keepalive thread */
if ( RFSPACE_NETSDR == _radio ||
RFSPACE_SDR_IP == _radio ||
- RFSPACE_CLOUDIQ == _radio )
+ RFSPACE_CLOUDIQ == _radio ||
+ RFSPACE_CLOUDSDR == _radio )
{
_run_tcp_keepalive_task = true;
_thread = gr::thread::thread( boost::bind(&rfspace_source_c::tcp_keepalive_task, this) );
@@ -1265,6 +1277,21 @@ osmosdr::meta_range_t rfspace_source_c::get_sample_rates()
range += osmosdr::range_t( 1228800 );
range += osmosdr::range_t( 1807058 );
}
+ else if ( RFSPACE_CLOUDSDR == _radio )
+ {
+ /* CloudSDR supports 122.88 MHz / 4*N for N = 15 ... 2560, but lets limit
+ * ourselves to the ones available in SpectraVue
+ */
+ range += osmosdr::range_t( 48000 ); // 40 kHz
+ range += osmosdr::range_t( 61440 ); // 50 kHz
+ range += osmosdr::range_t( 122880 ); // 100 kHz
+ range += osmosdr::range_t( 245760 ); // 200 kHz
+ range += osmosdr::range_t( 370120 ); // 300 kHz
+ range += osmosdr::range_t( 495483 ); // 400 kHz
+ range += osmosdr::range_t( 614400 ); // 500 kHz
+ range += osmosdr::range_t( 1228800 ); // 1 MHz
+ range += osmosdr::range_t( 2048000 ); // 2 MHz (16 bit)
+ }
return range;
}
@@ -1562,7 +1589,8 @@ std::string rfspace_source_c::get_antenna( size_t chan )
double rfspace_source_c::set_bandwidth( double bandwidth, size_t chan )
{
if ( RFSPACE_SDR_IQ == _radio ||
- RFSPACE_CLOUDIQ == _radio) /* not supported by SDR-IQ or Cloud-IQ */
+ RFSPACE_CLOUDIQ == _radio ||
+ RFSPACE_CLOUDSDR == _radio) /* not supported by SDR-IQ, Cloud-IQ, or CloudSDR */
return 0.0f;
/* SDR-IP 4.2.5 RF Filter Selection */
diff --git a/lib/rfspace/rfspace_source_c.h b/lib/rfspace/rfspace_source_c.h
index 996f47b..8bd2f11 100644
--- a/lib/rfspace/rfspace_source_c.h
+++ b/lib/rfspace/rfspace_source_c.h
@@ -130,7 +130,8 @@ private: /* members */
RFSPACE_SDR_IQ,
RFSPACE_SDR_IP,
RFSPACE_NETSDR,
- RFSPACE_CLOUDIQ
+ RFSPACE_CLOUDIQ,
+ RFSPACE_CLOUDSDR
};
radio_type _radio;
diff --git a/lib/source_impl.cc b/lib/source_impl.cc
index 71f8017..392255f 100644
--- a/lib/source_impl.cc
+++ b/lib/source_impl.cc
@@ -186,6 +186,7 @@ source_impl::source_impl( const std::string &args )
dev_types.push_back("sdr-ip");
dev_types.push_back("netsdr");
dev_types.push_back("cloudiq");
+ dev_types.push_back("cloudsdr");
#endif
for (std::string arg : arg_list) {
@@ -346,7 +347,8 @@ source_impl::source_impl( const std::string &args )
dict.count("sdr-iq") ||
dict.count("sdr-ip") ||
dict.count("netsdr") ||
- dict.count("cloudiq") ) {
+ dict.count("cloudiq") ||
+ dict.count("cloudsdr") ) {
rfspace_source_c_sptr src = make_rfspace_source_c( arg );
block = src; iface = src.get();
}