1*8837469aSBenjamin Tissoires#!/bin/env python3 2*8837469aSBenjamin Tissoires# SPDX-License-Identifier: GPL-2.0 3*8837469aSBenjamin Tissoires# -*- coding: utf-8 -*- 4*8837469aSBenjamin Tissoires# 5*8837469aSBenjamin Tissoires# Copyright (c) 2019 Benjamin Tissoires <benjamin.tissoires@gmail.com> 6*8837469aSBenjamin Tissoires# Copyright (c) 2019 Red Hat, Inc. 7*8837469aSBenjamin Tissoires# 8*8837469aSBenjamin Tissoires 9*8837469aSBenjamin Tissoiresfrom . import base 10*8837469aSBenjamin Tissoiresimport libevdev 11*8837469aSBenjamin Tissoiresimport pytest 12*8837469aSBenjamin Tissoires 13*8837469aSBenjamin Tissoiresfrom hidtools.device.base_gamepad import AsusGamepad, SaitekGamepad 14*8837469aSBenjamin Tissoires 15*8837469aSBenjamin Tissoiresimport logging 16*8837469aSBenjamin Tissoires 17*8837469aSBenjamin Tissoireslogger = logging.getLogger("hidtools.test.gamepad") 18*8837469aSBenjamin Tissoires 19*8837469aSBenjamin Tissoires 20*8837469aSBenjamin Tissoiresclass BaseTest: 21*8837469aSBenjamin Tissoires class TestGamepad(base.BaseTestCase.TestUhid): 22*8837469aSBenjamin Tissoires @pytest.fixture(autouse=True) 23*8837469aSBenjamin Tissoires def send_initial_state(self): 24*8837469aSBenjamin Tissoires """send an empty report to initialize the axes""" 25*8837469aSBenjamin Tissoires uhdev = self.uhdev 26*8837469aSBenjamin Tissoires 27*8837469aSBenjamin Tissoires r = uhdev.event() 28*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 29*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 30*8837469aSBenjamin Tissoires 31*8837469aSBenjamin Tissoires def assert_button(self, button): 32*8837469aSBenjamin Tissoires uhdev = self.uhdev 33*8837469aSBenjamin Tissoires evdev = uhdev.get_evdev() 34*8837469aSBenjamin Tissoires syn_event = self.syn_event 35*8837469aSBenjamin Tissoires 36*8837469aSBenjamin Tissoires buttons = {} 37*8837469aSBenjamin Tissoires key = libevdev.evbit(uhdev.buttons_map[button]) 38*8837469aSBenjamin Tissoires 39*8837469aSBenjamin Tissoires buttons[button] = True 40*8837469aSBenjamin Tissoires r = uhdev.event(buttons=buttons) 41*8837469aSBenjamin Tissoires expected_event = libevdev.InputEvent(key, 1) 42*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 43*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 44*8837469aSBenjamin Tissoires self.assertInputEventsIn((syn_event, expected_event), events) 45*8837469aSBenjamin Tissoires assert evdev.value[key] == 1 46*8837469aSBenjamin Tissoires 47*8837469aSBenjamin Tissoires buttons[button] = False 48*8837469aSBenjamin Tissoires r = uhdev.event(buttons=buttons) 49*8837469aSBenjamin Tissoires expected_event = libevdev.InputEvent(key, 0) 50*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 51*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 52*8837469aSBenjamin Tissoires self.assertInputEventsIn((syn_event, expected_event), events) 53*8837469aSBenjamin Tissoires assert evdev.value[key] == 0 54*8837469aSBenjamin Tissoires 55*8837469aSBenjamin Tissoires def test_buttons(self): 56*8837469aSBenjamin Tissoires """check for button reliability.""" 57*8837469aSBenjamin Tissoires uhdev = self.uhdev 58*8837469aSBenjamin Tissoires 59*8837469aSBenjamin Tissoires for b in uhdev.buttons: 60*8837469aSBenjamin Tissoires self.assert_button(b) 61*8837469aSBenjamin Tissoires 62*8837469aSBenjamin Tissoires def test_dual_buttons(self): 63*8837469aSBenjamin Tissoires """check for button reliability when pressing 2 buttons""" 64*8837469aSBenjamin Tissoires uhdev = self.uhdev 65*8837469aSBenjamin Tissoires evdev = uhdev.get_evdev() 66*8837469aSBenjamin Tissoires syn_event = self.syn_event 67*8837469aSBenjamin Tissoires 68*8837469aSBenjamin Tissoires # can change intended b1 b2 values 69*8837469aSBenjamin Tissoires b1 = uhdev.buttons[0] 70*8837469aSBenjamin Tissoires key1 = libevdev.evbit(uhdev.buttons_map[b1]) 71*8837469aSBenjamin Tissoires b2 = uhdev.buttons[1] 72*8837469aSBenjamin Tissoires key2 = libevdev.evbit(uhdev.buttons_map[b2]) 73*8837469aSBenjamin Tissoires 74*8837469aSBenjamin Tissoires buttons = {b1: True, b2: True} 75*8837469aSBenjamin Tissoires r = uhdev.event(buttons=buttons) 76*8837469aSBenjamin Tissoires expected_event0 = libevdev.InputEvent(key1, 1) 77*8837469aSBenjamin Tissoires expected_event1 = libevdev.InputEvent(key2, 1) 78*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 79*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 80*8837469aSBenjamin Tissoires self.assertInputEventsIn( 81*8837469aSBenjamin Tissoires (syn_event, expected_event0, expected_event1), events 82*8837469aSBenjamin Tissoires ) 83*8837469aSBenjamin Tissoires assert evdev.value[key1] == 1 84*8837469aSBenjamin Tissoires assert evdev.value[key2] == 1 85*8837469aSBenjamin Tissoires 86*8837469aSBenjamin Tissoires buttons = {b1: False, b2: None} 87*8837469aSBenjamin Tissoires r = uhdev.event(buttons=buttons) 88*8837469aSBenjamin Tissoires expected_event = libevdev.InputEvent(key1, 0) 89*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 90*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 91*8837469aSBenjamin Tissoires self.assertInputEventsIn((syn_event, expected_event), events) 92*8837469aSBenjamin Tissoires assert evdev.value[key1] == 0 93*8837469aSBenjamin Tissoires assert evdev.value[key2] == 1 94*8837469aSBenjamin Tissoires 95*8837469aSBenjamin Tissoires buttons = {b1: None, b2: False} 96*8837469aSBenjamin Tissoires r = uhdev.event(buttons=buttons) 97*8837469aSBenjamin Tissoires expected_event = libevdev.InputEvent(key2, 0) 98*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 99*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 100*8837469aSBenjamin Tissoires self.assertInputEventsIn((syn_event, expected_event), events) 101*8837469aSBenjamin Tissoires assert evdev.value[key1] == 0 102*8837469aSBenjamin Tissoires assert evdev.value[key2] == 0 103*8837469aSBenjamin Tissoires 104*8837469aSBenjamin Tissoires def _get_libevdev_abs_events(self, which): 105*8837469aSBenjamin Tissoires """Returns which ABS_* evdev axes are expected for the given stick""" 106*8837469aSBenjamin Tissoires abs_map = self.uhdev.axes_map[which] 107*8837469aSBenjamin Tissoires 108*8837469aSBenjamin Tissoires x = abs_map["x"].evdev 109*8837469aSBenjamin Tissoires y = abs_map["y"].evdev 110*8837469aSBenjamin Tissoires 111*8837469aSBenjamin Tissoires assert x 112*8837469aSBenjamin Tissoires assert y 113*8837469aSBenjamin Tissoires 114*8837469aSBenjamin Tissoires return x, y 115*8837469aSBenjamin Tissoires 116*8837469aSBenjamin Tissoires def _test_joystick_press(self, which, data): 117*8837469aSBenjamin Tissoires uhdev = self.uhdev 118*8837469aSBenjamin Tissoires 119*8837469aSBenjamin Tissoires libevdev_axes = self._get_libevdev_abs_events(which) 120*8837469aSBenjamin Tissoires 121*8837469aSBenjamin Tissoires r = None 122*8837469aSBenjamin Tissoires if which == "left_stick": 123*8837469aSBenjamin Tissoires r = uhdev.event(left=data) 124*8837469aSBenjamin Tissoires else: 125*8837469aSBenjamin Tissoires r = uhdev.event(right=data) 126*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 127*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 128*8837469aSBenjamin Tissoires 129*8837469aSBenjamin Tissoires for i, d in enumerate(data): 130*8837469aSBenjamin Tissoires if d is not None and d != 127: 131*8837469aSBenjamin Tissoires assert libevdev.InputEvent(libevdev_axes[i], d) in events 132*8837469aSBenjamin Tissoires else: 133*8837469aSBenjamin Tissoires assert libevdev.InputEvent(libevdev_axes[i]) not in events 134*8837469aSBenjamin Tissoires 135*8837469aSBenjamin Tissoires def test_left_joystick_press_left(self): 136*8837469aSBenjamin Tissoires """check for the left joystick reliability""" 137*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (63, None)) 138*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (0, 127)) 139*8837469aSBenjamin Tissoires 140*8837469aSBenjamin Tissoires def test_left_joystick_press_right(self): 141*8837469aSBenjamin Tissoires """check for the left joystick reliability""" 142*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (191, 127)) 143*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (255, None)) 144*8837469aSBenjamin Tissoires 145*8837469aSBenjamin Tissoires def test_left_joystick_press_up(self): 146*8837469aSBenjamin Tissoires """check for the left joystick reliability""" 147*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (None, 63)) 148*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (127, 0)) 149*8837469aSBenjamin Tissoires 150*8837469aSBenjamin Tissoires def test_left_joystick_press_down(self): 151*8837469aSBenjamin Tissoires """check for the left joystick reliability""" 152*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (127, 191)) 153*8837469aSBenjamin Tissoires self._test_joystick_press("left_stick", (None, 255)) 154*8837469aSBenjamin Tissoires 155*8837469aSBenjamin Tissoires def test_right_joystick_press_left(self): 156*8837469aSBenjamin Tissoires """check for the right joystick reliability""" 157*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (63, None)) 158*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (0, 127)) 159*8837469aSBenjamin Tissoires 160*8837469aSBenjamin Tissoires def test_right_joystick_press_right(self): 161*8837469aSBenjamin Tissoires """check for the right joystick reliability""" 162*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (191, 127)) 163*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (255, None)) 164*8837469aSBenjamin Tissoires 165*8837469aSBenjamin Tissoires def test_right_joystick_press_up(self): 166*8837469aSBenjamin Tissoires """check for the right joystick reliability""" 167*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (None, 63)) 168*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (127, 0)) 169*8837469aSBenjamin Tissoires 170*8837469aSBenjamin Tissoires def test_right_joystick_press_down(self): 171*8837469aSBenjamin Tissoires """check for the right joystick reliability""" 172*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (127, 191)) 173*8837469aSBenjamin Tissoires self._test_joystick_press("right_stick", (None, 255)) 174*8837469aSBenjamin Tissoires 175*8837469aSBenjamin Tissoires @pytest.mark.skip_if_uhdev( 176*8837469aSBenjamin Tissoires lambda uhdev: "Hat switch" not in uhdev.fields, 177*8837469aSBenjamin Tissoires "Device not compatible, missing Hat switch usage", 178*8837469aSBenjamin Tissoires ) 179*8837469aSBenjamin Tissoires @pytest.mark.parametrize( 180*8837469aSBenjamin Tissoires "hat_value,expected_evdev,evdev_value", 181*8837469aSBenjamin Tissoires [ 182*8837469aSBenjamin Tissoires (0, "ABS_HAT0Y", -1), 183*8837469aSBenjamin Tissoires (2, "ABS_HAT0X", 1), 184*8837469aSBenjamin Tissoires (4, "ABS_HAT0Y", 1), 185*8837469aSBenjamin Tissoires (6, "ABS_HAT0X", -1), 186*8837469aSBenjamin Tissoires ], 187*8837469aSBenjamin Tissoires ) 188*8837469aSBenjamin Tissoires def test_hat_switch(self, hat_value, expected_evdev, evdev_value): 189*8837469aSBenjamin Tissoires uhdev = self.uhdev 190*8837469aSBenjamin Tissoires 191*8837469aSBenjamin Tissoires r = uhdev.event(hat_switch=hat_value) 192*8837469aSBenjamin Tissoires events = uhdev.next_sync_events() 193*8837469aSBenjamin Tissoires self.debug_reports(r, uhdev, events) 194*8837469aSBenjamin Tissoires assert ( 195*8837469aSBenjamin Tissoires libevdev.InputEvent( 196*8837469aSBenjamin Tissoires libevdev.evbit("EV_ABS", expected_evdev), evdev_value 197*8837469aSBenjamin Tissoires ) 198*8837469aSBenjamin Tissoires in events 199*8837469aSBenjamin Tissoires ) 200*8837469aSBenjamin Tissoires 201*8837469aSBenjamin Tissoires 202*8837469aSBenjamin Tissoiresclass TestSaitekGamepad(BaseTest.TestGamepad): 203*8837469aSBenjamin Tissoires def create_device(self): 204*8837469aSBenjamin Tissoires return SaitekGamepad() 205*8837469aSBenjamin Tissoires 206*8837469aSBenjamin Tissoires 207*8837469aSBenjamin Tissoiresclass TestAsusGamepad(BaseTest.TestGamepad): 208*8837469aSBenjamin Tissoires def create_device(self): 209*8837469aSBenjamin Tissoires return AsusGamepad() 210