r250 - trunk/software/pyneod

smartphones-commits at lists.linuxtogo.org smartphones-commits at lists.linuxtogo.org
Thu Apr 24 22:52:19 CEST 2008


Author: emdete
Date: 2008-04-24 22:52:19 +0200 (Thu, 24 Apr 2008)
New Revision: 250

Added:
   trunk/software/pyneod/pyllbd.py
Log:
added a daemon to allow location by cell-id from pygsmd through a
local cell-id-location-database.


Added: trunk/software/pyneod/pyllbd.py
===================================================================
--- trunk/software/pyneod/pyllbd.py	                        (rev 0)
+++ trunk/software/pyneod/pyllbd.py	2008-04-24 20:52:19 UTC (rev 250)
@@ -0,0 +1,119 @@
+#!/usr/bin/env python2.5
+# -*- coding: utf-8 -*-
+
+# copyright: m. dietrich
+# license: gpl
+__revision = '$Rev$'
+
+from os import unlink
+from struct import pack, unpack, calcsize
+from gdbm import open as db_open
+from base import log_info, log_debug, config, LOG_ERR, LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG, dedbusmap
+from freesmartphone import *
+
+'''
+dbus-send --system --print-reply --type=method_call --dest=org.mobile /org/mobile/LocalLocation org.mobile.Location.SetPosition string:262.2.144.26993
+'''
+
+class LocalLocation(NotifyObject):
+	def __init__(self, bus):
+		LOG(LOG_DEBUG, __name__, '__init__')
+		NotifyObject.__init__(self,
+			object_path='/org/mobile/LocalLocation',
+			bus_name=BusName(DBUS_NAME, bus),
+			)
+		self.db = db_open(config.get('llb', 'database'), 'r')
+
+	@method(DIN_LOCATION, 's', 'a{sv}')
+	def SetPosition(self, cellid):
+		LOG(LOG_DEBUG, __name__, 'SetPosition', cellid)
+		key = self.gen_key(*[int(n) for n in cellid.split('.')])
+		if self.db.has_key(key):
+			latitude, longitude, radius = self.value(self.db[key])
+			content = dict(latitude=latitude, longitude=longitude, fix=1, )
+		else:
+			content = dict(latitude=0.0, longitude=0.0, fix=0, )
+		self.Position(content)
+		return content
+
+	@notify(DIN_LOCATION, 'a{sv}')
+	def Position(self, content):
+		LOG(LOG_DEBUG, __name__, 'Position', content)
+
+	@staticmethod
+	def gen_key(mcc, mnc, lac, ci, ):
+		return pack('!iiii', mcc, mnc, lac, ci, )
+
+	@staticmethod
+	def gen_value(mcc, mnc, lac, ci, radius, latitude, longitude, begin_angle, end_angle):
+		return pack('!iii', int(latitude*1000000), int(longitude*1000000), radius, )
+
+	@staticmethod
+	def value(buf):
+		latitude, longitude, radius = unpack('!iii', buf)
+		latitude = float(latitude) / 1000000
+		longitude = float(longitude) / 1000000
+		return latitude, longitude, radius
+
+	@staticmethod
+	def import_to_gdb(from_db):
+		f = open(from_db, 'r')
+		try: unlink(config.get('llb', 'database'))
+		except: pass
+		db = db_open(config.get('llb', 'database'), 'cf')
+		line = f.readline()
+		l = 0
+		while line:
+			mcc, mnc, lac, ci, radius, longitude, latitude, angle = line.split() 
+			mcc = int(mcc)
+			mnc = int(mnc)
+			lac = int(lac)
+			ci = int(ci)
+			radius = int(radius)
+			latitude = float(latitude)
+			longitude = float(longitude)
+			begin_angle = int(angle[:3])
+			end_angle = int(angle[3:])
+			db[LocalLocation.gen_key(mcc, mnc, lac, ci)] = LocalLocation.gen_value(mcc, mnc, lac, ci, radius, latitude, longitude, begin_angle, end_angle)
+			line = f.readline()
+			l+=1
+		db.close()
+		return l
+
+	@staticmethod
+	def import_to_myqsl(from_db, host, database, user, password, port):
+		import MySQLdb as dbi
+		connection = dbi.connect(host, database, user, password, port=port, )
+		cur = connection.cursor()
+		cur.execute('DELETE FROM cell_location')
+		f = open(from_db, 'r')
+		line = f.readline()
+		while line:
+			mcc, mnc, lac, ci, radius, longitude, latitude, angle = line.split() 
+			mcc = int(mcc)
+			mnc = int(mnc)
+			lac = int(lac)
+			ci = int(ci)
+			radius = int(radius)
+			latitude = float(latitude)
+			longitude = float(longitude)
+			begin_angle = int(angle[:3])
+			end_angle = int(angle[3:])
+			line = f.readline()
+			cur.execute('INSERT INTO cell_location (mcc, mnc, lac, cell_id, latitude, longitude) VALUES (%d, %d, %d, %d, %f, %f)'% (
+				mcc, mnc, lac, ci, latitude, longitude, ))
+		cur.close()
+		connection.close()
+
+if __name__ == '__main__':
+	from syslog import openlog, syslog, closelog, LOG_ERR, LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG_DAEMON, LOG_NDELAY, LOG_PID, LOG_PERROR
+	from gobject import MainLoop
+	from dbus.mainloop.glib import DBusGMainLoop
+	openlog('pyggld', LOG_NDELAY|LOG_PID|LOG_PERROR, LOG_DAEMON,)
+	DBusGMainLoop(set_as_default=True)
+	mainloop = MainLoop()
+	daemon = LocalLocation(InitBus())
+	print daemon.import_to_gdb('/tmp/bla.dat'), 'cells imported'
+	mainloop.run()
+	closelog()
+# vim:tw=0:nowrap


Property changes on: trunk/software/pyneod/pyllbd.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + "LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Rev"
Name: svn:eol-style
   + native




More information about the Smartphones-commits mailing list