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
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Smartphones-userland mailing list Smartphones-userland@linuxtogo.org http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/smartphones-userland