summaryrefslogtreecommitdiffstats
path: root/Src/PyCatcher/src
diff options
context:
space:
mode:
Diffstat (limited to 'Src/PyCatcher/src')
-rw-r--r--Src/PyCatcher/src/driverConnector.py110
-rw-r--r--Src/PyCatcher/src/localAreaDatabse.py4
-rw-r--r--Src/PyCatcher/src/pch_test.py62
-rw-r--r--Src/PyCatcher/src/pyCatcherController.py81
-rw-r--r--Src/PyCatcher/src/pyCatcherModel.py28
-rw-r--r--Src/PyCatcher/src/pyCatcherView.py49
-rw-r--r--Src/PyCatcher/src/rules.py29
-rw-r--r--Src/PyCatcher/src/settings.py17
8 files changed, 322 insertions, 58 deletions
diff --git a/Src/PyCatcher/src/driverConnector.py b/Src/PyCatcher/src/driverConnector.py
index dea253f..8b20e4a 100644
--- a/Src/PyCatcher/src/driverConnector.py
+++ b/Src/PyCatcher/src/driverConnector.py
@@ -2,9 +2,15 @@ from pyCatcherModel import BaseStationInformation
import subprocess
import threading
import re
-from settings import Commands
+from settings import Commands, PCH_retries
import time
-import gtk
+import gtk
+import datetime
+import thread
+from threading import Timer
+import os
+import signal
+import select
class DriverConnector:
def __init__ (self):
@@ -15,6 +21,8 @@ class DriverConnector:
self._base_station_found_callback = None
self._firmware_thread = None
self._scan_thread = None
+ self._pch_thread = None
+ self._pch_callback = None
def start_scanning (self, base_station_found_callback):
self._base_station_found_callback = base_station_found_callback
@@ -26,6 +34,11 @@ class DriverConnector:
self._firmware_loaded_callback = firmware_loaded_callback
self._firmware_thread = FirmwareThread(self._firmware_waiting_callback, self._firmware_loaded_callback)
self._firmware_thread.start()
+
+ def start_pch_scan(self, arfcn, timeout, scan_finished_callback):
+ self._pch_callback = scan_finished_callback
+ self._pch_thread = PCHThread(arfcn, timeout, self._pch_callback)
+ self._pch_thread.start()
def stop_scanning (self):
self._scan_thread.terminate()
@@ -38,6 +51,8 @@ class DriverConnector:
self._firmware_thread.join(3)
if self._scan_thread:
self._scan_thread.join(3)
+ if self._pch_thread:
+ self._pch_thread.join(3)
class FirmwareThread(threading.Thread):
def __init__(self, firmware_waiting_callback, firmware_loaded_callback):
@@ -76,6 +91,7 @@ class ScanThread(threading.Thread):
def run(self):
scan_process = subprocess.Popen(Commands['scan_command'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
time.sleep(2)
+ printall = False
while not self._thread_break:
line = scan_process.stdout.readline()
if line:
@@ -157,4 +173,92 @@ class ScanThread(threading.Thread):
self._base_station_found_callback(base_station)
scan_process.terminate()
- \ No newline at end of file
+
+class PCHThread(threading.Thread):
+ def __init__(self, arfcn, timeout, finished_callback):
+ gtk.gdk.threads_init()
+ threading.Thread.__init__(self)
+ self._arfcn = arfcn
+ self._timeout = timeout
+ self._thread_break = False
+ self._scan_finished_callback = finished_callback
+
+ def terminate(self):
+ self._thread_break = True
+
+ def run(self):
+ pch_retries = PCH_retries
+ max_scan_time = self._timeout
+ arfcn = self._arfcn
+ pages_found = 0
+ ia_non_hop_found = 0
+ ia_hop_fund = 0
+ retry = False
+ buffer = []
+
+ command = Commands['pch_command'] + ['-a', str(arfcn)]
+ scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ time.sleep(2)
+ poll_obj = select.poll()
+ poll_obj.register(scan_process.stdout, select.POLLIN)
+
+ start_time = datetime.datetime.now()
+ scan_time = datetime.datetime.now() - start_time
+
+ while(True and not self._thread_break):
+
+ if(retry):
+ scan_process.terminate()
+ scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ poll_obj.register(scan_process.stdout, select.POLLIN)
+ retry = False
+
+ while(pch_retries > 0 and scan_time.seconds < max_scan_time and not self._thread_break):
+ scan_time = datetime.datetime.now() - start_time
+ poll_result = poll_obj.poll(0)
+ if poll_result:
+ line = scan_process.stdout.readline()
+ else:
+ line = None
+
+ if line:
+ if 'Paging' in line:
+ pages_found += 1
+ if 'IMM' in line:
+ if 'HOP' in line:
+ ia_hop_fund += 1
+ else:
+ ia_non_hop_found += 1
+ if 'FBSB RESP: result=255' in line:
+ if(pch_retries > 0):
+ retry = True
+ break
+
+ if(retry):
+ print 'SCAN: retry (%d)'%pch_retries
+ pch_retries -= 1
+ else:
+ break
+
+ if scan_process:
+ scan_process.kill()
+
+ result = {
+ 'Pagings': pages_found,
+ 'Assignments_hopping': ia_hop_fund,
+ 'Assignments_non_hopping': ia_non_hop_found
+ }
+
+ if not self._thread_break:
+ self._scan_finished_callback((arfcn, result))
+
+class BufferFillerThread(threading.Thread):
+ def __init__(self, buffer, process):
+ gtk.gdk.threads_init()
+ threading.Thread.__init__(self)
+ self._buffer = buffer
+ self._process = process
+
+ def run(self):
+ while(True):
+ self._buffer.append(self._process.stdout.readline()) \ No newline at end of file
diff --git a/Src/PyCatcher/src/localAreaDatabse.py b/Src/PyCatcher/src/localAreaDatabse.py
index 3cded04..de08035 100644
--- a/Src/PyCatcher/src/localAreaDatabse.py
+++ b/Src/PyCatcher/src/localAreaDatabse.py
@@ -40,7 +40,7 @@ class LocalAreaDatabase:
base_station.lac,
base_station.rxlev,
base_station.rxlev,
- 1
+ base_station.times_scanned
)
sql = 'INSERT INTO basestations VALUES (?,?,?,?,?,?,?,?,?)'
self._cursor.execute(sql, values)
@@ -58,7 +58,7 @@ class LocalAreaDatabase:
rmax = current_rx
else:
rmax = old_rmax
- sightings = old_sightings + 1
+ sightings = old_sightings + base_station.times_scanned
values = (rmin,rmax,sightings,base_station.cell)
sql = 'UPDATE basestations SET rxmin=?, rxmax=?, sightings=? WHERE cellid=?'
self._cursor.execute(sql, values)
diff --git a/Src/PyCatcher/src/pch_test.py b/Src/PyCatcher/src/pch_test.py
new file mode 100644
index 0000000..9c9ae2b
--- /dev/null
+++ b/Src/PyCatcher/src/pch_test.py
@@ -0,0 +1,62 @@
+from settings import Commands
+import subprocess
+import time
+import datetime
+
+def main():
+
+ pch_retries = 5
+ max_scan_time = 20
+ arfcn = 17
+ pages_found = 0
+ ia_non_hop_found = 0
+ ia_hop_fund = 0
+
+ command = Commands['pch_command'] + ['-a', str(arfcn)]
+ scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ time.sleep(2)
+ retry = False
+
+ start_time = datetime.datetime.now()
+ scan_time = datetime.datetime.now() - start_time
+
+ while(True):
+ if(retry):
+ scan_process.terminate()
+ scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ retry = False
+
+ while(pch_retries > 0 and scan_time.seconds < max_scan_time):
+ scan_time = datetime.datetime.now() - start_time
+ line = scan_process.stdout.readline()
+ if line:
+ if 'Paging' in line:
+ pages_found += 1
+ if 'IMM' in line:
+ if 'HOP' in line:
+ ia_hop_fund += 1
+ else:
+ ia_non_hop_found += 1
+ if 'FBSB RESP: result=255' in line:
+ if(pch_retries > 0):
+ retry = True
+ break
+
+ if(retry):
+ pch_retries -= 1
+ else:
+ break
+
+ if scan_process:
+ scan_process.terminate()
+
+ result = {
+ 'Pagings': pages_found,
+ 'Assignments_hopping': ia_hop_fund,
+ 'Assignments_non_hopping': ia_non_hop_found
+ }
+
+ print result
+
+if __name__ == "__main__":
+ main() \ No newline at end of file
diff --git a/Src/PyCatcher/src/pyCatcherController.py b/Src/PyCatcher/src/pyCatcherController.py
index 38f1567..3d3beac 100644
--- a/Src/PyCatcher/src/pyCatcherController.py
+++ b/Src/PyCatcher/src/pyCatcherController.py
@@ -11,7 +11,7 @@ from rules import ProviderRule, ARFCNMappingRule, CountryMappingRule, LACMapping
import pickle
from localAreaDatabse import LocalAreaDatabase
from cellIDDatabase import CellIDDatabase, CellIDDBStatus, CIDDatabases
-from settings import Database_path
+from settings import Database_path, USR_timeout, Pagings_per_10s_threshold, Assignment_limit
class PyCatcherController:
def __init__(self):
@@ -36,6 +36,12 @@ class PyCatcherController:
self._weighted_evaluator = WeightedEvaluator()
self._active_evaluator = self._conservative_evaluator
+ self._pch_scan_running = False
+ self._user_mode_flag = False
+ self._remaining_pch_arfcns = []
+ self._accumulated_pch_results = []
+ self._pch_timeout = 10
+
self.provider_rule = ProviderRule()
self.provider_rule.is_active = True
self.country_mapping_rule = CountryMappingRule()
@@ -124,11 +130,76 @@ class PyCatcherController:
self._active_evaluator = self._weighted_evaluator
self.trigger_evaluation()
- def user_go(self, provider):
- pass
+ def user_pch_scan(self, provider):
+ if not provider:
+ self._gui.set_user_image()
+ return
+ else:
+ self._gui.set_user_image(RuleResult.IGNORE)
+ self._user_mode_flag = True
+ strongest_station = None
+ max_rx = -1000
+ for station in self._base_station_list._get_unfiltered_list():
+ if station.provider == provider:
+ if station.rxlev > max_rx:
+ max_rx = station.rxlev
+ strongest_station = station
+ if strongest_station:
+ if strongest_station.evaluation == RuleResult.OK:
+ self._remaining_pch_arfcns = [strongest_station.arfcn]
+ self._accumulated_pch_results = []
+ self._do_next_pch_scan()
+ else:
+ self._gui.set_user_image(strongest_station.evaluation)
+ else:
+ self._gui.set_user_image()
+
+
+ def normal_pch_scan(self, arfcns, timeout):
+ self._accumulated_pch_results = []
+ self._user_mode_flag = False
+ self._scan_pch(arfcns, timeout)
+
+ def _scan_pch(self, arfcns, timeout):
+ self._remaining_pch_arfcns = arfcns
+ self._pch_timeout = timeout
+ self._do_next_pch_scan()
+
+ def _do_next_pch_scan(self):
+ if not self._remaining_pch_arfcns:
+ return
+ arfcn = self._remaining_pch_arfcns.pop()
+ self._gui.log_line('Starting PCH scan on ARFCN %d'%arfcn)
+ if self._pch_scan_running:
+ return
+ else:
+ self._pch_scan_running = True
+ self._driver_connector.start_pch_scan(arfcn, self._pch_timeout, self._pch_done_callback)
+
+ def _pch_done_callback(self, results):
+ arfcn, values = results
+ self._accumulated_pch_results.append(results)
+ self._gui.log_line('Finished PCH scan on ARFCN %d'%arfcn)
+ self._pch_scan_running = False
+ if not self._user_mode_flag :
+ if self._remaining_pch_arfcns:
+ self._do_next_pch_scan()
+ else:
+ self._gui.set_pch_results(self._accumulated_pch_results)
+ else:
+ arfcn, results = self._accumulated_pch_results.pop()
+ if results['Assignments_non_hopping'] > 0:
+ self._gui.log_line('Non hopping channel found')
+ self._gui.set_user_image(RuleResult.CRITICAL)
+ elif results['Assignments_hopping'] >= Assignment_limit and self._return_normalised_pagings(results['Pagings']) >= Pagings_per_10s_threshold:
+ self._gui.log_line('Scan Ok')
+ self._gui.set_user_image(RuleResult.OK)
+ else:
+ self._gui.log_line('Paging/Assignment threshold not met')
+ self._gui.set_user_image(RuleResult.CRITICAL)
- def scan_encryption(self, arfcn_list, timeout):
- pass
+ def _return_normalised_pagings(self, pagings):
+ return (float(pagings) / float(USR_timeout))*10
def update_with_web_services(self):
self._gui.log_line('Starting online lookups...')
diff --git a/Src/PyCatcher/src/pyCatcherModel.py b/Src/PyCatcher/src/pyCatcherModel.py
index f4615fc..0370da5 100644
--- a/Src/PyCatcher/src/pyCatcherModel.py
+++ b/Src/PyCatcher/src/pyCatcherModel.py
@@ -5,12 +5,6 @@ from cellIDDatabase import CellIDDBStatus
from cellIDDatabase import CIDDatabases
from rules import RuleResult
-class Encryption:
- A0 = 'A5/0'
- A1 = 'A5/1'
- A2 = 'A5/2'
- NA = 'Not checked.'
-
class BaseStationInformation:
def __init__ (self):
@@ -37,9 +31,10 @@ class BaseStationInformation:
self.evaluation_by = 'NYE'
self.latitude = 0
self.longitude = 0
- self.encryption = Encryption.NA
self.db_status = CellIDDBStatus.NOT_LOOKED_UP
self.db_provider = CIDDatabases.NONE
+ self.imm_ass = 0
+ self.pagings = 0
def get_list_model(self):
@@ -55,13 +50,12 @@ BSIC: %s
LAC: %s
Cell ID: %s
Neighbours: %s
-Encryption: %s
Latitude: %s
Longitude: %s
Database Status: %s
Database Provider: %s
Evaluation: %s\n
-'''%(self.country,self.provider, self.arfcn, self.rxlev, self.bsic, self.lac, self.cell, ', '.join(map(str,self.neighbours)),self.encryption,self.latitude,self.longitude,self.db_status, self.db_provider,self.evaluation)
+'''%(self.country,self.provider, self.arfcn, self.rxlev, self.bsic, self.lac, self.cell, ', '.join(map(str,self.neighbours)),self.latitude,self.longitude,self.db_status, self.db_provider,self.evaluation)
report_rules ='------- Rule Results -----------\n'
for key in self.rules_report.keys():
@@ -93,10 +87,22 @@ class BaseStationInformationList:
def add_station(self, base_station):
base_station.found = True
for item in self._base_station_list:
- #TODO: check if this works like i thought
- if item.arfcn == base_station.arfcn and item.bsic == base_station.bsic:
+ if item.arfcn == base_station.arfcn:
item.discovery_time = datetime.datetime.now().strftime('%T')
item.times_scanned += 1
+ item.rxlev = base_station.rxlev
+ item.lac = base_station.lac
+ item.cell = base_station.cell
+ item.bsic = base_station.bsic
+ item.neighbours = base_station.neighbours
+ item.country = base_station.country
+ item.provider = base_station.provider
+ item.system_info_t1 = base_station.system_info_t1
+ item.system_info_t3 = base_station.system_info_t3
+ item.system_info_t4 = base_station.system_info_t4
+ item.system_info_t2 = base_station.system_info_t2
+ item.system_info_t2bis = base_station.system_info_t2bis
+ item.system_info_t2ter = base_station.system_info_t2ter
break
else:
self._base_station_list.append(base_station)
diff --git a/Src/PyCatcher/src/pyCatcherView.py b/Src/PyCatcher/src/pyCatcherView.py
index 196a650..07c7d10 100644
--- a/Src/PyCatcher/src/pyCatcherView.py
+++ b/Src/PyCatcher/src/pyCatcherView.py
@@ -26,7 +26,7 @@ class PyCatcherGUI:
self._evaluation_image = self._builder.get_object('evaluation_image')
self._user_image = self._builder.get_object('img_user')
self._databases_window = self._builder.get_object('databases_window')
- self._encryption_window = self._builder.get_object('encryption_window')
+ self._pch_window = self._builder.get_object('pch_window')
self._user_window = self._builder.get_object('user_window')
@@ -34,8 +34,9 @@ class PyCatcherGUI:
self._warning_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/warning.png')
self._critical_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/critical.png')
self._plain_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/plain.png')
+ self._busy_image = gtk.gdk.pixbuf_new_from_file('../GUI/Images/foundstation.png')
self.set_evaluator_image(RuleResult.IGNORE)
- self.set_user_image(RuleResult.IGNORE)
+ self.set_user_image()
self._catcher_controller = catcher_controller
@@ -79,16 +80,18 @@ class PyCatcherGUI:
pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
self._evaluation_image.set_from_pixbuf(pixbuf)
- def set_user_image(self, status):
+ def set_user_image(self, status=None):
pixbuf = self._plain_image
- if status == RuleResult.OK:
+ if not status:
+ pass
+ elif status == RuleResult.OK:
pixbuf = self._ok_image
elif status == RuleResult.WARNING:
pixbuf = self._warning_image
elif status == RuleResult.CRITICAL:
pixbuf = self._critical_image
elif status == RuleResult.IGNORE:
- pixbuf = self._plain_image
+ pixbuf = self._busy_image
pixbuf = pixbuf.scale_simple(320, 240, gtk.gdk.INTERP_BILINEAR)
self._user_image.set_from_pixbuf(pixbuf)
@@ -171,25 +174,35 @@ class PyCatcherGUI:
def _on_user_close_clicked(self, widget):
self._user_window.hide()
- def _on_encryption_close_clicked(self, widget):
+ def _on_pch_close_clicked(self, widget):
self._catcher_controller.trigger_evaluation()
- self._encryption_window.hide()
-
- def _on_scan_enc_clicked(self, widget):
- arfcn_list = map(int,(self._builder.get_object('te_enc_arfcns').get_text()).split(','))
- timeout = int(self._builder.get_object('te_enc_timeout').get_text())
- result = self._catcher_controller.scan_encryption(arfcn_list, timeout)
- self._builder.get_object('lbl_enc_result').set_text('Result: ' + result)
- def _on_go_clicked(self, widget):
+ self._pch_window.hide()
+
+ def _on_pch_scan_clicked(self, widget):
+ arfcns = map(int, self._builder.get_object('te_pch_arfcns').get_text().strip().split(','))
+ timeout = int(self._builder.get_object('te_pch_timeout').get_text())
+ self._catcher_controller.normal_pch_scan(arfcns, timeout)
+
+ def set_pch_results(self, results):
+ results_label = self._builder.get_object('lbl_pch_result')
+ result_text = 'Results:\n'
+ for scan in results:
+ arfcn, pagings = scan
+ result_text += 'ARFCN %d:\n'%arfcn
+ for key, value in pagings.items():
+ result_text += ' %s: %d\n'%(key, value)
+ result_text += '\n'
+ results_label.set_text(result_text)
+
+ def _on_user_evaluate_clicked(self, widget):
provider = self._builder.get_object('te_user_provider').get_text()
- result = self._catcher_controller.user_go()
- self.set_user_image(result)
+ self._catcher_controller.user_pch_scan(provider)
def _on_user_mode_clicked(self, widget):
self._user_window.show()
- def _on_encryption_clicked(self, widget):
- self._encryption_window.show()
+ def _on_pch_clicked(self, widget):
+ self._pch_window.show()
def _on_web_services_clicked(self, widget):
self._update_databases()
diff --git a/Src/PyCatcher/src/rules.py b/Src/PyCatcher/src/rules.py
index 4a5efd4..29676cf 100644
--- a/Src/PyCatcher/src/rules.py
+++ b/Src/PyCatcher/src/rules.py
@@ -64,7 +64,7 @@ class ARFCNMappingRule (Rule):
if station.arfcn == arfcn:
if station.provider in ARFCN_mapping:
for lower,upper in ARFCN_mapping[station.provider]:
- if lower < station.arfcn < upper:
+ if lower <= station.arfcn <= upper:
result = RuleResult.OK
break
return result
@@ -227,7 +227,6 @@ class CellIDDatabaseRule (Rule):
else:
return RuleResult.CRITICAL
-#TODO: remove debug crap
class LACChangeRule (Rule):
identifier = 'LAC Change Rule'
@@ -238,28 +237,26 @@ class LACChangeRule (Rule):
for item in base_station_list:
if item.arfcn == arfcn:
if self._old_lac.has_key(arfcn):
- lac, old_scanned = self._old_lac[arfcn]
+ lac, old_scanned, old_result = self._old_lac[arfcn]
if item.times_scanned > 1:
if item.times_scanned > old_scanned:
#print 'evaluating lac change on %d(%d): old lac %d / new lac %d'%(item.times_scanned,arfcn, lac, item.lac)
if item.lac == lac:
- self._old_lac[arfcn] = item.lac, item.times_scanned
+ self._old_lac[arfcn] = item.lac, item.times_scanned, RuleResult.OK
#print ' return ok'
return RuleResult.OK
else:
- self._old_lac[arfcn] = item.lac, item.times_scanned
+ self._old_lac[arfcn] = lac, item.times_scanned, RuleResult.CRITICAL
#print ' return critical'
return RuleResult.CRITICAL
else:
- return RuleResult.IGNORE
+ return old_result
else:
- return RuleResult.IGNORE
+ return old_result
else:
- self._old_lac[arfcn] = item.lac, item.times_scanned
+ self._old_lac[arfcn] = item.lac, item.times_scanned, RuleResult.IGNORE
return RuleResult.IGNORE
-
-#TODO: remove debug crap
class RxChangeRule (Rule):
identifier = 'rx Change Rule'
@@ -270,7 +267,7 @@ class RxChangeRule (Rule):
for item in base_station_list:
if item.arfcn == arfcn:
if self._old_rx.has_key(arfcn):
- rx, old_scanned = self._old_rx[arfcn]
+ rx, old_scanned, old_result = self._old_rx[arfcn]
if item.times_scanned > 1:
if item.times_scanned > old_scanned:
#print 'evaluating rx change on %d(%d): old rx %d / new rx %d'%(item.times_scanned,arfcn, rx, item.rxlev)
@@ -278,17 +275,17 @@ class RxChangeRule (Rule):
upper_bound = rx + math.fabs(rx * CH_RX_threshold)
#print ' thresholds: %d/%d'%(lower_bound, upper_bound)
if lower_bound <= item.rxlev <= upper_bound:
- self._old_rx[arfcn] = item.rxlev, item.times_scanned
+ self._old_rx[arfcn] = item.rxlev, item.times_scanned, RuleResult.OK
#print ' return ok'
return RuleResult.OK
else:
- self._old_rx[arfcn] = item.rxlev, item.times_scanned
+ self._old_rx[arfcn] = item.rxlev, item.times_scanned, RuleResult.CRITICAL
#print ' return critical '
return RuleResult.CRITICAL
else:
- return RuleResult.IGNORE
+ return old_result
else:
- return RuleResult.IGNORE
+ return old_result
else:
- self._old_rx[arfcn] = item.rxlev, item.times_scanned
+ self._old_rx[arfcn] = item.rxlev, item.times_scanned, RuleResult.IGNORE
return RuleResult.IGNORE
diff --git a/Src/PyCatcher/src/settings.py b/Src/PyCatcher/src/settings.py
index e62e5c5..b810899 100644
--- a/Src/PyCatcher/src/settings.py
+++ b/Src/PyCatcher/src/settings.py
@@ -16,6 +16,7 @@ Commands = {'osmocon_command' : [Osmocon_lib + '/host/osmocon/osmocon',
Osmocon_lib + '/target/firmware/board/' + Device_settings['firmware']
+ '/layer1.compalram.bin'],
'scan_command' : [Osmocon_lib + '/host/layer23/src/misc/catcher'],
+ 'pch_command' : [Osmocon_lib + '/host/layer23/src/misc/pch_scan'],
}
#Rules Configuration -------------------------------------------------------------------------------------------
@@ -40,17 +41,27 @@ LAC_mapping = {
ARFCN_mapping = {
'DB Systel GSM-R': [(0,1)],
- 'T-Mobile' : [(13,39),(81, 102),(122,124),(587,611)],
+ 'T-Mobile' : [(13,49),(81, 102),(122,124),(587,611)],
'O2' : [(0,0),(1000,1023),(637,723)],
'Vodafone' : [(1,12),(50,80),(103,121),(725,751)],
'E-Plus' : [(975,999),(777,863)]
}
-LAC_threshold = 0
+LAC_threshold = 0.05
DB_RX_threshold = 0.05
-CH_RX_threshold = 0.02
+CH_RX_threshold = 0.07
+
+Pagings_per_10s_threshold = 20
+
+Assignment_limit = 0
+
+#PCH Parameters ------------------------------------------------------------------------------------------------
+
+PCH_retries = 5
+
+USR_timeout = 15
#Evaluator Configuration ---------------------------------------------------------------------------------------