aboutsummaryrefslogtreecommitdiffstats
path: root/host/examples
diff options
context:
space:
mode:
Diffstat (limited to 'host/examples')
-rw-r--r--host/examples/rx_samples_to_file.cpp39
1 files changed, 24 insertions, 15 deletions
diff --git a/host/examples/rx_samples_to_file.cpp b/host/examples/rx_samples_to_file.cpp
index 130009851..79f90c1ab 100644
--- a/host/examples/rx_samples_to_file.cpp
+++ b/host/examples/rx_samples_to_file.cpp
@@ -36,8 +36,10 @@ template<typename samp_type> void recv_to_file(
uhd::usrp::multi_usrp::sptr usrp,
const std::string &cpu_format,
const std::string &file,
- size_t samps_per_buff
+ size_t samps_per_buff,
+ int num_requested_samples
){
+ int num_total_samps = 0;
//create a receive streamer
uhd::stream_args_t stream_args(cpu_format);
uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);
@@ -47,10 +49,23 @@ template<typename samp_type> void recv_to_file(
std::ofstream outfile(file.c_str(), std::ofstream::binary);
bool overflow_message = true;
- while(not stop_signal_called){
- size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md);
+ //setup streaming
+ uhd::stream_cmd_t stream_cmd((num_requested_samples == 0)?
+ uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
+ uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
+ );
+ stream_cmd.num_samps = num_requested_samples;
+ stream_cmd.stream_now = true;
+ stream_cmd.time_spec = uhd::time_spec_t();
+ usrp->issue_stream_cmd(stream_cmd);
- if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) break;
+ while(not stop_signal_called and (num_requested_samples != num_total_samps or num_requested_samples == 0)){
+ size_t num_rx_samps = rx_stream->recv(&buff.front(), buff.size(), md, 3.0);
+
+ if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT) {
+ std::cout << boost::format("Timeout while streaming") << std::endl;
+ break;
+ }
if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_OVERFLOW){
if (overflow_message){
overflow_message = false;
@@ -70,6 +85,8 @@ template<typename samp_type> void recv_to_file(
) % md.error_code));
}
+ num_total_samps += num_rx_samps;
+
outfile.write((const char*)&buff.front(), num_rx_samps*sizeof(samp_type));
}
@@ -181,23 +198,15 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
UHD_ASSERT_THROW(ref_locked.to_bool());
}
- //setup streaming
- uhd::stream_cmd_t stream_cmd((total_num_samps == 0)?
- uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS:
- uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE
- );
- stream_cmd.num_samps = total_num_samps;
- stream_cmd.stream_now = true;
- usrp->issue_stream_cmd(stream_cmd);
if (total_num_samps == 0){
std::signal(SIGINT, &sig_int_handler);
std::cout << "Press Ctrl + C to stop streaming..." << std::endl;
}
//recv to file
- if (type == "double") recv_to_file<std::complex<double> >(usrp, "fc64", file, spb);
- else if (type == "float") recv_to_file<std::complex<float> >(usrp, "fc32", file, spb);
- else if (type == "short") recv_to_file<std::complex<short> >(usrp, "sc16", file, spb);
+ if (type == "double") recv_to_file<std::complex<double> >(usrp, "fc64", file, spb, total_num_samps);
+ else if (type == "float") recv_to_file<std::complex<float> >(usrp, "fc32", file, spb, total_num_samps);
+ else if (type == "short") recv_to_file<std::complex<short> >(usrp, "sc16", file, spb, total_num_samps);
else throw std::runtime_error("Unknown type " + type);
//finished