mirror of
https://github.com/moparisthebest/uinput-mapper
synced 2025-01-30 22:50:16 -05:00
Clean up code a bit more; add a class.
This commit is contained in:
parent
e9de2ec43d
commit
f6efe9f331
66
py/cinput.py
66
py/cinput.py
@ -1,8 +1,12 @@
|
|||||||
from linux_input import *
|
from linux_input import *
|
||||||
|
from linux_uinput import *
|
||||||
|
|
||||||
import array, struct, fcntl
|
import array, struct, fcntl, os
|
||||||
|
|
||||||
def get_input_version(f):
|
def get_input_version(f):
|
||||||
|
"""
|
||||||
|
Returns the input version of a specified fd of a device
|
||||||
|
"""
|
||||||
buf = array.array('i', [0])
|
buf = array.array('i', [0])
|
||||||
r = fcntl.ioctl(f, EVIOCGVERSION, buf)
|
r = fcntl.ioctl(f, EVIOCGVERSION, buf)
|
||||||
v = struct.unpack('@i', buf)[0]
|
v = struct.unpack('@i', buf)[0]
|
||||||
@ -10,6 +14,9 @@ def get_input_version(f):
|
|||||||
return "%d.%d.%d" % ( v >> 16, (v >> 8) & 0xff, v & 0xff)
|
return "%d.%d.%d" % ( v >> 16, (v >> 8) & 0xff, v & 0xff)
|
||||||
|
|
||||||
def get_input_name(f, l=256):
|
def get_input_name(f, l=256):
|
||||||
|
"""
|
||||||
|
Returns the name of a specified fd of a device
|
||||||
|
"""
|
||||||
buf = array.array('c', ' ' * l)
|
buf = array.array('c', ' ' * l)
|
||||||
r = fcntl.ioctl(f, EVIOCGNAME(l), buf)
|
r = fcntl.ioctl(f, EVIOCGNAME(l), buf)
|
||||||
v = struct.unpack('%ds' % l, buf)
|
v = struct.unpack('%ds' % l, buf)
|
||||||
@ -21,6 +28,7 @@ _nbits = lambda x: ((x-1) / _bpl) + 1
|
|||||||
_ll = _nbits(KEY_MAX)
|
_ll = _nbits(KEY_MAX)
|
||||||
test_bit = lambda j, v: (v[j / _bpl] >> (j % _bpl)) & 1
|
test_bit = lambda j, v: (v[j / _bpl] >> (j % _bpl)) & 1
|
||||||
|
|
||||||
|
# TODO: Do this for all EV_* ?
|
||||||
def get_keys(f, ev):
|
def get_keys(f, ev):
|
||||||
buf = array.array('L', [0L] * _ll)
|
buf = array.array('L', [0L] * _ll)
|
||||||
try:
|
try:
|
||||||
@ -36,7 +44,61 @@ def get_keys(f, ev):
|
|||||||
for j in range(0, KEY_MAX):
|
for j in range(0, KEY_MAX):
|
||||||
if test_bit(j, v):
|
if test_bit(j, v):
|
||||||
yield j
|
yield j
|
||||||
#yield rev_keys[j]
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def open_uinput():
|
||||||
|
try:
|
||||||
|
f = os.open('/dev/uinput', os.O_WRONLY | os.O_NONBLOCK)
|
||||||
|
except IOError:
|
||||||
|
try:
|
||||||
|
f = os.open('/dev/input/uinput', os.O_WRONLY | os.O_NONBLOCK)
|
||||||
|
except IOError:
|
||||||
|
print 'FAIL MUCH?'
|
||||||
|
return None
|
||||||
|
return f
|
||||||
|
|
||||||
|
def create_uinput_device(name, specs):
|
||||||
|
"""
|
||||||
|
Create uinput device
|
||||||
|
"""
|
||||||
|
f = open_uinput()
|
||||||
|
|
||||||
|
if not f:
|
||||||
|
print 'Failed to open uinput'
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Add keys, etc
|
||||||
|
#handle_specs(f, specs)
|
||||||
|
|
||||||
|
# Allocate other info
|
||||||
|
uidev = uinput_user_dev()
|
||||||
|
|
||||||
|
# TODO: Get from specs
|
||||||
|
uidev.name = name
|
||||||
|
uidev._id.bustype = 0x03 # BUS_USB (TODO)
|
||||||
|
uidev._id.vendor = 0x42
|
||||||
|
uidev._id.product = 0xbebe
|
||||||
|
uidev._id.version = 1
|
||||||
|
|
||||||
|
buf = buffer(uidev)[:]
|
||||||
|
|
||||||
|
# Write dev info
|
||||||
|
os.write(f, buf)
|
||||||
|
|
||||||
|
fcntl.ioctl(f, UI_DEV_CREATE)
|
||||||
|
|
||||||
|
return f
|
||||||
|
|
||||||
|
def free_uinput_device(f):
|
||||||
|
return fcntl.ioctl(f, UI_DEV_DESTROY)
|
||||||
|
|
||||||
|
class UInputDevice(object):
|
||||||
|
|
||||||
|
def __init__(self, name, specs):
|
||||||
|
self.f = create_uinput_device(name, specs)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
free_uinput_device(self.f)
|
||||||
|
|
||||||
|
98
py/create.py
98
py/create.py
@ -1,81 +1,39 @@
|
|||||||
import cinput, linux_uinput, ctypes, fcntl, os
|
import cinput, linux_uinput, ctypes, fcntl, os
|
||||||
|
|
||||||
|
|
||||||
def open_uinput():
|
from cinput import *
|
||||||
try:
|
|
||||||
f = os.open('/dev/uinput', os.O_WRONLY | os.O_NONBLOCK)
|
|
||||||
except IOError:
|
|
||||||
try:
|
|
||||||
f = os.open('/dev/input/uinput', os.O_WRONLY | os.O_NONBLOCK)
|
|
||||||
except IOError:
|
|
||||||
print 'FAIL MUCH?'
|
|
||||||
return None
|
|
||||||
return f
|
|
||||||
|
|
||||||
def handle_specs(f, s):
|
def handle_specs(f, s):
|
||||||
print 'ioctl:', fcntl.ioctl(f, linux_uinput.UI_SET_EVBIT, cinput.EV_KEY)
|
print 'ioctl:', fcntl.ioctl(f, UI_SET_EVBIT, cinput.EV_KEY)
|
||||||
print 'ioctl:', fcntl.ioctl(f, linux_uinput.UI_SET_KEYBIT, cinput.KEY_UP)
|
print 'ioctl:', fcntl.ioctl(f, UI_SET_KEYBIT, cinput.KEY_UP)
|
||||||
|
|
||||||
|
|
||||||
def create_device(specs):
|
d = cinput.UInputDevice('Example input device', None)
|
||||||
f = open_uinput()
|
|
||||||
|
|
||||||
if not f:
|
|
||||||
print 'Failed to open uinput'
|
|
||||||
return None
|
|
||||||
|
|
||||||
# Add keys, etc
|
|
||||||
handle_specs(f, specs)
|
|
||||||
|
|
||||||
# Allocate other info
|
|
||||||
uidev = linux_uinput.uinput_user_dev()
|
|
||||||
|
|
||||||
uidev.name = 'key2joy:0'
|
|
||||||
uidev._id.bustype = 0x03 # BUS_USB (TODO)
|
|
||||||
uidev._id.vendor = 0x42
|
|
||||||
uidev._id.product = 0xbebe
|
|
||||||
uidev._id.version = 1
|
|
||||||
|
|
||||||
buf = buffer(uidev)[:]
|
|
||||||
|
|
||||||
# Write dev info
|
|
||||||
os.write(f, buf)
|
|
||||||
|
|
||||||
print 'ioctl:', fcntl.ioctl(f, linux_uinput.UI_DEV_CREATE)
|
|
||||||
|
|
||||||
return f
|
|
||||||
|
|
||||||
def free_device(f):
|
|
||||||
return fcntl.ioctl(f, linux_uinput.UI_DEV_DESTROY)
|
|
||||||
|
|
||||||
|
|
||||||
_ = create_device(None)
|
|
||||||
|
|
||||||
print 'Hoi'
|
|
||||||
import time
|
import time
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|
||||||
free_device(_)
|
|
||||||
# config
|
# Config
|
||||||
#dev = {
|
dev = {
|
||||||
# "input_devices" : [
|
"input_devices" : [
|
||||||
# ("/dev/input/event3", "keyboard1"),
|
("/dev/input/event3", "keyboard1"),
|
||||||
# ],
|
],
|
||||||
# "type" : "mouse", # "mixed" "mouse" "keyboard" "joystick" "clone"?
|
"type" : "mouse", # "mixed" "mouse" "keyboard" "joystick" "clone"?
|
||||||
# "keymap" : {
|
"keymap" : {
|
||||||
# "any" : { # From
|
"any" : { # From
|
||||||
# EV_KEY : {
|
EV_KEY : {
|
||||||
# KEY_UP : {
|
KEY_UP : {
|
||||||
# "type" : EV_REL
|
"type" : EV_REL,
|
||||||
# "key" : REL_X
|
"key" : REL_X,
|
||||||
# "value" : lambda x: -x*10
|
"value" : lambda x: -x*10
|
||||||
# }
|
},
|
||||||
# KEY_DOWN : {
|
KEY_DOWN : {
|
||||||
# "type": EV_REL
|
"type": EV_REL,
|
||||||
# "key": REL_X
|
"key": REL_X,
|
||||||
# "value" : lambda x: x*10
|
"value" : lambda x: x*10
|
||||||
# }
|
}
|
||||||
# }
|
}
|
||||||
# },
|
},
|
||||||
# }
|
}
|
||||||
#}
|
}
|
||||||
|
25
py/map.py
25
py/map.py
@ -1,25 +0,0 @@
|
|||||||
import cinput
|
|
||||||
import ctypes
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
f = open(sys.argv[1] if len(sys.argv) == 2 else "/dev/input/event3")
|
|
||||||
|
|
||||||
print 'Version:', cinput.get_input_version(f)
|
|
||||||
print cinput.get_input_name(f)
|
|
||||||
|
|
||||||
print [cinput.rev_keys[_] for _ in cinput.get_keys(f, cinput.EV_KEY)]
|
|
||||||
print [cinput.rev_absaxes[_] for _ in cinput.get_keys(f, cinput.EV_ABS)]
|
|
||||||
print [cinput.rev_rel[_] for _ in cinput.get_keys(f, cinput.EV_REL)]
|
|
||||||
|
|
||||||
while True:
|
|
||||||
estr = f.read(ctypes.sizeof(cinput.input_event))
|
|
||||||
|
|
||||||
e = ctypes.cast(estr, ctypes.POINTER(cinput.input_event))
|
|
||||||
ev = e.contents
|
|
||||||
|
|
||||||
print 'Event type:', cinput.rev_events[ev.type]
|
|
||||||
try:
|
|
||||||
print 'Code:', cinput.event_keys[ev.type][ev.code]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
25
py/read.py
Normal file
25
py/read.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from cinput import *
|
||||||
|
import ctypes
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
f = open(sys.argv[1] if len(sys.argv) == 2 else "/dev/input/event3")
|
||||||
|
|
||||||
|
print 'Version:', get_input_version(f)
|
||||||
|
print get_input_name(f)
|
||||||
|
|
||||||
|
print [rev_keys[_] for _ in get_keys(f, EV_KEY)]
|
||||||
|
print [rev_absaxes[_] for _ in get_keys(f, EV_ABS)]
|
||||||
|
print [rev_rel[_] for _ in get_keys(f, EV_REL)]
|
||||||
|
|
||||||
|
while True:
|
||||||
|
estr = f.read(ctypes.sizeof(input_event))
|
||||||
|
|
||||||
|
e = ctypes.cast(estr, ctypes.POINTER(input_event))
|
||||||
|
ev = e.contents
|
||||||
|
|
||||||
|
print 'Event type:', rev_events[ev.type]
|
||||||
|
try:
|
||||||
|
print 'Code:', event_keys[ev.type][ev.code]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
Loading…
Reference in New Issue
Block a user