diff options
author | Johnathan Corgan | 2009-10-27 12:01:41 -0700 |
---|---|---|
committer | Johnathan Corgan | 2009-10-27 12:01:41 -0700 |
commit | 029f89047d0ccd61347e1cd5d87e276b33332d18 (patch) | |
tree | 44bdce84ed3aab3b44458ee690cdef310aa2b567 /vrt/apps | |
parent | b4dce8e6a46af1ced503ca662b3c46f88e257db1 (diff) | |
parent | 2b2b9179272eacdd82c9c2d6d9c2a9a77a97d2c2 (diff) | |
download | gnuradio-029f89047d0ccd61347e1cd5d87e276b33332d18.tar.gz gnuradio-029f89047d0ccd61347e1cd5d87e276b33332d18.tar.bz2 gnuradio-029f89047d0ccd61347e1cd5d87e276b33332d18.zip |
Merge branch 'vrt' of http://gnuradio.org/git/jblum
Merge-fix: remove simple_rx_samples
Merge-fix: remove grc_gr_vrt.m4 from Makefile.am
* 'vrt' of http://gnuradio.org/git/jblum:
removed gr-vrt
removed caldiv stuff from gr-vrt
removed MOST of the quadradio specific stuff
install header for missing pkt checker
Diffstat (limited to 'vrt/apps')
-rw-r--r-- | vrt/apps/.gitignore | 2 | ||||
-rw-r--r-- | vrt/apps/Makefile.am | 18 | ||||
-rw-r--r-- | vrt/apps/simple_rx_samples.cc | 394 |
3 files changed, 1 insertions, 413 deletions
diff --git a/vrt/apps/.gitignore b/vrt/apps/.gitignore index a8e9f886f..dab7a7fd6 100644 --- a/vrt/apps/.gitignore +++ b/vrt/apps/.gitignore @@ -2,4 +2,4 @@ Makefile Makefile.in .deps .libs -simple_rx_samples + diff --git a/vrt/apps/Makefile.am b/vrt/apps/Makefile.am index 631d9020b..45772055b 100644 --- a/vrt/apps/Makefile.am +++ b/vrt/apps/Makefile.am @@ -16,21 +16,3 @@ # include $(top_srcdir)/Makefile.common - -AM_CPPFLAGS = \ - $(VRT_INCLUDES) \ - $(STD_DEFINES_AND_INCLUDES) \ - $(CPPUNIT_INCLUDES) - -LDADD = \ - $(VRT_LA) \ - $(GRUEL_LA) - - -bin_PROGRAMS = - -noinst_PROGRAMS = \ - simple_rx_samples - -simple_rx_samples_SOURCES = simple_rx_samples.cc - diff --git a/vrt/apps/simple_rx_samples.cc b/vrt/apps/simple_rx_samples.cc deleted file mode 100644 index 08f01c9cc..000000000 --- a/vrt/apps/simple_rx_samples.cc +++ /dev/null @@ -1,394 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio 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, or (at your option) - * any later version. - * - * GNU Radio 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <vrt/quadradio.h> -#include <vrt/rx.h> -#include <vrt/copiers.h> - -#include <errno.h> -#include <iostream> -#include <boost/scoped_ptr.hpp> -#include <boost/shared_ptr.hpp> -#include <stdexcept> -#include <signal.h> -#include <unistd.h> -#include <stdint.h> -#include <stdio.h> -#include <string.h> -#include <gruel/realtime.h> -#include <complex> - -#define MIN_IP_LOCAL_PORT 32768 -#define MAX_IP_LOCAL_PORT 61000 - -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"); - } -} - -// ------------------------------------------------------------------------ - -class rx_nop_handler : public vrt::rx_packet_handler -{ -private: - uint64_t d_max_samples; - uint64_t d_max_quantum; - uint64_t d_nsamples; - uint64_t d_npackets; - int d_last_pkt_cnt; - uint64_t d_nwrong_pkt_cnt; - -protected: - bool d_err; - -public: - - // Shared pointer to an instance of this class - typedef boost::shared_ptr<rx_nop_handler> sptr; - - /*! - * Constructor - * - * \param max_samples Maximum number of samples to copy. Use zero for no maximum. - * \param max_quantum Maximum number of samples required to accept in one call. - * Use 0 to indicate no maximum. - */ - rx_nop_handler(uint64_t max_samples, uint64_t max_quantum=0) - : d_max_samples(max_samples), d_max_quantum(max_quantum), - d_nsamples(0), d_npackets(0), - d_last_pkt_cnt(0xf), d_nwrong_pkt_cnt(0), - d_err(false){} - - - ~rx_nop_handler(); - - bool operator()(const uint32_t *payload, - size_t n32_bit_words, - const vrt::expanded_header *hdr); - - /*! - * \brief Returns number of packets this copier was called with - */ - uint64_t npackets() const { return d_npackets; } - - /*! - * \brief Returns actual number of samples copied - */ - uint64_t nsamples() const { return d_nsamples; } - - /*! - * \brief Returns maximum number of samples that will be copied - */ - uint64_t max_samples() const { return d_max_samples; } - - /*! - * Returns true if an error has occurred. Derived classes must set d_err to true - * when an error occurs in the () operator - */ - bool has_errored_p() const { return d_err; } - - /*! - * \brief Returns true if this instance has reached the maximum number of samples - */ - bool has_finished_p() const - { return d_max_samples == 0 ? false : d_nsamples >= d_max_samples-d_max_quantum; } - - uint64_t nwrong_pkt_cnt() const { return d_nwrong_pkt_cnt; } - - -}; - - -rx_nop_handler::~rx_nop_handler() -{ -} - -bool -rx_nop_handler::operator()(const uint32_t *payload, - size_t n32_bit_words, - const vrt::expanded_header *hdr) -{ - if (d_npackets != 0 && hdr->pkt_cnt() != ((d_last_pkt_cnt + 1) & 0xf)){ - d_nwrong_pkt_cnt++; - fprintf(stderr, "bad cnt (pkt %lld)\n", d_npackets); - } - d_last_pkt_cnt = hdr->pkt_cnt(); - - d_nsamples += n32_bit_words; - d_npackets++; - - return !has_finished_p(); -} - -// ------------------------------------------------------------------------ - -class file_writer_16sc : public rx_nop_handler -{ - FILE *d_fp; - std::string d_filename; - -public: - - file_writer_16sc(const std::string &filename, uint64_t max_samples) - : 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 vrt::expanded_header *hdr) - { - bool ok = rx_nop_handler::operator()(items, nitems, hdr); - - size_t host_nitems = nitems; - std::complex<int16_t> host_items[host_nitems]; - - vrt::copy_net_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 rx_nop_handler -{ - FILE *d_fp; - std::string d_filename; - -public: - - file_writer_32fc(const std::string &filename, uint64_t max_samples) - : 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 vrt::expanded_header *hdr) - { - bool ok = rx_nop_handler::operator()(items, nitems, hdr); - - size_t host_nitems = nitems; - std::complex<float> host_items[host_nitems]; - - vrt::copy_net_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, " -S samples_per_pkt specify # of samples per pkt [default=maximum]\n"); -//fprintf(stderr, " -v verbose output\n"); -} - - -int -main(int argc, char **argv) -{ - const char *quad_radio_ip = "192.168.123.123"; - size_t rx_bufsize = 62.5e6; // sizeof memory mapped network buffer - int samples_per_pkt = 0; // use default - uint64_t nsamples = 0; - char *output_filename = 0; - bool output_shorts = false; - int t; - - int ch; - - while ((ch = getopt(argc, argv, "hN:o:sS:")) != EOF){ - switch (ch){ - case 'N': - nsamples = (uint64_t) strtod(optarg, 0); - break; - - case 'o': - output_filename = optarg; - break; - - case 's': - output_shorts = true; - break; - - case 'S': - errno = 0; - t = strtol(optarg, 0, 0); - if (errno != 0){ - usage(argv[0]); - exit(1); - } - samples_per_pkt = t; - break; - - case 'h': - default: - usage(argv[0]); - exit(1); - } - } - - - install_sig_handler(SIGINT, sig_handler); - - gruel::rt_status_t rt = gruel::enable_realtime_scheduling(); - if (rt != gruel::RT_OK) - std::cerr << "Failed to enable realtime scheduling" << std::endl; - - - vrt::quadradio::sptr qr; - try { - qr = vrt::quadradio::sptr(new vrt::quadradio(quad_radio_ip, rx_bufsize)); - } - catch (...){ - std::cerr << "Failed to create vrt::quadradio\n"; - return 1; - } - - - rx_nop_handler::sptr handler; - if (output_filename){ - if (output_shorts) - handler = rx_nop_handler::sptr(new file_writer_16sc(output_filename, nsamples)); - else - handler = rx_nop_handler::sptr(new file_writer_32fc(output_filename, nsamples)); - } - else - handler = rx_nop_handler::sptr(new rx_nop_handler(nsamples)); - - - printf("samples_per_pkt = %d\n", samples_per_pkt); - - if (!qr->start_streaming(0, samples_per_pkt)){ - fprintf(stderr, "failed to send_rx_command\n"); - return 1; - } - - // start receiving packets - - while(1 - && !signaled - && !handler->has_errored_p() - && !handler->has_finished_p()){ - bool ok = qr->vrt_rx()->rx_packets(handler.get()); - if (!ok){ - fprintf(stderr, "vrt->rx_packets failed\n"); - break; - } - } - - qr->stop_streaming(0); - - printf("%llu packets received, %llu bad pkt_cnt field values, %llu samples\n", - handler->npackets(), handler->nwrong_pkt_cnt(), handler->nsamples()); - - //sleep(1); - - return 0; -} |