r4566 - developers/john_lee/pyfso
john_lee at docs.openmoko.org
john_lee at docs.openmoko.org
Thu Jul 31 17:59:47 CEST 2008
Author: john_lee
Date: 2008-07-31 17:59:46 +0200 (Thu, 31 Jul 2008)
New Revision: 4566
Modified:
developers/john_lee/pyfso/__init__.py
developers/john_lee/pyfso/accelerometer.py
Log:
add class to read directly from input dev
Modified: developers/john_lee/pyfso/__init__.py
===================================================================
--- developers/john_lee/pyfso/__init__.py 2008-07-31 15:24:46 UTC (rev 4565)
+++ developers/john_lee/pyfso/__init__.py 2008-07-31 15:59:46 UTC (rev 4566)
@@ -4,6 +4,6 @@
(C) 2008 Openmoko, Inc.
GPLv2 or later
"""
-from accelerometer import MockAccelerometer, FSOAccelerometer
+from accelerometer import MockAccelerometer, FSOAccelerometer, Gta02Accelerometer
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-31 15:24:46 UTC (rev 4565)
+++ developers/john_lee/pyfso/accelerometer.py 2008-07-31 15:59:46 UTC (rev 4566)
@@ -1,25 +1,148 @@
"""
Get accelerometer signals from dbus and parse them.
+or: read directly from input dev.
+
(C) 2008 John Lee <john_lee at openmoko.com>
(C) 2008 Openmoko, Inc.
GPLv2 or later
"""
-import math
+import math, os, struct
-class MockAccelerometer(object):
+class Accelerometer(object):
+ def retrieve(self):
+ raise NotImplementedError
+
+
+class MockAccelerometer(Accelerometer):
"""
"""
def retrieve(self):
return (0, -1000, 0)
-class FSOAccelerometer(object):
+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, device):
+ super(InputDevAccelerometer, self).__init__()
+ self.device_fd = 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)
+ """
+ i = 0
+ while True:
+ try:
+ data = os.read(self.device_fd, InputDevAccelerometer.input_event_size)
+ except OSError:
+ pass # what should i do with this?
+ else:
+ if len(data) >= InputDevAccelerometer.input_event_size:
+ break;
+ 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 is None:
+ device = Gta02Accelerometer.INPUT_DEV
+ super(Gta02Accelerometer, self).__init__(device)
+ if sample_rate is not None:
+ self.sample_rate = sample_rate
+
+ def _get_sample_rate(self):
+ f = open(Gta02Accelerometer.SYS_SAMPLE_RATE, 'r', 0)
+ sample_rate = int(f.read())
+ f.close()
+ return sample_rate
+
+ def _set_sample_rate(self, sample_rate):
+ """possible values: 100, 400
+ """
+ if sample_rate != 100 and sample_rate != 400:
+ return
+ f = open(Gta02Accelerometer.SYS_SAMPLE_RATE, 'w', 0)
+ f.write('%d\n' % sample_rate)
+ f.close()
+
+ sample_rate = property(_get_sample_rate, _set_sample_rate)
+
+ def retrieve(self):
+ return self._unpack_xyz()
+
+
+class FSOAccelerometer(Accelerometer):
+ """read value from dbus
+ """
def __init__(self, fso):
self.fso = fso
def retrieve(self):
return self.fso.accelerometer_iface.Value()
+
# shamelessly stoled from olv
def get_xy_theta(u):
"""get the angle related to (0, -1), clockwise.
More information about the commitlog
mailing list