summaryrefslogtreecommitdiff
path: root/gr-digital/lib/ts_insert_zeros_cc_impl.cc
diff options
context:
space:
mode:
authorJohnathan Corgan <johnathan@corganlabs.com>2013-03-15 09:57:31 -0700
committerJohnathan Corgan <johnathan@corganlabs.com>2013-03-15 09:57:31 -0700
commite965a5bb209ad46a509ccd21f393667fd69d95f9 (patch)
tree40d683ef8f80980f12eac6cfe7f3423c49b45f87 /gr-digital/lib/ts_insert_zeros_cc_impl.cc
parent2bf9c4cb4b0b426690f353fc1662a13e70c0d5e0 (diff)
parent27990ca9e236931e39a830e48f0a1efe13ec085f (diff)
Merge branch 'ofdm-master' into ofdm-next
Added fixups for next branch changes Conflicts: CMakeLists.txt gnuradio-core/src/lib/io/gr_message_sink.cc gnuradio-core/src/lib/io/gr_message_sink.h gnuradio-core/src/lib/io/gr_message_sink.i gnuradio-core/src/lib/io/gr_message_source.cc gnuradio-core/src/lib/io/gr_message_source.h gnuradio-core/src/lib/io/gr_message_source.i gr-blocks/CMakeLists.txt gr-digital/CMakeLists.txt gr-digital/grc/digital_block_tree.xml gr-digital/include/digital/CMakeLists.txt gr-digital/include/digital_ofdm_cyclic_prefixer.h gr-digital/lib/CMakeLists.txt gr-digital/lib/digital_ofdm_cyclic_prefixer.cc gr-digital/lib/ofdm_cyclic_prefixer_impl.h gr-digital/python/CMakeLists.txt gr-digital/swig/CMakeLists.txt gr-digital/swig/digital_swig.i
Diffstat (limited to 'gr-digital/lib/ts_insert_zeros_cc_impl.cc')
-rw-r--r--gr-digital/lib/ts_insert_zeros_cc_impl.cc130
1 files changed, 130 insertions, 0 deletions
diff --git a/gr-digital/lib/ts_insert_zeros_cc_impl.cc b/gr-digital/lib/ts_insert_zeros_cc_impl.cc
new file mode 100644
index 0000000000..1a78851c18
--- /dev/null
+++ b/gr-digital/lib/ts_insert_zeros_cc_impl.cc
@@ -0,0 +1,130 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 <+YOU OR YOUR COMPANY+>.
+ *
+ * This 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.
+ *
+ * This software 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 software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gr_io_signature.h>
+#include "ts_insert_zeros_cc_impl.h"
+#include <iostream>
+#include <vector>
+#include <algorithm>
+#include <string>
+#include <sstream>
+
+namespace gr {
+ namespace digital {
+
+ ts_insert_zeros_cc::sptr
+ ts_insert_zeros_cc::make(const std::string &lengthtagname)
+ {
+ return gnuradio::get_initial_sptr (new ts_insert_zeros_cc_impl(lengthtagname));
+ }
+
+ /*
+ * The private constructor
+ */
+ ts_insert_zeros_cc_impl::ts_insert_zeros_cc_impl(const std::string &lengthtagname)
+ : gr_block("ts_insert_zeros_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ d_lengthtagname(lengthtagname)
+ {
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ ts_insert_zeros_cc_impl::~ts_insert_zeros_cc_impl()
+ {
+ }
+
+ void
+ ts_insert_zeros_cc_impl::forecast(int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ ninput_items_required[0] = 0;
+ }
+
+ int
+ ts_insert_zeros_cc_impl::general_work (
+ int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items
+ )
+ {
+ gr_complex *out = (gr_complex *) output_items[0];
+ const gr_complex*in = (const gr_complex*) input_items[0];
+
+ if (ninput_items[0]) {
+ // Check if we have an entire packet.
+ long packet_length = 0;
+ std::vector<gr_tag_t> tags;
+ // Get any tags associated with the first item on the input.
+ this->get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+1);
+ for (unsigned int j = 0; j < tags.size(); j++) {
+ if (pmt::symbol_to_string(tags[j].key) == d_lengthtagname) {
+ packet_length = pmt::to_long(tags[j].value);
+ }
+ }
+ if (!packet_length) {
+ throw std::runtime_error("no tag");
+ }
+ if (ninput_items[0] < packet_length ) {
+ // We don't have enough input to produce a packet.
+ // Produces zeros instead.
+ } else {
+ // We have enough input.
+ if (noutput_items < packet_length) {
+ // But we don't have enough output space.
+ // We don't want to produce zeros, so return.
+ set_output_multiple(packet_length);
+ return 0;
+ } else {
+ // And we have enough output space.
+ // Produce the packet.
+ std::vector<gr_tag_t> tags;
+ this->get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+packet_length);
+ for (unsigned int j = 0; j < tags.size(); j++) {
+ const uint64_t offset = tags[j].offset - nitems_read(0) + nitems_written(0);
+ this->add_item_tag(0, offset, tags[j].key, tags[j].value);
+ }
+ if (noutput_items < packet_length) {
+ throw std::runtime_error("Not enough room in the output buffer.");
+ }
+ memcpy(out, in, packet_length*sizeof(gr_complex));
+ consume(0, packet_length);
+ return packet_length;
+ }
+ }
+ }
+ // We're just producing zeros.
+ // Either we have no input data, or not an entire packet yet.
+ for (int i=0; i<noutput_items; i++) {
+ out[i] = 0;
+ }
+ return noutput_items;
+ }
+
+
+ } /* namespace digital */
+} /* namespace gr */
+