Hi,

For what it's worth, here is a patch against fso-frameworkd(*) to make
ogpsd a gpsd client.

To use it change these three options in /etc/frameworkd:

 [ogpsd]
 device = GTA02GpsdDevice
 channel = ClientSocketChannel
 path = localhost:2947

While it surely needs some polishing - especially regarding the error
handling - it seems functional enough for the Zhone GPS feature.

Please bear with my code: I'm a python noob. Any improvement is welcome :)

BTW I've a doubt about the "seed" and "climb" units. AIUI it seems to be
knots, be I'd appreciate if someone could confirm.

Thanks,

_g.

(*) source taken from Debian unstable: fso-frameworkd-0.9.5.9+git20100131.
Index: fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/factory.py
===================================================================
--- fso-frameworkd-0.9.5.9+git20100131.orig/framework/subsystems/ogpsd/factory.py	2010-05-12 00:02:43.000000000 +0200
+++ fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/factory.py	2010-05-12 00:03:35.000000000 +0200
@@ -20,6 +20,8 @@
 from ubx import UBXDevice
 from om import GTA02Device
 from eten import EtenDevice
+from gpsd import GpsdDevice
+from omgpsd import GTA02GpsdDevice
 from gpschannel import *
 
 NEEDS_BUSNAMES = [ "org.freedesktop.Gypsy" ]
Index: fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/gpschannel.py
===================================================================
--- fso-frameworkd-0.9.5.9+git20100131.orig/framework/subsystems/ogpsd/gpschannel.py	2010-05-12 00:02:36.000000000 +0200
+++ fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/gpschannel.py	2010-05-12 00:03:27.000000000 +0200
@@ -18,7 +18,7 @@
 import socket
 import gobject
 
-import logging
+import logging, traceback
 logger = logging.getLogger('ogpsd')
 
 class GPSChannel( object ):
@@ -49,6 +49,68 @@
     def send( self, stream ):
         raise Exception( "Not implemented" )
 
+class ClientSocketChannel ( GPSChannel ):
+    """Generic socket client"""
+
+    def __init__( self, path ):
+        super(ClientSocketChannel, self).__init__()
+        logger.debug("ClientSocketChannel opens port %s" % path)
+        if ":" in path:
+            self.host, self.port = path.split( ":" )
+            self.port = int( self.port )
+        else:
+            self.host = ""
+            self.port = int( path )
+	self.sock = None
+        self.watchReadyToRead = None
+        self.watchReadyToSend = None
+        self.datapending = ""
+
+    def initializeChannel( self ):
+	if not self.sock:
+	    self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
+	try:
+            self.sock.connect( (self.host, self.port) )
+	except:
+	    logger.error("%s\n" % traceback.format_exc())
+	    self.shutdownChannel()
+	else:
+	    self.watchReadyToRead = gobject.io_add_watch( self.sock.makefile(), gobject.IO_IN, self.readyToRead )
+
+    def shutdownChannel( self ):
+	if self.watchReadyToRead:
+	    gobject.source_remove(self.watchReadyToRead)
+	    self.watchReadyToRead = None
+	if self.watchReadyToSend:
+	    gobject.source_remove(self.watchReadyToSend)
+	    self.watchReadyToSend = None
+	if self.sock:
+	    self.sock.close()
+	    self.sock = None
+
+    def suspendChannel( self ):
+        pass
+
+    def resumeChannel( self ):
+        pass
+
+    def readyToRead( self, source, condition ):
+        data = self.sock.recv(1024)
+        if self.callback:
+            self.callback(data)
+        return True
+
+    def readyToSend( self, source, condition ):
+        self.sock.send( self.datapending )
+        self.datapending = ""
+        self.watchReadyToSend = None
+        return False
+
+    def send( self, stream ):
+        self.datapending = self.datapending + stream
+        if self.sock and not self.watchReadyToSend:
+            self.watchReadyToSend = gobject.io_add_watch( self.sock.makefile(), gobject.IO_OUT, self.readyToSend )
+
 class UDPChannel ( GPSChannel ):
     """Generic UDP reader"""
 
Index: fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/gpsd.py
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/gpsd.py	2010-05-12 00:03:44.000000000 +0200
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+"""
+Open GPS Daemon - gpsd parser class
+
+(C) 2010 Gilles Filippini <gilles.filipp...@free.fr>
+(C) 2008 Daniel Willmann <dan...@totalueberwachung.de>
+(C) 2008 Openmoko, Inc.
+GPLv2
+"""
+
+__version__ = "0.0.0"
+
+from gpsdevice import GPSDevice
+from framework import resource
+from framework.config import config
+
+import logging
+logger = logging.getLogger('ogpsd')
+
+DBUS_INTERFACE = "org.freesmartphone.GPS"
+
+class GpsdDevice( GPSDevice ):
+    def __init__( self, bus, channel ):
+        super( GpsdDevice, self ).__init__( bus, channel )
+        self.channel.setCallback( self.receive )
+	lines = None
+
+    def initializeDevice( self ):
+        super( GpsdDevice, self ).initializeDevice()
+	self.fix_mode = 0
+
+	self.channel.send('?WATCH={"enable":true,"json":true,"scaled":true}')
+	lines = []
+
+    def shutdownDevice( self ):
+        super( GpsdDevice, self ).shutdownDevice()
+	self.line = ''
+
+    def receive( self, data ):
+	newlines = (self.line+data).split('\r\n')
+	for line in newlines[:-1]:
+	    self.proceed(line)
+	self.line = newlines[-1]
+	if self.line != '' and self.line[-1] == '}':
+	    self.proceed(self.line)
+	    self.line = ''
+
+    def proceed(self, line):
+	true  = True
+	false = False
+	dict = eval(line)
+        methodname = "_handle_"+dict["class"]
+        try:
+            method = getattr( self, methodname )
+        except AttributeError:
+            logger.debug( "No method to handle %s: %s" % ( dict["class"], dict ) )
+        else:
+            method(dict)
+
+    def _handle_TPV( self, data ):
+	# 'man gpsd' to get the full TPV record description
+	if "time" in data:
+	    self._updateTime(data["time"])
+	self.fix_mode = data["mode"]
+	if self.fix_mode == 0:
+	    self.fix_mode = 1
+	self._updateFixStatus(self.fix_mode)
+	if "lat" in data:
+	    self._updatePosition(self._valid(), data["lat"], data["lon"], data["alt"])
+	if "speed" in data:
+	    # The 1.94xxx factor is for converting from m/s to knots
+	    self._updateCourse(self._valid(), data["speed"]*1.9438445, data["track"], data["climb"]*1.9438445)
+
+    def _handle_SKY( self, data ):
+	# 'man gpsd' to get the full SKY record description
+	if "satellites" in data:
+	    satellites = []
+	    for sat in data["satellites"]:
+		if sat["el"] > 0:
+		    satellites.append( (sat["PRN"], sat["used"], sat["el"], sat["az"], sat["ss"]) )
+	    self._updateSatellites(satellites)
+	if "pdop" in data:
+	    self._updateAccuracy(self._valid(), data["pdop"], data["hdop"], data["vdop"])
+
+    def _valid( self ):
+	if self.fix_mode <= 1:
+	    return 0
+	if self.fix_mode == 2:
+	    return 3
+	return 7
+
+#vim: expandtab
Index: fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/omgpsd.py
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ fso-frameworkd-0.9.5.9+git20100131/framework/subsystems/ogpsd/omgpsd.py	2010-05-12 00:03:48.000000000 +0200
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+"""
+Open GPS Daemon
+
+(C) 2010 Gilles Filippini <gilles.filipp...@free.fr>
+(C) 2008 Jan 'Shoragan' Lübbe <jlue...@lasnet.de>
+(C) 2008 Daniel Willmann <dan...@totalueberwachung.de>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+"""
+
+__version__ = "0.9.9.4"
+MODULE_NAME = "ogpsd"
+
+DEVICE_POWER_PATH_OLD = "/sys/bus/platform/devices/neo1973-pm-gps.0/pwron"
+DEVICE_POWER_PATH_NEW = "/sys/bus/platform/devices/neo1973-pm-gps.0/power_on"
+
+from gpsd import GpsdDevice
+
+#from framework.persist import persist
+import helpers
+
+#import gobject
+#import os, sys, marshal, time
+import time
+#from datetime import datetime, timedelta
+
+#import logging
+#logger = logging.getLogger( MODULE_NAME )
+
+class GTA02GpsdDevice( GpsdDevice ):
+    """GTA02 gpsd client device"""
+
+    def __init__( self, bus, channel ):
+
+        # Make sure the GPS is off
+        helpers.writeToFile( DEVICE_POWER_PATH_OLD, "1" )
+        helpers.writeToFile( DEVICE_POWER_PATH_NEW, "1" )
+        time.sleep( 0.5 )
+        helpers.writeToFile( DEVICE_POWER_PATH_OLD, "0" )
+        helpers.writeToFile( DEVICE_POWER_PATH_NEW, "0" )
+
+        super( GTA02GpsdDevice, self ).__init__( bus, channel )
+
+    def initializeDevice( self ):
+        helpers.writeToFile( DEVICE_POWER_PATH_OLD, "1" )
+        helpers.writeToFile( DEVICE_POWER_PATH_NEW, "1" )
+
+        # Wait for the device to be powered up
+        time.sleep(0.5)
+
+        super( GTA02GpsdDevice, self ).initializeDevice()
+
+    def shutdownDevice( self ):
+        super( GTA02GpsdDevice, self ).shutdownDevice()
+
+        helpers.writeToFile( DEVICE_POWER_PATH_OLD, "0" )
+        helpers.writeToFile( DEVICE_POWER_PATH_NEW, "0" )
+
+#vim: expandtab

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Smartphones-userland mailing list
Smartphones-userland@linuxtogo.org
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/smartphones-userland

Reply via email to