diff options
author | Stany MARCEL <stanypub@gmail.com> | 2015-11-04 03:40:00 +0300 |
---|---|---|
committer | Stany MARCEL <stanypub@gmail.com> | 2015-11-04 03:44:32 +0300 |
commit | cd7c66d3a6c6d7f334dd5cc043cc89ccc2f19afa (patch) | |
tree | 90d636a4525edcd0dee53f8c0a6e15ad4e78248b | |
parent | 4f360079a916a9d694f958d25e81bb3217dd9e0d (diff) |
Increase compatibility with xbox360 gamepad
Add min, max, fuzz and flat settings in abs uinput init
The gamepad emulation Now works with kodi.
Signed-off-by: Stany MARCEL <stanypub@gmail.com>
-rwxr-xr-x | scripts/sc-xbox.py | 8 | ||||
-rw-r--r-- | src/uinput.c | 20 | ||||
-rw-r--r-- | src/uinput.py | 37 |
3 files changed, 41 insertions, 24 deletions
diff --git a/scripts/sc-xbox.py b/scripts/sc-xbox.py index 2872eb3..1bf581d 100755 --- a/scripts/sc-xbox.py +++ b/scripts/sc-xbox.py @@ -67,12 +67,12 @@ def lpad_func(x, btn, threshold, evstick, evtouch, clicked, invert): if x >= 0: if x >= threshold: - x = 32767 + x = 1 else: x = 0 else: if x <= -threshold: - x = -32767 + x = -1 else: x = 0 events.append((evtouch, x if not invert else -x, x != 0)) @@ -85,8 +85,8 @@ def lpad_func(x, btn, threshold, evstick, evtouch, clicked, invert): axis_map = { - 'ltrig' : lambda x, btn: [(Axes.ABS_Z, int(-32767 + ((x*2.0*32767.0)/255.)), False)], - 'rtrig' : lambda x, btn: [(Axes.ABS_RZ, int(-32767 + ((x*2.0*32767.0)/255.)), False)], + 'ltrig' : lambda x, btn: [(Axes.ABS_Z, x, False)], + 'rtrig' : lambda x, btn: [(Axes.ABS_RZ, x, False)], 'lpad_x' : lambda x, btn: lpad_func(x, btn, 15000, Axes.ABS_X, Axes.ABS_HAT0X, False, False), 'lpad_y' : lambda x, btn: lpad_func(x, btn, 15000, Axes.ABS_Y, Axes.ABS_HAT0Y, False, True), 'rpad_x' : lambda x, btn: [(Axes.ABS_RX, x, False)], diff --git a/src/uinput.c b/src/uinput.c index 3054838..cef3f68 100644 --- a/src/uinput.c +++ b/src/uinput.c @@ -31,9 +31,16 @@ #include <unistd.h> int uinput_init( - int key_len, int * key, - int abs_len, int * abs, - int vendor, int product, + int key_len, + int * key, + int abs_len, + int * abs, + int * abs_min, + int * abs_max, + int * abs_fuzz, + int * abs_flat, + int vendor, + int product, char * name) { struct uinput_user_dev uidev; @@ -76,9 +83,10 @@ int uinput_init( close(fd); return -5; } - uidev.absmin[abs[i]] = -32767; - uidev.absmax[abs[i]] = 32767; - uidev.absfuzz[abs[i]] = 0; + uidev.absmin[abs[i]] = abs_min[i]; + uidev.absmax[abs[i]] = abs_max[i]; + uidev.absfuzz[abs[i]] = abs_fuzz[i]; + uidev.absflat[abs[i]] = abs_flat[i]; } if (write(fd, &uidev, sizeof(uidev)) < 0) { diff --git a/src/uinput.py b/src/uinput.py index aecef01..d602029 100644 --- a/src/uinput.py +++ b/src/uinput.py @@ -42,8 +42,8 @@ class UInput(object): def __init__(self, vendor, product, name, keys, axes): - self._keys = set(keys) - self._axes = set(axes) + self._k = keys + self._a, self._amin, self._amax, self._afuzz, self._aflat = zip(*axes) lib = os.path.abspath( os.path.normpath( @@ -53,11 +53,20 @@ class UInput(object): 'libuinput' + get_config_var('SO')))) self._lib = ctypes.CDLL(lib) - _k = (ctypes.c_int * len(keys))(*keys) - _a = (ctypes.c_int * len(axes))(*axes) + ck = (ctypes.c_int * len(self._k))(*self._k) + ca = (ctypes.c_int * len(self._a))(*self._a) + camin = (ctypes.c_int * len(self._amin ))(*self._amin ) + camax = (ctypes.c_int * len(self._amax ))(*self._amax ) + cafuzz = (ctypes.c_int * len(self._afuzz))(*self._afuzz) + caflat = (ctypes.c_int * len(self._aflat))(*self._aflat) + _name = ctypes.c_char_p(name) - self._fd = self._lib.uinput_init(ctypes.c_int(len(keys)), _k, - ctypes.c_int(len(axes)), _a, + self._fd = self._lib.uinput_init(ctypes.c_int(len(self._k)), ck, + ctypes.c_int(len(self._a)), ca, + camin, + camax, + cafuzz, + caflat, ctypes.c_int(vendor), ctypes.c_int(product), _name) @@ -97,11 +106,11 @@ class Xbox360(UInput): Keys.BTN_TR, Keys.BTN_THUMBL, Keys.BTN_THUMBR], - axes=[Axes.ABS_X, - Axes.ABS_Y, - Axes.ABS_RX, - Axes.ABS_RY, - Axes.ABS_Z, - Axes.ABS_RZ, - Axes.ABS_HAT0X, - Axes.ABS_HAT0Y]) + axes=[(Axes.ABS_X, -32768, 32767, 16, 128), + (Axes.ABS_Y, -32768, 32767, 16, 128), + (Axes.ABS_RX, -32768, 32767, 16, 128), + (Axes.ABS_RY, -32768, 32767, 16, 128), + (Axes.ABS_Z, 0, 255, 0, 0), + (Axes.ABS_RZ, 0, 255, 0, 0), + (Axes.ABS_HAT0X, -1, 1, 0, 0), + (Axes.ABS_HAT0Y, -1, 1, 0, 0)]) |