Author: duncan
Date: Sat Dec  2 18:48:00 2006
New Revision: 8688

Added:
   branches/rel-1/freevo/src/helpers/makelinuxevent.py
   branches/rel-1/freevo/src/linuxevent.py
Modified:
   branches/rel-1/freevo/freevo_config.py
   branches/rel-1/freevo/local_conf.py.example
   branches/rel-1/freevo/src/evdev.py

Log:
[ 1579124 ] Support for Linux event devices
Added helper to make linuxevent.py and linuxevent.py for linux-2.6.18.2
Updated evdev.py to use linuxevent.py


Modified: branches/rel-1/freevo/freevo_config.py
==============================================================================
--- branches/rel-1/freevo/freevo_config.py      (original)
+++ branches/rel-1/freevo/freevo_config.py      Sat Dec  2 18:48:00 2006
@@ -252,7 +252,8 @@
      Added plug-in: Apple trailers in the contrib area
      Added plug-in: reencode and idlebar encode to compress mpeg video
      Added plug-in: XM online
-     Added helpers: encodingserver, rssServer
+     Added helpers: makevdev
+     Added servers: encodingserver, rssserver
      Added USE_SDL_KEYBOARD to specify if generic keyboard handler should be 
used
      Added EVENT_DEVS and EVENTMAP for the new Linux event device handler
      Added VIDEO_PRE_PLAY and VIDEO_POST_PLAY to allow external commands to be 
run
@@ -540,26 +541,21 @@
 #
 KEYMAP = DEFAULT_KEYMAP
 
-#
 # List of /dev/input/event# devices to monitor. You can specify either the
 # device node (e.g. '/dev/input/event1') or the name of the device (e.g.
 # 'ATI Remote Wonder II'). If you monitor your keyboard both here and with
 # USE_SDL_KEYBOARD, then you will get duplicate events.
 #
-
 EVENT_DEVS = []
 
-#
 # Keymap to map input events to event strings. You can change current mappings
 # and add new ones here, e.g. EVENTMAP['KEY_COFFEE'] = 'SUBTITLE'. Key names
 # are defined by the Linux input layer (input.h). An axis is described by a
 # pair, one for positive and one for negative movement, e.g.
 # EVENTMAP['REL_Z'] = ('LEFT', 'RIGHT')
 #
-
 EVENTMAP = DEFAULT_EVENTMAP
 
-#
 # Use Internet resources to fetch information?
 # For example, Freevo can use CDDB for album information,
 # the IMDB movie database for movie info, and Amazon for cover searches. 
@@ -567,7 +563,6 @@
 #
 USE_NETWORK = 1
 
-#
 # HOST_ALIVE_CHECK tests if the given host is online.
 # Will be used to avoid extremely long automounter timeouts.
 #

Modified: branches/rel-1/freevo/local_conf.py.example
==============================================================================
--- branches/rel-1/freevo/local_conf.py.example (original)
+++ branches/rel-1/freevo/local_conf.py.example Sat Dec  2 18:48:00 2006
@@ -279,17 +279,15 @@
 # 'ATI Remote Wonder II'). If you monitor your keyboard both here and with
 # USE_SDL_KEYBOARD, then you will get duplicate events.
 #
-# EVENT_DEVS = []
+EVENT_DEVS = []
 
-#
 # Keymap to map input events to event strings. You can change current mappings
 # and add new ones here, e.g. EVENTMAP['KEY_COFFEE'] = 'SUBTITLE'. Key names
 # are defined by the Linux input layer (input.h). An axis is described by a
 # pair, one for positive and one for negative movement, e.g.
-# EVENTMAP['REL_Z'] = ('LEFT', 'RIGHT')
 #
+# EVENTMAP['REL_Z'] = ('LEFT', 'RIGHT')
 
-#
 # Use Internet resources to fetch information?
 # For example, Freevo can use CDDB for album information,
 # the IMDB movie database for movie info, and Amazon for cover searches. 

Modified: branches/rel-1/freevo/src/evdev.py
==============================================================================
--- branches/rel-1/freevo/src/evdev.py  (original)
+++ branches/rel-1/freevo/src/evdev.py  Sat Dec  2 18:48:00 2006
@@ -331,4 +331,9 @@
     except KeyboardInterrupt:
         pass
 
-from evfallback import _types, _events, _ids, _buses
+try:
+    from linuxevent import _types, _events, _ids, _buses
+except ImportError:
+    from evfallback import _types, _events, _ids, _buses
+except StandardError, e:
+    print e

Added: branches/rel-1/freevo/src/helpers/makelinuxevent.py
==============================================================================
--- (empty file)
+++ branches/rel-1/freevo/src/helpers/makelinuxevent.py Sat Dec  2 18:48:00 2006
@@ -0,0 +1,406 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# evdev.py - Linux /dev/input/event# interface library
+# -----------------------------------------------------------------------
+# $Id$
+#
+# Notes:
+# Todo:
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al. 
+# Please see the fout freevo/Docs/CREDITS for a complete list of authors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
+# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# -----------------------------------------------------------------------
+
+import sys
+import os
+import re
+from fcntl import ioctl
+import struct
+
+_types = {}
+_events = {}
+
+_ids = {}
+_buses = {}
+
+def _convert_value(s):
+    if s.startswith("0x"):
+        return int(s, 16)
+    return int(s, 10)
+
+def parse_input_h(path):
+    global _types, _events, _ids, _buses
+
+    f = file(path)
+
+    types = {}
+    events = {}
+
+    ids = {}
+    buses = {}
+
+    for line in f.readlines():
+        m = re.search("#define 
(?P<name>EV_[A-Za-z0-9_]+)\s+(?P<value>(0x)?[0-9A-Fa-f]+)", line)
+        if m:
+            if m.group("name") != "EV_VERSION":
+                types[_convert_value(m.group("value"))] = m.group("name")
+            continue
+
+        m = re.search("#define 
(?P<name>ID_[A-Za-z0-9_]+)\s+(?P<value>(0x)?[0-9A-Fa-f]+)", line)
+        if m:
+            ids[_convert_value(m.group("value"))] = m.group("name")
+            continue
+
+        m = re.search("#define 
(?P<name>BUS_[A-Za-z0-9_]+)\s+(?P<value>(0x)?[0-9A-Fa-f]+)", line)
+        if m:
+            buses[_convert_value(m.group("value"))] = m.group("name")
+            continue
+
+        m = re.search("#define 
(?P<name>(?P<type>[A-Za-z0-9]+)_[A-Za-z0-9_]+)\s+(?P<value>(0x)?[0-9A-Fa-f]+)", 
line)
+        if m:
+            t = m.group("type")
+
+            # The naming is a bit off in input.h
+            if t == "BTN":
+                t = "KEY"
+
+            for k in types.keys():
+                if types[k] == "EV_" + t:
+                    break
+            else:
+                raise Exception("Invalid type: %s" % m.group("type"))
+
+            if not events.has_key(k):
+                events[k] = {}
+
+            events[k][_convert_value(m.group("value"))] = m.group("name")
+
+    _types = types
+    _events = events
+
+    _ids = ids
+    _buses = buses
+
+import pickle
+
+def save_event(fout):
+    #fout = open('ev.dat', 'wb')
+    #pickle.dump(_types, fout)
+    #pickle.dump(_events, fout)
+    #pickle.dump(_ids, fout)
+    #pickle.dump(_buses, fout)
+
+    print >>fout, '_types = {'
+    for type in _types:
+        print >>fout, '    %2d : \'%s\',' % (type, _types[type])
+    print >>fout, '}'
+
+    print >>fout
+    print >>fout, '_events = {'
+    for event in _events:
+        print >>fout, '    %d : { # %s' % (event, _types[event])
+        for subevent in _events[event]:
+            print >>fout, '        %3d : \'%s\',' % (subevent, 
_events[event][subevent])
+        print >>fout, '    },'
+    print >>fout, '}'
+
+    print >>fout
+    print >>fout, '_ids = {'
+    for id in _ids:
+        print >>fout, '    %2d : \'%s\',' % (id, _ids[id])
+    print >>fout, '}'
+
+    print >>fout
+    print >>fout, '_buses = {'
+    for bus in _buses:
+        print >>fout, '    %2d : \'%s\',' % (bus, _buses[bus])
+    print >>fout, '}'
+
+
+def _print_tables():
+    print "_types = {"
+
+    keys = _types.keys()
+    keys.sort()
+    for key in keys:
+        print "    %2d:%s," % (key, repr(_types[key]))
+
+    print "    }"
+
+    print ""
+
+    print "_events = {"
+
+    keys = _events.keys()
+    keys.sort()
+    for key in keys:
+        print "    %2d:{ # %s" % (key, _types[key])
+
+        subkeys = _events[key].keys()
+        for subkey in subkeys:
+            print "        %3d:%s," % (subkey, repr(_events[key][subkey]))
+
+        print "        },"
+
+    print "    }"
+
+    print ""
+
+    print "_ids = {"
+
+    keys = _ids.keys()
+    keys.sort()
+    for key in keys:
+        print "    %2d:%s," % (key, repr(_ids[key]))
+
+    print "    }"
+
+    print ""
+
+    print "_buses = {"
+
+    keys = _buses.keys()
+    keys.sort()
+    for key in keys:
+        print "    %2d:%s," % (key, repr(_buses[key]))
+
+    print "    }"
+
+# Copied from asm-generic/ioctl.h
+
+_IOC_NRBITS     = 8
+_IOC_TYPEBITS   = 8
+_IOC_SIZEBITS   = 14
+_IOC_DIRBITS    = 2
+
+_IOC_NRMASK     = ((1 << _IOC_NRBITS)-1)
+_IOC_TYPEMASK   = ((1 << _IOC_TYPEBITS)-1)
+_IOC_SIZEMASK   = ((1 << _IOC_SIZEBITS)-1)
+_IOC_DIRMASK    = ((1 << _IOC_DIRBITS)-1)
+
+_IOC_NRSHIFT    = 0
+_IOC_TYPESHIFT  = (_IOC_NRSHIFT+_IOC_NRBITS)
+_IOC_SIZESHIFT  = (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+_IOC_DIRSHIFT   = (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+_IOC_NONE       = 0
+_IOC_WRITE      = 1
+_IOC_READ       = 2
+
+def _IOC(dir,type,nr,size):
+    ioc = (((dir)  << _IOC_DIRSHIFT) | \
+        (ord(type) << _IOC_TYPESHIFT) | \
+        ((nr)   << _IOC_NRSHIFT) | \
+        ((size) << _IOC_SIZESHIFT))
+    if ioc >= 2**31:
+        ioc = int(ioc - 2**32)
+    return ioc
+
+def _IO(type,nr):
+    return _IOC(_IOC_NONE,(type),(nr),0)
+def _IOR(type,nr,size):
+    return _IOC(_IOC_READ,(type),(nr),(size))
+def _IOW(type,nr,size):
+    return _IOC(_IOC_WRITE,(type),(nr),(size))
+def _IOWR(type,nr,size):
+    return _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(size))
+
+
+EVIOCGVERSION              = _IOR('E', 0x01, 4) # get driver version
+EVIOCGID                   = _IOR('E', 0x02, 8) # get device ID
+
+def EVIOCGNAME(len):  return _IOR('E', 0x06, len) # get device name
+def EVIOCGPHYS(len):  return _IOR('E', 0x07, len) # get physical location
+def EVIOCGUNIQ(len):  return _IOR('E', 0x08, len) # get unique identifier
+
+def EVIOCGBIT(ev,len):return _IOR('E', 0x20 + ev, len) # get event bits
+def EVIOCGABS(abs):   return _IOR('E', 0x40 + abs, 20) # get abs value/limits
+def EVIOCSABS(abs):   return _IOW('E', 0xc0 + abs, 20) # set abs value/limits
+
+class evdev:
+    def __init__(self, dev, blocking = False):
+        self._fd = None
+        if blocking:
+            self._fd = os.open(dev, os.O_RDONLY)
+        else:
+            self._fd = os.open(dev, os.O_RDONLY | os.O_NDELAY)
+        self.get_events()
+
+    def __del__(self):
+        self.close()
+
+    def close(self):
+        if self._fd is not None:
+            os.close(self._fd)
+            self._fd = None
+
+    def print_info(self):
+        print "Input driver version %d.%d.%d" % self.get_version()
+
+        devid = self.get_id()
+        print "Device ID: bus %s vendor 0x%04x product 0x%04x version 0x%04x" 
% \
+            (devid["bus"], devid["vendor"], devid["product"], devid["version"])
+
+        print 'Device name: "' + self.get_name() + '"'
+        print 'Device location: "' + self.get_location() + '"'
+
+    def print_events(self):
+        print "Supported events:"
+
+        keys = self._events.keys()
+        keys.sort()
+        for key in keys:
+            print "    Event type %s (%d):" % (_types[key], key)
+
+            self._events[key].sort()
+            for event in self._events[key]:
+                try:
+                    print "        Event %s (%d)" % (_events[key][event], 
event)
+                except KeyError:
+                    print "        Event ??? (%d)" % event
+
+    def get_version(self):
+        buf = ioctl(self._fd, EVIOCGVERSION, "    ")
+        l, =  struct.unpack("L", buf)
+        return (l >> 16, (l >> 8) & 0xff, l & 0xff)
+
+    def get_id(self):
+        buf = ioctl(self._fd, EVIOCGID, " " * 8)
+        bus, vendor, product, version = struct.unpack("HHHH", buf)
+        return { "bus":_buses[bus], "vendor":vendor,
+            "product":product, "version":version }
+
+    def get_name(self):
+        buf = ioctl(self._fd, EVIOCGNAME(1024), " " * 1024)
+        null = buf.find("\0")
+        return buf[:null]
+
+    def get_location(self):
+        buf = ioctl(self._fd, EVIOCGPHYS(1024), " " * 1024)
+        null = buf.find("\0")
+        return buf[:null]
+
+    def get_events(self):
+        keys = _types.keys()
+        keys.sort()
+
+        # We need one bit per type, rounded up to even 4 bytes
+        l = ((keys[-1] + 7) / 8 + 3) & ~0x3
+
+        buf = ioctl(self._fd, EVIOCGBIT(0, l), " " * l)
+        array = struct.unpack("L" * (l/4), buf)
+
+        self._events = {}
+
+        for i in xrange(l * 8):
+            if not array[i / 32] & (1 << i % 32):
+                continue
+
+            self._events[i] = []
+
+            subkeys = _events[i].keys()
+            subkeys.sort()
+
+            # We need one bit per type, rounded up to even 4 bytes
+            sl = ((subkeys[-1] + 7) / 8 + 3) & ~0x3
+
+            try:
+                buf = ioctl(self._fd, EVIOCGBIT(i, sl), " " * sl)
+            except IOError:
+                # No events for a type results in Errno 22 (EINVAL)
+                break
+            subarray = struct.unpack("L" * (sl/4), buf)
+
+            for j in xrange(sl * 8):
+                if not subarray[j / 32] & (1 << j % 32):
+                    continue
+
+                self._events[i].append(j)
+
+    def has_event(self, test_event):
+        for type in self._events.keys():
+            for event in self._events[type]:
+                if _events[type][event] == test_event:
+                    return True
+        return False
+
+    def read(self):
+        try:
+            buf = os.read(self._fd, 16)
+        except OSError, (errno, str):
+            if errno == 11:
+                return None
+            raise
+
+        sec, usec, type, code, value = struct.unpack("LLHHl", buf)
+
+        return (float(sec) + float(usec)/1000000.0, _types[type], 
_events[type][code], value)
+
+
+def help():
+    print 'writes a linuxevent.py module'
+    print 'usage: freevo makelinuxevent [<device>] [<input.h>]'
+    print
+    print 'The linux/input.h will be parsed and the event data will be'
+    print 'written to stdout which can be redirected to the linuxevent.py'
+    print 'E.g.: freevo makelinuxevent > src/linuxevent.py'
+    print 
+    print 'if <device> is given then the device information will be also'
+    print 'written to stdout.'
+    print 'E.g.: freevo makelinuxevent /dev/input/event0'
+    print
+    print 'if <input.h> is given then this file will be parsed for the'
+    print 'event table'
+    print
+
+
+if __name__ == "__main__":
+    argc = len(sys.argv)
+
+    device = None
+    input_h = '/usr/include/linux/input.h'
+    for argv in sys.argv:
+        if argv in ('-h', '--help'):
+            help()
+            sys.exit(0)
+        if argv.find('/dev/') >= 0:
+            device = argv
+        if argv.find('input.h') >= 0:
+            input_h = argv
+
+    if not os.path.exists(input_h):
+        print '\"%s\" does not exist' % input_h
+        sys.exit(1)
+
+    try:
+        parse_input_h(input_h)
+    except StandardError, e:
+        print 'Failed to parse \"%s\": %s' % (input_h, e)
+        sys.exit(1)
+
+    try:
+        save_event(sys.stdout)
+    except StandardError, e:
+        print 'Failed writing: %s' % (e)
+        sys.exit(1)
+
+    if device:
+        e = evdev(device, True)
+        e.print_info()

Added: branches/rel-1/freevo/src/linuxevent.py
==============================================================================
--- (empty file)
+++ branches/rel-1/freevo/src/linuxevent.py     Sat Dec  2 18:48:00 2006
@@ -0,0 +1,540 @@
+_types = {
+     0 : 'EV_SYN',
+     1 : 'EV_KEY',
+     2 : 'EV_REL',
+     3 : 'EV_ABS',
+     4 : 'EV_MSC',
+     5 : 'EV_SW',
+    17 : 'EV_LED',
+    18 : 'EV_SND',
+    20 : 'EV_REP',
+    21 : 'EV_FF',
+    22 : 'EV_PWR',
+    23 : 'EV_FF_STATUS',
+    31 : 'EV_MAX',
+}
+
+_events = {
+    0 : { # EV_SYN
+          0 : 'SYN_REPORT',
+          1 : 'SYN_CONFIG',
+    },
+    1 : { # EV_KEY
+          0 : 'KEY_RESERVED',
+          1 : 'KEY_ESC',
+          2 : 'KEY_1',
+          3 : 'KEY_2',
+          4 : 'KEY_3',
+          5 : 'KEY_4',
+          6 : 'KEY_5',
+          7 : 'KEY_6',
+          8 : 'KEY_7',
+          9 : 'KEY_8',
+         10 : 'KEY_9',
+         11 : 'KEY_0',
+         12 : 'KEY_MINUS',
+         13 : 'KEY_EQUAL',
+         14 : 'KEY_BACKSPACE',
+         15 : 'KEY_TAB',
+         16 : 'KEY_Q',
+         17 : 'KEY_W',
+         18 : 'KEY_E',
+         19 : 'KEY_R',
+         20 : 'KEY_T',
+         21 : 'KEY_Y',
+         22 : 'KEY_U',
+         23 : 'KEY_I',
+         24 : 'KEY_O',
+         25 : 'KEY_P',
+         26 : 'KEY_LEFTBRACE',
+         27 : 'KEY_RIGHTBRACE',
+         28 : 'KEY_ENTER',
+         29 : 'KEY_LEFTCTRL',
+         30 : 'KEY_A',
+         31 : 'KEY_S',
+         32 : 'KEY_D',
+         33 : 'KEY_F',
+         34 : 'KEY_G',
+         35 : 'KEY_H',
+         36 : 'KEY_J',
+         37 : 'KEY_K',
+         38 : 'KEY_L',
+         39 : 'KEY_SEMICOLON',
+         40 : 'KEY_APOSTROPHE',
+         41 : 'KEY_GRAVE',
+         42 : 'KEY_LEFTSHIFT',
+         43 : 'KEY_BACKSLASH',
+         44 : 'KEY_Z',
+         45 : 'KEY_X',
+         46 : 'KEY_C',
+         47 : 'KEY_V',
+         48 : 'KEY_B',
+         49 : 'KEY_N',
+         50 : 'KEY_M',
+         51 : 'KEY_COMMA',
+         52 : 'KEY_DOT',
+         53 : 'KEY_SLASH',
+         54 : 'KEY_RIGHTSHIFT',
+         55 : 'KEY_KPASTERISK',
+         56 : 'KEY_LEFTALT',
+         57 : 'KEY_SPACE',
+         58 : 'KEY_CAPSLOCK',
+         59 : 'KEY_F1',
+         60 : 'KEY_F2',
+         61 : 'KEY_F3',
+         62 : 'KEY_F4',
+         63 : 'KEY_F5',
+         64 : 'KEY_F6',
+         65 : 'KEY_F7',
+         66 : 'KEY_F8',
+         67 : 'KEY_F9',
+         68 : 'KEY_F10',
+         69 : 'KEY_NUMLOCK',
+         70 : 'KEY_SCROLLLOCK',
+         71 : 'KEY_KP7',
+         72 : 'KEY_KP8',
+         73 : 'KEY_KP9',
+         74 : 'KEY_KPMINUS',
+         75 : 'KEY_KP4',
+         76 : 'KEY_KP5',
+         77 : 'KEY_KP6',
+         78 : 'KEY_KPPLUS',
+         79 : 'KEY_KP1',
+         80 : 'KEY_KP2',
+         81 : 'KEY_KP3',
+         82 : 'KEY_KP0',
+         83 : 'KEY_KPDOT',
+         85 : 'KEY_ZENKAKUHANKAKU',
+         86 : 'KEY_102ND',
+         87 : 'KEY_F11',
+         88 : 'KEY_F12',
+         89 : 'KEY_RO',
+         90 : 'KEY_KATAKANA',
+         91 : 'KEY_HIRAGANA',
+         92 : 'KEY_HENKAN',
+         93 : 'KEY_KATAKANAHIRAGANA',
+         94 : 'KEY_MUHENKAN',
+         95 : 'KEY_KPJPCOMMA',
+         96 : 'KEY_KPENTER',
+         97 : 'KEY_RIGHTCTRL',
+         98 : 'KEY_KPSLASH',
+         99 : 'KEY_SYSRQ',
+        100 : 'KEY_RIGHTALT',
+        101 : 'KEY_LINEFEED',
+        102 : 'KEY_HOME',
+        103 : 'KEY_UP',
+        104 : 'KEY_PAGEUP',
+        105 : 'KEY_LEFT',
+        106 : 'KEY_RIGHT',
+        107 : 'KEY_END',
+        108 : 'KEY_DOWN',
+        109 : 'KEY_PAGEDOWN',
+        110 : 'KEY_INSERT',
+        111 : 'KEY_DELETE',
+        112 : 'KEY_MACRO',
+        113 : 'KEY_MUTE',
+        114 : 'KEY_VOLUMEDOWN',
+        115 : 'KEY_VOLUMEUP',
+        116 : 'KEY_POWER',
+        117 : 'KEY_KPEQUAL',
+        118 : 'KEY_KPPLUSMINUS',
+        119 : 'KEY_PAUSE',
+        121 : 'KEY_KPCOMMA',
+        122 : 'KEY_HANGEUL',
+        123 : 'KEY_HANJA',
+        124 : 'KEY_YEN',
+        125 : 'KEY_LEFTMETA',
+        126 : 'KEY_RIGHTMETA',
+        127 : 'KEY_COMPOSE',
+        128 : 'KEY_STOP',
+        129 : 'KEY_AGAIN',
+        130 : 'KEY_PROPS',
+        131 : 'KEY_UNDO',
+        132 : 'KEY_FRONT',
+        133 : 'KEY_COPY',
+        134 : 'KEY_OPEN',
+        135 : 'KEY_PASTE',
+        136 : 'KEY_FIND',
+        137 : 'KEY_CUT',
+        138 : 'KEY_HELP',
+        139 : 'KEY_MENU',
+        140 : 'KEY_CALC',
+        141 : 'KEY_SETUP',
+        142 : 'KEY_SLEEP',
+        143 : 'KEY_WAKEUP',
+        144 : 'KEY_FILE',
+        145 : 'KEY_SENDFILE',
+        146 : 'KEY_DELETEFILE',
+        147 : 'KEY_XFER',
+        148 : 'KEY_PROG1',
+        149 : 'KEY_PROG2',
+        150 : 'KEY_WWW',
+        151 : 'KEY_MSDOS',
+        152 : 'KEY_COFFEE',
+        153 : 'KEY_DIRECTION',
+        154 : 'KEY_CYCLEWINDOWS',
+        155 : 'KEY_MAIL',
+        156 : 'KEY_BOOKMARKS',
+        157 : 'KEY_COMPUTER',
+        158 : 'KEY_BACK',
+        159 : 'KEY_FORWARD',
+        160 : 'KEY_CLOSECD',
+        161 : 'KEY_EJECTCD',
+        162 : 'KEY_EJECTCLOSECD',
+        163 : 'KEY_NEXTSONG',
+        164 : 'KEY_PLAYPAUSE',
+        165 : 'KEY_PREVIOUSSONG',
+        166 : 'KEY_STOPCD',
+        167 : 'KEY_RECORD',
+        168 : 'KEY_REWIND',
+        169 : 'KEY_PHONE',
+        170 : 'KEY_ISO',
+        171 : 'KEY_CONFIG',
+        172 : 'KEY_HOMEPAGE',
+        173 : 'KEY_REFRESH',
+        174 : 'KEY_EXIT',
+        175 : 'KEY_MOVE',
+        176 : 'KEY_EDIT',
+        177 : 'KEY_SCROLLUP',
+        178 : 'KEY_SCROLLDOWN',
+        179 : 'KEY_KPLEFTPAREN',
+        180 : 'KEY_KPRIGHTPAREN',
+        181 : 'KEY_NEW',
+        182 : 'KEY_REDO',
+        183 : 'KEY_F13',
+        184 : 'KEY_F14',
+        185 : 'KEY_F15',
+        186 : 'KEY_F16',
+        187 : 'KEY_F17',
+        188 : 'KEY_F18',
+        189 : 'KEY_F19',
+        190 : 'KEY_F20',
+        191 : 'KEY_F21',
+        192 : 'KEY_F22',
+        193 : 'KEY_F23',
+        194 : 'KEY_F24',
+        200 : 'KEY_PLAYCD',
+        201 : 'KEY_PAUSECD',
+        202 : 'KEY_PROG3',
+        203 : 'KEY_PROG4',
+        205 : 'KEY_SUSPEND',
+        206 : 'KEY_CLOSE',
+        207 : 'KEY_PLAY',
+        208 : 'KEY_FASTFORWARD',
+        209 : 'KEY_BASSBOOST',
+        210 : 'KEY_PRINT',
+        211 : 'KEY_HP',
+        212 : 'KEY_CAMERA',
+        213 : 'KEY_SOUND',
+        214 : 'KEY_QUESTION',
+        215 : 'KEY_EMAIL',
+        216 : 'KEY_CHAT',
+        217 : 'KEY_SEARCH',
+        218 : 'KEY_CONNECT',
+        219 : 'KEY_FINANCE',
+        220 : 'KEY_SPORT',
+        221 : 'KEY_SHOP',
+        222 : 'KEY_ALTERASE',
+        223 : 'KEY_CANCEL',
+        224 : 'KEY_BRIGHTNESSDOWN',
+        225 : 'KEY_BRIGHTNESSUP',
+        226 : 'KEY_MEDIA',
+        227 : 'KEY_SWITCHVIDEOMODE',
+        228 : 'KEY_KBDILLUMTOGGLE',
+        229 : 'KEY_KBDILLUMDOWN',
+        230 : 'KEY_KBDILLUMUP',
+        231 : 'KEY_SEND',
+        232 : 'KEY_REPLY',
+        233 : 'KEY_FORWARDMAIL',
+        234 : 'KEY_SAVE',
+        235 : 'KEY_DOCUMENTS',
+        236 : 'KEY_BATTERY',
+        240 : 'KEY_UNKNOWN',
+        256 : 'BTN_0',
+        257 : 'BTN_1',
+        258 : 'BTN_2',
+        259 : 'BTN_3',
+        260 : 'BTN_4',
+        261 : 'BTN_5',
+        262 : 'BTN_6',
+        263 : 'BTN_7',
+        264 : 'BTN_8',
+        265 : 'BTN_9',
+        272 : 'BTN_LEFT',
+        273 : 'BTN_RIGHT',
+        274 : 'BTN_MIDDLE',
+        275 : 'BTN_SIDE',
+        276 : 'BTN_EXTRA',
+        277 : 'BTN_FORWARD',
+        278 : 'BTN_BACK',
+        279 : 'BTN_TASK',
+        288 : 'BTN_TRIGGER',
+        289 : 'BTN_THUMB',
+        290 : 'BTN_THUMB2',
+        291 : 'BTN_TOP',
+        292 : 'BTN_TOP2',
+        293 : 'BTN_PINKIE',
+        294 : 'BTN_BASE',
+        295 : 'BTN_BASE2',
+        296 : 'BTN_BASE3',
+        297 : 'BTN_BASE4',
+        298 : 'BTN_BASE5',
+        299 : 'BTN_BASE6',
+        303 : 'BTN_DEAD',
+        304 : 'BTN_A',
+        305 : 'BTN_B',
+        306 : 'BTN_C',
+        307 : 'BTN_X',
+        308 : 'BTN_Y',
+        309 : 'BTN_Z',
+        310 : 'BTN_TL',
+        311 : 'BTN_TR',
+        312 : 'BTN_TL2',
+        313 : 'BTN_TR2',
+        314 : 'BTN_SELECT',
+        315 : 'BTN_START',
+        316 : 'BTN_MODE',
+        317 : 'BTN_THUMBL',
+        318 : 'BTN_THUMBR',
+        320 : 'BTN_TOOL_PEN',
+        321 : 'BTN_TOOL_RUBBER',
+        322 : 'BTN_TOOL_BRUSH',
+        323 : 'BTN_TOOL_PENCIL',
+        324 : 'BTN_TOOL_AIRBRUSH',
+        325 : 'BTN_TOOL_FINGER',
+        326 : 'BTN_TOOL_MOUSE',
+        327 : 'BTN_TOOL_LENS',
+        330 : 'BTN_TOUCH',
+        331 : 'BTN_STYLUS',
+        332 : 'BTN_STYLUS2',
+        333 : 'BTN_TOOL_DOUBLETAP',
+        334 : 'BTN_TOOL_TRIPLETAP',
+        336 : 'BTN_GEAR_DOWN',
+        337 : 'BTN_GEAR_UP',
+        352 : 'KEY_OK',
+        353 : 'KEY_SELECT',
+        354 : 'KEY_GOTO',
+        355 : 'KEY_CLEAR',
+        356 : 'KEY_POWER2',
+        357 : 'KEY_OPTION',
+        358 : 'KEY_INFO',
+        359 : 'KEY_TIME',
+        360 : 'KEY_VENDOR',
+        361 : 'KEY_ARCHIVE',
+        362 : 'KEY_PROGRAM',
+        363 : 'KEY_CHANNEL',
+        364 : 'KEY_FAVORITES',
+        365 : 'KEY_EPG',
+        366 : 'KEY_PVR',
+        367 : 'KEY_MHP',
+        368 : 'KEY_LANGUAGE',
+        369 : 'KEY_TITLE',
+        370 : 'KEY_SUBTITLE',
+        371 : 'KEY_ANGLE',
+        372 : 'KEY_ZOOM',
+        373 : 'KEY_MODE',
+        374 : 'KEY_KEYBOARD',
+        375 : 'KEY_SCREEN',
+        376 : 'KEY_PC',
+        377 : 'KEY_TV',
+        378 : 'KEY_TV2',
+        379 : 'KEY_VCR',
+        380 : 'KEY_VCR2',
+        381 : 'KEY_SAT',
+        382 : 'KEY_SAT2',
+        383 : 'KEY_CD',
+        384 : 'KEY_TAPE',
+        385 : 'KEY_RADIO',
+        386 : 'KEY_TUNER',
+        387 : 'KEY_PLAYER',
+        388 : 'KEY_TEXT',
+        389 : 'KEY_DVD',
+        390 : 'KEY_AUX',
+        391 : 'KEY_MP3',
+        392 : 'KEY_AUDIO',
+        393 : 'KEY_VIDEO',
+        394 : 'KEY_DIRECTORY',
+        395 : 'KEY_LIST',
+        396 : 'KEY_MEMO',
+        397 : 'KEY_CALENDAR',
+        398 : 'KEY_RED',
+        399 : 'KEY_GREEN',
+        400 : 'KEY_YELLOW',
+        401 : 'KEY_BLUE',
+        402 : 'KEY_CHANNELUP',
+        403 : 'KEY_CHANNELDOWN',
+        404 : 'KEY_FIRST',
+        405 : 'KEY_LAST',
+        406 : 'KEY_AB',
+        407 : 'KEY_NEXT',
+        408 : 'KEY_RESTART',
+        409 : 'KEY_SLOW',
+        410 : 'KEY_SHUFFLE',
+        411 : 'KEY_BREAK',
+        412 : 'KEY_PREVIOUS',
+        413 : 'KEY_DIGITS',
+        414 : 'KEY_TEEN',
+        415 : 'KEY_TWEN',
+        448 : 'KEY_DEL_EOL',
+        449 : 'KEY_DEL_EOS',
+        450 : 'KEY_INS_LINE',
+        451 : 'KEY_DEL_LINE',
+        464 : 'KEY_FN',
+        465 : 'KEY_FN_ESC',
+        466 : 'KEY_FN_F1',
+        467 : 'KEY_FN_F2',
+        468 : 'KEY_FN_F3',
+        469 : 'KEY_FN_F4',
+        470 : 'KEY_FN_F5',
+        471 : 'KEY_FN_F6',
+        472 : 'KEY_FN_F7',
+        473 : 'KEY_FN_F8',
+        474 : 'KEY_FN_F9',
+        475 : 'KEY_FN_F10',
+        476 : 'KEY_FN_F11',
+        477 : 'KEY_FN_F12',
+        478 : 'KEY_FN_1',
+        479 : 'KEY_FN_2',
+        480 : 'KEY_FN_D',
+        481 : 'KEY_FN_E',
+        482 : 'KEY_FN_F',
+        483 : 'KEY_FN_S',
+        484 : 'KEY_FN_B',
+        497 : 'KEY_BRL_DOT1',
+        498 : 'KEY_BRL_DOT2',
+        499 : 'KEY_BRL_DOT3',
+        500 : 'KEY_BRL_DOT4',
+        501 : 'KEY_BRL_DOT5',
+        502 : 'KEY_BRL_DOT6',
+        503 : 'KEY_BRL_DOT7',
+        504 : 'KEY_BRL_DOT8',
+        511 : 'KEY_MAX',
+    },
+    2 : { # EV_REL
+          0 : 'REL_X',
+          1 : 'REL_Y',
+          2 : 'REL_Z',
+          3 : 'REL_RX',
+          4 : 'REL_RY',
+          5 : 'REL_RZ',
+          6 : 'REL_HWHEEL',
+          7 : 'REL_DIAL',
+          8 : 'REL_WHEEL',
+          9 : 'REL_MISC',
+         15 : 'REL_MAX',
+    },
+    3 : { # EV_ABS
+          0 : 'ABS_X',
+          1 : 'ABS_Y',
+          2 : 'ABS_Z',
+          3 : 'ABS_RX',
+          4 : 'ABS_RY',
+          5 : 'ABS_RZ',
+          6 : 'ABS_THROTTLE',
+          7 : 'ABS_RUDDER',
+          8 : 'ABS_WHEEL',
+          9 : 'ABS_GAS',
+         10 : 'ABS_BRAKE',
+         16 : 'ABS_HAT0X',
+         17 : 'ABS_HAT0Y',
+         18 : 'ABS_HAT1X',
+         19 : 'ABS_HAT1Y',
+         20 : 'ABS_HAT2X',
+         21 : 'ABS_HAT2Y',
+         22 : 'ABS_HAT3X',
+         23 : 'ABS_HAT3Y',
+         24 : 'ABS_PRESSURE',
+         25 : 'ABS_DISTANCE',
+         26 : 'ABS_TILT_X',
+         27 : 'ABS_TILT_Y',
+         28 : 'ABS_TOOL_WIDTH',
+         32 : 'ABS_VOLUME',
+         40 : 'ABS_MISC',
+         63 : 'ABS_MAX',
+    },
+    4 : { # EV_MSC
+          0 : 'MSC_SERIAL',
+          1 : 'MSC_PULSELED',
+          2 : 'MSC_GESTURE',
+          3 : 'MSC_RAW',
+          4 : 'MSC_SCAN',
+          7 : 'MSC_MAX',
+    },
+    5 : { # EV_SW
+          0 : 'SW_LID',
+          1 : 'SW_TABLET_MODE',
+          2 : 'SW_HEADPHONE_INSERT',
+         15 : 'SW_MAX',
+    },
+    17 : { # EV_LED
+          0 : 'LED_NUML',
+          1 : 'LED_CAPSL',
+          2 : 'LED_SCROLLL',
+          3 : 'LED_COMPOSE',
+          4 : 'LED_KANA',
+          5 : 'LED_SLEEP',
+          6 : 'LED_SUSPEND',
+          7 : 'LED_MUTE',
+          8 : 'LED_MISC',
+          9 : 'LED_MAIL',
+         10 : 'LED_CHARGING',
+         15 : 'LED_MAX',
+    },
+    18 : { # EV_SND
+          0 : 'SND_CLICK',
+          1 : 'SND_BELL',
+          2 : 'SND_TONE',
+          7 : 'SND_MAX',
+    },
+    20 : { # EV_REP
+          0 : 'REP_DELAY',
+          1 : 'REP_MAX',
+    },
+    21 : { # EV_FF
+          0 : 'FF_STATUS_STOPPED',
+          1 : 'FF_STATUS_MAX',
+         97 : 'FF_AUTOCENTER',
+         96 : 'FF_GAIN',
+         80 : 'FF_RUMBLE',
+         81 : 'FF_PERIODIC',
+         82 : 'FF_CONSTANT',
+         83 : 'FF_SPRING',
+         84 : 'FF_FRICTION',
+         85 : 'FF_DAMPER',
+         86 : 'FF_INERTIA',
+         87 : 'FF_RAMP',
+         88 : 'FF_SQUARE',
+         89 : 'FF_TRIANGLE',
+         90 : 'FF_SINE',
+         91 : 'FF_SAW_UP',
+         92 : 'FF_SAW_DOWN',
+         93 : 'FF_CUSTOM',
+        127 : 'FF_MAX',
+    },
+}
+
+_ids = {
+     0 : 'ID_BUS',
+     1 : 'ID_VENDOR',
+     2 : 'ID_PRODUCT',
+     3 : 'ID_VERSION',
+}
+
+_buses = {
+     1 : 'BUS_PCI',
+     2 : 'BUS_ISAPNP',
+     3 : 'BUS_USB',
+     4 : 'BUS_HIL',
+     5 : 'BUS_BLUETOOTH',
+    16 : 'BUS_ISA',
+    17 : 'BUS_I8042',
+    18 : 'BUS_XTKBD',
+    19 : 'BUS_RS232',
+    20 : 'BUS_GAMEPORT',
+    21 : 'BUS_PARPORT',
+    22 : 'BUS_AMIGA',
+    23 : 'BUS_ADB',
+    24 : 'BUS_I2C',
+    25 : 'BUS_HOST',
+    26 : 'BUS_GSC',
+}

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to