diff options
-rw-r--r-- | grc/gsm_block_tree.xml | 1 | ||||
-rw-r--r-- | grc/misc_utils/CMakeLists.txt | 7 | ||||
-rw-r--r-- | grc/misc_utils/gsm_burst_source_qa.xml | 35 | ||||
-rw-r--r-- | include/grgsm/misc_utils/CMakeLists.txt | 1 | ||||
-rw-r--r-- | include/grgsm/misc_utils/burst_source_qa.h | 64 | ||||
-rw-r--r-- | lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/misc_utils/burst_source_qa_impl.cc | 161 | ||||
-rw-r--r-- | lib/misc_utils/burst_source_qa_impl.h | 61 | ||||
-rw-r--r-- | swig/grgsm_swig.i | 3 |
9 files changed, 331 insertions, 3 deletions
diff --git a/grc/gsm_block_tree.xml b/grc/gsm_block_tree.xml index 94d1d82..e75197c 100644 --- a/grc/gsm_block_tree.xml +++ b/grc/gsm_block_tree.xml @@ -42,6 +42,7 @@ <block>gsm_bursts_printer</block> <block>gsm_burst_sink</block> <block>gsm_burst_source</block> + <block>gsm_burst_source_qa</block> <block>gsm_extract_system_info</block> <block>gsm_extract_immediate_assignment</block> <block>gsm_controlled_rotator_cc</block> diff --git a/grc/misc_utils/CMakeLists.txt b/grc/misc_utils/CMakeLists.txt index d545692..89c4650 100644 --- a/grc/misc_utils/CMakeLists.txt +++ b/grc/misc_utils/CMakeLists.txt @@ -24,8 +24,9 @@ install(FILES gsm_controlled_const_source_f.xml gsm_message_printer.xml gsm_bursts_printer.xml - gsm_clock_offset_corrector.xml - gsm_tmsi_dumper.xml + gsm_clock_offset_corrector.xml + gsm_tmsi_dumper.xml gsm_burst_sink.xml - gsm_burst_source.xml DESTINATION share/gnuradio/grc/blocks + gsm_burst_source.xml + gsm_burst_source_qa.xml DESTINATION share/gnuradio/grc/blocks ) diff --git a/grc/misc_utils/gsm_burst_source_qa.xml b/grc/misc_utils/gsm_burst_source_qa.xml new file mode 100644 index 0000000..bb04cca --- /dev/null +++ b/grc/misc_utils/gsm_burst_source_qa.xml @@ -0,0 +1,35 @@ +<?xml version="1.0"?> +<block> + <name>QA Burst source</name> + <key>gsm_burst_source_qa</key> + <import>import grgsm</import> + <make>grgsm.burst_source_qa($framenumbers, $timeslots, $bursts)</make> + + <param> + <name>Frame numbers</name> + <key>framenumbers</key> + <value>[]</value> + <type>int_vector</type> + <hide>part</hide> + </param> + + <param> + <name>Timeslots</name> + <key>timeslots</key> + <value>[]</value> + <type>int_vector</type> + <hide>part</hide> + </param> + + <param> + <name>Bursts</name> + <key>bursts</key> + <value>[[],]</value> + <type>raw</type> + </param> + + <source> + <name>out</name> + <type>message</type> + </source> +</block> diff --git a/include/grgsm/misc_utils/CMakeLists.txt b/include/grgsm/misc_utils/CMakeLists.txt index 3d63d46..adedf1d 100644 --- a/include/grgsm/misc_utils/CMakeLists.txt +++ b/include/grgsm/misc_utils/CMakeLists.txt @@ -24,6 +24,7 @@ install(FILES bursts_printer.h burst_sink.h burst_source.h + burst_source_qa.h extract_system_info.h extract_immediate_assignment.h controlled_rotator_cc.h diff --git a/include/grgsm/misc_utils/burst_source_qa.h b/include/grgsm/misc_utils/burst_source_qa.h new file mode 100644 index 0000000..c3c5713 --- /dev/null +++ b/include/grgsm/misc_utils/burst_source_qa.h @@ -0,0 +1,64 @@ +/* -*- c++ -*- */ +/* @file + * @author Roman Khassraf <rkhassraf@gmail.com> + * @section LICENSE + * + * Gr-gsm 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. + * + * Gr-gsm 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 gr-gsm; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef INCLUDED_GSM_BURST_SOURCE_QA_H +#define INCLUDED_GSM_BURST_SOURCE_QA_H + +#include <grgsm/api.h> +#include <gnuradio/block.h> + +namespace gr { + namespace gsm { + + /*! + * \brief <+description of block+> + * \ingroup gsm + * + */ + class GSM_API burst_source_qa : virtual public gr::block + { + public: + typedef boost::shared_ptr<burst_source_qa> sptr; + + /*! + * \brief Return a shared_ptr to a new instance of grgsm::burst_source_qa. + * + * To avoid accidental use of raw pointers, grgsm::burst_source_qa's + * constructor is in a private implementation + * class. grgsm::burst_source_qa::make is the public interface for + * creating new instances. + */ + static sptr make(const std::vector<int> &framenumbers, + const std::vector<int> ×lots, + const std::vector<std::string> &burst_data); + + virtual void set_framenumbers(const std::vector<int> &framenumbers) = 0; + virtual void set_timeslots(const std::vector<int> ×lots) = 0; + virtual void set_burst_data(const std::vector<std::string> &burst_data) = 0; + }; + + } // namespace gsm +} // namespace gr + +#endif /* INCLUDED_GSM_BURST_SOURCE_QA_H */ + + diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index d906396..1f3570e 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -52,6 +52,7 @@ list(APPEND grgsm_sources misc_utils/tmsi_dumper_impl.cc misc_utils/burst_sink_impl.cc misc_utils/burst_source_impl.cc + misc_utils/burst_source_qa_impl.cc decryption/decryption_impl.cc ) add_library(gnuradio-grgsm SHARED ${grgsm_sources}) diff --git a/lib/misc_utils/burst_source_qa_impl.cc b/lib/misc_utils/burst_source_qa_impl.cc new file mode 100644 index 0000000..e7438f7 --- /dev/null +++ b/lib/misc_utils/burst_source_qa_impl.cc @@ -0,0 +1,161 @@ +/* -*- c++ -*- */ +/* @file + * @author Roman Khassraf <rkhassraf@gmail.com> + * @section LICENSE + * + * Gr-gsm 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. + * + * Gr-gsm 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 gr-gsm; 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 <gnuradio/io_signature.h> +#include "burst_source_qa_impl.h" +#include "stdio.h" +#include <grgsm/gsmtap.h> +#include <grgsm/endian.h> + +#define PMT_SIZE 174 + +namespace gr { + namespace gsm { + + burst_source_qa::sptr + burst_source_qa::make(const std::vector<int> &framenumbers, + const std::vector<int> ×lots, + const std::vector<std::string> &burst_data) + { + return gnuradio::get_initial_sptr + (new burst_source_qa_impl(framenumbers, timeslots, burst_data)); + } + + /* + * The private constructor + */ + burst_source_qa_impl::burst_source_qa_impl(const std::vector<int> &framenumbers, + const std::vector<int> ×lots, + const std::vector<std::string> &burst_data) + : gr::block("burst_source_qa", + gr::io_signature::make(0, 0, 0), + gr::io_signature::make(0, 0, 0)), + d_finished(false) + { + message_port_register_out(pmt::mp("out")); + set_framenumbers(framenumbers); + set_timeslots(timeslots); + set_burst_data(burst_data); + } + + /* + * Our virtual destructor. + */ + burst_source_qa_impl::~burst_source_qa_impl() + { + if (d_finished == false){ + d_finished = true; + } + } + + void burst_source_qa_impl::set_framenumbers(const std::vector<int> &framenumbers) + { + d_framenumbers = framenumbers; + } + + void burst_source_qa_impl::set_timeslots(const std::vector<int> ×lots) + { + d_timeslots = timeslots; + } + + void burst_source_qa_impl::set_burst_data(const std::vector<std::string> &burst_data) + { + d_burst_data = burst_data; + } + + bool burst_source_qa_impl::start() + { + d_finished = false; + d_thread = boost::shared_ptr<gr::thread::thread> + (new gr::thread::thread(boost::bind(&burst_source_qa_impl::run, this))); + return block::start(); + } + + bool burst_source_qa_impl::stop() + { + d_finished = true; + d_thread->interrupt(); + d_thread->join(); + return block::stop(); + } + + bool burst_source_qa_impl::finished() + { + return d_finished; + } + + void burst_source_qa_impl::run() + { + char *unserialized = (char*)malloc(sizeof(char) * PMT_SIZE); + + for (int i=0; i<d_burst_data.size(); i++) + { + if (d_burst_data[i].length() == BURST_SIZE && + d_timeslots[i] >= 0 && d_timeslots[i] <= 7 && + d_framenumbers[i] >= 0 && d_framenumbers[i] <= (26 * 51 * 2048 - 1)) + { + boost::scoped_ptr<gsmtap_hdr> tap_header(new gsmtap_hdr()); + + tap_header->version = GSMTAP_VERSION; + tap_header->hdr_len = sizeof(gsmtap_hdr)/4; + tap_header->type = GSMTAP_TYPE_UM_BURST; + tap_header->timeslot = d_timeslots[i]; + tap_header->frame_number = htobe32(d_framenumbers[i]); + tap_header->sub_type = GSMTAP_BURST_NORMAL; + tap_header->arfcn = 0; + tap_header->signal_dbm = 0; + tap_header->snr_db = 0; + + uint8_t burst[BURST_SIZE]; + + for (int j=0; j<BURST_SIZE; j++) + { + if (d_burst_data[i][j] == '0') + { + burst[j] = 0; + } + else + { + burst[j] = 1; + } + } + + int8_t header_plus_burst[sizeof(gsmtap_hdr) + BURST_SIZE]; + memcpy(header_plus_burst, tap_header.get(), sizeof(gsmtap_hdr)); + memcpy(header_plus_burst + sizeof(gsmtap_hdr), burst, BURST_SIZE); + + pmt::pmt_t blob_header_plus_burst = pmt::make_blob(header_plus_burst, sizeof(gsmtap_hdr) + BURST_SIZE); + pmt::pmt_t msg = pmt::cons(pmt::PMT_NIL, blob_header_plus_burst); + + message_port_pub(pmt::mp("out"), msg); + } + } + post(pmt::mp("system"), pmt::cons(pmt::mp("done"), pmt::from_long(1))); + } + } /* namespace gsm */ +} /* namespace gr */ + + diff --git a/lib/misc_utils/burst_source_qa_impl.h b/lib/misc_utils/burst_source_qa_impl.h new file mode 100644 index 0000000..cb62571 --- /dev/null +++ b/lib/misc_utils/burst_source_qa_impl.h @@ -0,0 +1,61 @@ +/* -*- c++ -*- */ +/* @file + * @author Roman Khassraf <rkhassraf@gmail.com> + * @section LICENSE + * + * Gr-gsm 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. + * + * Gr-gsm 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 gr-gsm; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef INCLUDED_GSM_BURST_SOURCE_QA_IMPL_H +#define INCLUDED_GSM_BURST_SOURCE_QA_IMPL_H + +#define BURST_SIZE 148 + +#include <grgsm/misc_utils/burst_source_qa.h> +#include <fstream> + + +namespace gr { + namespace gsm { + + class burst_source_qa_impl : public burst_source_qa + { + private: + boost::shared_ptr<gr::thread::thread> d_thread; + std::vector<int> d_framenumbers; + std::vector<int> d_timeslots; + std::vector<std::string> d_burst_data; + bool d_finished; + void run(); + public: + burst_source_qa_impl(const std::vector<int> &framenumbers, + const std::vector<int> ×lots, + const std::vector<std::string> &burst_data); + ~burst_source_qa_impl(); + virtual void set_framenumbers(const std::vector<int> &framenumbers); + virtual void set_timeslots(const std::vector<int> ×lots); + virtual void set_burst_data(const std::vector<std::string> &burst_data); + bool start(); + bool stop(); + bool finished(); + }; + } // namespace gsm +} // namespace gr + +#endif /* INCLUDED_GSM_BURST_SOURCE_QA_IMPL_H */ + + diff --git a/swig/grgsm_swig.i b/swig/grgsm_swig.i index 79831f8..07f6418 100644 --- a/swig/grgsm_swig.i +++ b/swig/grgsm_swig.i @@ -25,6 +25,7 @@ #include "grgsm/misc_utils/tmsi_dumper.h" #include "grgsm/misc_utils/burst_sink.h" #include "grgsm/misc_utils/burst_source.h" +#include "grgsm/misc_utils/burst_source_qa.h" %} @@ -54,6 +55,8 @@ GR_SWIG_BLOCK_MAGIC2(gsm, bursts_printer); GR_SWIG_BLOCK_MAGIC2(gsm, burst_sink); %include "grgsm/misc_utils/burst_source.h" GR_SWIG_BLOCK_MAGIC2(gsm, burst_source); +%include "grgsm/misc_utils/burst_source_qa.h" +GR_SWIG_BLOCK_MAGIC2(gsm, burst_source_qa); %include "grgsm/misc_utils/extract_system_info.h" GR_SWIG_BLOCK_MAGIC2(gsm, extract_system_info); %include "grgsm/misc_utils/extract_immediate_assignment.h" |