aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rfspace/rfspace_source_c.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rfspace/rfspace_source_c.cc')
-rw-r--r--lib/rfspace/rfspace_source_c.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/rfspace/rfspace_source_c.cc b/lib/rfspace/rfspace_source_c.cc
index f9c587d..74708c6 100644
--- a/lib/rfspace/rfspace_source_c.cc
+++ b/lib/rfspace/rfspace_source_c.cc
@@ -475,6 +475,16 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
set_sample_rate( 240000 );
set_bandwidth( 0 );
}
+
+ /* start TCP keepalive thread */
+ if ( RFSPACE_NETSDR == _radio ||
+ RFSPACE_SDR_IP == _radio ||
+ RFSPACE_CLOUDIQ == _radio )
+ {
+ _run_tcp_keepalive_task = true;
+ _thread = gr::thread::thread( boost::bind(&rfspace_source_c::tcp_keepalive_task, this) );
+ }
+
#if 0
std::cerr << "sample_rates: " << get_sample_rates().to_pp_string() << std::endl;
std::cerr << "sample rate: " << (uint32_t)get_sample_rate() << std::endl;
@@ -505,6 +515,12 @@ rfspace_source_c::~rfspace_source_c ()
_thread.join();
}
+ else
+ {
+ _run_tcp_keepalive_task = false;
+ _thread.interrupt();
+ _thread.join();
+ }
close(_usb);
@@ -580,6 +596,8 @@ bool rfspace_source_c::transaction( const unsigned char *cmd, size_t size,
}
else
{
+ boost::mutex::scoped_lock lock(_tcp_lock);
+
#ifdef USE_ASIO
_t.write_some( boost::asio::buffer(cmd, size) );
@@ -730,6 +748,22 @@ void rfspace_source_c::usb_read_task()
}
}
+/* send periodic status requests to keep TCP connection alive */
+void rfspace_source_c::tcp_keepalive_task()
+{
+ std::vector< unsigned char > response;
+ unsigned char status_pkt[] = { 0x04, 0x20, 0x05, 0x00 };
+
+ if ( -1 == _tcp )
+ return;
+
+ while ( _run_tcp_keepalive_task )
+ {
+ boost::this_thread::sleep_for(boost::chrono::seconds(60));
+ transaction( status_pkt, sizeof(status_pkt), response );
+ }
+}
+
bool rfspace_source_c::start()
{
_sequence = 0;