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