diff options
author | Mike McCarrick <mike.mccarrick@gmail.com> | 2022-12-28 19:41:32 +0100 |
---|---|---|
committer | Eric Wild <ewild@sysmocom.de> | 2022-12-28 20:00:26 +0100 |
commit | 82d6b6db78c829ddf7511826bd2b64be2bc189d5 (patch) | |
tree | dffcb7c83791938d0cac450a3c05ffc1223d4ed6 | |
parent | d75ccf8248e895efcd877fb51f9872a2204b978c (diff) |
Add support for RFSpace CloudSDR to gr-osmosdrv0.2.4
Signed-off-by: Eric Wild <ewild@sysmocom.de>
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | lib/rfspace/rfspace_source_c.cc | 40 | ||||
-rw-r--r-- | lib/rfspace/rfspace_source_c.h | 3 | ||||
-rw-r--r-- | lib/source_impl.cc | 4 |
4 files changed, 40 insertions, 9 deletions
@@ -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(); } |