# Copyright 2015 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 glob
import logging
import pprint
from threading import Timer

from autotest_lib.client.bin.input.input_device import *


class firmwareCheckKeys(object):
    """An abstraction to deal with checking firmware keys."""
    # pylint: disable=undefined-variable
    version = 1
    actual_output = []
    device = None
    ev = None

    def __init__(self):
        for evdev in glob.glob("/dev/input/event*"):
            device = InputDevice(evdev)
            if device.is_keyboard():
                print 'keyboard device %s' % evdev
                self.device = device

    def _keyboard_input(self):
        """Read key presses."""
        index = 0
        while True:
            self.ev.read(self.device.f)
            if self.ev.code != KEY_RESERVED:
                print "EventCode is %d value is %d" % (self.ev.code,
                                                       self.ev.value)
                if self.ev.type == 0 or self.ev.type == 1:
                    self.actual_output.append(self.ev.code)
                    index = index + 1

    def check_keys(self, expected_sequence):
        """Wait for key press for 10 seconds.

        @return number of input keys captured, -1 for error.
        """
        if not self.device:
            logging.error("Could not find a keyboard device")
            return -1

        self.ev = InputEvent()
        Timer(0, self._keyboard_input).start()

        time.sleep(10)

        # Keypresses will have a tendency to repeat as there is delay between
        # the down and up events.  We're not interested in precisely how many
        # repeats of the key there is, just what is the sequence of keys,
        # so, we will make the list unique.
        uniq_actual_output = sorted(list(set(self.actual_output)))
        if uniq_actual_output != expected_sequence:
            print 'Keys mismatched %s' % pprint.pformat(uniq_actual_output)
            return -1
        print 'Key match expected: %s' % pprint.pformat(uniq_actual_output)
        return len(uniq_actual_output)
