summaryrefslogtreecommitdiff
path: root/gr-uhd/lib/usrp_sink_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-uhd/lib/usrp_sink_impl.cc')
-rw-r--r--gr-uhd/lib/usrp_sink_impl.cc61
1 files changed, 59 insertions, 2 deletions
diff --git a/gr-uhd/lib/usrp_sink_impl.cc b/gr-uhd/lib/usrp_sink_impl.cc
index 2b393443c4..92ff805191 100644
--- a/gr-uhd/lib/usrp_sink_impl.cc
+++ b/gr-uhd/lib/usrp_sink_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2010-2016 Free Software Foundation, Inc.
+ * Copyright 2010-2016,2018 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -47,13 +47,20 @@ namespace gr {
io_signature::make(0, 0, 0)),
usrp_block_impl(device_addr, stream_args, length_tag_name),
_length_tag_key(length_tag_name.empty() ? pmt::PMT_NIL : pmt::string_to_symbol(length_tag_name)),
- _nitems_to_send(0)
+ _nitems_to_send(0),
+ _async_event_loop_running(true)
{
+ message_port_register_out(ASYNC_MSGS_PORT_KEY);
+ _async_event_thread = gr::thread::thread([this](){
+ this->async_event_loop();
+ });
_sample_rate = get_samp_rate();
}
usrp_sink_impl::~usrp_sink_impl()
{
+ _async_event_loop_running = false;
+ _async_event_thread.join();
}
::uhd::dict<std::string, std::string>
@@ -702,5 +709,55 @@ namespace gr {
#endif /* GR_CTRLPORT */
}
+ void
+ usrp_sink_impl::async_event_loop()
+ {
+ typedef ::uhd::async_metadata_t md_t;
+ md_t metadata;
+
+ while(_async_event_loop_running) {
+ while(!_dev->get_device()->recv_async_msg(metadata, 0.1)) {
+ if(!_async_event_loop_running){
+ return;
+ }
+ }
+
+ pmt::pmt_t event_list = pmt::PMT_NIL;
+
+ if(metadata.event_code & md_t::EVENT_CODE_BURST_ACK){
+ event_list = pmt::list_add(event_list, BURST_ACK_KEY);
+ }
+ if(metadata.event_code & md_t::EVENT_CODE_UNDERFLOW){
+ event_list = pmt::list_add(event_list, UNDERFLOW_KEY);
+ }
+ if(metadata.event_code & md_t::EVENT_CODE_UNDERFLOW_IN_PACKET){
+ event_list = pmt::list_add(event_list, UNDERFLOW_IN_PACKET_KEY);
+ }
+ if(metadata.event_code & md_t::EVENT_CODE_SEQ_ERROR){
+ event_list = pmt::list_add(event_list, SEQ_ERROR_KEY);
+ }
+ if(metadata.event_code & md_t::EVENT_CODE_SEQ_ERROR_IN_BURST){
+ event_list = pmt::list_add(event_list, SEQ_ERROR_IN_BURST_KEY);
+ }
+ if(metadata.event_code & md_t::EVENT_CODE_TIME_ERROR){
+ event_list = pmt::list_add(event_list, TIME_ERROR_KEY);
+ }
+
+ if(!pmt::eq(event_list, pmt::PMT_NIL)){
+ pmt::pmt_t value = pmt::dict_add(pmt::make_dict(), EVENT_CODE_KEY, event_list);
+ if(metadata.has_time_spec){
+ pmt::pmt_t time_spec = pmt::cons(
+ pmt::from_long(metadata.time_spec.get_full_secs()),
+ pmt::from_double(metadata.time_spec.get_frac_secs())
+ );
+ value = pmt::dict_add(value, TIME_SPEC_KEY, time_spec);
+ }
+ value = pmt::dict_add(value, CHANNEL_KEY, pmt::from_uint64(metadata.channel));
+ pmt::pmt_t msg = pmt::cons(ASYNC_MSG_KEY, value);
+ message_port_pub(ASYNC_MSGS_PORT_KEY, msg);
+ }
+ }
+ }
+
} /* namespace uhd */
} /* namespace gr */