From 95c6f9dfba62dd2a219fc6b29a41dae401d84c9c Mon Sep 17 00:00:00 2001 From: Roman Khassraf Date: Sun, 12 Jul 2015 19:02:32 +0200 Subject: [PATCH] Added functions for retrieving data from immediate assignment extractor --- .../misc_utils/extract_immediate_assignment.h | 12 +- .../extract_immediate_assignment_impl.cc | 138 +++++++++++++++++- .../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 #include +#include 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 get_frame_numbers() = 0; + virtual std::vector get_channel_types() = 0; + virtual std::vector get_timeslots() = 0; + virtual std::vector get_subchannels() = 0; + virtual std::vector get_hopping() = 0; + virtual std::vector get_maios() = 0; + virtual std::vector get_hsns() = 0; + virtual std::vector get_arfcns() = 0; + virtual std::vector get_timing_advances() = 0; + virtual std::vector 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 #include #include +#include #include #include #include +#include +#include #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,23 +170,138 @@ 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> (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 extract_immediate_assignment_impl::get_frame_numbers() + { + std::vector fnrs; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + fnrs.push_back(i.second.frame_nr); + } + return fnrs; + } + + std::vector extract_immediate_assignment_impl::get_channel_types() + { + std::vector types; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + types.push_back(i.second.channel_type); + } + return types; + } + + std::vector extract_immediate_assignment_impl::get_timeslots() + { + std::vector timeslots; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + timeslots.push_back(i.second.timeslot); + } + return timeslots; + } + + std::vector extract_immediate_assignment_impl::get_subchannels() + { + std::vector subchannels; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + subchannels.push_back(i.second.subchannel); + } + return subchannels; + } + + std::vector extract_immediate_assignment_impl::get_hopping() + { + std::vector hopping; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + hopping.push_back(i.second.hopping); + } + return hopping; + } + + std::vector extract_immediate_assignment_impl::get_maios() + { + std::vector maios; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + maios.push_back(i.second.maio); + } + return maios; + } + + std::vector extract_immediate_assignment_impl::get_hsns() + { + std::vector hsns; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + hsns.push_back(i.second.hsn); + } + return hsns; + } + + std::vector extract_immediate_assignment_impl::get_arfcns() + { + std::vector arfcns; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + arfcns.push_back(i.second.arfcn); + } + return arfcns; + } + + std::vector extract_immediate_assignment_impl::get_timing_advances() + { + std::vector tas; + BOOST_FOREACH(immediate_assignment_map::value_type &i, d_assignment_map) + { + tas.push_back(i.second.timing_advance); + } + return tas; + } + + std::vector extract_immediate_assignment_impl::get_mobile_allocations() + { + std::vector 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 extract_immediate_assignment::make() { 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 - +#include +#include +#include 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 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 get_frame_numbers(); + virtual std::vector get_channel_types(); + virtual std::vector get_timeslots(); + virtual std::vector get_subchannels(); + virtual std::vector get_hopping(); + virtual std::vector get_maios(); + virtual std::vector get_hsns(); + virtual std::vector get_arfcns(); + virtual std::vector get_timing_advances(); + virtual std::vector get_mobile_allocations(); + extract_immediate_assignment_impl(); + ~extract_immediate_assignment_impl(); }; } // namespace gsm } // namespace gr