# Copyright (c) 2012 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 time
import re

from autotest_lib.server.cros.faftsequence import FAFTSequence


# en-US key matrix (from "kb membrane pin matrix.pdf")
KEYMATRIX = {'`': (3, 1), '1': (6, 1), '2': (6, 4), '3': (6, 2), '4': (6, 3),
             '5': (3, 3), '6': (3, 6), '7': (6, 6), '8': (6, 5), '9': (6, 9),
             '0': (6, 8), '-': (3, 8), '=': (0, 8), 'q': (7, 1), 'w': (7, 4),
             'e': (7, 2), 'r': (7, 3), 't': (2, 3), 'y': (2, 6), 'u': (7, 6),
             'i': (7, 5), 'o': (7, 9), 'p': (7, 8), '[': (2, 8), ']': (2, 5),
             '\\': (3, 11), 'a': (4, 1), 's': (4, 4), 'd': (4, 2), 'f': (4, 3),
             'g': (1, 3), 'h': (1, 6), 'j': (4, 6), 'k': (4, 5), 'l': (4, 9),
             ';': (4, 8), '\'': (1, 8), 'z': (5, 1), 'x': (5, 4), 'c': (5, 2),
             'v': (5, 3), 'b': (0, 3), 'n': (0, 6), 'm': (5, 6), ',': (5, 5),
             '.': (5, 9), '/': (5, 8), ' ': (5, 11), '<right>': (6, 12),
             '<alt_r>': (0, 10), '<down>': (6, 11), '<tab>': (2, 1),
             '<f10>': (0, 4), '<shift_r>': (7, 7), '<ctrl_r>': (4, 0),
             '<esc>': (1, 1), '<backspace>': (1, 11), '<f2>': (3, 2),
             '<alt_l>': (6, 10), '<ctrl_l>': (2, 0), '<f1>': (0, 2),
             '<search>': (0, 1), '<f3>': (2, 2), '<f4>': (1, 2), '<f5>': (3, 4),
             '<f6>': (2, 4), '<f7>': (1, 4), '<f8>': (2, 9), '<f9>': (1, 9),
             '<up>': (7, 11), '<shift_l>': (5, 7), '<enter>': (4, 11),
             '<left>': (7, 12)}


class firmware_ECKeyboard(FAFTSequence):
    """
    Servo based EC keyboard test.
    """
    version = 1


    # Delay between commands
    CMD_DELAY = 1


    def setup(self):
        super(firmware_ECKeyboard, self).setup()
        # Only run in normal mode
        self.setup_dev_mode(False)


    def key_down(self, keyname):
        """Simulate pressing a key."""
        self.send_uart_command('kbpress %d %d 1' %
                (KEYMATRIX[keyname][1], KEYMATRIX[keyname][0]))


    def key_up(self, keyname):
        """Simulate releasing a key."""
        self.send_uart_command('kbpress %d %d 0' %
                (KEYMATRIX[keyname][1], KEYMATRIX[keyname][0]))


    def key_press(self, keyname):
        """Press and then release a key."""
        self.key_down(keyname)
        self.key_up(keyname)


    def send_raw_string(self, string):
        """Send key strokes consisting of only characters."""
        for c in string:
            self.key_press(c)


    def send_string(self, string):
        """Send key strokes including special keys.

        Args:
          string: Character string including 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_raw_string(raw)
            else:
                self.key_press(sp)


    def switch_tty2(self):
        """Switch to tty2 console."""
        self.key_down('<ctrl_l>')
        self.key_down('<alt_l>')
        self.key_down('<f2>')
        self.key_up('<f2>')
        self.key_up('<alt_l>')
        self.key_up('<ctrl_l>')
        time.sleep(self.CMD_DELAY)


    def reboot_by_keyboard(self):
        """
        Simulate key press sequence to log into console and then issue reboot
        command.
        """
        self.switch_tty2()
        self.send_string('root<enter>')
        time.sleep(self.CMD_DELAY)
        self.send_string('test0000<enter>')
        time.sleep(self.CMD_DELAY)
        self.send_string('reboot<enter>')


    def run_once(self, host=None):
        if not self.check_ec_capability(['keyboard']):
            return
        self.register_faft_sequence((
            {   # Step 1, use key press simulation to issue reboot command
                'reboot_action': self.reboot_by_keyboard,
            },
            {   # Step 2, dummy step to ensure reboot
            }
        ))
        self.run_faft_sequence()
