Send commitlog mailing list submissions to
        commitlog@lists.openmoko.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r4535 - developers/john_lee/pyfso ([EMAIL PROTECTED])
   2. r4536 - developers/john_lee/pyfso ([EMAIL PROTECTED])
   3. r4537 - developers/john_lee/pyfso ([EMAIL PROTECTED])
   4. r4538 - developers/john_lee/pyfso ([EMAIL PROTECTED])
   5. r4539 - developers/john_lee/pyfso ([EMAIL PROTECTED])
--- Begin Message ---
Author: john_lee
Date: 2008-07-18 19:19:47 +0200 (Fri, 18 Jul 2008)
New Revision: 4535

Added:
   developers/john_lee/pyfso/TODO
Log:
add TODO file

Added: developers/john_lee/pyfso/TODO
===================================================================
--- developers/john_lee/pyfso/TODO                              (rev 0)
+++ developers/john_lee/pyfso/TODO      2008-07-18 17:19:47 UTC (rev 4535)
@@ -0,0 +1,4 @@
+* accelerometer.py needs to be integrated into frameworkd
+
+* general.py some general base classes.  Singleton pattern still got
+  bug.




--- End Message ---
--- Begin Message ---
Author: john_lee
Date: 2008-07-18 19:19:55 +0200 (Fri, 18 Jul 2008)
New Revision: 4536

Modified:
   developers/john_lee/pyfso/dialer.py
   developers/john_lee/pyfso/fso_backend.py
Log:
modify fso_backend to set mainloop when initialize.  use GMainLoop as
default in testing.

* also modify dialer to reflect the changes.

Modified: developers/john_lee/pyfso/dialer.py
===================================================================
--- developers/john_lee/pyfso/dialer.py 2008-07-18 17:19:47 UTC (rev 4535)
+++ developers/john_lee/pyfso/dialer.py 2008-07-18 17:19:55 UTC (rev 4536)
@@ -76,7 +76,7 @@
 class FSODialer(Dialer):
     """A Dialer implementation based on fso dbus API.
     """
-    def __init__(self):
+    def __init__(self, mainloop):
         super(FSODialer, self).__init__()
         self.callid = None
         self.initialized = False
@@ -84,12 +84,12 @@
         self.fso = FSOObject()
         from threading import Thread
         # put the slow init function into background
-        Thread(target=self._init).start()
+        Thread(target=self._init, args=(mainloop, )).start()
         # FIXME: get state from fso and set self state
         self._set_state('release')
 
-    def _init(self):
-        if not self.fso.initialize():
+    def _init(self, mainloop):
+        if not self.fso.initialize(mainloop):
             return
         self.fso.onCallStatus.append(self.on_call_status)
         self.initialized = True
@@ -130,9 +130,8 @@
 
 
 def _test():
-    import ecore
-    FSODialer()
-    ecore.main_loop_begin()
+    from dbus.mainloop.glib import DBusGMainLoop
+    FSODialer(DBusGMainLoop())
 
 
 if __name__ == "__main__":

Modified: developers/john_lee/pyfso/fso_backend.py
===================================================================
--- developers/john_lee/pyfso/fso_backend.py    2008-07-18 17:19:47 UTC (rev 
4535)
+++ developers/john_lee/pyfso/fso_backend.py    2008-07-18 17:19:55 UTC (rev 
4536)
@@ -1,4 +1,3 @@
-import e_dbus
 import os
 from dbus import DBusException, SystemBus, Interface
 from general import Singleton
@@ -44,11 +43,11 @@
                 self.objects[ "%s:%s" % ( busname, objname ) ] = obj
         return obj
 
-    def initialize( self ):
+    def initialize( self, mainloop ):
         if self.fullinit:
             return True
         try:
-            self.bus = SystemBus( mainloop=e_dbus.DBusEcoreMainLoop() )
+            self.bus = SystemBus( mainloop=mainloop )
         except DBusException, e:
             print "could not connect to dbus_object system bus:", e
             return False
@@ -177,8 +176,9 @@
 
 
 def _test():
+    from dbus.mainloop.glib import DBusGMainLoop
     fso = FSOObject()
-    fso.initialize()
+    fso.initialize(DBusGMainLoop())
 
 
 if __name__ == '__main__':




--- End Message ---
--- Begin Message ---
Author: john_lee
Date: 2008-07-18 19:20:10 +0200 (Fri, 18 Jul 2008)
New Revision: 4537

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:
* fso backend cope with new odeviced accelerometer change

* accelerometer now cope with fso backend

* put the responsibility of FSOObject initialization into user

* update singleton implementation.  we don't use it anywhere for now.

* update tests.

Modified: developers/john_lee/pyfso/__init__.py
===================================================================
--- developers/john_lee/pyfso/__init__.py       2008-07-18 17:19:55 UTC (rev 
4536)
+++ developers/john_lee/pyfso/__init__.py       2008-07-18 17:20:10 UTC (rev 
4537)
@@ -1,3 +1,9 @@
+"""
+
+(C) 2008 John Lee <[EMAIL PROTECTED]>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+"""
 from accelerometer import Accelerometer, MockAccelerometer, \
     InputDevAccelerometer, Gta02Accelerometer, get_xy_theta
 

Modified: developers/john_lee/pyfso/accelerometer.py
===================================================================
--- developers/john_lee/pyfso/accelerometer.py  2008-07-18 17:19:55 UTC (rev 
4536)
+++ developers/john_lee/pyfso/accelerometer.py  2008-07-18 17:20:10 UTC (rev 
4537)
@@ -1,229 +1,24 @@
 """
-Accelerometer class.  It can run in two different modes.  In pull
-mode, it accepts read request then retrieve accelerometer values.  In
-daemon mode, it updates itself as often as possible, notifies the
-observers about value changes and answers request with its current
-state.
-
+Get accelerometer signals from dbus and parse them.
 (C) 2008 John Lee <[EMAIL PROTECTED]>
 (C) 2008 Openmoko, Inc.
 GPLv2 or later
 """
-from __future__ import with_statement
-from general import Subject
-
+from fso_backend import FSOObject
+from general import Subject, DumpObserver
 import math
-import os
-import struct
-from threading import RLock
-from time import sleep
 
-class Accelerometer(Subject):
-    """The base class of all accelerometers.
-    """
+class FSOAccelerometer(Subject):
+    def __init__(self, fso_obj):
+        super(FSOAccelerometer, self).__init__()
+        self.fso = fso_obj
+        self.fso.onAccelerometer.append(self.on_accelerometer)
 
-    def __new__(cls, *args, **kwargs):
-        cls.sample_rate = property(cls._get_sample_rate, cls._set_sample_rate)
-        obj = object.__new__(cls, *args, **kwargs)
-        return obj
+    def on_accelerometer(self, x, y, z):
+        self._notify(x, y, z)
 
-    def __init__(self, device, sample_rate=None):
-        """device: the name of the input
-        sample_rate: how many samples per second
-        """
-        super(Accelerometer, self).__init__()
-        self._statelock = RLock()
-        self._state = (0, -1000, 0)
-        self._open_device(device)
-        self._daemonized = False
-        if sample_rate is not None:
-            self.sample_rate = sample_rate
 
-    def _open_device(self, device):
-        raise NotImplementedError
-
-    def _get_sample_rate(self):
-        """get sample rate
-        """
-        raise NotImplementedError
-
-    def _set_sample_rate(self, sample_rate):
-        """set sample rate
-        """
-        raise NotImplementedError
-
-    def _retrieve(self):
-        """read and parse the current values.  could be time
-        consuming.
-        """
-        raise NotImplementedError
-
-    @property
-    def state(self):
-        """return the current state
-        """
-        if self._daemonized:
-            with self._statelock:
-                return self._state
-        else:
-            state = self._retrieve()
-            with self._statelock:
-                self._state = state
-                return self._state
-
-    def daemonize(self):
-        """a infinite loop to update self.state.  will notify
-        observers about state changes.
-        """
-        self._daemonized = True
-        while self._daemonized:
-            state = self._retrieve()
-            with self._statelock:
-                self._state = state
-                self._notify(self._state)
-
-    def stop(self):
-        """stop daemon
-        """
-        self._daemonized = False
-
-
-class MockAccelerometer(Accelerometer):
-    """Mock accelerometer class.
-    >>> g = MockAccelerometer()
-    >>> g.sample_rate
-    100
-    >>> g.sample_rate = 400
-    >>> g.sample_rate
-    400
-    """
-
-    def __init__(self):
-        super(MockAccelerometer, self).__init__(None)
-        self.sample_rate = 100
-
-    def _open_device(self, device):
-        pass
-
-    def _set_sample_rate(self, sample_rate):
-        self._sample_rate = sample_rate
-
-    def _get_sample_rate(self):
-        return self._sample_rate
-
-    def _retrieve(self):
-        sleep(1/self._sample_rate)
-        return (0, -1000, 0)
-
-
-class InputDevAccelerometer(Accelerometer):
-    """Read values from kernel input device
-    """
-
-    # Event types
-    EV_SYN = 0x00
-    EV_KEY = 0x01
-    EV_REL = 0x02
-    EV_ABS = 0x03
-    EV_MSC = 0x04
-    EV_SW = 0x05
-    EV_LED = 0x11
-    EV_SND = 0x12
-    EV_REP = 0x14
-    EV_FF = 0x15
-    EV_PWR = 0x16
-    EV_FF = 0x17
-    EV_MAX = 0x1f
-    EV_CNT = (EV_MAX+1)
-
-    # Relative axes
-    REL_X = 0x00
-    REL_Y = 0x01
-    REL_Z = 0x02
-    REL_RX = 0x03
-    REL_RY = 0x04
-    REL_RZ = 0x05
-    REL_HWHEEL = 0x06
-    REL_DIAL = 0x07
-    REL_WHEEL = 0x08
-    REL_MISC = 0x09
-    REL_MAX = 0x0f
-    REL_CNT = REL_MAX + 1
-
-    input_event_struct = "@llHHi"
-    input_event_size = struct.calcsize(input_event_struct)
-
-    def __init__(self, *args, **kwargs):
-        super(InputDevAccelerometer, self).__init__(*args, **kwargs)
-
-    def _open_device(self, device):
-        self.device = os.open(device, os.O_RDONLY | os.O_SYNC)
-
-    def _unpack(self):
-        """struct input_event {
-       struct timeval time; /* (long, long) */
-       __u16 type;
-       __u16 code;
-       __s32 value;
-        };
-        return (tv_sec, tv_usec, type, code, value)
-        """
-        for i in xrange(0, 5):
-            data = os.read(self.device, InputDevAccelerometer.input_event_size)
-            if len(data) >= InputDevAccelerometer.input_event_size:
-                break;
-        else:
-            raise Exception()
-
-        return struct.unpack(InputDevAccelerometer.input_event_struct, data)
-
-    def _unpack_xyz(self):
-        """return a 3 tuple
-        """
-        # wait for EV_SYN
-        while self._unpack()[2] != InputDevAccelerometer.EV_SYN:
-            pass
-        # now return (x, y, z)
-        return (self._unpack()[4], self._unpack()[4], self._unpack()[4])
-
-
-class Gta02Accelerometer(InputDevAccelerometer):
-    """Read values from gta02.  for now we use just one.
-    >>> g = Gta02Accelerometer()
-    >>> g.sample_rate = 400
-    >>> g.sample_rate
-    400
-    >>> g.sample_rate = 100
-    >>> g.sample_rate
-    100
-    """
-
-    INPUT_DEV = '/dev/input/event3'
-    SYS_SAMPLE_RATE = 
'/sys/devices/platform/spi_s3c24xx_gpio.1/spi0.1/sample_rate'
-
-    def __init__(self, device=None, sample_rate=None):
-        if device == None:
-            device = Gta02Accelerometer.INPUT_DEV
-        super(Gta02Accelerometer, self).__init__(device, sample_rate)
-
-    def _set_sample_rate(self, sample_rate):
-        """possible values: 100, 400
-        """
-        f = open(Gta02Accelerometer.SYS_SAMPLE_RATE, 'w', 0)
-        f.write('%d\n' % sample_rate)
-        f.close()
-
-    def _get_sample_rate(self):
-        f = open(Gta02Accelerometer.SYS_SAMPLE_RATE, 'r', 0)
-        sample_rate = int(f.read())
-        f.close()
-        return sample_rate
-
-    def _retrieve(self):
-        return self._unpack_xyz()
-
-
-# shamelessly stole from olv
+# shamelessly stoled from olv
 def get_xy_theta(u):
     """get the angle related to (0, -1), clockwise.
     return 0 < theta < 2pi.
@@ -237,30 +32,6 @@
     return theta
 
 
-class DumpObserver(object):
-    """Does nothing but print the subject state when notified.
-    """
-
-    def __init__(self, subject=None):
-        if subject == None:
-            subject = MockAccelerometer()
-        subject.attach(self)
-        self.subject = subject
-
-    def update(self, state):
-        t = get_xy_theta(state)
-        print 'x = %d, y = %d, z = %d, theta = %f pi' % (state + (t / math.pi, 
))
-
-
-def dump():
-    try:
-        gsensor = Gta02Accelerometer(sample_rate=400)
-    except OSError:
-        gsensor = MockAccelerometer()
-    DumpObserver(gsensor)
-    gsensor.daemonize()
-
-
 def _doctest():
     try:
         import doctest
@@ -270,5 +41,19 @@
         doctest.testmod()
 
 
+def _test():
+    from dbus.mainloop.glib import DBusGMainLoop
+    fso = FSOObject()
+    fso.initialize(DBusGMainLoop())
+    accelerometer = FSOAccelerometer(fso)
+    DumpObserver(accelerometer)
+    import gobject
+    try:
+        gobject.MainLoop().run()
+    except KeyboardInterrupt:
+        return
+
+
 if __name__ == '__main__':
     _doctest()
+    _test()

Modified: developers/john_lee/pyfso/dialer.py
===================================================================
--- developers/john_lee/pyfso/dialer.py 2008-07-18 17:19:55 UTC (rev 4536)
+++ developers/john_lee/pyfso/dialer.py 2008-07-18 17:20:10 UTC (rev 4537)
@@ -1,3 +1,9 @@
+"""
+
+(C) 2008 John Lee <[EMAIL PROTECTED]>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+"""
 from general import Subject
 from fso_backend import FSOObject
 from dbus import DBusException
@@ -64,38 +70,27 @@
     return decorator
 
 
-def need_initialized(real_f):
-    def decorator(self, *args, **kwargs):
-        if self.initialized:
-            return real_f(self, *args, **kwargs)
-        else:
-            return False
-    return decorator
-
-
 class FSODialer(Dialer):
     """A Dialer implementation based on fso dbus API.
     """
-    def __init__(self, mainloop):
+    def __init__(self, fso_obj):
         super(FSODialer, self).__init__()
         self.callid = None
         self.initialized = False
         self.registered = False
-        self.fso = FSOObject()
+        self.fso = fso_obj
+        self._set_state('release')
         from threading import Thread
-        # put the slow init function into background
-        Thread(target=self._init, args=(mainloop, )).start()
-        # FIXME: get state from fso and set self state
-        self._set_state('release')
+        Thread(target=self._init).run()
 
-    def _init(self, mainloop):
-        if not self.fso.initialize(mainloop):
-            return
+    def _init(self):
+        if not self.fso.fullinit:
+            self.fso.initialize()
         self.fso.onCallStatus.append(self.on_call_status)
-        self.initialized = True
         if not self._register():
             return
         self.registered = True
+        # FIXME: get state from fso and set self state
         return True
 
     def _register(self):
@@ -131,8 +126,14 @@
 
 def _test():
     from dbus.mainloop.glib import DBusGMainLoop
-    FSODialer(DBusGMainLoop())
+    fso = FSOObject()
+    fso.initialize(DBusGMainLoop())
+    dialer = FSODialer(fso)
+    import gobject
+    try:
+        gobject.MainLoop().run()
+    except KeyboardInterrupt:
+        return
 
-
 if __name__ == "__main__":
     _test()

Modified: developers/john_lee/pyfso/fso_backend.py
===================================================================
--- developers/john_lee/pyfso/fso_backend.py    2008-07-18 17:19:55 UTC (rev 
4536)
+++ developers/john_lee/pyfso/fso_backend.py    2008-07-18 17:20:10 UTC (rev 
4537)
@@ -1,3 +1,9 @@
+"""
+
+(C) 2008 John Lee <[EMAIL PROTECTED]>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+"""
 import os
 from dbus import DBusException, SystemBus, Interface
 from general import Singleton
@@ -2,7 +8,6 @@
 
-class FSOObject(Singleton):
-    """ based on the code from zhone but it's a singleton class now.
+class FSOObject(object):
+    """Based on the code from zhone.
     """
-
-    def __init__( self ):
+    def __init__(self):
         self.objects = {}
@@ -13,6 +18,7 @@
         self.onNetworkStatus = []
         self.onIdleStateChanged = []
         self.onSignalStrength = []
+        self.onAccelerometer = []
         self.ignoreSuspend = False
 
         self.framework_obj = None
@@ -43,7 +49,7 @@
                 self.objects[ "%s:%s" % ( busname, objname ) ] = obj
         return obj
 
-    def initialize( self, mainloop ):
+    def initialize(self, mainloop):
         if self.fullinit:
             return True
         try:
@@ -112,6 +118,11 @@
             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")
+            self.accelerometer_iface.connect_to_signal("Event", 
self.cbAccelerometer)
+
         if self.device_obj is None:
             failcount += 1
         else:
@@ -174,11 +185,21 @@
             cb (strength = strength)
         print 'SignalStrength:', strength
 
+    def cbAccelerometer(self, x, y, z):
+        for cb in self.onAccelerometer:
+            cb(x, y, z)
 
+
 def _test():
     from dbus.mainloop.glib import DBusGMainLoop
+    import sys
     fso = FSOObject()
     fso.initialize(DBusGMainLoop())
+    import gobject
+    try:
+        gobject.MainLoop().run()
+    except KeyboardInterrupt:
+        return
 
 
 if __name__ == '__main__':

Modified: developers/john_lee/pyfso/general.py
===================================================================
--- developers/john_lee/pyfso/general.py        2008-07-18 17:19:55 UTC (rev 
4536)
+++ developers/john_lee/pyfso/general.py        2008-07-18 17:20:10 UTC (rev 
4537)
@@ -1,3 +1,9 @@
+"""
+
+(C) 2008 John Lee <[EMAIL PROTECTED]>
+(C) 2008 Openmoko, Inc.
+GPLv2 or later
+"""
 from __future__ import with_statement
 from threading import RLock
 
@@ -28,12 +34,39 @@
 
 
 class Singleton(object):
-    __single_lock = RLock()
+    """the implementation of the singleton class in python.
+    >>> class A(Singleton):
+    ...     def __init__(self):
+    ...         print 'init'
+    ... 
+    >>> a1 = A.instance()
+    init
+    >>> a2 = A.instance()
+    """
     __single = None
-    def __new__(cls, *args, **kwargs):
-        with cls.__single_lock:
-            if cls != type(cls.__single):
-                # subclass can create their own
-                cls.__single = object.__new__(cls, *args, **kwargs)
-            return cls.__single
-    #FIXME: the __init__ problem
+
+    @classmethod
+    def instance(cls, *args, **kwargs):
+        if cls != type(cls.__single):
+            cls.__single = cls(*args, **kwargs)
+        return cls.__single
+
+
+class DumpObserver(object):
+    def __init__(self, subject):
+        subject.attach(self)
+
+    def update(self, *args, **kwargs):
+        print args, kwargs
+
+
+def _doctest():
+    try:
+        import doctest
+    except ImportError:
+        return
+    doctest.testmod()
+
+
+if __name__ == '__main__':
+    _doctest()




--- End Message ---
--- Begin Message ---
Author: john_lee
Date: 2008-07-18 19:20:17 +0200 (Fri, 18 Jul 2008)
New Revision: 4538

Modified:
   developers/john_lee/pyfso/TODO
Log:
update TODO

Modified: developers/john_lee/pyfso/TODO
===================================================================
--- developers/john_lee/pyfso/TODO      2008-07-18 17:20:10 UTC (rev 4537)
+++ developers/john_lee/pyfso/TODO      2008-07-18 17:20:17 UTC (rev 4538)
@@ -1,4 +1,5 @@
-* accelerometer.py needs to be integrated into frameworkd
+* solve the signal handle issue
 
-* general.py some general base classes.  Singleton pattern still got
-  bug.
+* gps
+
+* opreferenced, usage, etc.




--- End Message ---
--- Begin Message ---
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 <[EMAIL PROTECTED]>
 (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 <[EMAIL PROTECTED]>
 (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




--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to