discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Adding uhd-style tags, to soapy driver?


From: Jeff Long
Subject: Re: Adding uhd-style tags, to soapy driver?
Date: Tue, 19 Oct 2021 06:26:59 -0400

The timestamp in gr-uhd is useful because a USRP can provide the exact start/restart time of a sample stream, based on a GPSDO. A system timestamp at the call to work() is not quite as useful. I'd suggest that a "timestamp first sample" block would do the same thing, and would be usable for sources other than gr-soapy, too.

Our workflow uses pull requests on Github. A short diff like this in email is fine as a question, but submitting a PR works better for us.

On Mon, Oct 18, 2021 at 6:33 PM Bailey, Josh <josh@vandervecken.com> wrote:
Hi all,

The gr-uhd driver, tags samples when center frequency changes and some other events):

https://github.com/gnuradio/gnuradio/blob/8b23f906844c9784c784934ae06dfdfe10d31a1f/gr-uhd/lib/usrp_source_impl.cc#L619

I've been able to make a minimal patch to the soapy driver (see following), that does the same thing for all other SDRs supported by soapy (the patch is for proof of concept/illustrative purposes only - I appreciate that it isn't compatible with the contribution guidelines).

My question - would a suitable patch that provides these tags, be acceptable to the maintainers? I can appreciate that it's possible that there are flow graphs that just happen to use these same tags perhaps for other purposes - perhaps I could then add a flag to make them optional? In any case, the gr-uhd driver appears to always send them, already.

Thanks,

diff --git a/gr-soapy/lib/block_impl.h b/gr-soapy/lib/block_impl.h
index a1e95fdd0..74b2beffe 100644
--- a/gr-soapy/lib/block_impl.h
+++ b/gr-soapy/lib/block_impl.h
@@ -90,6 +90,7 @@ protected:
 public:
     bool start() override;
     bool stop() override;
+    bool _tag_now;
 
     /*** Begin public API implementation ***/
 
diff --git a/gr-soapy/lib/source_impl.cc b/gr-soapy/lib/source_impl.cc
index f76d4437f..93aa06bb2 100644
--- a/gr-soapy/lib/source_impl.cc
+++ b/gr-soapy/lib/source_impl.cc
@@ -47,6 +47,10 @@ source_impl::source_impl(const std::string& device,
 {
 }
 
+static const pmt::pmt_t TIME_KEY = pmt::string_to_symbol("rx_time");
+static const pmt::pmt_t FREQ_KEY = pmt::string_to_symbol("rx_freq");
+static const pmt::pmt_t RATE_KEY = pmt::string_to_symbol("rx_rate");
+
 int source_impl::general_work(int noutput_items,
                               __GR_ATTR_UNUSED gr_vector_int& ninput_items,
                               __GR_ATTR_UNUSED gr_vector_const_void_star& input_items,
@@ -57,6 +61,11 @@ int source_impl::general_work(int noutput_items,
     const long timeout_us = 500000; // 0.5 sec
     int nout = 0;
 
+    std::stringstream str;
+    str << name() << unique_id();
+    pmt::pmt_t _id = pmt::string_to_symbol(str.str());
+    std::time_t time_now = std::time(nullptr);
+
     for (;;) {
 
         // No command handlers while reading
@@ -66,6 +75,25 @@ int source_impl::general_work(int noutput_items,
             result = d_device->readStream(
                 d_stream, output_items.data(), noutput_items, flags, time_ns, timeout_us);
         }
+        if (_tag_now) {
+            _tag_now = false;
+            // create a timestamp pmt for the first sample
+            // TODO: use timestamp from radio hardware, and < 1s granularity?
+            const pmt::pmt_t val =
+                pmt::make_tuple(pmt::from_uint64(time_now),
+                                pmt::from_double(0));
+            // create a tag set for each channel
+            for (size_t i = 0; i < 1; i++) { // TODO: get actual number of channels.
+                this->add_item_tag(i, nitems_written(0), TIME_KEY, val, _id);
+                this->add_item_tag(
+                    i, nitems_written(0), RATE_KEY, pmt::from_double(this->get_sample_rate(i)), _id);
+                this->add_item_tag(i,
+                                   nitems_written(0),
+                                   FREQ_KEY,
+                                   pmt::from_double(this->get_frequency(i)),
+                                   _id);
+            }
+        }
 
         if (result >= 0) {
             nout = result;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]