Author: duncan
Date: Sun Oct 29 10:36:20 2006
New Revision: 8505
Added:
branches/rel-1/freevo/src/evdev.py
branches/rel-1/freevo/src/evfallback.py
Modified:
branches/rel-1/freevo/freevo_config.py
branches/rel-1/freevo/local_conf.py.example
branches/rel-1/freevo/src/event.py
branches/rel-1/freevo/src/rc.py
Log:
[ 1579124 ] Support for Linux event devices
Patch as 2006-10-29 applied with some modifications
Modified: branches/rel-1/freevo/freevo_config.py
==============================================================================
--- branches/rel-1/freevo/freevo_config.py (original)
+++ branches/rel-1/freevo/freevo_config.py Sun Oct 29 10:36:20 2006
@@ -250,6 +250,8 @@
Added experimental plug-ins: Apple trailers, reencode
Added plug-ins: XM online
Added helpers: 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
''' ),
]
@@ -523,12 +525,37 @@
MENU_ARROW_NAVIGATION = 0
#
+# Process keyboard events from SDL. You want this unless you use only lirc
+# or event devices below.
+#
+USE_SDL_KEYBOARD = 1
+
+#
# Keymap to map keyboard keys to event strings. You can also add new keys
# here, e.g. KEYMAP[key.K_x] = 'SUBTITLE'. The K_-names are defined by pygame.
#
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.
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 Sun Oct 29 10:36:20 2006
@@ -263,11 +263,33 @@
# MENU_ARROW_NAVIGATION = 0
#
+# Process keyboard events from SDL. You want this unless you use only lirc
+# or event devices below.
+#
+# USE_SDL_KEYBOARD = 1
+
+#
# Keymap to map keyboard keys to event strings. You can also add new keys
# here, e.g. KEYMAP[key.K_x] = 'SUBTITLE'. The K_-names are defined by pygame.
#
#
+# 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')
+#
+
+#
# 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.
Added: branches/rel-1/freevo/src/evdev.py
==============================================================================
--- (empty file)
+++ branches/rel-1/freevo/src/evdev.py Sun Oct 29 10:36:20 2006
@@ -0,0 +1,334 @@
+# -*- 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 file 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 = {}
+
+# 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)
+
+
+if __name__ == "__main__":
+
+ from evfallback import _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
+
+ 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 " }"
+
+ # Main starts here
+ e = evdev(sys.argv[1], True)
+ e.print_info()
+ e.print_events()
+
+ try:
+ while True:
+ print e.read()
+ except KeyboardInterrupt:
+ pass
Modified: branches/rel-1/freevo/src/event.py
==============================================================================
--- branches/rel-1/freevo/src/event.py (original)
+++ branches/rel-1/freevo/src/event.py Sun Oct 29 10:36:20 2006
@@ -538,6 +538,76 @@
}
+DEFAULT_EVENTMAP = {
+ 'KEY_F1' : 'SLEEP',
+ 'KEY_HOME' : 'MENU',
+ 'KEY_G' : 'GUIDE',
+ 'KEY_ESC' : 'EXIT',
+ 'KEY_UP' : 'UP',
+ 'KEY_DOWN' : 'DOWN',
+ 'KEY_LEFT' : 'LEFT',
+ 'KEY_RIGHT' : 'RIGHT',
+ 'KEY_OK' : 'SELECT',
+ 'KEY_SPACE' : 'SELECT',
+ 'KEY_ENTER' : 'SELECT',
+ 'KEY_KPENTER' : 'SELECT',
+ 'KEY_POWER' : 'POWER',
+ 'KEY_F2' : 'POWER',
+ 'KEY_MUTE' : 'MUTE',
+ 'KEY_F3' : 'MUTE',
+ 'KEY_VOLUMEDOWN' : 'VOL-',
+ 'KEY_KPMINUS' : 'VOL-',
+ 'KEY_N' : 'VOL-',
+ 'KEY_VOLUMEUP' : 'VOL+',
+ 'KEY_KPPLUS' : 'VOL+',
+ 'KEY_M' : 'VOL+',
+ 'KEY_CHANNELUP' : 'CH+',
+ 'KEY_C' : 'CH+',
+ 'KEY_CHANNELDOWN' : 'CH-',
+ 'KEY_V' : 'CH-',
+ 'KEY_1' : '1',
+ 'KEY_2' : '2',
+ 'KEY_3' : '3',
+ 'KEY_4' : '4',
+ 'KEY_5' : '5',
+ 'KEY_6' : '6',
+ 'KEY_7' : '7',
+ 'KEY_8' : '8',
+ 'KEY_9' : '9',
+ 'KEY_0' : '0',
+ 'KEY_VENDOR' : 'DISPLAY',
+ 'KEY_D' : 'DISPLAY',
+ 'KEY_MENU' : 'ENTER',
+ 'KEY_E' : 'ENTER',
+ 'KEY_MINUS' : 'PREV_CH',
+ 'KEY_O' : 'PIP_ONOFF',
+ 'KEY_W' : 'PIP_SWAP',
+ 'KEY_I' : 'PIP_MOVE',
+ 'KEY_F4' : 'TV_VCR',
+ 'KEY_REWIND' : 'REW',
+ 'KEY_R' : 'REW',
+ 'KEY_PLAY' : 'PLAY',
+ 'KEY_P' : 'PLAY',
+ 'KEY_FORWARD' : 'FFWD',
+ 'KEY_F' : 'FFWD',
+ 'KEY_PAUSE' : 'PAUSE',
+ 'KEY_U' : 'PAUSE',
+ 'KEY_STOP' : 'STOP',
+ 'KEY_S' : 'STOP',
+ 'KEY_RECORD' : 'RECORD',
+ 'KEY_F6' : 'REC',
+ 'KEY_PERIOD' : 'EJECT',
+ 'KEY_L' : 'SUBTITLE',
+ 'KEY_A' : 'LANG',
+
+ 'REL_X' : ('LEFT', 'RIGHT'),
+ 'REL_Y' : ('UP', 'DOWN'),
+
+ 'BTN_LEFT' : 'SELECT',
+ 'BTN_RIGHT' : 'EXIT',
+ }
+
+
#
# Internal events, don't map any button on them
Added: branches/rel-1/freevo/src/evfallback.py
==============================================================================
--- (empty file)
+++ branches/rel-1/freevo/src/evfallback.py Sun Oct 29 10:36:20 2006
@@ -0,0 +1,570 @@
+# -*- coding: iso-8859-1 -*-
+# -----------------------------------------------------------------------
+# evfallback.py - Default mappings for event interface module
+# -----------------------------------------------------------------------
+# $Id$
+#
+# Notes:
+# Todo:
+#
+# -----------------------------------------------------------------------
+# Freevo - A Home Theater PC framework
+# Copyright (C) 2002 Krister Lagerstrom, et al.
+# Please see the file 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
+#
+# -----------------------------------------------------------------------
+
+_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',
+ }
Modified: branches/rel-1/freevo/src/rc.py
==============================================================================
--- branches/rel-1/freevo/src/rc.py (original)
+++ branches/rel-1/freevo/src/rc.py Sun Oct 29 10:36:20 2006
@@ -36,6 +36,7 @@
import types
import config
+import evdev
from event import Event, BUTTON
@@ -299,6 +300,67 @@
# No data available
return None
+#
--------------------------------------------------------------------------------
+
+class Evdev:
+ """
+ Class to handle evdev events
+ """
+ def __init__(self):
+ """
+ init all specified devices
+ """
+ self._devs = []
+
+ for dev in config.EVENT_DEVS:
+ e = None
+
+ if os.path.exists(dev):
+ try:
+ e = evdev.evdev(dev)
+ except:
+ print "Problem opening event device '%s'" % dev
+ else:
+ name = dev
+ for dev in os.listdir('/dev/input'):
+ if not dev.startswith('event'):
+ continue
+
+ try:
+ dev = '/dev/input/' + dev
+ e = evdev.evdev(dev)
+ except:
+ continue
+
+ if e.get_name() == name:
+ break
+ else:
+ e = None
+ print "Could not find any device named '%s'" % name
+
+ if e is not None:
+ print "Added input device '%s': %s" % (dev, e.get_name())
+ self._devs.append(e)
+
+ def poll(self, rc):
+ """
+ return next event
+ """
+ for dev in self._devs:
+ event = dev.read()
+ if event is None:
+ continue
+
+ if config.EVENTMAP.has_key(event[2]):
+ if event[1] == 'EV_KEY':
+ # 0 = release, 1 = press, 2 = repeat
+ if event[3] > 0:
+ return config.EVENTMAP[event[2]]
+ elif event[1] == 'EV_REL':
+ if event[3] < -10:
+ return config.EVENTMAP[event[2]][0]
+ elif event[3] > 10:
+ return config.EVENTMAP[event[2]][1]
#
--------------------------------------------------------------------------------
@@ -316,8 +378,14 @@
except:
pass
+ if config.USE_SDL_KEYBOARD:
+ try:
+ self.inputs.append(Keyboard())
+ except:
+ pass
+
try:
- self.inputs.append(Keyboard())
+ self.inputs.append(Evdev())
except:
pass
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog