diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CMakeLists.txt | 13 | ||||
-rw-r--r-- | lib/misc_utils/burst_file_sink_impl.cc (renamed from lib/misc_utils/burst_sink_impl.cc) | 18 | ||||
-rw-r--r-- | lib/misc_utils/burst_file_sink_impl.h (renamed from lib/misc_utils/burst_sink_impl.h) | 14 | ||||
-rw-r--r-- | lib/misc_utils/burst_file_source_impl.cc (renamed from lib/misc_utils/burst_source_impl.cc) | 24 | ||||
-rw-r--r-- | lib/misc_utils/burst_file_source_impl.h (renamed from lib/misc_utils/burst_source_impl.h) | 14 | ||||
-rw-r--r-- | lib/misc_utils/message_printer_impl.cc | 18 | ||||
-rw-r--r-- | lib/misc_utils/message_printer_impl.h | 3 | ||||
-rw-r--r-- | lib/qa_utils/burst_sink_impl.cc (renamed from lib/misc_utils/burst_sink_qa_impl.cc) | 24 | ||||
-rw-r--r-- | lib/qa_utils/burst_sink_impl.h (renamed from lib/misc_utils/burst_sink_qa_impl.h) | 14 | ||||
-rw-r--r-- | lib/qa_utils/burst_source_impl.cc (renamed from lib/misc_utils/burst_source_qa_impl.cc) | 30 | ||||
-rw-r--r-- | lib/qa_utils/burst_source_impl.h (renamed from lib/misc_utils/burst_source_qa_impl.h) | 14 | ||||
-rw-r--r-- | lib/qa_utils/message_sink_impl.cc | 90 | ||||
-rw-r--r-- | lib/qa_utils/message_sink_impl.h | 47 | ||||
-rw-r--r-- | lib/qa_utils/message_source_impl.cc | 131 | ||||
-rw-r--r-- | lib/qa_utils/message_source_impl.h | 51 |
15 files changed, 418 insertions, 87 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 61f0858..c9a39ce 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -50,11 +50,14 @@ list(APPEND grgsm_sources misc_utils/controlled_const_source_f_impl.cc misc_utils/message_printer_impl.cc misc_utils/tmsi_dumper_impl.cc - misc_utils/burst_sink_impl.cc - misc_utils/burst_source_impl.cc - misc_utils/burst_sink_qa_impl.cc - misc_utils/burst_source_qa_impl.cc - decryption/decryption_impl.cc ) + misc_utils/burst_file_sink_impl.cc + misc_utils/burst_file_source_impl.cc + qa_utils/burst_sink_impl.cc + qa_utils/burst_source_impl.cc + qa_utils/message_source_impl.cc + qa_utils/message_sink_impl.cc + decryption/decryption_impl.cc +) add_library(gnuradio-grgsm SHARED ${grgsm_sources}) target_link_libraries(gnuradio-grgsm ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES} ${LIBOSMOCORE_LIBRARIES} diff --git a/lib/misc_utils/burst_sink_impl.cc b/lib/misc_utils/burst_file_sink_impl.cc index fdb7d98..25a262e 100644 --- a/lib/misc_utils/burst_sink_impl.cc +++ b/lib/misc_utils/burst_file_sink_impl.cc @@ -25,36 +25,36 @@ #endif #include <gnuradio/io_signature.h> -#include "burst_sink_impl.h" +#include "burst_file_sink_impl.h" #include "stdio.h" namespace gr { namespace gsm { - burst_sink::sptr - burst_sink::make(const std::string &filename) + burst_file_sink::sptr + burst_file_sink::make(const std::string &filename) { return gnuradio::get_initial_sptr - (new burst_sink_impl(filename)); + (new burst_file_sink_impl(filename)); } /* * The private constructor */ - burst_sink_impl::burst_sink_impl(const std::string &filename) - : gr::block("burst_sink", + burst_file_sink_impl::burst_file_sink_impl(const std::string &filename) + : gr::block("burst_file_sink", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), d_output_file(filename.c_str(), std::ofstream::binary) { message_port_register_in(pmt::mp("in")); - set_msg_handler(pmt::mp("in"), boost::bind(&burst_sink_impl::process_burst, this, _1)); + set_msg_handler(pmt::mp("in"), boost::bind(&burst_file_sink_impl::process_burst, this, _1)); } /* * Our virtual destructor. */ - burst_sink_impl::~burst_sink_impl() + burst_file_sink_impl::~burst_file_sink_impl() { if (d_output_file.is_open()) { @@ -62,7 +62,7 @@ namespace gr { } } - void burst_sink_impl::process_burst(pmt::pmt_t msg) + void burst_file_sink_impl::process_burst(pmt::pmt_t msg) { std::string s = pmt::serialize_str(msg); const char *serialized = s.data(); diff --git a/lib/misc_utils/burst_sink_impl.h b/lib/misc_utils/burst_file_sink_impl.h index f981826..898c609 100644 --- a/lib/misc_utils/burst_sink_impl.h +++ b/lib/misc_utils/burst_file_sink_impl.h @@ -20,27 +20,27 @@ * */ -#ifndef INCLUDED_GSM_BURST_SINK_IMPL_H -#define INCLUDED_GSM_BURST_SINK_IMPL_H +#ifndef INCLUDED_GSM_BURST_FILE_SINK_IMPL_H +#define INCLUDED_GSM_BURST_FILE_SINK_IMPL_H -#include <grgsm/misc_utils/burst_sink.h> +#include <grgsm/misc_utils/burst_file_sink.h> #include <fstream> namespace gr { namespace gsm { - class burst_sink_impl : public burst_sink + class burst_file_sink_impl : public burst_file_sink { private: std::ofstream d_output_file; public: - burst_sink_impl(const std::string &filename); - ~burst_sink_impl(); + burst_file_sink_impl(const std::string &filename); + ~burst_file_sink_impl(); void process_burst(pmt::pmt_t msg); }; } // namespace gsm } // namespace gr -#endif /* INCLUDED_GSM_BURST_SINK_IMPL_H */ +#endif /* INCLUDED_GSM_BURST_FILE_SINK_IMPL_H */ diff --git a/lib/misc_utils/burst_source_impl.cc b/lib/misc_utils/burst_file_source_impl.cc index 76d1eaa..4661dfb 100644 --- a/lib/misc_utils/burst_source_impl.cc +++ b/lib/misc_utils/burst_file_source_impl.cc @@ -25,7 +25,7 @@ #endif #include <gnuradio/io_signature.h> -#include "burst_source_impl.h" +#include "burst_file_source_impl.h" #include "stdio.h" #define PMT_SIZE 174 @@ -33,18 +33,18 @@ namespace gr { namespace gsm { - burst_source::sptr - burst_source::make(const std::string &filename) + burst_file_source::sptr + burst_file_source::make(const std::string &filename) { return gnuradio::get_initial_sptr - (new burst_source_impl(filename)); + (new burst_file_source_impl(filename)); } /* * The private constructor */ - burst_source_impl::burst_source_impl(const std::string &filename) - : gr::block("burst_source", + burst_file_source_impl::burst_file_source_impl(const std::string &filename) + : gr::block("burst_file_source", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), d_input_file(filename.c_str(), std::ifstream::binary), @@ -56,22 +56,22 @@ namespace gr { /* * Our virtual destructor. */ - burst_source_impl::~burst_source_impl() + burst_file_source_impl::~burst_file_source_impl() { if (d_finished == false){ d_finished = true; } } - bool burst_source_impl::start() + bool burst_file_source_impl::start() { d_finished = false; d_thread = boost::shared_ptr<gr::thread::thread> - (new gr::thread::thread(boost::bind(&burst_source_impl::run, this))); + (new gr::thread::thread(boost::bind(&burst_file_source_impl::run, this))); return block::start(); } - bool burst_source_impl::stop() + bool burst_file_source_impl::stop() { d_finished = true; d_thread->interrupt(); @@ -79,12 +79,12 @@ namespace gr { return block::stop(); } - bool burst_source_impl::finished() + bool burst_file_source_impl::finished() { return d_finished; } - void burst_source_impl::run() + void burst_file_source_impl::run() { char *unserialized = (char*)malloc(sizeof(char) * PMT_SIZE); while (d_input_file.read(unserialized, PMT_SIZE) && !d_finished) diff --git a/lib/misc_utils/burst_source_impl.h b/lib/misc_utils/burst_file_source_impl.h index 85217b0..383dc90 100644 --- a/lib/misc_utils/burst_source_impl.h +++ b/lib/misc_utils/burst_file_source_impl.h @@ -20,16 +20,16 @@ * */ -#ifndef INCLUDED_GSM_BURST_SOURCE_IMPL_H -#define INCLUDED_GSM_BURST_SOURCE_IMPL_H +#ifndef INCLUDED_GSM_BURST_FILE_SOURCE_IMPL_H +#define INCLUDED_GSM_BURST_FILE_SOURCE_IMPL_H -#include <grgsm/misc_utils/burst_source.h> +#include <grgsm/misc_utils/burst_file_source.h> #include <fstream> namespace gr { namespace gsm { - class burst_source_impl : public burst_source + class burst_file_source_impl : public burst_file_source { private: boost::shared_ptr<gr::thread::thread> d_thread; @@ -37,8 +37,8 @@ namespace gr { bool d_finished; void run(); public: - burst_source_impl(const std::string &filename); - ~burst_source_impl(); + burst_file_source_impl(const std::string &filename); + ~burst_file_source_impl(); bool start(); bool stop(); bool finished(); @@ -46,5 +46,5 @@ namespace gr { } // namespace gsm } // namespace gr -#endif /* INCLUDED_GSM_BURST_SOURCE_IMPL_H */ +#endif /* INCLUDED_GSM_BURST_FILE_SOURCE_IMPL_H */ diff --git a/lib/misc_utils/message_printer_impl.cc b/lib/misc_utils/message_printer_impl.cc index d02e2fe..2599f65 100644 --- a/lib/misc_utils/message_printer_impl.cc +++ b/lib/misc_utils/message_printer_impl.cc @@ -41,7 +41,15 @@ namespace gr { gsmtap_hdr * header = (gsmtap_hdr *)message_plus_header; std::cout << d_prepend_string; - for(int ii=sizeof(gsmtap_hdr); ii<message_plus_header_len; ii++) + + int start_index = sizeof(gsmtap_hdr); + + if (d_print_gsmtap_header) + { + start_index = 0; + } + + for(int ii=start_index; ii<message_plus_header_len; ii++) { printf(" %02x", message_plus_header[ii]); } @@ -49,24 +57,24 @@ namespace gr { } message_printer::sptr - message_printer::make(pmt::pmt_t prepend_string) + message_printer::make(pmt::pmt_t prepend_string, bool print_gsmtap_header) { return gnuradio::get_initial_sptr - (new message_printer_impl(prepend_string)); + (new message_printer_impl(prepend_string, print_gsmtap_header)); } /* * The private constructor */ - message_printer_impl::message_printer_impl(pmt::pmt_t prepend_string) + message_printer_impl::message_printer_impl(pmt::pmt_t prepend_string, bool print_gsmtap_header) : gr::block("message_printer", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { d_prepend_string = prepend_string; + d_print_gsmtap_header = print_gsmtap_header; message_port_register_in(pmt::mp("msgs")); set_msg_handler(pmt::mp("msgs"), boost::bind(&message_printer_impl::message_print, this, _1)); - } /* diff --git a/lib/misc_utils/message_printer_impl.h b/lib/misc_utils/message_printer_impl.h index e82485e..e44288b 100644 --- a/lib/misc_utils/message_printer_impl.h +++ b/lib/misc_utils/message_printer_impl.h @@ -33,8 +33,9 @@ namespace gr { private: void message_print(pmt::pmt_t msg); pmt::pmt_t d_prepend_string; + bool d_print_gsmtap_header; public: - message_printer_impl(pmt::pmt_t prepend_string); + message_printer_impl(pmt::pmt_t prepend_string, bool print_gsmtap_header=false); ~message_printer_impl(); }; diff --git a/lib/misc_utils/burst_sink_qa_impl.cc b/lib/qa_utils/burst_sink_impl.cc index aa9df9d..de26d39 100644 --- a/lib/misc_utils/burst_sink_qa_impl.cc +++ b/lib/qa_utils/burst_sink_impl.cc @@ -25,7 +25,7 @@ #endif #include <gnuradio/io_signature.h> -#include "burst_sink_qa_impl.h" +#include "burst_sink_impl.h" #include <stdio.h> #include <sstream> #include <grgsm/gsmtap.h> @@ -33,29 +33,29 @@ namespace gr { namespace gsm { - burst_sink_qa::sptr - burst_sink_qa::make() + burst_sink::sptr + burst_sink::make() { return gnuradio::get_initial_sptr - (new burst_sink_qa_impl()); + (new burst_sink_impl()); } /* * The private constructor */ - burst_sink_qa_impl::burst_sink_qa_impl() - : gr::block("burst_sink_qa", + burst_sink_impl::burst_sink_impl() + : gr::block("burst_sink", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) { message_port_register_in(pmt::mp("in")); - set_msg_handler(pmt::mp("in"), boost::bind(&burst_sink_qa_impl::process_burst, this, _1)); + set_msg_handler(pmt::mp("in"), boost::bind(&burst_sink_impl::process_burst, this, _1)); } /* * Our virtual destructor. */ - burst_sink_qa_impl::~burst_sink_qa_impl() + burst_sink_impl::~burst_sink_impl() { // for (int i=0; i<d_burst_data.size(); i++) // { @@ -63,7 +63,7 @@ namespace gr { // } } - void burst_sink_qa_impl::process_burst(pmt::pmt_t msg) + void burst_sink_impl::process_burst(pmt::pmt_t msg) { pmt::pmt_t header_plus_burst = pmt::cdr(msg); @@ -90,17 +90,17 @@ namespace gr { d_burst_data.push_back(burst_str.str()); } - std::vector<int> burst_sink_qa_impl::get_framenumbers() + std::vector<int> burst_sink_impl::get_framenumbers() { return d_framenumbers; } - std::vector<int> burst_sink_qa_impl::get_timeslots() + std::vector<int> burst_sink_impl::get_timeslots() { return d_timeslots; } - std::vector<std::string> burst_sink_qa_impl::get_burst_data() + std::vector<std::string> burst_sink_impl::get_burst_data() { return d_burst_data; } diff --git a/lib/misc_utils/burst_sink_qa_impl.h b/lib/qa_utils/burst_sink_impl.h index 412a0a1..42e1e4a 100644 --- a/lib/misc_utils/burst_sink_qa_impl.h +++ b/lib/qa_utils/burst_sink_impl.h @@ -20,24 +20,24 @@ * */ -#ifndef INCLUDED_GSM_BURST_SINK_QA_IMPL_H -#define INCLUDED_GSM_BURST_SINK_QA_IMPL_H +#ifndef INCLUDED_GSM_BURST_SINK_IMPL_H +#define INCLUDED_GSM_BURST_SINK_IMPL_H -#include <grgsm/misc_utils/burst_sink_qa.h> +#include <grgsm/qa_utils/burst_sink.h> #include <fstream> namespace gr { namespace gsm { - class burst_sink_qa_impl : public burst_sink_qa + class burst_sink_impl : public burst_sink { private: std::vector<int> d_framenumbers; std::vector<int> d_timeslots; std::vector<std::string> d_burst_data; public: - burst_sink_qa_impl(); - ~burst_sink_qa_impl(); + burst_sink_impl(); + ~burst_sink_impl(); void process_burst(pmt::pmt_t msg); virtual std::vector<int> get_framenumbers(); virtual std::vector<int> get_timeslots(); @@ -47,5 +47,5 @@ namespace gr { } // namespace gsm } // namespace gr -#endif /* INCLUDED_GSM_BURST_SINK_QA_IMPL_H */ +#endif /* INCLUDED_GSM_BURST_SINK_IMPL_H */ diff --git a/lib/misc_utils/burst_source_qa_impl.cc b/lib/qa_utils/burst_source_impl.cc index 7b2d412..7391872 100644 --- a/lib/misc_utils/burst_source_qa_impl.cc +++ b/lib/qa_utils/burst_source_impl.cc @@ -25,7 +25,7 @@ #endif #include <gnuradio/io_signature.h> -#include "burst_source_qa_impl.h" +#include "burst_source_impl.h" #include "stdio.h" #include <boost/scoped_ptr.hpp> #include <grgsm/gsmtap.h> @@ -36,22 +36,22 @@ namespace gr { namespace gsm { - burst_source_qa::sptr - burst_source_qa::make(const std::vector<int> &framenumbers, + burst_source::sptr + burst_source::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)); + (new burst_source_impl(framenumbers, timeslots, burst_data)); } /* * The private constructor */ - burst_source_qa_impl::burst_source_qa_impl(const std::vector<int> &framenumbers, + burst_source_impl::burst_source_impl(const std::vector<int> &framenumbers, const std::vector<int> ×lots, const std::vector<std::string> &burst_data) - : gr::block("burst_source_qa", + : gr::block("burst_source", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), d_finished(false) @@ -65,37 +65,37 @@ namespace gr { /* * Our virtual destructor. */ - burst_source_qa_impl::~burst_source_qa_impl() + burst_source_impl::~burst_source_impl() { if (d_finished == false){ d_finished = true; } } - void burst_source_qa_impl::set_framenumbers(const std::vector<int> &framenumbers) + void burst_source_impl::set_framenumbers(const std::vector<int> &framenumbers) { d_framenumbers = framenumbers; } - void burst_source_qa_impl::set_timeslots(const std::vector<int> ×lots) + void burst_source_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) + void burst_source_impl::set_burst_data(const std::vector<std::string> &burst_data) { d_burst_data = burst_data; } - bool burst_source_qa_impl::start() + bool burst_source_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))); + (new gr::thread::thread(boost::bind(&burst_source_impl::run, this))); return block::start(); } - bool burst_source_qa_impl::stop() + bool burst_source_impl::stop() { d_finished = true; d_thread->interrupt(); @@ -103,12 +103,12 @@ namespace gr { return block::stop(); } - bool burst_source_qa_impl::finished() + bool burst_source_impl::finished() { return d_finished; } - void burst_source_qa_impl::run() + void burst_source_impl::run() { char *unserialized = (char*)malloc(sizeof(char) * PMT_SIZE); diff --git a/lib/misc_utils/burst_source_qa_impl.h b/lib/qa_utils/burst_source_impl.h index cb62571..969faf9 100644 --- a/lib/misc_utils/burst_source_qa_impl.h +++ b/lib/qa_utils/burst_source_impl.h @@ -20,19 +20,19 @@ * */ -#ifndef INCLUDED_GSM_BURST_SOURCE_QA_IMPL_H -#define INCLUDED_GSM_BURST_SOURCE_QA_IMPL_H +#ifndef INCLUDED_GSM_BURST_SOURCE_IMPL_H +#define INCLUDED_GSM_BURST_SOURCE_IMPL_H #define BURST_SIZE 148 -#include <grgsm/misc_utils/burst_source_qa.h> +#include <grgsm/qa_utils/burst_source.h> #include <fstream> namespace gr { namespace gsm { - class burst_source_qa_impl : public burst_source_qa + class burst_source_impl : public burst_source { private: boost::shared_ptr<gr::thread::thread> d_thread; @@ -42,10 +42,10 @@ namespace gr { bool d_finished; void run(); public: - burst_source_qa_impl(const std::vector<int> &framenumbers, + burst_source_impl(const std::vector<int> &framenumbers, const std::vector<int> ×lots, const std::vector<std::string> &burst_data); - ~burst_source_qa_impl(); + ~burst_source_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); @@ -56,6 +56,6 @@ namespace gr { } // namespace gsm } // namespace gr -#endif /* INCLUDED_GSM_BURST_SOURCE_QA_IMPL_H */ +#endif /* INCLUDED_GSM_BURST_SOURCE_IMPL_H */ diff --git a/lib/qa_utils/message_sink_impl.cc b/lib/qa_utils/message_sink_impl.cc new file mode 100644 index 0000000..269cada --- /dev/null +++ b/lib/qa_utils/message_sink_impl.cc @@ -0,0 +1,90 @@ +/* -*- 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 "message_sink_impl.h" +#include <stdio.h> +#include <sstream> + +namespace gr { + namespace gsm { + + message_sink::sptr + message_sink::make() + { + return gnuradio::get_initial_sptr + (new message_sink_impl()); + } + + /* + * The private constructor + */ + message_sink_impl::message_sink_impl() + : gr::block("message_sink", + gr::io_signature::make(0, 0, 0), + gr::io_signature::make(0, 0, 0)) + { + message_port_register_in(pmt::mp("in")); + set_msg_handler(pmt::mp("in"), boost::bind(&message_sink_impl::process_message, this, _1)); + } + + /* + * Our virtual destructor. + */ + message_sink_impl::~message_sink_impl() + { + for (int i=0; i<d_messages.size(); i++) + { + std::cout << d_messages[i].c_str() << std::endl; + } + } + + void message_sink_impl::process_message(pmt::pmt_t msg) + { + pmt::pmt_t message_plus_header_blob = pmt::cdr(msg); + uint8_t * message_plus_header = (uint8_t *)pmt::blob_data(message_plus_header_blob); + size_t message_plus_header_len = pmt::blob_length(message_plus_header_blob); + + std::stringstream s_msg_stream; + for (int i=0; i<message_plus_header_len; i++) + { + if (i>0) + { + s_msg_stream << (" "); + } + s_msg_stream << std::hex << std::setw(2) << std::setfill('0') << (unsigned)message_plus_header[i]; + } + d_messages.push_back(s_msg_stream.str()); + } + + std::vector<std::string> message_sink_impl::get_messages() + { + return d_messages; + } + + } /* namespace gsm */ +} /* namespace gr */ + diff --git a/lib/qa_utils/message_sink_impl.h b/lib/qa_utils/message_sink_impl.h new file mode 100644 index 0000000..dd11819 --- /dev/null +++ b/lib/qa_utils/message_sink_impl.h @@ -0,0 +1,47 @@ +/* -*- 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_MESSAGE_SINK_IMPL_H +#define INCLUDED_GSM_MESSAGE_SINK_IMPL_H + +#include <grgsm/qa_utils/message_sink.h> + +namespace gr { + namespace gsm { + + class message_sink_impl : public message_sink + { + private: + std::vector<std::string> d_messages; + + public: + message_sink_impl(); + ~message_sink_impl(); + void process_message(pmt::pmt_t msg); + virtual std::vector<std::string> get_messages(); + }; + + } // namespace gsm +} // namespace gr + +#endif /* INCLUDED_GSM_MESSAGE_SINK_IMPL_H */ + diff --git a/lib/qa_utils/message_source_impl.cc b/lib/qa_utils/message_source_impl.cc new file mode 100644 index 0000000..2e71ba4 --- /dev/null +++ b/lib/qa_utils/message_source_impl.cc @@ -0,0 +1,131 @@ +/* -*- 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 "message_source_impl.h" +#include <stdio.h> +#include <grgsm/gsmtap.h> +#include <grgsm/endian.h> +#include <algorithm> +#include <boost/scoped_ptr.hpp> +#include <iostream> +#include <string> +#include <sstream> + +#define MSG_BYTE_LEN 39 + + +namespace gr { + namespace gsm { + + message_source::sptr + message_source::make(const std::vector<std::string> &msg_data) + { + return gnuradio::get_initial_sptr + (new message_source_impl(msg_data)); + } + + /* + * The private constructor + */ + message_source_impl::message_source_impl(const std::vector<std::string> &msg_data) + : gr::block("message_source", + gr::io_signature::make(0, 0, 0), + gr::io_signature::make(0, 0, 0)), + d_finished(false) + { + message_port_register_out(pmt::mp("msgs")); + set_msg_data(msg_data); + } + + /* + * Our virtual destructor. + */ + message_source_impl::~message_source_impl() + { + if (d_finished == false){ + d_finished = true; + } + } + + void message_source_impl::set_msg_data(const std::vector<std::string> &msg_data) + { + for (int i=0; i<msg_data.size(); i++) + { + std::istringstream iss(msg_data[i]); + std::vector<uint8_t> bytes; + unsigned int c; + + while (iss >> std::hex >> c) + { + if (c < 256) + { + bytes.push_back(c); + } + } + + if (bytes.size() == MSG_BYTE_LEN) + { + d_msgs.push_back(bytes); + } + } + } + + bool message_source_impl::start() + { + d_finished = false; + d_thread = boost::shared_ptr<gr::thread::thread> + (new gr::thread::thread(boost::bind(&message_source_impl::run, this))); + return block::start(); + } + + bool message_source_impl::stop() + { + d_finished = true; + d_thread->interrupt(); + d_thread->join(); + return block::stop(); + } + + bool message_source_impl::finished() + { + return d_finished; + } + + void message_source_impl::run() + { + for (int i=0; i<d_msgs.size(); i++) + { + std::vector<uint8_t> current = d_msgs[i]; + pmt::pmt_t blob_header_plus_burst = pmt::make_blob(¤t[0], current.size()); + pmt::pmt_t msg = pmt::cons(pmt::PMT_NIL, blob_header_plus_burst); + message_port_pub(pmt::mp("msgs"), msg); + } + post(pmt::mp("system"), pmt::cons(pmt::mp("done"), pmt::from_long(1))); + } + } /* namespace gsm */ +} /* namespace gr */ + diff --git a/lib/qa_utils/message_source_impl.h b/lib/qa_utils/message_source_impl.h new file mode 100644 index 0000000..9856f78 --- /dev/null +++ b/lib/qa_utils/message_source_impl.h @@ -0,0 +1,51 @@ +/* -*- 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_MESSAGE_SOURCE_IMPL_H +#define INCLUDED_GSM_MESSAGE_SOURCE_IMPL_H + +#include <grgsm/qa_utils/message_source.h> + +namespace gr { + namespace gsm { + + class message_source_impl : public message_source + { + private: + boost::shared_ptr<gr::thread::thread> d_thread; + std::vector<std::vector<uint8_t> > d_msgs; + bool d_finished; + void run(); + public: + message_source_impl(const std::vector<std::string> &msg_data); + ~message_source_impl(); + virtual void set_msg_data(const std::vector<std::string> &msg_data); + bool start(); + bool stop(); + bool finished(); + }; + + } // namespace grgsm +} // namespace gr + +#endif /* INCLUDED_GSM_MESSAGE_SOURCE_IMPL_H */ + |