diff mbox series

selftests: hid: Add touch tests for Wacom devices

Message ID 20230511194754.129571-1-Joshua@Joshua-Dickens.com
State Accepted
Commit 4c2216728f688da3c4478fec23be9bd820824664
Headers show
Series selftests: hid: Add touch tests for Wacom devices | expand

Commit Message

Joshua Dickens May 11, 2023, 7:47 p.m. UTC
Adding a wacom touch device to use the test_multitouch tests.
Adding a 2 additional tests.
 - A test to check if a touch event is sent when the contact_id of the event is 0.
 - A test to check if a touch event is not sent when confidence is set to 0.

Signed-off-by: Joshua Dickens <joshua.dickens@wacom.com>
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
---
 .../selftests/hid/tests/test_wacom_generic.py | 84 ++++++++++++++++++-
 1 file changed, 81 insertions(+), 3 deletions(-)

Comments

Ping Cheng June 7, 2023, 5:43 p.m. UTC | #1
Hi maintainers,

Can one of you review the patch and let us know if there is anything
we need to change/update?

Thank you for your effort,
Ping

On Thu, May 11, 2023 at 12:48 PM Joshua Dickens
<joshua@joshua-dickens.com> wrote:
>
> Adding a wacom touch device to use the test_multitouch tests.
> Adding a 2 additional tests.
>  - A test to check if a touch event is sent when the contact_id of the event is 0.
>  - A test to check if a touch event is not sent when confidence is set to 0.
>
> Signed-off-by: Joshua Dickens <joshua.dickens@wacom.com>
> Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
> ---
>  .../selftests/hid/tests/test_wacom_generic.py | 84 ++++++++++++++++++-
>  1 file changed, 81 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/hid/tests/test_wacom_generic.py b/tools/testing/selftests/hid/tests/test_wacom_generic.py
> index b1eb2bc787fc..f92fe8e02c1b 100644
> --- a/tools/testing/selftests/hid/tests/test_wacom_generic.py
> +++ b/tools/testing/selftests/hid/tests/test_wacom_generic.py
> @@ -31,6 +31,7 @@ from enum import Enum
>  from hidtools.hut import HUT
>  from hidtools.hid import HidUnit
>  from . import base
> +from . import test_multitouch
>  import libevdev
>  import pytest
>
> @@ -517,7 +518,7 @@ class BaseTest:
>                  for usage in get_report_usages(report):
>                      yield usage
>
> -        def assertName(self, uhdev):
> +        def assertName(self, uhdev, type):
>              """
>              Assert that the name is as we expect.
>
> @@ -526,7 +527,7 @@ class BaseTest:
>              this assertion from the base class to work properly.
>              """
>              evdev = uhdev.get_evdev()
> -            expected_name = uhdev.name + " Pen"
> +            expected_name = uhdev.name + type
>              if "wacom" not in expected_name.lower():
>                  expected_name = "Wacom " + expected_name
>              assert evdev.name == expected_name
> @@ -549,6 +550,12 @@ class BaseTest:
>                  usage_id("Generic Desktop", "Y"): PhysRange(
>                      PhysRange.CENTIMETER, 5, 150
>                  ),
> +                usage_id("Digitizers", "Width"): PhysRange(
> +                    PhysRange.CENTIMETER, 5, 150
> +                ),
> +                usage_id("Digitizers", "Height"): PhysRange(
> +                    PhysRange.CENTIMETER, 5, 150
> +                ),
>                  usage_id("Digitizers", "X Tilt"): PhysRange(PhysRange.DEGREE, 90, 180),
>                  usage_id("Digitizers", "Y Tilt"): PhysRange(PhysRange.DEGREE, 90, 180),
>                  usage_id("Digitizers", "Twist"): PhysRange(PhysRange.DEGREE, 358, 360),
> @@ -603,7 +610,17 @@ class BaseTest:
>              pass
>
>
> -class TestOpaqueTablet(BaseTest.TestTablet):
> +class PenTabletTest(BaseTest.TestTablet):
> +    def assertName(self, uhdev):
> +        super().assertName(uhdev, " Pen")
> +
> +
> +class TouchTabletTest(BaseTest.TestTablet):
> +    def assertName(self, uhdev):
> +        super().assertName(uhdev, " Finger")
> +
> +
> +class TestOpaqueTablet(PenTabletTest):
>      def create_device(self):
>          return OpaqueTablet()
>
> @@ -842,3 +859,64 @@ class TestPTHX60_Pen(TestOpaqueCTLTablet):
>                  libevdev.InputEvent(libevdev.EV_KEY.BTN_0, 0),
>              ],
>          )
> +
> +
> +class TestDTH2452Tablet(test_multitouch.BaseTest.TestMultitouch, TouchTabletTest):
> +    def create_device(self):
> +        return test_multitouch.Digitizer(
> +            "DTH 2452",
> +            rdesc="05 0d 09 04 a1 01 85 0c 95 01 75 08 15 00 26 ff 00 81 03 09 54 81 02 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 27 ff ff 00 00 75 10 95 01 09 56 81 02 75 08 95 0e 81 03 09 55 26 ff 00 75 08 b1 02 85 0a 06 00 ff 09 c5 96 00 01 b1 02 c0 06 00 ff 09 01 a1 01 09 01 85 13 15 00 26 ff 00 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0",
> +            input_info=(0x3, 0x056A, 0x0383),
> +        )
> +
> +    def test_contact_id_0(self):
> +        """
> +        Bring a finger in contact with the tablet, then hold it down and remove it.
> +
> +        Ensure that even with contact ID = 0 which is usually given as an invalid
> +        touch event by most tablets with the exception of a few, that given the
> +        confidence bit is set to 1 it should process it as a valid touch to cover
> +        the few tablets using contact ID = 0 as a valid touch value.
> +        """
> +        uhdev = self.uhdev
> +        evdev = uhdev.get_evdev()
> +
> +        t0 = test_multitouch.Touch(0, 50, 100)
> +        r = uhdev.event([t0])
> +        events = uhdev.next_sync_events()
> +        self.debug_reports(r, uhdev, events)
> +
> +        slot = self.get_slot(uhdev, t0, 0)
> +
> +        assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
> +        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
> +        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
> +        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
> +
> +        t0.tipswitch = False
> +        if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
> +            t0.inrange = False
> +        r = uhdev.event([t0])
> +        events = uhdev.next_sync_events()
> +        self.debug_reports(r, uhdev, events)
> +        assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
> +        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
> +
> +    def test_confidence_false(self):
> +        """
> +        Bring a finger in contact with the tablet with confidence set to false.
> +
> +        Ensure that the confidence bit being set to false should not result in a touch event.
> +        """
> +        uhdev = self.uhdev
> +        evdev = uhdev.get_evdev()
> +
> +        t0 = test_multitouch.Touch(1, 50, 100)
> +        t0.confidence = False
> +        r = uhdev.event([t0])
> +        events = uhdev.next_sync_events()
> +        self.debug_reports(r, uhdev, events)
> +
> +        slot = self.get_slot(uhdev, t0, 0)
> +
> +        assert not events
> \ No newline at end of file
> --
> 2.40.0
>
Jiri Kosina June 8, 2023, 1:56 p.m. UTC | #2
On Thu, 11 May 2023, Joshua Dickens wrote:

> Adding a wacom touch device to use the test_multitouch tests.
> Adding a 2 additional tests.
>  - A test to check if a touch event is sent when the contact_id of the event is 0.
>  - A test to check if a touch event is not sent when confidence is set to 0.
> 
> Signed-off-by: Joshua Dickens <joshua.dickens@wacom.com>
> Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>

Applied, sorry for the delay.
diff mbox series

Patch

diff --git a/tools/testing/selftests/hid/tests/test_wacom_generic.py b/tools/testing/selftests/hid/tests/test_wacom_generic.py
index b1eb2bc787fc..f92fe8e02c1b 100644
--- a/tools/testing/selftests/hid/tests/test_wacom_generic.py
+++ b/tools/testing/selftests/hid/tests/test_wacom_generic.py
@@ -31,6 +31,7 @@  from enum import Enum
 from hidtools.hut import HUT
 from hidtools.hid import HidUnit
 from . import base
+from . import test_multitouch
 import libevdev
 import pytest
 
@@ -517,7 +518,7 @@  class BaseTest:
                 for usage in get_report_usages(report):
                     yield usage
 
-        def assertName(self, uhdev):
+        def assertName(self, uhdev, type):
             """
             Assert that the name is as we expect.
 
@@ -526,7 +527,7 @@  class BaseTest:
             this assertion from the base class to work properly.
             """
             evdev = uhdev.get_evdev()
-            expected_name = uhdev.name + " Pen"
+            expected_name = uhdev.name + type
             if "wacom" not in expected_name.lower():
                 expected_name = "Wacom " + expected_name
             assert evdev.name == expected_name
@@ -549,6 +550,12 @@  class BaseTest:
                 usage_id("Generic Desktop", "Y"): PhysRange(
                     PhysRange.CENTIMETER, 5, 150
                 ),
+                usage_id("Digitizers", "Width"): PhysRange(
+                    PhysRange.CENTIMETER, 5, 150
+                ),
+                usage_id("Digitizers", "Height"): PhysRange(
+                    PhysRange.CENTIMETER, 5, 150
+                ),
                 usage_id("Digitizers", "X Tilt"): PhysRange(PhysRange.DEGREE, 90, 180),
                 usage_id("Digitizers", "Y Tilt"): PhysRange(PhysRange.DEGREE, 90, 180),
                 usage_id("Digitizers", "Twist"): PhysRange(PhysRange.DEGREE, 358, 360),
@@ -603,7 +610,17 @@  class BaseTest:
             pass
 
 
-class TestOpaqueTablet(BaseTest.TestTablet):
+class PenTabletTest(BaseTest.TestTablet):
+    def assertName(self, uhdev):
+        super().assertName(uhdev, " Pen")
+
+
+class TouchTabletTest(BaseTest.TestTablet):
+    def assertName(self, uhdev):
+        super().assertName(uhdev, " Finger")
+
+
+class TestOpaqueTablet(PenTabletTest):
     def create_device(self):
         return OpaqueTablet()
 
@@ -842,3 +859,64 @@  class TestPTHX60_Pen(TestOpaqueCTLTablet):
                 libevdev.InputEvent(libevdev.EV_KEY.BTN_0, 0),
             ],
         )
+
+
+class TestDTH2452Tablet(test_multitouch.BaseTest.TestMultitouch, TouchTabletTest):
+    def create_device(self):
+        return test_multitouch.Digitizer(
+            "DTH 2452",
+            rdesc="05 0d 09 04 a1 01 85 0c 95 01 75 08 15 00 26 ff 00 81 03 09 54 81 02 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 09 22 a1 02 05 0d 95 01 75 01 25 01 09 42 81 02 81 03 09 47 81 02 95 05 81 03 09 51 26 ff 00 75 10 95 01 81 02 35 00 65 11 55 0e 05 01 09 30 26 a0 44 46 96 14 81 42 09 31 26 9a 26 46 95 0b 81 42 05 0d 75 08 95 01 15 00 09 48 26 5f 00 46 7c 14 81 02 09 49 25 35 46 7d 0b 81 02 45 00 65 00 55 00 c0 05 0d 27 ff ff 00 00 75 10 95 01 09 56 81 02 75 08 95 0e 81 03 09 55 26 ff 00 75 08 b1 02 85 0a 06 00 ff 09 c5 96 00 01 b1 02 c0 06 00 ff 09 01 a1 01 09 01 85 13 15 00 26 ff 00 75 08 95 3f 81 02 06 00 ff 09 01 15 00 26 ff 00 75 08 95 3f 91 02 c0",
+            input_info=(0x3, 0x056A, 0x0383),
+        )
+
+    def test_contact_id_0(self):
+        """
+        Bring a finger in contact with the tablet, then hold it down and remove it.
+
+        Ensure that even with contact ID = 0 which is usually given as an invalid
+        touch event by most tablets with the exception of a few, that given the
+        confidence bit is set to 1 it should process it as a valid touch to cover
+        the few tablets using contact ID = 0 as a valid touch value.
+        """
+        uhdev = self.uhdev
+        evdev = uhdev.get_evdev()
+
+        t0 = test_multitouch.Touch(0, 50, 100)
+        r = uhdev.event([t0])
+        events = uhdev.next_sync_events()
+        self.debug_reports(r, uhdev, events)
+
+        slot = self.get_slot(uhdev, t0, 0)
+
+        assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 1) in events
+        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == 0
+        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_X] == 50
+        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_POSITION_Y] == 100
+
+        t0.tipswitch = False
+        if uhdev.quirks is None or "VALID_IS_INRANGE" not in uhdev.quirks:
+            t0.inrange = False
+        r = uhdev.event([t0])
+        events = uhdev.next_sync_events()
+        self.debug_reports(r, uhdev, events)
+        assert libevdev.InputEvent(libevdev.EV_KEY.BTN_TOUCH, 0) in events
+        assert evdev.slots[slot][libevdev.EV_ABS.ABS_MT_TRACKING_ID] == -1
+
+    def test_confidence_false(self):
+        """
+        Bring a finger in contact with the tablet with confidence set to false.
+
+        Ensure that the confidence bit being set to false should not result in a touch event.
+        """
+        uhdev = self.uhdev
+        evdev = uhdev.get_evdev()
+
+        t0 = test_multitouch.Touch(1, 50, 100)
+        t0.confidence = False
+        r = uhdev.event([t0])
+        events = uhdev.next_sync_events()
+        self.debug_reports(r, uhdev, events)
+
+        slot = self.get_slot(uhdev, t0, 0)
+
+        assert not events
\ No newline at end of file