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