diff options
author | Roman Khassraf <roman@khassraf.at> | 2015-09-27 10:49:23 +0200 |
---|---|---|
committer | Roman Khassraf <roman@khassraf.at> | 2015-09-27 10:49:23 +0200 |
commit | 74efd100da9b891edefa590bb70fe2f75fa86b67 (patch) | |
tree | c42d9317a4403b06379be6327a58623c2680ac85 | |
parent | 9f4feb5c38d469d6ebc3e386f9d413a383f644ac (diff) |
Added parsing arfcn's from cell description in SIT1.
-rw-r--r-- | include/grgsm/misc_utils/extract_system_info.h | 1 | ||||
-rw-r--r-- | lib/misc_utils/extract_system_info_impl.cc | 30 | ||||
-rw-r--r-- | lib/misc_utils/extract_system_info_impl.h | 2 |
3 files changed, 33 insertions, 0 deletions
diff --git a/include/grgsm/misc_utils/extract_system_info.h b/include/grgsm/misc_utils/extract_system_info.h index d449cce..a05be18 100644 --- a/include/grgsm/misc_utils/extract_system_info.h +++ b/include/grgsm/misc_utils/extract_system_info.h @@ -57,6 +57,7 @@ namespace gr { virtual std::vector<int> get_mcc() = 0; virtual std::vector<int> get_mnc() = 0; virtual std::vector<int> get_ccch_conf() = 0; + virtual std::vector<int> get_cell_arfcns(int chan_id) = 0; virtual std::vector<int> get_neighbours(int chan_id) = 0; virtual void reset() = 0; }; diff --git a/lib/misc_utils/extract_system_info_impl.cc b/lib/misc_utils/extract_system_info_impl.cc index 73ce992..22e09aa 100644 --- a/lib/misc_utils/extract_system_info_impl.cc +++ b/lib/misc_utils/extract_system_info_impl.cc @@ -161,6 +161,27 @@ namespace gr { } } } + else if(msg_elements[2]==0x19) + { //System Information Type 1 + memset(freq, 0, sizeof(freq)); + chan_info info; + info.id = be16toh(header->arfcn); //take arfcn + info.pwr_db = header->signal_dbm; + boost::mutex::scoped_lock lock(extract_mutex); + //read cell arfcn's + gsm48_decode_freq_list(freq, &msg_elements[3], 16, 0x8c, 0x01); + if(d_c0_channels.find(info.id) != d_c0_channels.end()){ + d_c0_channels[info.id].copy_nonzero_elements(info); + } else { + d_c0_channels[info.id] = info; + } + + for(int arfcn=0; arfcn<sizeof(freq); arfcn++){ + if(freq[arfcn].mask==0x01){ + d_c0_channels[info.id].cell_arfcns.insert(arfcn); + } + } + } } std::vector<int> extract_system_info_impl::get_chans() @@ -234,6 +255,15 @@ namespace gr { } return neighbour_cells; } + + std::vector<int> extract_system_info_impl::get_cell_arfcns(int chan_id) + { + std::vector<int> cell_arfcns; + BOOST_FOREACH(int n, d_c0_channels[chan_id].cell_arfcns){ + cell_arfcns.push_back(n); + } + return cell_arfcns; + } void extract_system_info_impl::reset() { diff --git a/lib/misc_utils/extract_system_info_impl.h b/lib/misc_utils/extract_system_info_impl.h index cd0b2b0..20f5adc 100644 --- a/lib/misc_utils/extract_system_info_impl.h +++ b/lib/misc_utils/extract_system_info_impl.h @@ -41,6 +41,7 @@ namespace gr { unsigned int mnc; unsigned int ccch_conf; std::set<int> neighbour_cells; + std::set<int> cell_arfcns; chan_info() : id(-1), pwr_db(0), arfcn(0), lac(0), cell_id(0), mcc(0), mnc(0), ccch_conf(-1){} chan_info(const chan_info & info) : id(info.id), pwr_db(info.pwr_db), arfcn(info.arfcn), lac(info.lac), cell_id(info.cell_id), mcc(info.mcc), mnc(info.mnc), ccch_conf(info.ccch_conf){} @@ -89,6 +90,7 @@ namespace gr { virtual std::vector<int> get_mcc(); virtual std::vector<int> get_mnc(); virtual std::vector<int> get_ccch_conf(); + virtual std::vector<int> get_cell_arfcns(int chan_id); virtual std::vector<int> get_neighbours(int chan_id); virtual void reset(); extract_system_info_impl(); |