summaryrefslogtreecommitdiff
path: root/usrp2/host/apps/rx_streaming_samples.cc
diff options
context:
space:
mode:
Diffstat (limited to 'usrp2/host/apps/rx_streaming_samples.cc')
-rw-r--r--usrp2/host/apps/rx_streaming_samples.cc373
1 files changed, 0 insertions, 373 deletions
diff --git a/usrp2/host/apps/rx_streaming_samples.cc b/usrp2/host/apps/rx_streaming_samples.cc
deleted file mode 100644
index 8479ae1b26..0000000000
--- a/usrp2/host/apps/rx_streaming_samples.cc
+++ /dev/null
@@ -1,373 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2007,2008 Free Software Foundation, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <usrp2/usrp2.h>
-#include <usrp2/strtod_si.h>
-#include <usrp2/copiers.h>
-#include <usrp2/rx_nop_handler.h>
-#include <gruel/realtime.h>
-#include <sys/time.h>
-#include <iostream>
-#include <cstdio>
-#include <string.h>
-#include <boost/scoped_ptr.hpp>
-#include <boost/shared_ptr.hpp>
-#include <stdexcept>
-#include <signal.h>
-
-static volatile bool signaled = false;
-
-static void
-sig_handler(int sig)
-{
- signaled = true;
-}
-
-static void
-install_sig_handler(int signum,
- void (*new_handler)(int))
-{
- struct sigaction new_action;
- memset (&new_action, 0, sizeof (new_action));
-
- new_action.sa_handler = new_handler;
- sigemptyset (&new_action.sa_mask);
- new_action.sa_flags = 0;
-
- if (sigaction (signum, &new_action, 0) < 0){
- perror ("sigaction (install new)");
- throw std::runtime_error ("sigaction");
- }
-}
-
-// ------------------------------------------------------------------------
-
-// FIXME make this a template
-
-class file_writer_16sc : public usrp2::rx_nop_handler
-{
- FILE *d_fp;
- std::string d_filename;
-
-public:
-
- file_writer_16sc(const std::string &filename, uint64_t max_samples)
- : usrp2::rx_nop_handler(max_samples), d_filename(filename)
- {
- d_fp = fopen(filename.c_str(), "wb");
- if (d_fp == 0){
- perror(filename.c_str());
- throw std::invalid_argument(filename);
- }
- }
-
- ~file_writer_16sc();
-
- bool
- operator()(const uint32_t *items, size_t nitems, const usrp2::rx_metadata *metadata)
- {
- bool ok = rx_nop_handler::operator()(items, nitems, metadata);
-
- size_t host_nitems = nitems;
- std::complex<int16_t> host_items[host_nitems];
-
- usrp2::copy_u2_16sc_to_host_16sc(nitems, items, host_items);
-
- size_t n = 0;
- while (n < host_nitems){
- size_t r = fwrite(&host_items[n], sizeof(host_items[0]), host_nitems - n, d_fp);
- n += r;
- if (r == 0){ // out of space?
- d_err = true;
- perror(d_filename.c_str());
- ok = false;
- break;
- }
- }
-
- return ok;
- }
-};
-
-file_writer_16sc::~file_writer_16sc()
-{
- fclose(d_fp);
-}
-
-// ------------------------------------------------------------------------
-
-class file_writer_32fc : public usrp2::rx_nop_handler
-{
- FILE *d_fp;
- std::string d_filename;
-
-public:
-
- file_writer_32fc(const std::string &filename, uint64_t max_samples)
- : usrp2::rx_nop_handler(max_samples), d_filename(filename)
- {
- d_fp = fopen(filename.c_str(), "wb");
- if (d_fp == 0){
- perror(filename.c_str());
- throw std::invalid_argument(filename);
- }
- }
-
- ~file_writer_32fc();
-
- bool
- operator()(const uint32_t *items, size_t nitems, const usrp2::rx_metadata *metadata)
- {
- bool ok = rx_nop_handler::operator()(items, nitems, metadata);
-
- size_t host_nitems = nitems;
- std::complex<float> host_items[host_nitems];
-
- usrp2::copy_u2_16sc_to_host_32fc(nitems, items, host_items);
-
- size_t n = 0;
- while (n < host_nitems){
- size_t r = fwrite(&host_items[n], sizeof(host_items[0]), host_nitems - n, d_fp);
- n += r;
- if (r == 0){ // out of space?
- d_err = true;
- perror(d_filename.c_str());
- ok = false;
- break;
- }
- }
-
- return ok;
- }
-};
-
-file_writer_32fc::~file_writer_32fc()
-{
- fclose(d_fp);
-}
-
-// ------------------------------------------------------------------------
-
-static void
-usage(const char *progname)
-{
- const char *p = strrchr(progname, '/'); // drop leading directory path
- if (p)
- p++;
-
- if (strncmp(p, "lt-", 3) == 0) // drop lt- libtool prefix
- p += 3;
-
- fprintf(stderr, "Usage: %s [options]\n\n", p);
- fprintf(stderr, "Options:\n");
- fprintf(stderr, " -h show this message and exit\n");
- fprintf(stderr, " -e ETH_INTERFACE specify ethernet interface [default=eth0]\n");
- fprintf(stderr, " -m MAC_ADDR mac address of USRP2 HH:HH [default=first one found]\n");
- fprintf(stderr, " -f FREQUENCY specify receive center frequency in Hz [default=0.0]\n");
- fprintf(stderr, " -d DECIM specify receive decimation rate [default=5]\n");
- fprintf(stderr, " -g GAIN specify receive daughterboard gain [default=0]\n");
- fprintf(stderr, " -N NSAMPLES specify number of samples to receive [default=infinite]\n");
- fprintf(stderr, " -o OUTPUT_FILENAME specify file to receive samples [default=none]\n");
- fprintf(stderr, " -s write complex<short> [default=complex<float>]\n");
- fprintf(stderr, " -v verbose output\n");
-}
-
-int
-main(int argc, char **argv)
-{
- // options and their defaults
- const char *interface = "eth0";
- const char *mac_addr_str = "";
- double rx_freq = 0.0;
- int rx_decim = 5;
- double rx_gain = 0.0;
- uint64_t nsamples = 0;
- bool output_shorts = false;
- char *output_filename = 0;
- bool verbose = false;
-
- int ch;
-
- while ((ch = getopt(argc, argv, "he:m:f:d:g:N:o:sv")) != EOF){
- double tmp;
- switch (ch){
-
- case 'e':
- interface = optarg;
- break;
-
- case 'm':
- mac_addr_str = optarg;
- break;
-
- case 'f':
- if (!strtod_si(optarg, &rx_freq)) {
- std::cerr << "invalid number: " << optarg << std::endl;
- usage(argv[0]);
- exit(1);
- }
- break;
-
- case 'g':
- if (!strtod_si(optarg, &rx_gain)) {
- std::cerr << "invalid number: " << optarg << std::endl;
- usage(argv[0]);
- exit(1);
- }
- break;
-
- case 'd':
- rx_decim = strtol(optarg, 0, 0);
- if (rx_decim < 4 or rx_decim > 512) {
- std::cerr << "invalid decimation rate: " << optarg << std::endl;
- usage(argv[0]);
- exit(1);
- }
- break;
-
- case 'N':
- if (!strtod_si(optarg, &tmp)) {
- std::cerr << "invalid number: " << optarg << std::endl;
- usage(argv[0]);
- exit(1);
- }
- nsamples = static_cast<uint64_t>(tmp);
- break;
-
- case 's':
- output_shorts = true;
- break;
-
- case 'o':
- output_filename = optarg;
- break;
-
- case 'v':
- verbose = true;
- break;
-
- case 'h':
- default:
- usage(argv[0]);
- exit(1);
- }
- }
-
-
- install_sig_handler(SIGINT, sig_handler);
-
- usrp2::rx_nop_handler::sptr handler;
-
- if (output_filename){
- if (output_shorts)
- handler = usrp2::rx_nop_handler::sptr(new file_writer_16sc(output_filename, nsamples));
- else
- handler = usrp2::rx_nop_handler::sptr(new file_writer_32fc(output_filename, nsamples));
- }
- else
- handler = usrp2::rx_nop_handler::sptr(new usrp2::rx_nop_handler(nsamples));
-
- gruel::rt_status_t rt = gruel::enable_realtime_scheduling();
- if (rt != gruel::RT_OK)
- std::cerr << "Failed to enable realtime scheduling" << std::endl;
-
- usrp2::usrp2::sptr u2 = usrp2::usrp2::make(interface, mac_addr_str);
-
- // FIXME in case it was left running...
- if (!u2->stop_rx_streaming()){
- fprintf(stderr, "stop_rx_streaming failed\n");
- }
-
- if (!u2->set_rx_gain(rx_gain)){
- fprintf(stderr, "set_rx_gain(%f) failed\n", rx_gain);
- exit(1);
- }
-
- usrp2::tune_result tr;
- if (!u2->set_rx_center_freq(rx_freq, &tr)){
- fprintf(stderr, "set_rx_center_freq(%g) failed\n", rx_freq);
- exit(1);
- }
-
- if (verbose){
- printf("USRP2 MAC address: %s\n\n", u2->mac_addr().c_str());
- printf("Daughterboard configuration:\n");
- printf(" baseband_freq=%f\n", tr.baseband_freq);
- printf(" ddc_freq=%f\n", tr.dxc_freq);
- printf(" residual_freq=%f\n", tr.residual_freq);
- printf(" inverted=%s\n\n", tr.spectrum_inverted ? "yes" : "no");
- }
-
- if (!u2->set_rx_decim(rx_decim)) {
- fprintf(stderr, "set_rx_decim(%d) failed\n", rx_decim);
- exit(1);
- }
-
- if (verbose)
- printf("USRP2 using decimation rate of %d\n", rx_decim);
-
- if (!u2->start_rx_streaming(0)){
- fprintf(stderr, "start_rx_streaming failed\n");
- exit(1);
- }
-
- if (verbose) {
- if (nsamples > 0)
- printf("Receiving %zd samples\n\n", nsamples);
- else
- printf("Receiving infinite samples\n\n");
- }
-
- struct timeval start, end;
- gettimeofday(&start, 0);
-
- while (!signaled &&
- !handler->has_errored_p() &&
- !handler->has_finished_p()) {
- bool ok = u2->rx_samples(0, handler.get());
- if (!ok){
- fprintf(stderr, "u2->rx_samples failed\n");
- return 1;
- }
- }
-
- gettimeofday(&end, 0);
- long n_usecs = end.tv_usec-start.tv_usec;
- long n_secs = end.tv_sec-start.tv_sec;
- double elapsed = (double)n_secs + (double)n_usecs*1e-6;
- double mbs = handler->nsamples()*sizeof(uint32_t)/elapsed/1e6;
- double pps = handler->nframes()/elapsed;
-
- u2->stop_rx_streaming();
-
- if (verbose){
- printf("\nCopy handler called %li times.\n", handler->nframes());
- printf("Copy handler called with %li bytes.\n\n", handler->nsamples()*sizeof(uint32_t));
- printf("Elapsed time was %5.3f seconds.\n", elapsed);
- printf("Packet rate was %1.0f pkts/sec.\n", pps);
- printf("Approximate throughput was %5.2f MB/sec.\n", mbs);
- printf("Total instances of overruns was %d.\n", u2->rx_overruns());
- printf("Total missing frames was %d.\n", u2->rx_missing());
- }
-
- return 0;
-}