blob: 9f6351a6d5853cb5ef5d68f7d40b8e5076ef19a4 [file] [log] [blame]
# 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