diff options
author | Roman Khassraf <roman@khassraf.at> | 2015-07-12 19:02:32 +0200 |
---|---|---|
committer | Roman Khassraf <roman@khassraf.at> | 2015-07-12 19:02:32 +0200 |
commit | 95c6f9dfba62dd2a219fc6b29a41dae401d84c9c (patch) | |
tree | e0589f679ce9311c6f4349f8133d34d78b1c83cc | |
parent | 4a7b645bd46bbbf88903998937a8366101a09503 (diff) |
Added functions for retrieving data from immediate assignment extractor
-rw-r--r-- | include/grgsm/misc_utils/extract_immediate_assignment.h | 12 | ||||
-rw-r--r-- | lib/misc_utils/extract_immediate_assignment_impl.cc | 138 | ||||
-rw-r--r-- | lib/misc_utils/extract_immediate_assignment_impl.h | 46 |
3 files changed, 186 insertions, 10 deletions
diff --git a/include/grgsm/misc_utils/extract_immediate_assignment.h b/include/grgsm/misc_utils/extract_immediate_assignment.h index 74e69a4..90e2ef0 100644 --- a/include/grgsm/misc_utils/extract_immediate_assignment.h +++ b/include/grgsm/misc_utils/extract_immediate_assignment.h @@ -26,10 +26,10 @@ #include <grgsm/api.h> #include <gnuradio/block.h> +#include <vector> namespace gr { namespace gsm { - /*! * \brief <+description of block+> * \ingroup gsm @@ -49,6 +49,16 @@ namespace gr { * creating new instances. */ static sptr make(); + virtual std::vector<int> get_frame_numbers() = 0; + virtual std::vector<std::string> get_channel_types() = 0; + virtual std::vector<int> get_timeslots() = 0; + virtual std::vector<int> get_subchannels() = 0; + virtual std::vector<int> get_hopping() = 0; + virtual std::vector<int> get_maios() = 0; + virtual std::vector<int> get_hsns() = 0; + virtual std::vector<int> get_arfcns() = 0; + virtual std::vector<int> get_timing_advances() = 0; + virtual std::vector<std::string> get_mobile_allocations() = 0; }; } // namespace gsm } // namespace gr diff --git a/lib/misc_utils/extract_immediate_assignment_impl.cc b/lib/misc_utils/extract_immediate_assignment_impl.cc index b7df803..0129d2f 100644 --- a/lib/misc_utils/extract_immediate_assignment_impl.cc +++ b/lib/misc_utils/extract_immediate_assignment_impl.cc @@ -28,9 +28,12 @@ #include <grgsm/gsmtap.h> #include <unistd.h> #include <set> +#include <map> #include <iterator> #include <algorithm> #include <iostream> +#include <endian.h> +#include <boost/foreach.hpp> #include "extract_immediate_assignment_impl.h" @@ -47,10 +50,12 @@ namespace gr { if(msg_elements[2]==0x3f) { + immediate_assignment current; std::cout << "\n------------------------------------------------------------------\n" << std::endl; - std::cout << "Immediate assignment found !" << std::endl; std::cout << "FrameNr: " << (unsigned)frame_nr << std::endl; + current.frame_nr = frame_nr; + uint8_t mode = msg_elements[3] & (1 << 4); /* @@ -101,9 +106,15 @@ namespace gr { } else { + channel_type = "GPRS - Temporary Block Flow TBF"; + subchannel = 0; std::cout << "Channel type: " << "GPRS - Temporary Block Flow TBF" << std::endl; } + current.channel_type = channel_type; + current.timeslot = timeslot; + current.subchannel = subchannel; + /* msg_elements[5], msg_elements[6] are octets 3 and 4 in specs @@ -123,6 +134,7 @@ namespace gr { 6bit HSN */ uint8_t hopping = (msg_elements[5] >> 4) & 1; + current.hopping = hopping; std::cout << "Hopping: " << (unsigned)hopping << std::endl; @@ -133,6 +145,9 @@ namespace gr { uint8_t hsn = (msg_elements[6] & 0x3f); + current.maio = maio; + current.hsn = hsn; + std::cout << "MAIO: " << (unsigned)maio << std::endl; std::cout << "HSN: " << (unsigned)hsn << std::endl; } @@ -141,6 +156,8 @@ namespace gr { uint16_t arfcn = (msg_elements[5] & 3) << 8; arfcn |= msg_elements[6]; + current.arfcn = arfcn; + std::cout << "ARFCN: " << (unsigned)arfcn << std::endl; } @@ -153,21 +170,136 @@ namespace gr { uint8_t timing_advance = msg_elements[10]; std::cout << "TA: " << (unsigned)timing_advance << std::endl; + current.timing_advance = timing_advance; + + /* msg_elements[11] - 20: mobile allocation, flexible length, see 10.5.2.21 */ - uint8_t mobile_allocation_len = msg_elements[11]; if (mobile_allocation_len > 0) { uint8_t mobile_allocation[mobile_allocation_len]; + std::string ma; + for (int i=0; i<mobile_allocation_len; i++) { mobile_allocation[i] = msg_elements[12 + i]; - std::cout << "MA: " << (unsigned)mobile_allocation[i] << std::endl; + + for (int j=0; j<8; j++) + { + ma.push_back('0' + ((mobile_allocation[i] >> (7-j)) & 0x1)); + } + +// std::cout << "MA: " << (unsigned)mobile_allocation[i] << std::endl; + std::cout << "MA: " << ma << std::endl; } + + current.mobile_allocation = ma; } + + d_assignment_map[current.frame_nr] = current; + } + } + + std::vector<int> extract_immediate_assignment_impl::get_frame_numbers() + { + std::vector<int> fnrs; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + fnrs.push_back(i.second.frame_nr); + } + return fnrs; + } + + std::vector<std::string> extract_immediate_assignment_impl::get_channel_types() + { + std::vector<std::string> types; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + types.push_back(i.second.channel_type); + } + return types; + } + + std::vector<int> extract_immediate_assignment_impl::get_timeslots() + { + std::vector<int> timeslots; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + timeslots.push_back(i.second.timeslot); + } + return timeslots; + } + + std::vector<int> extract_immediate_assignment_impl::get_subchannels() + { + std::vector<int> subchannels; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + subchannels.push_back(i.second.subchannel); + } + return subchannels; + } + + std::vector<int> extract_immediate_assignment_impl::get_hopping() + { + std::vector<int> hopping; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + hopping.push_back(i.second.hopping); + } + return hopping; + } + + std::vector<int> extract_immediate_assignment_impl::get_maios() + { + std::vector<int> maios; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + maios.push_back(i.second.maio); + } + return maios; + } + + std::vector<int> extract_immediate_assignment_impl::get_hsns() + { + std::vector<int> hsns; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + hsns.push_back(i.second.hsn); + } + return hsns; + } + + std::vector<int> extract_immediate_assignment_impl::get_arfcns() + { + std::vector<int> arfcns; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + arfcns.push_back(i.second.arfcn); + } + return arfcns; + } + + std::vector<int> extract_immediate_assignment_impl::get_timing_advances() + { + std::vector<int> tas; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + tas.push_back(i.second.timing_advance); + } + return tas; + } + + std::vector<std::string> extract_immediate_assignment_impl::get_mobile_allocations() + { + std::vector<std::string> mobile_allocations; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + mobile_allocations.push_back(i.second.mobile_allocation); } + return mobile_allocations; } extract_immediate_assignment::sptr diff --git a/lib/misc_utils/extract_immediate_assignment_impl.h b/lib/misc_utils/extract_immediate_assignment_impl.h index 2bb9538..93e61a0 100644 --- a/lib/misc_utils/extract_immediate_assignment_impl.h +++ b/lib/misc_utils/extract_immediate_assignment_impl.h @@ -24,18 +24,52 @@ #define INCLUDED_GSM_EXTRACT_IMMEDIATE_ASSIGNMENT_IMPL_H #include <grgsm/misc_utils/extract_immediate_assignment.h> - +#include <set> +#include <map> +#include <vector> namespace gr { namespace gsm { + class immediate_assignment + { + public: + uint32_t frame_nr; + std::string channel_type; + uint8_t timeslot; + uint8_t subchannel; + uint8_t hopping; + uint8_t maio; + uint8_t hsn; + uint16_t arfcn; + uint8_t timing_advance; + std::string mobile_allocation; + + immediate_assignment() : frame_nr(0), channel_type("unknown"), timeslot(0), subchannel(0), + hopping(false), maio(0), hsn(0), arfcn(0), timing_advance(0), mobile_allocation("") {}; + ~immediate_assignment() {}; + }; + + typedef std::map<uint32_t, immediate_assignment> immediate_assignment_map; + class extract_immediate_assignment_impl : public extract_immediate_assignment { - private: - void process_message(pmt::pmt_t msg); - public: - extract_immediate_assignment_impl(); - ~extract_immediate_assignment_impl(); + private: + void process_message(pmt::pmt_t msg); + immediate_assignment_map d_assignment_map; + public: + virtual std::vector<int> get_frame_numbers(); + virtual std::vector<std::string> get_channel_types(); + virtual std::vector<int> get_timeslots(); + virtual std::vector<int> get_subchannels(); + virtual std::vector<int> get_hopping(); + virtual std::vector<int> get_maios(); + virtual std::vector<int> get_hsns(); + virtual std::vector<int> get_arfcns(); + virtual std::vector<int> get_timing_advances(); + virtual std::vector<std::string> get_mobile_allocations(); + extract_immediate_assignment_impl(); + ~extract_immediate_assignment_impl(); }; } // namespace gsm } // namespace gr |