r4539 - developers/john_lee/pyfso

john_lee at docs.openmoko.org john_lee at docs.openmoko.org
Fri Jul 18 19:20:29 CEST 2008


Author: john_lee
Date: 2008-07-18 19:20:29 +0200 (Fri, 18 Jul 2008)
New Revision: 4539

Modified:
   developers/john_lee/pyfso/__init__.py
   developers/john_lee/pyfso/accelerometer.py
   developers/john_lee/pyfso/dialer.py
   developers/john_lee/pyfso/fso_backend.py
   developers/john_lee/pyfso/general.py
Log:
modified to receive accelerometer signal from fso

* many other minor changes.

Modified: developers/john_lee/pyfso/__init__.py
===================================================================
--- developers/john_lee/pyfso/__init__.py	2008-07-18 17:20:17 UTC (rev 4538)
+++ developers/john_lee/pyfso/__init__.py	2008-07-18 17:20:29 UTC (rev 4539)
@@ -4,7 +4,6 @@
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
 """
-from accelerometer import Accelerometer, MockAccelerometer, \
-    InputDevAccelerometer, Gta02Accelerometer, get_xy_theta
-
+from accelerometer import MockAccelerometer, FSOAccelerometer
 from dialer import Dialer, MockDialer, FSODialer
+from fso_backend import FSOObject

Modified: developers/john_lee/pyfso/accelerometer.py
===================================================================
--- developers/john_lee/pyfso/accelerometer.py	2008-07-18 17:20:17 UTC (rev 4538)
+++ developers/john_lee/pyfso/accelerometer.py	2008-07-18 17:20:29 UTC (rev 4539)
@@ -4,20 +4,30 @@
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
 """
-from fso_backend import FSOObject
+from dbus import Interface, SystemBus
+from dbus.exceptions import DBusException
 from general import Subject, DumpObserver
 import math
 
+class MockAccelerometer(Subject):
+    """>>> m = MockAccelerometer()
+    >>> d = DumpObserver(m)
+    (0, -1000, 0) {}
+    """
+    def __init__(self, *args, **kwargs):
+        super(MockAccelerometer, self).__init__()
+
+    def attach(self, function):
+        super(MockAccelerometer, self).attach(function)
+        self._notify(0, -1000, 0)
+
+
 class FSOAccelerometer(Subject):
-    def __init__(self, fso_obj):
+    def __init__(self, fso):
         super(FSOAccelerometer, self).__init__()
-        self.fso = fso_obj
-        self.fso.onAccelerometer.append(self.on_accelerometer)
+        fso.onAccelerometer.append(self._notify)
 
-    def on_accelerometer(self, x, y, z):
-        self._notify(x, y, z)
 
-
 # shamelessly stoled from olv
 def get_xy_theta(u):
     """get the angle related to (0, -1), clockwise.
@@ -41,11 +51,10 @@
         doctest.testmod()
 
 
-def _test():
+def _test_fso():
     from dbus.mainloop.glib import DBusGMainLoop
-    fso = FSOObject()
-    fso.initialize(DBusGMainLoop())
-    accelerometer = FSOAccelerometer(fso)
+    from fso_backend import FSOObject
+    accelerometer = FSOAccelerometer(FSOObject(SystemBus(mainloop=DBusGMainLoop())))
     DumpObserver(accelerometer)
     import gobject
     try:
@@ -56,4 +65,4 @@
 
 if __name__ == '__main__':
     _doctest()
-    _test()
+    _test_fso()

Modified: developers/john_lee/pyfso/dialer.py
===================================================================
--- developers/john_lee/pyfso/dialer.py	2008-07-18 17:20:17 UTC (rev 4538)
+++ developers/john_lee/pyfso/dialer.py	2008-07-18 17:20:29 UTC (rev 4539)
@@ -5,8 +5,7 @@
 GPLv2 or later
 """
 from general import Subject
-from fso_backend import FSOObject
-from dbus import DBusException
+from dbus import DBusException, SystemBus
 from threading import Timer
 
 class Dialer(Subject):
@@ -73,38 +72,28 @@
 class FSODialer(Dialer):
     """A Dialer implementation based on fso dbus API.
     """
-    def __init__(self, fso_obj):
+    def __init__(self, fso):
         super(FSODialer, self).__init__()
         self.callid = None
         self.initialized = False
         self.registered = False
-        self.fso = fso_obj
+        self.fso = fso
+        self.fso.onCallStatus.append(self.on_call_status)
         self._set_state('release')
         from threading import Thread
         Thread(target=self._init).run()
 
     def _init(self):
-        if not self.fso.fullinit:
-            self.fso.initialize()
-        self.fso.onCallStatus.append(self.on_call_status)
-        if not self._register():
-            return
-        self.registered = True
-        # FIXME: get state from fso and set self state
-        return True
-
-    def _register(self):
         if self.fso.gsm_network_iface.GetStatus()['registration'] == 'unregistered':
             try:
                 self.fso.gsm_device_iface.SetAntennaPower(True)
                 self.fso.gsm_network_iface.Register()
                 print 'registered'
+                self.registered = True
             except DBusException, e:
                 # FIXME pin number?
                 print e
                 self.registered = False
-                return False
-        return True
 
     @need_registered
     def dial(self, number):
@@ -124,11 +113,13 @@
         self.callid = id
 
 
-def _test():
+def _test_fso():
     from dbus.mainloop.glib import DBusGMainLoop
-    fso = FSOObject()
-    fso.initialize(DBusGMainLoop())
-    dialer = FSODialer(fso)
+    from fso_backend import FSOObject
+    try:
+        dialer = FSODialer(FSOObject(SystemBus(mainloop=DBusGMainLoop())))
+    except DBusException:
+        return
     import gobject
     try:
         gobject.MainLoop().run()
@@ -136,4 +127,4 @@
         return
 
 if __name__ == "__main__":
-    _test()
+    _test_fso()

Modified: developers/john_lee/pyfso/fso_backend.py
===================================================================
--- developers/john_lee/pyfso/fso_backend.py	2008-07-18 17:20:17 UTC (rev 4538)
+++ developers/john_lee/pyfso/fso_backend.py	2008-07-18 17:20:29 UTC (rev 4539)
@@ -1,5 +1,5 @@
 """
-
+Originated from zhone
 (C) 2008 John Lee <john_lee at openmoko.com>
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
@@ -11,7 +11,8 @@
 class FSOObject(object):
     """Based on the code from zhone.
     """
-    def __init__(self):
+    def __init__(self, bus):
+
         self.objects = {}
         self.onResourceChanged = []
         self.onCallStatus = []
@@ -20,118 +21,101 @@
         self.onSignalStrength = []
         self.onAccelerometer = []
         self.ignoreSuspend = False
+        self.bus = bus
 
-        self.framework_obj = None
-        self.gsm_device_obj = None
-        self.gsm_device_iface = None
+        self.fw_iface = None
         self.usage_iface = None
+        self.gsm_device_iface = None
+        self.gsm_sim_iface = None
+        self.gsm_network_iface = None
+        self.gsm_call_iface = None
+        self.gsm_test_iface = None
         self.device_iface = None
         self.device_power_iface = None
-        self.idlenotifier_obj = None
         self.idlenotifier_iface = None
-        self.inputnotifier_obj = None
         self.inputnotifier_iface = None
-        self.display_obj = None
         self.display_iface = None
+        self.accelerometer_iface = None
 
-        self.fullinit = False
+        # Framework -- at least we should have this.  if not, let exception raise.
+        fw_obj = self.bus.get_object('org.freesmartphone.frameworkd',
+                                     '/org/freesmartphone/Framework')
+        self.fw_iface = Interface(fw_obj, "org.freesmartphone.Objects")
 
-    def tryGetProxy( self, busname, objname ):
-        obj = None
-        try:
-            obj = self.objects[ "%s:%s" % ( busname, objname ) ]
-        except KeyError:
-            try:
-                obj = self.bus.get_object( busname, objname )
-            except DBusException, e:
-                print "could not create proxy for %s:%s" % ( busname, objname ), e
-            else:
-                self.objects[ "%s:%s" % ( busname, objname ) ] = obj
-        return obj
-
-    def initialize(self, mainloop):
-        if self.fullinit:
-            return True
-        try:
-            self.bus = SystemBus( mainloop=mainloop )
-        except DBusException, e:
-            print "could not connect to dbus_object system bus:", e
-            return False
-
-        # Framework
-        fw_obj = self.tryGetProxy( 'org.freesmartphone.frameworkd', '/org/freesmartphone/Framework' )
-        if fw_obj is None:
-            print ( "could not connect to org.freesmartphone.frameworkd -- is the framework daemon started?" )
-            return False
-        else:
-            self.fw = Interface( fw_obj, "org.freesmartphone.Objects" )
-        failcount = 0
-
         # Usage
-        self.usage_obj = self.tryGetProxy( 'org.freesmartphone.ousaged', '/org/freesmartphone/Usage' )
-        if ( self.usage_obj is not None ) and ( self.usage_iface is None ):
-            self.usage_iface = Interface(self.usage_obj, 'org.freesmartphone.Usage')
-            self.usage_iface.connect_to_signal( "ResourceChanged", self.cbResourceChanged )
+        usage_obj = self.tryGetProxy('org.freesmartphone.ousaged',
+                                          '/org/freesmartphone/Usage')
+        if usage_obj:
+            print 'creating usage interface',
+            self.usage_iface = Interface(usage_obj, 'org.freesmartphone.Usage')
+            self.usage_iface.connect_to_signal("ResourceChanged", self.cbResourceChanged)
             self.usage_iface.RequestResource("GSM")
-        if self.usage_obj is None:
-            failcount += 1
-        else:
-            print "usage ok", self.usage_iface
+            print 'ok'
 
         # Phone
-        self.gsm_device_obj = self.tryGetProxy( 'org.freesmartphone.ogpsd', '/org/freesmartphone/GSM/Device' )
-        print self.gsm_device_obj
-
-        if ( self.gsm_device_obj is not None ) and ( self.gsm_device_iface is None ):
-            print "creating gsm interfaces"
-            self.gsm_device_iface = Interface(self.gsm_device_obj, 'org.freesmartphone.GSM.Device')
-            self.gsm_sim_iface = Interface(self.gsm_device_obj, 'org.freesmartphone.GSM.SIM')
-            self.gsm_network_iface = Interface(self.gsm_device_obj, 'org.freesmartphone.GSM.Network')
-            self.gsm_call_iface = Interface(self.gsm_device_obj, 'org.freesmartphone.GSM.Call')
-            self.gsm_test_iface = Interface(self.gsm_device_obj, 'org.freesmartphone.GSM.Test')
-            self.gsm_call_iface.connect_to_signal( "CallStatus", self.cbCallStatus )
-            self.gsm_network_iface.connect_to_signal( "Status", self.cbNetworkStatus )
+        gsm_device_obj = self.tryGetProxy('org.freesmartphone.ogsmd',
+                                          '/org/freesmartphone/GSM/Device')
+        if gsm_device_obj:
+            print "creating gsm interfaces",
+            self.gsm_device_iface = Interface(gsm_device_obj, 'org.freesmartphone.GSM.Device')
+            self.gsm_sim_iface = Interface(gsm_device_obj, 'org.freesmartphone.GSM.SIM')
+            self.gsm_network_iface = Interface(gsm_device_obj, 'org.freesmartphone.GSM.Network')
+            self.gsm_call_iface = Interface(gsm_device_obj, 'org.freesmartphone.GSM.Call')
+            self.gsm_test_iface = Interface(gsm_device_obj, 'org.freesmartphone.GSM.Test')
+            self.gsm_call_iface.connect_to_signal("CallStatus", self.cbCallStatus)
+            self.gsm_network_iface.connect_to_signal("Status", self.cbNetworkStatus)
             self.gsm_network_iface.connect_to_signal('SignalStrength', self.cbSignalStrength)
-        if self.gsm_device_obj is None:
-            failcount += 1
-        else:
-            print "gsm ok", self.gsm_network_iface
+            print 'ok'
 
-        self.device_obj = self.tryGetProxy( 'org.freesmartphone.odeviced', '/org/freesmartphone/Device' )
-        if ( self.device_obj is not None ) and ( self.device_iface is None ):
-            self.device_iface = Interface( self.device_obj, 'org.freesmartphone.Device' )
+        device_obj = self.tryGetProxy('org.freesmartphone.odeviced',
+                                      '/org/freesmartphone/Device')
+        if device_obj:
+            self.device_iface = Interface(device_obj, 'org.freesmartphone.Device')
+            print 'device interface ok'
 
-            self.device_power_obj = self.tryGetProxy( "org.freesmartphone.odeviced", self.fw.ListObjectsByInterface( "org.freesmartphone.Device.PowerSupply" )[0] )
-            self.device_power_iface = Interface(self.device_power_obj, 'org.freesmartphone.Device.PowerSupply')
+        self.device_power_iface = self.tryGetFirstInterface(
+            "org.freesmartphone.odeviced", "org.freesmartphone.Device.PowerSupply")
 
-            self.idlenotifier_obj = self.tryGetProxy( "org.freesmartphone.odeviced", self.fw.ListObjectsByInterface( "org.freesmartphone.Device.IdleNotifier" )[0] )
+        self.idlenotifier_iface = self.tryGetFirstInterface(
+            "org.freesmartphone.odeviced", "org.freesmartphone.Device.IdleNotifier")
+        if self.idlenotifier_iface:
+            self.idlenotifier_iface.connect_to_signal("State", self.cbIdleStateChanged)
 
-            self.idlenotifier_iface = Interface( self.idlenotifier_obj, "org.freesmartphone.Device.IdleNotifier" )
-            self.idlenotifier_iface.connect_to_signal( "State", self.cbIdleStateChanged )
+        inputnotifier_obj = self.tryGetProxy("org.freesmartphone.odeviced", "/org/freesmartphone/Device/Input")
+        if inputnotifier_obj:
+            self.inputnotifier_iface = Interface(inputnotifier_obj, "org.freesmartphone.Device.Input")
+            self.inputnotifier_iface.connect_to_signal("Event", self.cbEvent)
 
-            self.inputnotifier_obj = self.bus.get_object( "org.freesmartphone.odeviced", "/org/freesmartphone/Device/Input" )
-            self.inputnotifier_iface = Interface( self.inputnotifier_obj, "org.freesmartphone.Device.Input" )
-            self.inputnotifier_iface.connect_to_signal( "Event", self.cbEvent )
+        self.display_iface = self.tryGetFirstInterface(
+            "org.freesmartphone.odeviced", "org.freesmartphone.Device.Display")
+        if self.display_iface:
+            self.display_iface.SetBrightness(90)
 
-            print "displays:", self.fw.ListObjectsByInterface( "org.freesmartphone.Device.Display" )
-            self.display_obj = self.tryGetProxy( "org.freesmartphone.odeviced", self.fw.ListObjectsByInterface( "org.freesmartphone.Device.Display" )[0] )
-            if self.display_obj is not None:
-                self.display_iface = Interface( self.display_obj, "org.freesmartphone.Device.Display" )
-                self.display_iface.SetBrightness( 90 )
-
-            self.accelerometer_obj = self.bus.get_object("org.freesmartphone.odeviced", "/org/freesmartphone/Device/Accelerometer")
-            self.accelerometer_iface = Interface(self.accelerometer_obj, "org.freesmartphone.Device.Accelerometer")
+        accelerometer_obj = self.tryGetProxy(
+            "org.freesmartphone.odeviced", "/org/freesmartphone/Device/Accelerometer")
+        if accelerometer_obj:
+            self.accelerometer_iface = Interface(accelerometer_obj, "org.freesmartphone.Device.Accelerometer")
             self.accelerometer_iface.connect_to_signal("Event", self.cbAccelerometer)
 
-        if self.device_obj is None:
-            failcount += 1
-        else:
-            print "device ok", self.device_iface
+    def tryGetFirstInterface(self, busname, interface):
+        if self.fw_iface:
+            list = self.fw_iface.ListObjectsByInterface(interface)
+            if list and (len(list) > 1):
+                obj = self.tryGetProxy(busname, list[0])
+                return Interface(obj, interface)
 
-        print "failcount=", failcount
-        if failcount == 0:
-            self.fullinit = True
-        return self.fullinit
+    def tryGetProxy( self, busname, objname ):
+        obj = None
+        try:
+            obj = self.objects[ "%s:%s" % ( busname, objname ) ]
+        except KeyError:
+            try:
+                obj = self.bus.get_object( busname, objname )
+            except DBusException, e:
+                print "could not create proxy for %s:%s" % ( busname, objname ), e
+            else:
+                self.objects[ "%s:%s" % ( busname, objname ) ] = obj
+        return obj
 
     def cbResourceChanged( self, resourcename ):
         for cb in self.onResourceChanged:
@@ -193,8 +177,7 @@
 def _test():
     from dbus.mainloop.glib import DBusGMainLoop
     import sys
-    fso = FSOObject()
-    fso.initialize(DBusGMainLoop())
+    fso = FSOObject(SystemBus(mainloop=DBusGMainLoop()))
     import gobject
     try:
         gobject.MainLoop().run()

Modified: developers/john_lee/pyfso/general.py
===================================================================
--- developers/john_lee/pyfso/general.py	2008-07-18 17:20:17 UTC (rev 4538)
+++ developers/john_lee/pyfso/general.py	2008-07-18 17:20:29 UTC (rev 4539)
@@ -1,5 +1,4 @@
 """
-
 (C) 2008 John Lee <john_lee at openmoko.com>
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
@@ -15,22 +14,22 @@
         self._observers_lock = RLock()
         self._observers = []
 
-    def attach(self, observer):
+    def attach(self, function):
         """attach as an observer
         """
         with self._observers_lock:
-            self._observers.append(observer)
+            self._observers.append(function)
 
-    def detach(self, observer):
+    def detach(self, function):
         """detach from observers
         """
         with self._observers_lock:
-            self._observers.remove(observer)
+            self._observers.remove(function)
 
     def _notify(self, *args, **kwargs):
         with self._observers_lock:
-            for o in self._observers:
-                o.update(*args, **kwargs)
+            for f in self._observers:
+                f(*args, **kwargs)
 
 
 class Singleton(object):
@@ -53,8 +52,14 @@
 
 
 class DumpObserver(object):
+    """ dump everything the subject notifies.
+    >>> s = Subject()
+    >>> d = DumpObserver(s)
+    >>> s._notify('test')
+    ('test',) {}
+    """
     def __init__(self, subject):
-        subject.attach(self)
+        subject.attach(self.update)
 
     def update(self, *args, **kwargs):
         print args, kwargs





More information about the commitlog mailing list