162306a36Sopenharmony_ci#!/bin/env python3 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci# -*- coding: utf-8 -*- 462306a36Sopenharmony_ci# 562306a36Sopenharmony_ci# Copyright (c) 2020 Benjamin Tissoires <benjamin.tissoires@gmail.com> 662306a36Sopenharmony_ci# Copyright (c) 2020 Red Hat, Inc. 762306a36Sopenharmony_ci# 862306a36Sopenharmony_ci 962306a36Sopenharmony_cifrom .base import application_matches 1062306a36Sopenharmony_cifrom .test_gamepad import BaseTest 1162306a36Sopenharmony_cifrom hidtools.device.sony_gamepad import ( 1262306a36Sopenharmony_ci PS3Controller, 1362306a36Sopenharmony_ci PS4ControllerBluetooth, 1462306a36Sopenharmony_ci PS4ControllerUSB, 1562306a36Sopenharmony_ci PS5ControllerBluetooth, 1662306a36Sopenharmony_ci PS5ControllerUSB, 1762306a36Sopenharmony_ci PSTouchPoint, 1862306a36Sopenharmony_ci) 1962306a36Sopenharmony_cifrom hidtools.util import BusType 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciimport libevdev 2262306a36Sopenharmony_ciimport logging 2362306a36Sopenharmony_ciimport pytest 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cilogger = logging.getLogger("hidtools.test.sony") 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciPS3_MODULE = ("sony", "hid_sony") 2862306a36Sopenharmony_ciPS4_MODULE = ("playstation", "hid_playstation") 2962306a36Sopenharmony_ciPS5_MODULE = ("playstation", "hid_playstation") 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciclass SonyBaseTest: 3362306a36Sopenharmony_ci class SonyTest(BaseTest.TestGamepad): 3462306a36Sopenharmony_ci pass 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci class SonyPS4ControllerTest(SonyTest): 3762306a36Sopenharmony_ci kernel_modules = [PS4_MODULE] 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci def test_accelerometer(self): 4062306a36Sopenharmony_ci uhdev = self.uhdev 4162306a36Sopenharmony_ci evdev = uhdev.get_evdev("Accelerometer") 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci for x in range(-32000, 32000, 4000): 4462306a36Sopenharmony_ci r = uhdev.event(accel=(x, None, None)) 4562306a36Sopenharmony_ci events = uhdev.next_sync_events("Accelerometer") 4662306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_X) in events 4962306a36Sopenharmony_ci value = evdev.value[libevdev.EV_ABS.ABS_X] 5062306a36Sopenharmony_ci # Check against range due to small loss in precision due 5162306a36Sopenharmony_ci # to inverse calibration, followed by calibration by hid-sony. 5262306a36Sopenharmony_ci assert x - 1 <= value <= x + 1 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci for y in range(-32000, 32000, 4000): 5562306a36Sopenharmony_ci r = uhdev.event(accel=(None, y, None)) 5662306a36Sopenharmony_ci events = uhdev.next_sync_events("Accelerometer") 5762306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_Y) in events 6062306a36Sopenharmony_ci value = evdev.value[libevdev.EV_ABS.ABS_Y] 6162306a36Sopenharmony_ci assert y - 1 <= value <= y + 1 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci for z in range(-32000, 32000, 4000): 6462306a36Sopenharmony_ci r = uhdev.event(accel=(None, None, z)) 6562306a36Sopenharmony_ci events = uhdev.next_sync_events("Accelerometer") 6662306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_Z) in events 6962306a36Sopenharmony_ci value = evdev.value[libevdev.EV_ABS.ABS_Z] 7062306a36Sopenharmony_ci assert z - 1 <= value <= z + 1 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci def test_gyroscope(self): 7362306a36Sopenharmony_ci uhdev = self.uhdev 7462306a36Sopenharmony_ci evdev = uhdev.get_evdev("Accelerometer") 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci for rx in range(-2000000, 2000000, 200000): 7762306a36Sopenharmony_ci r = uhdev.event(gyro=(rx, None, None)) 7862306a36Sopenharmony_ci events = uhdev.next_sync_events("Accelerometer") 7962306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_RX) in events 8262306a36Sopenharmony_ci value = evdev.value[libevdev.EV_ABS.ABS_RX] 8362306a36Sopenharmony_ci # Sensor internal value is 16-bit, but calibrated is 22-bit, so 8462306a36Sopenharmony_ci # 6-bit (64) difference, so allow a range of +/- 64. 8562306a36Sopenharmony_ci assert rx - 64 <= value <= rx + 64 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci for ry in range(-2000000, 2000000, 200000): 8862306a36Sopenharmony_ci r = uhdev.event(gyro=(None, ry, None)) 8962306a36Sopenharmony_ci events = uhdev.next_sync_events("Accelerometer") 9062306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_RY) in events 9362306a36Sopenharmony_ci value = evdev.value[libevdev.EV_ABS.ABS_RY] 9462306a36Sopenharmony_ci assert ry - 64 <= value <= ry + 64 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci for rz in range(-2000000, 2000000, 200000): 9762306a36Sopenharmony_ci r = uhdev.event(gyro=(None, None, rz)) 9862306a36Sopenharmony_ci events = uhdev.next_sync_events("Accelerometer") 9962306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_RZ) in events 10262306a36Sopenharmony_ci value = evdev.value[libevdev.EV_ABS.ABS_RZ] 10362306a36Sopenharmony_ci assert rz - 64 <= value <= rz + 64 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci def test_battery(self): 10662306a36Sopenharmony_ci uhdev = self.uhdev 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci assert uhdev.power_supply_class is not None 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci # DS4 capacity levels are in increments of 10. 11162306a36Sopenharmony_ci # Battery is never below 5%. 11262306a36Sopenharmony_ci for i in range(5, 105, 10): 11362306a36Sopenharmony_ci uhdev.battery.capacity = i 11462306a36Sopenharmony_ci uhdev.event() 11562306a36Sopenharmony_ci assert uhdev.power_supply_class.capacity == i 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci # Discharging tests only make sense for BlueTooth. 11862306a36Sopenharmony_ci if uhdev.bus == BusType.BLUETOOTH: 11962306a36Sopenharmony_ci uhdev.battery.cable_connected = False 12062306a36Sopenharmony_ci uhdev.battery.capacity = 45 12162306a36Sopenharmony_ci uhdev.event() 12262306a36Sopenharmony_ci assert uhdev.power_supply_class.status == "Discharging" 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci uhdev.battery.cable_connected = True 12562306a36Sopenharmony_ci uhdev.battery.capacity = 5 12662306a36Sopenharmony_ci uhdev.event() 12762306a36Sopenharmony_ci assert uhdev.power_supply_class.status == "Charging" 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci uhdev.battery.capacity = 100 13062306a36Sopenharmony_ci uhdev.event() 13162306a36Sopenharmony_ci assert uhdev.power_supply_class.status == "Charging" 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci uhdev.battery.full = True 13462306a36Sopenharmony_ci uhdev.event() 13562306a36Sopenharmony_ci assert uhdev.power_supply_class.status == "Full" 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci def test_mt_single_touch(self): 13862306a36Sopenharmony_ci """send a single touch in the first slot of the device, 13962306a36Sopenharmony_ci and release it.""" 14062306a36Sopenharmony_ci uhdev = self.uhdev 14162306a36Sopenharmony_ci evdev = uhdev.get_evdev("Touch Pad") 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci t0 = PSTouchPoint(1, 50, 100) 14462306a36Sopenharmony_ci r = uhdev.event(touch=[t0]) 14562306a36Sopenharmony_ci events = uhdev.next_sync_events("Touch Pad") 14662306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events 14962306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0 15062306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50 15162306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci t0.tipswitch = False 15462306a36Sopenharmony_ci r = uhdev.event(touch=[t0]) 15562306a36Sopenharmony_ci events = uhdev.next_sync_events("Touch Pad") 15662306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 15762306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events 15862306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci def test_mt_dual_touch(self): 16162306a36Sopenharmony_ci """Send 2 touches in the first 2 slots. 16262306a36Sopenharmony_ci Make sure the kernel sees this as a dual touch. 16362306a36Sopenharmony_ci Release and check 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci Note: PTP will send here BTN_DOUBLETAP emulation""" 16662306a36Sopenharmony_ci uhdev = self.uhdev 16762306a36Sopenharmony_ci evdev = uhdev.get_evdev("Touch Pad") 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci t0 = PSTouchPoint(1, 50, 100) 17062306a36Sopenharmony_ci t1 = PSTouchPoint(2, 150, 200) 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci r = uhdev.event(touch=[t0]) 17362306a36Sopenharmony_ci events = uhdev.next_sync_events("Touch Pad") 17462306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events 17762306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1 17862306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0 17962306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50 18062306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100 18162306a36Sopenharmony_ci assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci r = uhdev.event(touch=[t0, t1]) 18462306a36Sopenharmony_ci events = uhdev.next_sync_events("Touch Pad") 18562306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 18662306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH) not in events 18762306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.BTN_TOUCH] == 1 18862306a36Sopenharmony_ci assert ( 18962306a36Sopenharmony_ci libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_X, 5) not in events 19062306a36Sopenharmony_ci ) 19162306a36Sopenharmony_ci assert ( 19262306a36Sopenharmony_ci libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_Y, 10) not in events 19362306a36Sopenharmony_ci ) 19462306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0 19562306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50 19662306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100 19762306a36Sopenharmony_ci assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1 19862306a36Sopenharmony_ci assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_POSITION_X] == 150 19962306a36Sopenharmony_ci assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 200 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci t0.tipswitch = False 20262306a36Sopenharmony_ci r = uhdev.event(touch=[t0, t1]) 20362306a36Sopenharmony_ci events = uhdev.next_sync_events("Touch Pad") 20462306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 20562306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1 20662306a36Sopenharmony_ci assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 1 20762306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_X) not in events 20862306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_POSITION_Y) not in events 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci t1.tipswitch = False 21162306a36Sopenharmony_ci r = uhdev.event(touch=[t1]) 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci events = uhdev.next_sync_events("Touch Pad") 21462306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 21562306a36Sopenharmony_ci assert evdev.slots[0][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1 21662306a36Sopenharmony_ci assert evdev.slots[1][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ciclass TestPS3Controller(SonyBaseTest.SonyTest): 22062306a36Sopenharmony_ci kernel_modules = [PS3_MODULE] 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci def create_device(self): 22362306a36Sopenharmony_ci controller = PS3Controller() 22462306a36Sopenharmony_ci controller.application_matches = application_matches 22562306a36Sopenharmony_ci return controller 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci @pytest.fixture(autouse=True) 22862306a36Sopenharmony_ci def start_controller(self): 22962306a36Sopenharmony_ci # emulate a 'PS' button press to tell the kernel we are ready to accept events 23062306a36Sopenharmony_ci self.assert_button(17) 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci # drain any remaining udev events 23362306a36Sopenharmony_ci while self.uhdev.dispatch(10): 23462306a36Sopenharmony_ci pass 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci def test_led(self): 23762306a36Sopenharmony_ci for k, v in self.uhdev.led_classes.items(): 23862306a36Sopenharmony_ci # the kernel might have set a LED for us 23962306a36Sopenharmony_ci logger.info(f"{k}: {v.brightness}") 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci idx = int(k[-1]) - 1 24262306a36Sopenharmony_ci assert self.uhdev.hw_leds.get_led(idx)[0] == bool(v.brightness) 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci v.brightness = 0 24562306a36Sopenharmony_ci self.uhdev.dispatch(10) 24662306a36Sopenharmony_ci assert self.uhdev.hw_leds.get_led(idx)[0] is False 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci v.brightness = v.max_brightness 24962306a36Sopenharmony_ci self.uhdev.dispatch(10) 25062306a36Sopenharmony_ci assert self.uhdev.hw_leds.get_led(idx)[0] 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ciclass CalibratedPS4Controller(object): 25462306a36Sopenharmony_ci # DS4 reports uncalibrated sensor data. Calibration coefficients 25562306a36Sopenharmony_ci # can be retrieved using a feature report (0x2 USB / 0x5 BT). 25662306a36Sopenharmony_ci # The values below are the processed calibration values for the 25762306a36Sopenharmony_ci # DS4s matching the feature reports of PS4ControllerBluetooth/USB 25862306a36Sopenharmony_ci # as dumped from hid-sony 'ds4_get_calibration_data'. 25962306a36Sopenharmony_ci # 26062306a36Sopenharmony_ci # Note we duplicate those values here in case the kernel changes them 26162306a36Sopenharmony_ci # so we can have tests passing even if hid-tools doesn't have the 26262306a36Sopenharmony_ci # correct values. 26362306a36Sopenharmony_ci accelerometer_calibration_data = { 26462306a36Sopenharmony_ci "x": {"bias": -73, "numer": 16384, "denom": 16472}, 26562306a36Sopenharmony_ci "y": {"bias": -352, "numer": 16384, "denom": 16344}, 26662306a36Sopenharmony_ci "z": {"bias": 81, "numer": 16384, "denom": 16319}, 26762306a36Sopenharmony_ci } 26862306a36Sopenharmony_ci gyroscope_calibration_data = { 26962306a36Sopenharmony_ci "x": {"bias": 0, "numer": 1105920, "denom": 17827}, 27062306a36Sopenharmony_ci "y": {"bias": 0, "numer": 1105920, "denom": 17777}, 27162306a36Sopenharmony_ci "z": {"bias": 0, "numer": 1105920, "denom": 17748}, 27262306a36Sopenharmony_ci } 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ciclass CalibratedPS4ControllerBluetooth(CalibratedPS4Controller, PS4ControllerBluetooth): 27662306a36Sopenharmony_ci pass 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ciclass TestPS4ControllerBluetooth(SonyBaseTest.SonyPS4ControllerTest): 28062306a36Sopenharmony_ci def create_device(self): 28162306a36Sopenharmony_ci controller = CalibratedPS4ControllerBluetooth() 28262306a36Sopenharmony_ci controller.application_matches = application_matches 28362306a36Sopenharmony_ci return controller 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ciclass CalibratedPS4ControllerUSB(CalibratedPS4Controller, PS4ControllerUSB): 28762306a36Sopenharmony_ci pass 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ciclass TestPS4ControllerUSB(SonyBaseTest.SonyPS4ControllerTest): 29162306a36Sopenharmony_ci def create_device(self): 29262306a36Sopenharmony_ci controller = CalibratedPS4ControllerUSB() 29362306a36Sopenharmony_ci controller.application_matches = application_matches 29462306a36Sopenharmony_ci return controller 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ciclass CalibratedPS5Controller(object): 29862306a36Sopenharmony_ci # DualSense reports uncalibrated sensor data. Calibration coefficients 29962306a36Sopenharmony_ci # can be retrieved using feature report 0x09. 30062306a36Sopenharmony_ci # The values below are the processed calibration values for the 30162306a36Sopenharmony_ci # DualSene matching the feature reports of PS5ControllerBluetooth/USB 30262306a36Sopenharmony_ci # as dumped from hid-playstation 'dualsense_get_calibration_data'. 30362306a36Sopenharmony_ci # 30462306a36Sopenharmony_ci # Note we duplicate those values here in case the kernel changes them 30562306a36Sopenharmony_ci # so we can have tests passing even if hid-tools doesn't have the 30662306a36Sopenharmony_ci # correct values. 30762306a36Sopenharmony_ci accelerometer_calibration_data = { 30862306a36Sopenharmony_ci "x": {"bias": 0, "numer": 16384, "denom": 16374}, 30962306a36Sopenharmony_ci "y": {"bias": -114, "numer": 16384, "denom": 16362}, 31062306a36Sopenharmony_ci "z": {"bias": 2, "numer": 16384, "denom": 16395}, 31162306a36Sopenharmony_ci } 31262306a36Sopenharmony_ci gyroscope_calibration_data = { 31362306a36Sopenharmony_ci "x": {"bias": 0, "numer": 1105920, "denom": 17727}, 31462306a36Sopenharmony_ci "y": {"bias": 0, "numer": 1105920, "denom": 17728}, 31562306a36Sopenharmony_ci "z": {"bias": 0, "numer": 1105920, "denom": 17769}, 31662306a36Sopenharmony_ci } 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ciclass CalibratedPS5ControllerBluetooth(CalibratedPS5Controller, PS5ControllerBluetooth): 32062306a36Sopenharmony_ci pass 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ciclass TestPS5ControllerBluetooth(SonyBaseTest.SonyPS4ControllerTest): 32462306a36Sopenharmony_ci kernel_modules = [PS5_MODULE] 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci def create_device(self): 32762306a36Sopenharmony_ci controller = CalibratedPS5ControllerBluetooth() 32862306a36Sopenharmony_ci controller.application_matches = application_matches 32962306a36Sopenharmony_ci return controller 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ciclass CalibratedPS5ControllerUSB(CalibratedPS5Controller, PS5ControllerUSB): 33362306a36Sopenharmony_ci pass 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ciclass TestPS5ControllerUSB(SonyBaseTest.SonyPS4ControllerTest): 33762306a36Sopenharmony_ci kernel_modules = [PS5_MODULE] 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci def create_device(self): 34062306a36Sopenharmony_ci controller = CalibratedPS5ControllerUSB() 34162306a36Sopenharmony_ci controller.application_matches = application_matches 34262306a36Sopenharmony_ci return controller 343