commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r8478 - in usrp2/branches/developers/jcorgan/u2/host:


From: jcorgan
Subject: [Commit-gnuradio] r8478 - in usrp2/branches/developers/jcorgan/u2/host: gr-usrp2 lib
Date: Wed, 21 May 2008 17:49:53 -0600 (MDT)

Author: jcorgan
Date: 2008-05-21 17:49:52 -0600 (Wed, 21 May 2008)
New Revision: 8478

Modified:
   usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_base.cc
   usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_c.cc
   usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.cc
   usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.h
   usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.cc
   usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.h
Log:
Wip.  Successfully streaming RX data through buffered reads into Python GR 
application and recording to disk.  Endianness is not handled yet.

Modified: 
usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_base.cc
===================================================================
--- usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_base.cc     
2008-05-21 22:47:15 UTC (rev 8477)
+++ usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_base.cc     
2008-05-21 23:49:52 UTC (rev 8478)
@@ -130,12 +130,14 @@
                        gr_vector_const_void_star &input_items,
                        gr_vector_void_star &output_items)
 {
-  // copy_from_usrp2_buffer(buffer, output_items[0], n);
+  if (USRP2_SOURCE_BASE_DEBUG)
+    ::write(1, "w", 1);
 
-  int n = noutput_items; //dummy
+  uint32_t buffer[SAMPLES_PER_PACKET];
+  uint32_t flags = 0; // In the streaming mode that gr-usrp2 uses, these are 
ignored
 
-  if (USRP2_SOURCE_BASE_DEBUG)
-    ::write(1, ".", 1);
+  int n = d_u2->rx_samples(std::min(noutput_items, SAMPLES_PER_PACKET), 
buffer, &flags);
+  copy_from_usrp2_buffer(buffer, output_items[0], n);
 
   return n;
 }

Modified: usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_c.cc
===================================================================
--- usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_c.cc        
2008-05-21 22:47:15 UTC (rev 8477)
+++ usrp2/branches/developers/jcorgan/u2/host/gr-usrp2/usrp2_source_c.cc        
2008-05-21 23:49:52 UTC (rev 8478)
@@ -56,8 +56,8 @@
 {
   gr_complex *out = (gr_complex *)dst;
   for (int i = 0; i < nsamples; i++) {
-    float re = (signed short int)((src[i] & 0xFFFF0000) >> 16);
-    float im = (signed short int)(src[i] & 0x0000FFFF);
+    float re = (int16_t)(src[i] >> 16);
+    float im = (int16_t)(src[i] & 0xFFFF);
     *out++ = gr_complex(re, im); 
   }
 }

Modified: usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.cc
===================================================================
--- usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.cc      
2008-05-21 22:47:15 UTC (rev 8477)
+++ usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.cc      
2008-05-21 23:49:52 UTC (rev 8478)
@@ -21,13 +21,16 @@
 #endif
 
 #include "sample_buffer.h"
+#include <usrp2_eth_packet.h>
 #include <cstdio>
+#include <cassert>
 
 #define SAMPLE_BUFFER_DEBUG 0
 
 sample_buffer::sample_buffer(size_t nsamples, size_t ndescs)
   : d_samples(nsamples), 
     d_descs(ndescs),
+    d_rx_remainder(0),
     d_not_empty(&d_mutex), 
     d_not_full(&d_mutex)
 {
@@ -36,13 +39,56 @@
 void
 sample_buffer::write(size_t nsamples, const uint32_t *samples, uint32_t flags)
 {
-  if (SAMPLE_BUFFER_DEBUG)
-    printf("sample_buffer::write(%li, %0X, %08X)\n", nsamples, samples, flags);
+  omni_mutex_lock l(d_mutex);
+  
+  while (is_full_p())
+    d_not_full.wait();
+
+  sample_desc_t desc;
+  desc.nsamples = nsamples;
+  desc.flags = flags;
+  d_descs.write(1, &desc);
+  d_samples.write(nsamples, samples);
+
+  ::write(1, "e", 1); // enqueued
+  d_not_empty.signal();
 }
 
 size_t
-sample_buffer::read(uint32_t *samples, size_t nmax, uint32_t *flags)
+sample_buffer::read(size_t nmax, uint32_t *samples, uint32_t *flags)
 {
-  if (SAMPLE_BUFFER_DEBUG)
-    printf("sample_buffer::read(%0X, %li, %08X)\n", samples, nmax, flags);
+  size_t count = 0, n = 0;
+  
+  while (count < nmax) {
+    omni_mutex_lock l(d_mutex);
+    while (is_empty_p())
+      d_not_empty.wait();
+
+    // Try to read from leftover from last descriptor
+    if (d_rx_remainder > 0) {
+      n = std::min(d_rx_remainder, nmax-count);
+      d_rx_remainder -= n;
+      ::write(1, "p", 1); // partial read
+    }
+    else {
+      // Grab a descriptor out of the queue
+      sample_desc_t desc;
+      d_descs.read(1, &desc);
+      n = std::min(nmax-count, desc.nsamples);
+      d_rx_remainder = desc.nsamples-n;
+      if (flags)
+        *flags |= desc.flags;
+      ::write(1, "d", 1); // dequeue
+    }
+    
+    d_samples.read(n, &samples[count]);
+    count += n;
+
+    d_not_full.signal();
+
+    if (flags && (*flags & U2P_TX_END_OF_BURST))
+       return count;
+  }
+
+  return count;
 }

Modified: usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.h
===================================================================
--- usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.h       
2008-05-21 22:47:15 UTC (rev 8477)
+++ usrp2/branches/developers/jcorgan/u2/host/lib/sample_buffer.h       
2008-05-21 23:49:52 UTC (rev 8478)
@@ -34,7 +34,8 @@
 private:
   ring_buffer<uint32_t> d_samples;
   ring_buffer<sample_desc_t> d_descs;
-
+  size_t d_rx_remainder;
+  
   omni_mutex d_mutex;
   omni_condition d_not_empty;
   omni_condition d_not_full;
@@ -61,12 +62,13 @@
    * Returns number of samples read and places the OR of the associated flags
    * into the 'flags' parameter, if not NULL.
    */
-  size_t read(uint32_t *samples, size_t nmax, uint32_t *flags);
+  size_t read(size_t nmax, uint32_t *samples, uint32_t *flags);
 
   /*!
    * Returns true if there are no samples available for reading.
    */
-  bool is_empty_p() const { return d_descs.items_available() == 0; }
+  bool is_empty_p() const { return d_rx_remainder == 0 && 
+                                   d_descs.items_available() == 0; }
   
   /*!
    * Returns true if there is either no space available for samples OR there

Modified: usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.cc
===================================================================
--- usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.cc        
2008-05-21 22:47:15 UTC (rev 8477)
+++ usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.cc        
2008-05-21 23:49:52 UTC (rev 8478)
@@ -890,7 +890,7 @@
       return;
     } 
     else if (len == 0) {
-      ::write(1, "Z", 1); // no more frames
+      ::write(1, "|", 1); // no more frames
       return;
     }
     else if ((size_t)len < sizeof(u2_eth_packet_t)) {
@@ -921,3 +921,7 @@
 {
 }
 
+size_t usrp2_basic::rx_samples(size_t nmax, uint32_t *samples, uint32_t *flags)
+{
+  return d_rx_samples.read(nmax, samples, flags);
+}

Modified: usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.h
===================================================================
--- usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.h 2008-05-21 
22:47:15 UTC (rev 8477)
+++ usrp2/branches/developers/jcorgan/u2/host/lib/usrp2_basic.h 2008-05-21 
23:49:52 UTC (rev 8478)
@@ -190,6 +190,14 @@
 
 
   /*!
+   * Receive at most nmax samples.  Returns number of samples actually read,
+   * and places the OR of the sample ranges into the flags variable.
+   *
+   * FIXME: multiple channels
+   */
+  size_t rx_samples(size_t nmax, uint32_t *samples, uint32_t *flags);
+
+  /*!
    * \brief Read FPGA's idea of time
    *
    * N.B., this interface will probably change.
@@ -209,7 +217,6 @@
 
   //! Return D/A sample rate
   long dac_rate() const { return fpga_master_clock_freq(); }
-
 };
 
 std::ostream& operator<<(std::ostream &os, const op_id_reply_t &x);





reply via email to

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