aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/CMakeLists.txt13
-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.cc18
-rw-r--r--lib/misc_utils/message_printer_impl.h3
-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.cc90
-rw-r--r--lib/qa_utils/message_sink_impl.h47
-rw-r--r--lib/qa_utils/message_source_impl.cc131
-rw-r--r--lib/qa_utils/message_source_impl.h51
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> &timeslots,
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> &timeslots,
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> &timeslots)
+ void burst_source_impl::set_timeslots(const std::vector<int> &timeslots)
{
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> &timeslots,
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> &timeslots);
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(&current[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 */
+