fixed mapping joysticks as buttons

meta
sezanzeb 4 years ago
parent ef3b6cea82
commit d4a8163268

@ -38,8 +38,7 @@ from evdev.ecodes import EV_KEY
from keymapper.ipc.pipe import Pipe
from keymapper.logger import logger
from keymapper.state import custom_mapping
from keymapper.getdevices import get_devices, is_gamepad
from keymapper.getdevices import get_devices
from keymapper import utils
@ -110,7 +109,6 @@ class RootHelper:
device_name = self.device_name
rlist = {}
gamepad = {}
if device_name is None:
logger.error('device_name is None')
@ -135,7 +133,6 @@ class RootHelper:
for device in virtual_devices:
rlist[device.fd] = device
gamepad[device.fd] = is_gamepad(device)
logger.debug(
'Starting reading keycodes from "%s"',
@ -162,21 +159,18 @@ class RootHelper:
try:
event = device.read_one()
self._send_event(event, device, gamepad[device.fd])
self._send_event(event, device)
except OSError:
logger.debug('Device "%s" disappeared', device.path)
return
def _send_event(self, event, device, gamepad):
def _send_event(self, event, device):
"""Write the event into the pipe to the main process.
Parameters
----------
event : evdev.InputEvent
device : evdev.InputDevice
gamepad : bool
If true, ABS_X and ABS_Y might be mapped to buttons as well
depending on the purpose configuration
"""
# value: 1 for down, 0 for up, 2 for hold.
if event.type == EV_KEY and event.value == 2:
@ -194,9 +188,6 @@ class RootHelper:
# which breaks the current workflow.
return
if not utils.should_map_as_btn(event, custom_mapping, gamepad):
return
max_abs = utils.get_max_abs(device)
event.value = utils.normalize_value(event, max_abs)

@ -33,6 +33,9 @@ from keymapper.key import Key
from keymapper.getdevices import set_devices
from keymapper.ipc.pipe import Pipe
from keymapper.gui.helper import TERMINATE
from keymapper import utils
from keymapper.state import custom_mapping
from keymapper.getdevices import get_devices
DEBOUNCE_TICKS = 3
@ -132,6 +135,10 @@ class Reader:
if event is None:
continue
gamepad = get_devices()[self.device_name]['gamepad']
if not utils.should_map_as_btn(event, custom_mapping, gamepad):
continue
event_tuple = (event.type, event.code, event.value)
type_code = (event.type, event.code)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

@ -20,6 +20,7 @@
import unittest
from unittest import mock
import time
import multiprocessing
@ -166,22 +167,22 @@ class TestReader(unittest.TestCase):
self.assertEqual(reader.get_unreleased_keys(), None)
def test_change_wheel_direction(self):
self.assertEqual(reader.read(), None)
self.create_helper()
self.assertEqual(reader.read(), None)
# not just wheel, anything that suddenly reports a different value.
# as long as type and code are equal its the same key, so there is no
# way both directions can be held down.
self.assertEqual(reader.read(), None)
self.create_helper()
self.assertEqual(reader.read(), None)
reader.start_reading('device 1')
self.assertEqual(reader.read(), None)
send_event_to_reader(new_event(1234, 2345, 1))
self.assertEqual(reader.read(), (1234, 2345, 1))
send_event_to_reader(new_event(EV_REL, REL_WHEEL, 1))
self.assertEqual(reader.read(), (EV_REL, REL_WHEEL, 1))
self.assertEqual(len(reader._unreleased), 1)
self.assertEqual(reader.read(), None)
send_event_to_reader(new_event(1234, 2345, -1))
self.assertEqual(reader.read(), (1234, 2345, -1))
send_event_to_reader(new_event(EV_REL, REL_WHEEL, -1))
self.assertEqual(reader.read(), (EV_REL, REL_WHEEL, -1))
# notice that this is no combination of two sides, the previous
# entry in unreleased has to get overwritten. So there is still only
# one element in it.
@ -240,13 +241,14 @@ class TestReader(unittest.TestCase):
def test_reading_3(self):
self.create_helper()
# a combination of events via Socket with reads inbetween
reader.start_reading('device 1')
reader.start_reading('gamepad')
send_event_to_reader(new_event(EV_KEY, CODE_1, 1, 1001))
self.assertEqual(reader.read(), (
(EV_KEY, CODE_1, 1)
))
custom_mapping.set('gamepad.joystick.left_purpose', BUTTONS)
send_event_to_reader(new_event(EV_ABS, ABS_Y, 1, 1002))
self.assertEqual(reader.read(), (
(EV_KEY, CODE_1, 1),
@ -308,7 +310,7 @@ class TestReader(unittest.TestCase):
self.assertEqual(len(reader._unreleased), 0)
def test_combine_triggers(self):
reader.start_reading('foo')
reader.start_reading('device 1')
i = 0

Loading…
Cancel
Save