aboutsummaryrefslogtreecommitdiffstats
path: root/src/OutputUHDFeedback.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/OutputUHDFeedback.cpp')
-rw-r--r--src/OutputUHDFeedback.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/OutputUHDFeedback.cpp b/src/OutputUHDFeedback.cpp
index 09b73ba..3ef5648 100644
--- a/src/OutputUHDFeedback.cpp
+++ b/src/OutputUHDFeedback.cpp
@@ -138,6 +138,8 @@ void OutputUHDFeedback::ReceiveBurstThread()
if (not m_running) break;
+ etiLog.level(debug) << "Prepare RX stream command for " << burstRequest.num_samples;
+
uhd::stream_cmd_t cmd(
uhd::stream_cmd_t::stream_mode_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
cmd.num_samps = burstRequest.num_samples;
@@ -146,16 +148,28 @@ void OutputUHDFeedback::ReceiveBurstThread()
double pps = burstRequest.rx_pps / 16384000.0;
cmd.time_spec = uhd::time_spec_t(burstRequest.rx_second, pps);
+ const double usrp_time = m_usrp->get_time_now().get_real_secs();
+ const double cmd_time = cmd.time_spec.get_real_secs();
+
+ etiLog.level(debug) <<
+ "RX stream command ts=" << std::fixed << cmd_time << " Delta=" << cmd_time - usrp_time;
+
rxStream->issue_stream_cmd(cmd);
uhd::rx_metadata_t md;
burstRequest.rx_samples.resize(burstRequest.num_samples * sizeof(complexf));
- rxStream->recv(&burstRequest.rx_samples[0], burstRequest.num_samples, md);
+ size_t samples_read = rxStream->recv(&burstRequest.rx_samples[0], burstRequest.num_samples, md);
+ assert(samples_read <= burstRequest.num_samples);
+ burstRequest.rx_samples.resize(samples_read * sizeof(complexf));
// The recv might have happened at another time than requested
burstRequest.rx_second = md.time_spec.get_full_secs();
burstRequest.rx_pps = md.time_spec.get_frac_secs() * 16384000.0;
+ etiLog.level(debug) << "Read " << samples_read << " RX feedback samples "
+ << "at time " << std::fixed << burstRequest.tx_second << "." <<
+ burstRequest.tx_pps / 16384000.0;
+
burstRequest.state = BurstRequestState::Acquired;
lock.unlock();
@@ -258,6 +272,11 @@ void OutputUHDFeedback::ServeFeedbackThread()
burstRequest.state = BurstRequestState::None;
lock.unlock();
+ burstRequest.num_samples = std::min(burstRequest.num_samples,
+ std::min(
+ burstRequest.tx_samples.size() / sizeof(complexf),
+ burstRequest.rx_samples.size() / sizeof(complexf)));
+
if (send(client_sock,
&burstRequest.num_samples,
sizeof(burstRequest.num_samples),
@@ -287,7 +306,7 @@ void OutputUHDFeedback::ServeFeedbackThread()
const size_t frame_bytes = burstRequest.num_samples * sizeof(complexf);
- assert(burstRequest.tx_samples.size() == frame_bytes);
+ assert(burstRequest.tx_samples.size() >= frame_bytes);
if (send(client_sock,
&burstRequest.tx_samples[0],
frame_bytes,
@@ -315,7 +334,7 @@ void OutputUHDFeedback::ServeFeedbackThread()
break;
}
- assert(burstRequest.rx_samples.size() == frame_bytes);
+ assert(burstRequest.rx_samples.size() >= frame_bytes);
if (send(client_sock,
&burstRequest.rx_samples[0],
frame_bytes,