# 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.

from threading import Timer
import logging
import re
import time

from autotest_lib.client.common_lib import error
from autotest_lib.server.cros.faftsequence import FAFTSequence

def delayed(seconds):
    def decorator(f):
        def wrapper(*args, **kargs):
            t = Timer(seconds, f, args, kargs)
            t.start()
        return wrapper
    return decorator


class firmware_ECLidSwitch(FAFTSequence):
    """
    Servo based EC lid switch test.
    """
    version = 1


    # Delay between closing and opening the lid
    LID_DELAY = 1

    # Delay to allow FAFT client receive command
    RPC_DELAY = 2

    # Delay between shutdown and wake by lid switch including kernel
    # shutdown time
    LONG_WAKE_DELAY = 25
    SHORT_WAKE_DELAY = 15


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


    def _open_lid(self):
        """Open lid by servo."""
        self.servo.set('lid_open', 'yes')


    def _close_lid(self):
        """Close lid by servo."""
        self.servo.set('lid_open', 'no')


    @delayed(RPC_DELAY)
    def delayed_open_lid(self):
        """Delay by RPC_DELAY and then open lid by servo."""
        self._open_lid()


    @delayed(RPC_DELAY)
    def delayed_close_lid(self):
        """Delay by RPC_DELAY and then close lid by servo."""
        self._close_lid()


    def _wake_by_lid_switch(self):
        """Wake DUT with lid switch."""
        self._close_lid()
        time.sleep(self.LID_DELAY)
        self._open_lid()


    @delayed(LONG_WAKE_DELAY)
    def long_delayed_wake(self):
        """Delay for LONG_WAKE_DELAY and then wake DUT with lid switch."""
        self._wake_by_lid_switch()


    @delayed(SHORT_WAKE_DELAY)
    def short_delayed_wake(self):
        """Delay for SHORT_WAKE_DELAY and then wake DUT with lid switch."""
        self._wake_by_lid_switch()


    def shutdown_and_wake(self, wake_func):
        """Software shutdown and delay. Then wake by lid switch.

        Args:
          wake_func: Delayed function to wake DUT.
        """
        self.faft_client.run_shell_command('shutdown -P now')
        wake_func()


    def _get_keyboard_backlight(self):
        """Get keyboard backlight brightness.

        Returns:
          Backlight brightness percentage 0~100. If it is disabled, 0 is
            returned.
        """
        cmd = 'ectool pwmgetkblight'
        pattern_percent = re.compile(
            'Current keyboard backlight percent: (\d*)')
        pattern_disable = re.compile('Keyboard backlight disabled.')
        lines = self.faft_client.run_shell_command_get_output(cmd)
        for line in lines:
            matched_percent = pattern_percent.match(line)
            if matched_percent is not None:
                return int(matched_percent.group(1))
            matched_disable = pattern_disable.match(line)
            if matched_disable is not None:
                return 0
        raise error.TestError('Cannot get keyboard backlight status.')


    def _set_keyboard_backlight(self, value):
        """Set keyboard backlight brightness.

        Args:
          value: Backlight brightness percentage 0~100.
        """
        cmd = 'ectool pwmsetkblight %d' % value
        self.faft_client.run_shell_command(cmd)


    def check_keycode(self):
        """Check if lid open/close send power button keycode.

        Returns:
          True if no power button keycode is captured. Otherwise, False.
        """
        cmd = 'showkey | grep "keycode 116" | wc -l'

        self._open_lid()
        self.delayed_close_lid()
        lines = self.faft_client.run_shell_command_get_output(cmd)
        if int(lines[0].strip()) != 0:
            logging.error("Captured power button keycode on lid close.")
            self._open_lid()
            return False
        self.delayed_open_lid()
        lines = self.faft_client.run_shell_command_get_output(cmd)
        if int(lines[0].strip()) != 0:
            logging.error("Captured power button keycode on lid close.")
            return False
        return True


    def check_backlight(self):
        """Check if lid open/close controls keyboard backlight as expected.

        Returns:
          True if keyboard backlight is turned off when lid close and on when
           lid open.
        """
        ok = True
        original_value = self._get_keyboard_backlight()
        self._set_keyboard_backlight(100)

        self._close_lid()
        if self._get_keyboard_backlight() != 0:
            logging.error("Keyboard backlight still on when lid close.")
            ok = False
        self._open_lid()
        if self._get_keyboard_backlight() == 0:
            logging.error("Keyboard backlight still off when lid open.")
            ok = False

        self._set_keyboard_backlight(original_value)
        return ok


    def check_keycode_and_backlight(self):
        """
        Disable powerd to prevent DUT shutting down dutring test. Then check
        if lid switch event controls keycode and backlight as we expected.
        """
        ok = True
        logging.info("Stopping power management daemons")
        self.faft_client.run_shell_command('stop powerd')
        self.faft_client.run_shell_command('stop powerm')
        if not self.check_keycode():
            logging.error("check_keycode failed.")
            ok = False
        if not self.check_backlight():
            logging.error("check_backlight failed.")
            ok = False
        logging.info("Restarting power management daemons")
        self.faft_client.run_shell_command('start powerd')
        self.faft_client.run_shell_command('start powerm')
        return ok


    def run_once(self, host=None):
        if not self.check_ec_capability(['lid']):
            return
        self.register_faft_sequence((
            {   # Step 1, shutdown and long delayed wake
                'reboot_action': (self.shutdown_and_wake,
                                  self.long_delayed_wake),
            },
            {   # Step 2, shutdown and short delayed wake
                'reboot_action': (self.shutdown_and_wake,
                                  self.short_delayed_wake),
            },
            {   # Step 3, check keycode and backlight
                'state_checker': self.check_keycode_and_backlight
            }
        ))
        self.run_faft_sequence()
