diff --git a/gr-gmr1/grc/CMakeLists.txt b/gr-gmr1/grc/CMakeLists.txt index 850d049..84ce36e 100644 --- a/gr-gmr1/grc/CMakeLists.txt +++ b/gr-gmr1/grc/CMakeLists.txt @@ -22,5 +22,6 @@ install(FILES gsmtap_sink.xml rach_demod.xml rach_detect_fft.xml + rach_file_sink.xml DESTINATION share/gnuradio/grc/blocks ) diff --git a/gr-gmr1/grc/rach_file_sink.xml b/gr-gmr1/grc/rach_file_sink.xml new file mode 100644 index 0000000..b72160f --- /dev/null +++ b/gr-gmr1/grc/rach_file_sink.xml @@ -0,0 +1,29 @@ + + + RACH File Sink + rach_file_sink + GMR-1 + from gnuradio import gmr1 + gmr1.rach_file_sink($filename, $center_freq, $sample_rate) + + Filename + filename + string + + + Center Frequency + center_freq + 0 + float + + + Sample Rate + sample_rate + 0 + float + + + pdus + message + + diff --git a/gr-gmr1/include/gnuradio/gmr1/CMakeLists.txt b/gr-gmr1/include/gnuradio/gmr1/CMakeLists.txt index a05f79e..399bbae 100644 --- a/gr-gmr1/include/gnuradio/gmr1/CMakeLists.txt +++ b/gr-gmr1/include/gnuradio/gmr1/CMakeLists.txt @@ -26,5 +26,6 @@ install(FILES gsmtap_sink.h rach_demod.h rach_detect_fft.h + rach_file_sink.h DESTINATION include/gnuradio/gmr1 ) diff --git a/gr-gmr1/include/gnuradio/gmr1/rach_file_sink.h b/gr-gmr1/include/gnuradio/gmr1/rach_file_sink.h new file mode 100644 index 0000000..51d5aea --- /dev/null +++ b/gr-gmr1/include/gnuradio/gmr1/rach_file_sink.h @@ -0,0 +1,56 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Sylvain Munaut + * + * 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. + */ + +#ifndef INCLUDED_GR_GMR1_RACH_FILE_SINK_H +#define INCLUDED_GR_GMR1_RACH_FILE_SINK_H + +#include + +#include +#include + +namespace gr { + namespace gmr1 { + + /*! + * \brief + * \ingroup + */ + class GR_GMR1_API rach_file_sink : virtual public block + { + public: + typedef boost::shared_ptr sptr; + + static sptr make(const std::string &filename, + const double center_freq, const double sample_rate); + + virtual std::string filename() const = 0; + + virtual double center_freq() const = 0; + virtual double sample_rate() const = 0; + + virtual void set_center_freq(const double center_freq) = 0; + virtual void set_sample_rate(const double sample_rate) = 0; + }; + + } // namespace gmr1 +} // namespace gr + +#endif /* INCLUDED_GR_GMR1_RACH_FILE_SINK_H */ diff --git a/gr-gmr1/lib/CMakeLists.txt b/gr-gmr1/lib/CMakeLists.txt index 10b9475..992dd08 100644 --- a/gr-gmr1/lib/CMakeLists.txt +++ b/gr-gmr1/lib/CMakeLists.txt @@ -46,6 +46,7 @@ list(APPEND gmr1_sources gsmtap_sink_impl.cc rach_demod_impl.cc rach_detect_fft_impl.cc + rach_file_sink_impl.cc ) add_library(gnuradio-gmr1 SHARED ${gmr1_sources}) diff --git a/gr-gmr1/lib/rach_file_sink_impl.cc b/gr-gmr1/lib/rach_file_sink_impl.cc new file mode 100644 index 0000000..43695e3 --- /dev/null +++ b/gr-gmr1/lib/rach_file_sink_impl.cc @@ -0,0 +1,149 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Sylvain Munaut + * + * 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 +#include + +#include + +#include "rach_file_sink_impl.h" + + +namespace gr { + namespace gmr1 { + +rach_file_sink::sptr +rach_file_sink::make(const std::string &filename, + const double center_freq, const double sample_rate) +{ + return gnuradio::get_initial_sptr( + new rach_file_sink_impl(filename, center_freq, sample_rate) + ); +} + +rach_file_sink_impl::rach_file_sink_impl(const std::string &filename, + const double center_freq, + const double sample_rate) + : gr::block("rach_file_sink", + io_signature::make(0, 0, 0), + io_signature::make(0, 0, 0)), + d_filename(filename), + d_center_freq(center_freq), d_sample_rate(sample_rate) +{ + message_port_register_in(PDU_PORT_ID); + set_msg_handler(PDU_PORT_ID, boost::bind(&rach_file_sink_impl::send_pdu, this, _1)); + + this->d_fh = fopen(filename.c_str(), "a"); + if (!this->d_fh) + throw std::runtime_error("Unable to open output file"); +} + +rach_file_sink_impl::~rach_file_sink_impl() +{ + fclose(this->d_fh); +} + + +std::string +rach_file_sink_impl::filename() const +{ + return this->d_filename; +} + +double +rach_file_sink_impl::center_freq() const +{ + return this->d_center_freq; +} + +double +rach_file_sink_impl::sample_rate() const +{ + return this->d_sample_rate; +} + +void +rach_file_sink_impl::set_center_freq(const double center_freq) +{ + this->d_center_freq = center_freq; +} + +void +rach_file_sink_impl::set_sample_rate(const double sample_rate) +{ + this->d_sample_rate = sample_rate; +} + + +bool +rach_file_sink_impl::start() +{ + /* Nothing yet */ +} + +bool +rach_file_sink_impl::stop() +{ + fflush(this->d_fh); +} + + +void +rach_file_sink_impl::send_pdu(pmt::pmt_t pdu) +{ + static const pmt::pmt_t key_sb_mask = pmt::string_to_symbol("sb_mask"); + static const pmt::pmt_t key_freq = pmt::string_to_symbol("freq"); + + pmt::pmt_t meta = pmt::car(pdu); + pmt::pmt_t vector = pmt::cdr(pdu); + size_t len = pmt::length(vector); + size_t offset(0); + const uint8_t* rach = (const uint8_t*) pmt::uniform_vector_elements(vector, offset); + + /* Validate */ + if (!is_dict(meta) || + !dict_has_key(meta, key_sb_mask) || + !dict_has_key(meta, key_freq)) + throw std::runtime_error("Invalid RACH PDU"); + + /* Grab SB_Mask & freq */ + uint8_t sb_mask = pmt::to_long(pmt::dict_ref(meta, key_sb_mask, pmt::PMT_NIL)); + double freq = pmt::to_double(pmt::dict_ref(meta, key_freq, pmt::PMT_NIL)); + + fprintf(this->d_fh, "%02hhx %.17g %.17g ", + sb_mask, + freq, + this->d_center_freq + (this->d_sample_rate * freq / (2.0 * M_PI)) + ); + + /* Raw bytes */ + for (int i=0; id_fh, "%02hhx", rach[i]); + + /* EOL */ + fprintf(this->d_fh, "\n"); +} + + } // namespace gmr1 +} // namespace gr diff --git a/gr-gmr1/lib/rach_file_sink_impl.h b/gr-gmr1/lib/rach_file_sink_impl.h new file mode 100644 index 0000000..6738f01 --- /dev/null +++ b/gr-gmr1/lib/rach_file_sink_impl.h @@ -0,0 +1,66 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Sylvain Munaut + * + * 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. + */ + + +#ifndef INCLUDED_GR_GMR1_RACH_FILE_SINK_IMPL_H +#define INCLUDED_GR_GMR1_RACH_FILE_SINK_IMPL_H + +#include + +#include + +namespace gr { + namespace gmr1 { + + /*! + * \brief + * \ingroup gmr1 + */ + class rach_file_sink_impl : public rach_file_sink + { + private: + std::string d_filename; + double d_center_freq; + double d_sample_rate; + + FILE *d_fh; + + void send_pdu(pmt::pmt_t pdu); + + public: + rach_file_sink_impl(const std::string &filename, + const double center_freq, const double sample_rate); + virtual ~rach_file_sink_impl(); + + std::string filename() const; + double center_freq() const; + double sample_rate() const; + + void set_center_freq(const double center_freq); + void set_sample_rate(const double sample_rate); + + bool start(); + bool stop(); + }; + + } // namespace gmr1 +} // namespace gr + +#endif /* INCLUDED_GR_GMR1_RACH_FILE_SINK_IMPL_H */ diff --git a/gr-gmr1/swig/gmr1_swig.i b/gr-gmr1/swig/gmr1_swig.i index 0f427d5..4c58d32 100644 --- a/gr-gmr1/swig/gmr1_swig.i +++ b/gr-gmr1/swig/gmr1_swig.i @@ -13,6 +13,7 @@ #include "gnuradio/gmr1/gsmtap_sink.h" #include "gnuradio/gmr1/rach_demod.h" #include "gnuradio/gmr1/rach_detect_fft.h" +#include "gnuradio/gmr1/rach_file_sink.h" %} %include "gnuradio/gmr1/burst_to_tagged_stream.h" @@ -26,3 +27,6 @@ GR_SWIG_BLOCK_MAGIC2(gmr1, rach_demod); %include "gnuradio/gmr1/rach_detect_fft.h" GR_SWIG_BLOCK_MAGIC2(gmr1, rach_detect_fft); + +%include "gnuradio/gmr1/rach_file_sink.h" +GR_SWIG_BLOCK_MAGIC2(gmr1, rach_file_sink);