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