You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.4 KiB
120 lines
3.4 KiB
# Copyright 2017 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import logging
|
|
import re
|
|
|
|
from autotest_lib.client.cros import ec
|
|
from autotest_lib.server.cros.servo import chrome_ec
|
|
|
|
|
|
class ChromeBaseEC(chrome_ec.ChromeConsole):
|
|
"""Manages control of a ChromeBaseEC.
|
|
|
|
The ChromeBaseEC object should be instantiated via the create_base_ec()
|
|
method which checks the board name.
|
|
|
|
There are several ways to control the Base EC, depending on the setup.
|
|
To simplify, this class assumes the Base EC is connected to a servo-micro
|
|
flex to a servo v4 board. The main EC is also connected to the same servo
|
|
v4 board via either another servo-micro flex or the type-C CCD cable.
|
|
|
|
"""
|
|
|
|
def __init__(self, servo, board):
|
|
"""Initialize the object.
|
|
|
|
Args:
|
|
servo: An autotest_lib.server.cros.servo.Servo object.
|
|
board: A string of the board name for the base, e.g. "hammer".
|
|
"""
|
|
self.board = board
|
|
console_prefix = board + '_ec_uart'
|
|
super(ChromeBaseEC, self).__init__(servo, console_prefix)
|
|
|
|
|
|
def get_board(self):
|
|
"""Get the board name of the Base EC.
|
|
|
|
Returns:
|
|
A string of the board name.
|
|
"""
|
|
return self.board
|
|
|
|
|
|
def key_down(self, keyname):
|
|
"""Simulate pressing a key.
|
|
|
|
Args:
|
|
keyname: Key name, one of the keys of ec.KEYMATRIX.
|
|
"""
|
|
self.send_command('kbpress %d %d 1' %
|
|
(ec.KEYMATRIX[keyname][1], ec.KEYMATRIX[keyname][0]))
|
|
|
|
|
|
def key_up(self, keyname):
|
|
"""Simulate releasing a key.
|
|
|
|
Args:
|
|
keyname: Key name, one of the keys of KEYMATRIX.
|
|
"""
|
|
self.send_command('kbpress %d %d 0' %
|
|
(ec.KEYMATRIX[keyname][1], ec.KEYMATRIX[keyname][0]))
|
|
|
|
|
|
def key_press(self, keyname):
|
|
"""Press and then release a key.
|
|
|
|
Args:
|
|
keyname: Key name, one of the keys of KEYMATRIX.
|
|
"""
|
|
self.send_command([
|
|
'kbpress %d %d 1' %
|
|
(ec.KEYMATRIX[keyname][1], ec.KEYMATRIX[keyname][0]),
|
|
'kbpress %d %d 0' %
|
|
(ec.KEYMATRIX[keyname][1], ec.KEYMATRIX[keyname][0]),
|
|
])
|
|
|
|
|
|
def send_key_string_raw(self, string):
|
|
"""Send key strokes consisting of only characters.
|
|
|
|
Args:
|
|
string: Raw string.
|
|
"""
|
|
for c in string:
|
|
self.key_press(c)
|
|
|
|
|
|
def send_key_string(self, string):
|
|
"""Send key strokes that can include special keys.
|
|
|
|
Args:
|
|
string: Character string that can include special keys. An example
|
|
is "this is an<tab>example<enter>".
|
|
"""
|
|
for m in re.finditer("(<[^>]+>)|([^<>]+)", string):
|
|
sp, raw = m.groups()
|
|
if raw is not None:
|
|
self.send_key_string_raw(raw)
|
|
else:
|
|
self.key_press(sp)
|
|
|
|
|
|
def create_base_ec(servo):
|
|
"""Create a Base EC object.
|
|
|
|
It gets the base board name from servod and returns a ChromeBaseEC object
|
|
of the board.
|
|
|
|
Returns:
|
|
A ChromeBaseEC object, or None if not found.
|
|
"""
|
|
base_board = servo.get_base_board()
|
|
if base_board:
|
|
return ChromeBaseEC(servo, base_board)
|
|
else:
|
|
logging.warn('No Base EC found on the servo board')
|
|
return None
|