162306a36Sopenharmony_ci#!/bin/env python3 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci# -*- coding: utf-8 -*- 462306a36Sopenharmony_ci# 562306a36Sopenharmony_ci# Copyright (c) 2018 Benjamin Tissoires <benjamin.tissoires@gmail.com> 662306a36Sopenharmony_ci# Copyright (c) 2018 Red Hat, Inc. 762306a36Sopenharmony_ci# 862306a36Sopenharmony_ci 962306a36Sopenharmony_cifrom . import base 1062306a36Sopenharmony_ciimport hidtools.hid 1162306a36Sopenharmony_ciimport libevdev 1262306a36Sopenharmony_ciimport logging 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cilogger = logging.getLogger("hidtools.test.keyboard") 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciclass InvalidHIDCommunication(Exception): 1862306a36Sopenharmony_ci pass 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciclass KeyboardData(object): 2262306a36Sopenharmony_ci pass 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciclass BaseKeyboard(base.UHIDTestDevice): 2662306a36Sopenharmony_ci def __init__(self, rdesc, name=None, input_info=None): 2762306a36Sopenharmony_ci assert rdesc is not None 2862306a36Sopenharmony_ci super().__init__(name, "Key", input_info=input_info, rdesc=rdesc) 2962306a36Sopenharmony_ci self.keystates = {} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci def _update_key_state(self, keys): 3262306a36Sopenharmony_ci """ 3362306a36Sopenharmony_ci Update the internal state of keys with the new state given. 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci :param key: a tuple of chars for the currently pressed keys. 3662306a36Sopenharmony_ci """ 3762306a36Sopenharmony_ci # First remove the already released keys 3862306a36Sopenharmony_ci unused_keys = [k for k, v in self.keystates.items() if not v] 3962306a36Sopenharmony_ci for key in unused_keys: 4062306a36Sopenharmony_ci del self.keystates[key] 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci # self.keystates contains now the list of currently pressed keys, 4362306a36Sopenharmony_ci # release them... 4462306a36Sopenharmony_ci for key in self.keystates.keys(): 4562306a36Sopenharmony_ci self.keystates[key] = False 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci # ...and press those that are in parameter 4862306a36Sopenharmony_ci for key in keys: 4962306a36Sopenharmony_ci self.keystates[key] = True 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci def _create_report_data(self): 5262306a36Sopenharmony_ci keyboard = KeyboardData() 5362306a36Sopenharmony_ci for key, value in self.keystates.items(): 5462306a36Sopenharmony_ci key = key.replace(" ", "").lower() 5562306a36Sopenharmony_ci setattr(keyboard, key, value) 5662306a36Sopenharmony_ci return keyboard 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci def create_array_report(self, keys, reportID=None, application=None): 5962306a36Sopenharmony_ci """ 6062306a36Sopenharmony_ci Return an input report for this device. 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci :param keys: a tuple of chars for the pressed keys. The class maintains 6362306a36Sopenharmony_ci the list of currently pressed keys, so to release a key, the caller 6462306a36Sopenharmony_ci needs to call again this function without the key in this tuple. 6562306a36Sopenharmony_ci :param reportID: the numeric report ID for this report, if needed 6662306a36Sopenharmony_ci """ 6762306a36Sopenharmony_ci self._update_key_state(keys) 6862306a36Sopenharmony_ci reportID = reportID or self.default_reportID 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci keyboard = self._create_report_data() 7162306a36Sopenharmony_ci return self.create_report(keyboard, reportID=reportID, application=application) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci def event(self, keys, reportID=None, application=None): 7462306a36Sopenharmony_ci """ 7562306a36Sopenharmony_ci Send an input event on the default report ID. 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci :param keys: a tuple of chars for the pressed keys. The class maintains 7862306a36Sopenharmony_ci the list of currently pressed keys, so to release a key, the caller 7962306a36Sopenharmony_ci needs to call again this function without the key in this tuple. 8062306a36Sopenharmony_ci """ 8162306a36Sopenharmony_ci r = self.create_array_report(keys, reportID, application) 8262306a36Sopenharmony_ci self.call_input_event(r) 8362306a36Sopenharmony_ci return [r] 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciclass PlainKeyboard(BaseKeyboard): 8762306a36Sopenharmony_ci # fmt: off 8862306a36Sopenharmony_ci report_descriptor = [ 8962306a36Sopenharmony_ci 0x05, 0x01, # Usage Page (Generic Desktop) 9062306a36Sopenharmony_ci 0x09, 0x06, # Usage (Keyboard) 9162306a36Sopenharmony_ci 0xa1, 0x01, # Collection (Application) 9262306a36Sopenharmony_ci 0x85, 0x01, # .Report ID (1) 9362306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 9462306a36Sopenharmony_ci 0x19, 0xe0, # .Usage Minimum (224) 9562306a36Sopenharmony_ci 0x29, 0xe7, # .Usage Maximum (231) 9662306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 9762306a36Sopenharmony_ci 0x25, 0x01, # .Logical Maximum (1) 9862306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 9962306a36Sopenharmony_ci 0x95, 0x08, # .Report Count (8) 10062306a36Sopenharmony_ci 0x81, 0x02, # .Input (Data,Var,Abs) 10162306a36Sopenharmony_ci 0x19, 0x00, # .Usage Minimum (0) 10262306a36Sopenharmony_ci 0x29, 0x97, # .Usage Maximum (151) 10362306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 10462306a36Sopenharmony_ci 0x25, 0x01, # .Logical Maximum (1) 10562306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 10662306a36Sopenharmony_ci 0x95, 0x98, # .Report Count (152) 10762306a36Sopenharmony_ci 0x81, 0x02, # .Input (Data,Var,Abs) 10862306a36Sopenharmony_ci 0xc0, # End Collection 10962306a36Sopenharmony_ci ] 11062306a36Sopenharmony_ci # fmt: on 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci def __init__(self, rdesc=report_descriptor, name=None, input_info=None): 11362306a36Sopenharmony_ci super().__init__(rdesc, name, input_info) 11462306a36Sopenharmony_ci self.default_reportID = 1 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ciclass ArrayKeyboard(BaseKeyboard): 11862306a36Sopenharmony_ci # fmt: off 11962306a36Sopenharmony_ci report_descriptor = [ 12062306a36Sopenharmony_ci 0x05, 0x01, # Usage Page (Generic Desktop) 12162306a36Sopenharmony_ci 0x09, 0x06, # Usage (Keyboard) 12262306a36Sopenharmony_ci 0xa1, 0x01, # Collection (Application) 12362306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 12462306a36Sopenharmony_ci 0x19, 0xe0, # .Usage Minimum (224) 12562306a36Sopenharmony_ci 0x29, 0xe7, # .Usage Maximum (231) 12662306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 12762306a36Sopenharmony_ci 0x25, 0x01, # .Logical Maximum (1) 12862306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 12962306a36Sopenharmony_ci 0x95, 0x08, # .Report Count (8) 13062306a36Sopenharmony_ci 0x81, 0x02, # .Input (Data,Var,Abs) 13162306a36Sopenharmony_ci 0x95, 0x06, # .Report Count (6) 13262306a36Sopenharmony_ci 0x75, 0x08, # .Report Size (8) 13362306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 13462306a36Sopenharmony_ci 0x26, 0xa4, 0x00, # .Logical Maximum (164) 13562306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 13662306a36Sopenharmony_ci 0x19, 0x00, # .Usage Minimum (0) 13762306a36Sopenharmony_ci 0x29, 0xa4, # .Usage Maximum (164) 13862306a36Sopenharmony_ci 0x81, 0x00, # .Input (Data,Arr,Abs) 13962306a36Sopenharmony_ci 0xc0, # End Collection 14062306a36Sopenharmony_ci ] 14162306a36Sopenharmony_ci # fmt: on 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci def __init__(self, rdesc=report_descriptor, name=None, input_info=None): 14462306a36Sopenharmony_ci super().__init__(rdesc, name, input_info) 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci def _create_report_data(self): 14762306a36Sopenharmony_ci data = KeyboardData() 14862306a36Sopenharmony_ci array = [] 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci hut = hidtools.hut.HUT 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci # strip modifiers from the array 15362306a36Sopenharmony_ci for k, v in self.keystates.items(): 15462306a36Sopenharmony_ci # we ignore depressed keys 15562306a36Sopenharmony_ci if not v: 15662306a36Sopenharmony_ci continue 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci usage = hut[0x07].from_name[k].usage 15962306a36Sopenharmony_ci if usage >= 224 and usage <= 231: 16062306a36Sopenharmony_ci # modifier 16162306a36Sopenharmony_ci setattr(data, k.lower(), 1) 16262306a36Sopenharmony_ci else: 16362306a36Sopenharmony_ci array.append(k) 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci # if array length is bigger than 6, report ErrorRollOver 16662306a36Sopenharmony_ci if len(array) > 6: 16762306a36Sopenharmony_ci array = ["ErrorRollOver"] * 6 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci data.keyboard = array 17062306a36Sopenharmony_ci return data 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ciclass LEDKeyboard(ArrayKeyboard): 17462306a36Sopenharmony_ci # fmt: off 17562306a36Sopenharmony_ci report_descriptor = [ 17662306a36Sopenharmony_ci 0x05, 0x01, # Usage Page (Generic Desktop) 17762306a36Sopenharmony_ci 0x09, 0x06, # Usage (Keyboard) 17862306a36Sopenharmony_ci 0xa1, 0x01, # Collection (Application) 17962306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 18062306a36Sopenharmony_ci 0x19, 0xe0, # .Usage Minimum (224) 18162306a36Sopenharmony_ci 0x29, 0xe7, # .Usage Maximum (231) 18262306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 18362306a36Sopenharmony_ci 0x25, 0x01, # .Logical Maximum (1) 18462306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 18562306a36Sopenharmony_ci 0x95, 0x08, # .Report Count (8) 18662306a36Sopenharmony_ci 0x81, 0x02, # .Input (Data,Var,Abs) 18762306a36Sopenharmony_ci 0x95, 0x01, # .Report Count (1) 18862306a36Sopenharmony_ci 0x75, 0x08, # .Report Size (8) 18962306a36Sopenharmony_ci 0x81, 0x01, # .Input (Cnst,Arr,Abs) 19062306a36Sopenharmony_ci 0x95, 0x05, # .Report Count (5) 19162306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 19262306a36Sopenharmony_ci 0x05, 0x08, # .Usage Page (LEDs) 19362306a36Sopenharmony_ci 0x19, 0x01, # .Usage Minimum (1) 19462306a36Sopenharmony_ci 0x29, 0x05, # .Usage Maximum (5) 19562306a36Sopenharmony_ci 0x91, 0x02, # .Output (Data,Var,Abs) 19662306a36Sopenharmony_ci 0x95, 0x01, # .Report Count (1) 19762306a36Sopenharmony_ci 0x75, 0x03, # .Report Size (3) 19862306a36Sopenharmony_ci 0x91, 0x01, # .Output (Cnst,Arr,Abs) 19962306a36Sopenharmony_ci 0x95, 0x06, # .Report Count (6) 20062306a36Sopenharmony_ci 0x75, 0x08, # .Report Size (8) 20162306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 20262306a36Sopenharmony_ci 0x26, 0xa4, 0x00, # .Logical Maximum (164) 20362306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 20462306a36Sopenharmony_ci 0x19, 0x00, # .Usage Minimum (0) 20562306a36Sopenharmony_ci 0x29, 0xa4, # .Usage Maximum (164) 20662306a36Sopenharmony_ci 0x81, 0x00, # .Input (Data,Arr,Abs) 20762306a36Sopenharmony_ci 0xc0, # End Collection 20862306a36Sopenharmony_ci ] 20962306a36Sopenharmony_ci # fmt: on 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci def __init__(self, rdesc=report_descriptor, name=None, input_info=None): 21262306a36Sopenharmony_ci super().__init__(rdesc, name, input_info) 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci# Some Primax manufactured keyboards set the Usage Page after having defined 21662306a36Sopenharmony_ci# some local Usages. It relies on the fact that the specification states that 21762306a36Sopenharmony_ci# Usages are to be concatenated with Usage Pages upon finding a Main item (see 21862306a36Sopenharmony_ci# 6.2.2.8). This test covers this case. 21962306a36Sopenharmony_ciclass PrimaxKeyboard(ArrayKeyboard): 22062306a36Sopenharmony_ci # fmt: off 22162306a36Sopenharmony_ci report_descriptor = [ 22262306a36Sopenharmony_ci 0x05, 0x01, # Usage Page (Generic Desktop) 22362306a36Sopenharmony_ci 0x09, 0x06, # Usage (Keyboard) 22462306a36Sopenharmony_ci 0xA1, 0x01, # Collection (Application) 22562306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 22662306a36Sopenharmony_ci 0x19, 0xE0, # .Usage Minimum (224) 22762306a36Sopenharmony_ci 0x29, 0xE7, # .Usage Maximum (231) 22862306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 22962306a36Sopenharmony_ci 0x25, 0x01, # .Logical Maximum (1) 23062306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 23162306a36Sopenharmony_ci 0x95, 0x08, # .Report Count (8) 23262306a36Sopenharmony_ci 0x81, 0x02, # .Input (Data,Var,Abs) 23362306a36Sopenharmony_ci 0x75, 0x08, # .Report Size (8) 23462306a36Sopenharmony_ci 0x95, 0x01, # .Report Count (1) 23562306a36Sopenharmony_ci 0x81, 0x01, # .Input (Data,Var,Abs) 23662306a36Sopenharmony_ci 0x05, 0x08, # .Usage Page (LEDs) 23762306a36Sopenharmony_ci 0x19, 0x01, # .Usage Minimum (1) 23862306a36Sopenharmony_ci 0x29, 0x03, # .Usage Maximum (3) 23962306a36Sopenharmony_ci 0x75, 0x01, # .Report Size (1) 24062306a36Sopenharmony_ci 0x95, 0x03, # .Report Count (3) 24162306a36Sopenharmony_ci 0x91, 0x02, # .Output (Data,Var,Abs) 24262306a36Sopenharmony_ci 0x95, 0x01, # .Report Count (1) 24362306a36Sopenharmony_ci 0x75, 0x05, # .Report Size (5) 24462306a36Sopenharmony_ci 0x91, 0x01, # .Output (Constant) 24562306a36Sopenharmony_ci 0x15, 0x00, # .Logical Minimum (0) 24662306a36Sopenharmony_ci 0x26, 0xFF, 0x00, # .Logical Maximum (255) 24762306a36Sopenharmony_ci 0x19, 0x00, # .Usage Minimum (0) 24862306a36Sopenharmony_ci 0x2A, 0xFF, 0x00, # .Usage Maximum (255) 24962306a36Sopenharmony_ci 0x05, 0x07, # .Usage Page (Keyboard) 25062306a36Sopenharmony_ci 0x75, 0x08, # .Report Size (8) 25162306a36Sopenharmony_ci 0x95, 0x06, # .Report Count (6) 25262306a36Sopenharmony_ci 0x81, 0x00, # .Input (Data,Arr,Abs) 25362306a36Sopenharmony_ci 0xC0, # End Collection 25462306a36Sopenharmony_ci ] 25562306a36Sopenharmony_ci # fmt: on 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci def __init__(self, rdesc=report_descriptor, name=None, input_info=None): 25862306a36Sopenharmony_ci super().__init__(rdesc, name, input_info) 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ciclass BaseTest: 26262306a36Sopenharmony_ci class TestKeyboard(base.BaseTestCase.TestUhid): 26362306a36Sopenharmony_ci def test_single_key(self): 26462306a36Sopenharmony_ci """check for key reliability.""" 26562306a36Sopenharmony_ci uhdev = self.uhdev 26662306a36Sopenharmony_ci evdev = uhdev.get_evdev() 26762306a36Sopenharmony_ci syn_event = self.syn_event 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci r = uhdev.event(["a and A"]) 27062306a36Sopenharmony_ci expected = [syn_event] 27162306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_A, 1)) 27262306a36Sopenharmony_ci events = uhdev.next_sync_events() 27362306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 27462306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 27562306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_A] == 1 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci r = uhdev.event([]) 27862306a36Sopenharmony_ci expected = [syn_event] 27962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_A, 0)) 28062306a36Sopenharmony_ci events = uhdev.next_sync_events() 28162306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 28262306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 28362306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_A] == 0 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci def test_two_keys(self): 28662306a36Sopenharmony_ci uhdev = self.uhdev 28762306a36Sopenharmony_ci evdev = uhdev.get_evdev() 28862306a36Sopenharmony_ci syn_event = self.syn_event 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci r = uhdev.event(["a and A", "q and Q"]) 29162306a36Sopenharmony_ci expected = [syn_event] 29262306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_A, 1)) 29362306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_Q, 1)) 29462306a36Sopenharmony_ci events = uhdev.next_sync_events() 29562306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 29662306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 29762306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_A] == 1 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci r = uhdev.event([]) 30062306a36Sopenharmony_ci expected = [syn_event] 30162306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_A, 0)) 30262306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_Q, 0)) 30362306a36Sopenharmony_ci events = uhdev.next_sync_events() 30462306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 30562306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 30662306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_A] == 0 30762306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_Q] == 0 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci r = uhdev.event(["c and C"]) 31062306a36Sopenharmony_ci expected = [syn_event] 31162306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_C, 1)) 31262306a36Sopenharmony_ci events = uhdev.next_sync_events() 31362306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 31462306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 31562306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_C] == 1 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci r = uhdev.event(["c and C", "Spacebar"]) 31862306a36Sopenharmony_ci expected = [syn_event] 31962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_SPACE, 1)) 32062306a36Sopenharmony_ci events = uhdev.next_sync_events() 32162306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 32262306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_KEY.KEY_C) not in events 32362306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 32462306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_C] == 1 32562306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_SPACE] == 1 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci r = uhdev.event(["Spacebar"]) 32862306a36Sopenharmony_ci expected = [syn_event] 32962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_C, 0)) 33062306a36Sopenharmony_ci events = uhdev.next_sync_events() 33162306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 33262306a36Sopenharmony_ci assert libevdev.InputEvent(libevdev.EV_KEY.KEY_SPACE) not in events 33362306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 33462306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_C] == 0 33562306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_SPACE] == 1 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci r = uhdev.event([]) 33862306a36Sopenharmony_ci expected = [syn_event] 33962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_SPACE, 0)) 34062306a36Sopenharmony_ci events = uhdev.next_sync_events() 34162306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 34262306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 34362306a36Sopenharmony_ci assert evdev.value[libevdev.EV_KEY.KEY_SPACE] == 0 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci def test_modifiers(self): 34662306a36Sopenharmony_ci # ctrl-alt-del would be very nice :) 34762306a36Sopenharmony_ci uhdev = self.uhdev 34862306a36Sopenharmony_ci syn_event = self.syn_event 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci r = uhdev.event(["LeftControl", "LeftShift", "= and +"]) 35162306a36Sopenharmony_ci expected = [syn_event] 35262306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_LEFTCTRL, 1)) 35362306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_LEFTSHIFT, 1)) 35462306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_EQUAL, 1)) 35562306a36Sopenharmony_ci events = uhdev.next_sync_events() 35662306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 35762306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ciclass TestPlainKeyboard(BaseTest.TestKeyboard): 36162306a36Sopenharmony_ci def create_device(self): 36262306a36Sopenharmony_ci return PlainKeyboard() 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci def test_10_keys(self): 36562306a36Sopenharmony_ci uhdev = self.uhdev 36662306a36Sopenharmony_ci syn_event = self.syn_event 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci r = uhdev.event( 36962306a36Sopenharmony_ci [ 37062306a36Sopenharmony_ci "1 and !", 37162306a36Sopenharmony_ci "2 and @", 37262306a36Sopenharmony_ci "3 and #", 37362306a36Sopenharmony_ci "4 and $", 37462306a36Sopenharmony_ci "5 and %", 37562306a36Sopenharmony_ci "6 and ^", 37662306a36Sopenharmony_ci "7 and &", 37762306a36Sopenharmony_ci "8 and *", 37862306a36Sopenharmony_ci "9 and (", 37962306a36Sopenharmony_ci "0 and )", 38062306a36Sopenharmony_ci ] 38162306a36Sopenharmony_ci ) 38262306a36Sopenharmony_ci expected = [syn_event] 38362306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_0, 1)) 38462306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_1, 1)) 38562306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_2, 1)) 38662306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_3, 1)) 38762306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_4, 1)) 38862306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_5, 1)) 38962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_6, 1)) 39062306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_7, 1)) 39162306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_8, 1)) 39262306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_9, 1)) 39362306a36Sopenharmony_ci events = uhdev.next_sync_events() 39462306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 39562306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci r = uhdev.event([]) 39862306a36Sopenharmony_ci expected = [syn_event] 39962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_0, 0)) 40062306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_1, 0)) 40162306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_2, 0)) 40262306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_3, 0)) 40362306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_4, 0)) 40462306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_5, 0)) 40562306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_6, 0)) 40662306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_7, 0)) 40762306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_8, 0)) 40862306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_9, 0)) 40962306a36Sopenharmony_ci events = uhdev.next_sync_events() 41062306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 41162306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ciclass TestArrayKeyboard(BaseTest.TestKeyboard): 41562306a36Sopenharmony_ci def create_device(self): 41662306a36Sopenharmony_ci return ArrayKeyboard() 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci def test_10_keys(self): 41962306a36Sopenharmony_ci uhdev = self.uhdev 42062306a36Sopenharmony_ci syn_event = self.syn_event 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci r = uhdev.event( 42362306a36Sopenharmony_ci [ 42462306a36Sopenharmony_ci "1 and !", 42562306a36Sopenharmony_ci "2 and @", 42662306a36Sopenharmony_ci "3 and #", 42762306a36Sopenharmony_ci "4 and $", 42862306a36Sopenharmony_ci "5 and %", 42962306a36Sopenharmony_ci "6 and ^", 43062306a36Sopenharmony_ci ] 43162306a36Sopenharmony_ci ) 43262306a36Sopenharmony_ci expected = [syn_event] 43362306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_1, 1)) 43462306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_2, 1)) 43562306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_3, 1)) 43662306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_4, 1)) 43762306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_5, 1)) 43862306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_6, 1)) 43962306a36Sopenharmony_ci events = uhdev.next_sync_events() 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 44262306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci # ErrRollOver 44562306a36Sopenharmony_ci r = uhdev.event( 44662306a36Sopenharmony_ci [ 44762306a36Sopenharmony_ci "1 and !", 44862306a36Sopenharmony_ci "2 and @", 44962306a36Sopenharmony_ci "3 and #", 45062306a36Sopenharmony_ci "4 and $", 45162306a36Sopenharmony_ci "5 and %", 45262306a36Sopenharmony_ci "6 and ^", 45362306a36Sopenharmony_ci "7 and &", 45462306a36Sopenharmony_ci "8 and *", 45562306a36Sopenharmony_ci "9 and (", 45662306a36Sopenharmony_ci "0 and )", 45762306a36Sopenharmony_ci ] 45862306a36Sopenharmony_ci ) 45962306a36Sopenharmony_ci events = uhdev.next_sync_events() 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci assert len(events) == 0 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci r = uhdev.event([]) 46662306a36Sopenharmony_ci expected = [syn_event] 46762306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_1, 0)) 46862306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_2, 0)) 46962306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_3, 0)) 47062306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_4, 0)) 47162306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_5, 0)) 47262306a36Sopenharmony_ci expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_6, 0)) 47362306a36Sopenharmony_ci events = uhdev.next_sync_events() 47462306a36Sopenharmony_ci self.debug_reports(r, uhdev, events) 47562306a36Sopenharmony_ci self.assertInputEventsIn(expected, events) 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ciclass TestLEDKeyboard(BaseTest.TestKeyboard): 47962306a36Sopenharmony_ci def create_device(self): 48062306a36Sopenharmony_ci return LEDKeyboard() 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ciclass TestPrimaxKeyboard(BaseTest.TestKeyboard): 48462306a36Sopenharmony_ci def create_device(self): 48562306a36Sopenharmony_ci return PrimaxKeyboard() 486