[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r8478 - in usrp2/branches/developers/jcorgan/u2/host: gr-usrp2 lib,
jcorgan <=