Changeset 4566


Ignore:
Timestamp:
07/31/08 17:59:46 (5 years ago)
Author:
john_lee
Message:

add class to read directly from input dev

Location:
developers/john_lee/pyfso
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • developers/john_lee/pyfso/__init__.py

    r4539 r4566  
    55GPLv2 or later 
    66""" 
    7 from accelerometer import MockAccelerometer, FSOAccelerometer 
     7from accelerometer import MockAccelerometer, FSOAccelerometer, Gta02Accelerometer 
    88from dialer import Dialer, MockDialer, FSODialer 
    99from fso_backend import FSOObject 
  • developers/john_lee/pyfso/accelerometer.py

    r4540 r4566  
    11""" 
    22Get accelerometer signals from dbus and parse them. 
     3or: read directly from input dev. 
     4 
    35(C) 2008 John Lee <john_lee@openmoko.com> 
    46(C) 2008 Openmoko, Inc. 
    57GPLv2 or later 
    68""" 
    7 import math 
     9import math, os, struct 
    810 
    9 class MockAccelerometer(object): 
     11class Accelerometer(object): 
     12    def retrieve(self): 
     13        raise NotImplementedError 
     14 
     15 
     16class MockAccelerometer(Accelerometer): 
    1017    """ 
    1118    """ 
     
    1421 
    1522 
    16 class FSOAccelerometer(object): 
     23class InputDevAccelerometer(Accelerometer): 
     24    """Read values from kernel input device 
     25    """ 
     26 
     27    # Event types 
     28    EV_SYN = 0x00 
     29    EV_KEY = 0x01 
     30    EV_REL = 0x02 
     31    EV_ABS = 0x03 
     32    EV_MSC = 0x04 
     33    EV_SW = 0x05 
     34    EV_LED = 0x11 
     35    EV_SND = 0x12 
     36    EV_REP = 0x14 
     37    EV_FF = 0x15 
     38    EV_PWR = 0x16 
     39    EV_FF = 0x17 
     40    EV_MAX = 0x1f 
     41    EV_CNT = (EV_MAX+1) 
     42 
     43    # Relative axes 
     44    REL_X = 0x00 
     45    REL_Y = 0x01 
     46    REL_Z = 0x02 
     47    REL_RX = 0x03 
     48    REL_RY = 0x04 
     49    REL_RZ = 0x05 
     50    REL_HWHEEL = 0x06 
     51    REL_DIAL = 0x07 
     52    REL_WHEEL = 0x08 
     53    REL_MISC = 0x09 
     54    REL_MAX = 0x0f 
     55    REL_CNT = REL_MAX + 1 
     56 
     57    input_event_struct = "@llHHi" 
     58    input_event_size = struct.calcsize(input_event_struct) 
     59 
     60    def __init__(self, device): 
     61        super(InputDevAccelerometer, self).__init__() 
     62        self.device_fd = os.open(device, os.O_RDONLY | os.O_SYNC) 
     63 
     64    def _unpack(self): 
     65        """struct input_event { 
     66        struct timeval time; /* (long, long) */ 
     67        __u16 type; 
     68        __u16 code; 
     69        __s32 value; 
     70        }; 
     71        return (tv_sec, tv_usec, type, code, value) 
     72        """ 
     73        i = 0 
     74        while True: 
     75            try: 
     76                data = os.read(self.device_fd, InputDevAccelerometer.input_event_size) 
     77            except OSError: 
     78                pass # what should i do with this? 
     79            else: 
     80                if len(data) >= InputDevAccelerometer.input_event_size: 
     81                    break; 
     82        return struct.unpack(InputDevAccelerometer.input_event_struct, data) 
     83 
     84    def _unpack_xyz(self): 
     85        """return a 3 tuple 
     86        """ 
     87        # wait for EV_SYN 
     88        while self._unpack()[2] != InputDevAccelerometer.EV_SYN: 
     89            pass 
     90        # now return (x, y, z) 
     91        return (self._unpack()[4], self._unpack()[4], self._unpack()[4]) 
     92 
     93 
     94class Gta02Accelerometer(InputDevAccelerometer): 
     95    """Read values from gta02.  for now we use just one. 
     96    >>> g = Gta02Accelerometer() 
     97    >>> g.sample_rate = 400 
     98    >>> g.sample_rate 
     99    400 
     100    >>> g.sample_rate = 100 
     101    >>> g.sample_rate 
     102    100 
     103    """ 
     104 
     105    INPUT_DEV = '/dev/input/event3' 
     106    SYS_SAMPLE_RATE = '/sys/devices/platform/spi_s3c24xx_gpio.1/spi0.1/sample_rate' 
     107 
     108    def __init__(self, device=None, sample_rate=None): 
     109        if device is None: 
     110            device = Gta02Accelerometer.INPUT_DEV 
     111        super(Gta02Accelerometer, self).__init__(device) 
     112        if sample_rate is not None: 
     113            self.sample_rate = sample_rate 
     114 
     115    def _get_sample_rate(self): 
     116        f = open(Gta02Accelerometer.SYS_SAMPLE_RATE, 'r', 0) 
     117        sample_rate = int(f.read()) 
     118        f.close() 
     119        return sample_rate 
     120 
     121    def _set_sample_rate(self, sample_rate): 
     122        """possible values: 100, 400 
     123        """ 
     124        if sample_rate != 100 and sample_rate != 400: 
     125            return 
     126        f = open(Gta02Accelerometer.SYS_SAMPLE_RATE, 'w', 0) 
     127        f.write('%d\n' % sample_rate) 
     128        f.close() 
     129 
     130    sample_rate = property(_get_sample_rate, _set_sample_rate) 
     131 
     132    def retrieve(self): 
     133        return self._unpack_xyz() 
     134 
     135 
     136class FSOAccelerometer(Accelerometer): 
     137    """read value from dbus 
     138    """ 
    17139    def __init__(self, fso): 
    18140        self.fso = fso 
     
    20142    def retrieve(self): 
    21143        return self.fso.accelerometer_iface.Value() 
     144 
    22145 
    23146# shamelessly stoled from olv 
Note: See TracChangeset for help on using the changeset viewer.