1*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Li"""An interface to access the local input facade.""" 6*9c5db199SXin Li 7*9c5db199SXin Li 8*9c5db199SXin Liimport json 9*9c5db199SXin Liimport logging 10*9c5db199SXin Liimport threading 11*9c5db199SXin Li 12*9c5db199SXin Lifrom autotest_lib.client.bin.input import input_event_recorder 13*9c5db199SXin Lifrom autotest_lib.client.cros.input_playback import input_playback 14*9c5db199SXin Lifrom autotest_lib.client.common_lib import error 15*9c5db199SXin Lifrom autotest_lib.client.cros.graphics import graphics_utils 16*9c5db199SXin Li 17*9c5db199SXin Li 18*9c5db199SXin Liclass InputFacadeLocalError(Exception): 19*9c5db199SXin Li """Error in InputFacadeLocal.""" 20*9c5db199SXin Li pass 21*9c5db199SXin Li 22*9c5db199SXin Li 23*9c5db199SXin Liclass InputFacadeLocal(object): 24*9c5db199SXin Li """Facade to access the record input events.""" 25*9c5db199SXin Li 26*9c5db199SXin Li def __init__(self): 27*9c5db199SXin Li """Initializes the input facade.""" 28*9c5db199SXin Li self.recorders_lock = threading.Lock() 29*9c5db199SXin Li self.recorders = dict() 30*9c5db199SXin Li 31*9c5db199SXin Li def initialize_input_playback(self, input_type='keyboard', property_file=None): 32*9c5db199SXin Li """Initialize for input events simulation. 33*9c5db199SXin Li 34*9c5db199SXin Li @param input_type: the name of the input device. 35*9c5db199SXin Li @param property_file: Property file of device to be emulated. 36*9c5db199SXin Li """ 37*9c5db199SXin Li self._player = input_playback.InputPlayback() 38*9c5db199SXin Li self._player.emulate(input_type=input_type, property_file=property_file) 39*9c5db199SXin Li self._player.find_connected_inputs() 40*9c5db199SXin Li 41*9c5db199SXin Li def initialize_input_recorder(self, device_name, uniq): 42*9c5db199SXin Li """Initialize an input event recorder object. 43*9c5db199SXin Li 44*9c5db199SXin Li @param device_name: the name of the input device to record. 45*9c5db199SXin Li @param uniq: Unique address of input device (None if not used) 46*9c5db199SXin Li 47*9c5db199SXin Li """ 48*9c5db199SXin Li with self.recorders_lock: 49*9c5db199SXin Li self.recorders[device_name] = \ 50*9c5db199SXin Li input_event_recorder.InputEventRecorder(device_name, uniq) 51*9c5db199SXin Li logging.info('input event device: %s [uniq=%s] (%s)', 52*9c5db199SXin Li self.recorders[device_name].device_name, 53*9c5db199SXin Li self.recorders[device_name].uniq, 54*9c5db199SXin Li self.recorders[device_name].device_node) 55*9c5db199SXin Li 56*9c5db199SXin Li 57*9c5db199SXin Li def clear_input_events(self, device_name): 58*9c5db199SXin Li """Clear the event list. 59*9c5db199SXin Li 60*9c5db199SXin Li @param device_name: the name of the input device to record. 61*9c5db199SXin Li 62*9c5db199SXin Li """ 63*9c5db199SXin Li with self.recorders_lock: 64*9c5db199SXin Li if self.recorders[device_name] is None: 65*9c5db199SXin Li raise error.TestError( 66*9c5db199SXin Li 'input facade: input device name not given') 67*9c5db199SXin Li self.recorders[device_name].clear_events() 68*9c5db199SXin Li 69*9c5db199SXin Li 70*9c5db199SXin Li def start_input_recorder(self, device_name): 71*9c5db199SXin Li """Start the recording thread. 72*9c5db199SXin Li 73*9c5db199SXin Li @param device_name: the name of the input device to record. 74*9c5db199SXin Li 75*9c5db199SXin Li """ 76*9c5db199SXin Li with self.recorders_lock: 77*9c5db199SXin Li if self.recorders[device_name] is None: 78*9c5db199SXin Li raise error.TestError( 79*9c5db199SXin Li 'input facade: input device name not given') 80*9c5db199SXin Li self.recorders[device_name].start() 81*9c5db199SXin Li 82*9c5db199SXin Li 83*9c5db199SXin Li def stop_input_recorder(self, device_name): 84*9c5db199SXin Li """Stop the recording thread. 85*9c5db199SXin Li 86*9c5db199SXin Li @param device_name: the name of the input device to record. 87*9c5db199SXin Li 88*9c5db199SXin Li """ 89*9c5db199SXin Li with self.recorders_lock: 90*9c5db199SXin Li if self.recorders[device_name] is None: 91*9c5db199SXin Li raise error.TestError( 92*9c5db199SXin Li 'input facade: input device name not given') 93*9c5db199SXin Li self.recorders[device_name].stop() 94*9c5db199SXin Li 95*9c5db199SXin Li 96*9c5db199SXin Li def get_input_events(self, device_name): 97*9c5db199SXin Li """Get the bluetooth device input events. 98*9c5db199SXin Li 99*9c5db199SXin Li @param device_name: the name of the input device to record. 100*9c5db199SXin Li 101*9c5db199SXin Li @returns: the recorded input events. 102*9c5db199SXin Li 103*9c5db199SXin Li """ 104*9c5db199SXin Li with self.recorders_lock: 105*9c5db199SXin Li if self.recorders[device_name] is None: 106*9c5db199SXin Li raise error.TestError( 107*9c5db199SXin Li 'input facade: input device name not given') 108*9c5db199SXin Li events = self.recorders[device_name].get_events() 109*9c5db199SXin Li return json.dumps(events) 110*9c5db199SXin Li 111*9c5db199SXin Li 112*9c5db199SXin Li def press_keys(self, key_list): 113*9c5db199SXin Li """ Simulating key press 114*9c5db199SXin Li 115*9c5db199SXin Li @param key_list: A list of key strings, e.g. ['LEFTCTRL', 'F4'] 116*9c5db199SXin Li """ 117*9c5db199SXin Li graphics_utils.press_keys(key_list) 118*9c5db199SXin Li 119*9c5db199SXin Li 120*9c5db199SXin Li def blocking_playback_of_default_file(self, input_type, filename): 121*9c5db199SXin Li """Simulate events 122*9c5db199SXin Li 123*9c5db199SXin Li @param input_type: input device name 124*9c5db199SXin Li @param filename: input events 125*9c5db199SXin Li """ 126*9c5db199SXin Li self._player.blocking_playback_of_default_file(input_type=input_type, 127*9c5db199SXin Li filename=filename) 128