aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Khassraf <roman@khassraf.at>2015-09-27 10:49:23 +0200
committerRoman Khassraf <roman@khassraf.at>2015-09-27 10:49:23 +0200
commit74efd100da9b891edefa590bb70fe2f75fa86b67 (patch)
treec42d9317a4403b06379be6327a58623c2680ac85
parent9f4feb5c38d469d6ebc3e386f9d413a383f644ac (diff)
Added parsing arfcn's from cell description in SIT1.
-rw-r--r--include/grgsm/misc_utils/extract_system_info.h1
-rw-r--r--lib/misc_utils/extract_system_info_impl.cc30
-rw-r--r--lib/misc_utils/extract_system_info_impl.h2
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();