# Lint as: python2, python3
# Copyright (c) 2011 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.

"""A Python library to interact with TTCI module for TPM testing.

Background
 - TTCI stands for TPM Test Controller Interface
 - TTCI is a custom-designed hardware board that can be used to test TPM module
 - TTCI board contains two modules: PCA9555 and INA219. This library provides
   methods to interact with these modules programmatically

Dependency
 - This library depends on a new C shared library called "libsmogcheck.so".
 - In order to run test cases built using this API, one needs a TTCI board

Notes:
 - An exception is raised if it doesn't make logical sense to continue program
   flow (e.g. I/O error prevents test case from executing)
 - An exception is caught and then converted to an error code if the caller
   expects to check for error code per API definition
"""

import logging
from autotest_lib.client.common_lib import smogcheck_ina219, smogcheck_pca9555


# I2C slave addresses of INA219 module
INA219_BPWR_SLV = 0x40  # Backup Power
INA219_MPWR_SLV = 0x44  # Main Power


class TtciError(Exception):
    """Base class for all errors in this module."""


class TtciController(object):
    """Object to control TTCI board used for TPM module testing."""

    def __init__(self):
        """Constructor.

        Mandatory params:
          err: error string.
          ina_backup_obj: an instance of InaController (for Backup Power port
                          of INA219 module).
          ina_main_obj: an instance of InaController (for Main Power port
                        of INA219 module).
          pca_obj: an instance of PcaController.

        Raises:
          TtciError: if error initializing TTCI controller.
        """
        self.err = None
        try:
            # Initialize PCA9555 module.
            self.pca_obj = smogcheck_pca9555.PcaController()

            # Initialize INA219 module.
            self.ina_main_obj = smogcheck_ina219.InaController(
                node_addr=INA219_MPWR_SLV)
            self.ina_backup_obj = smogcheck_ina219.InaController(
                node_addr=INA219_BPWR_SLV)
        except smogcheck_pca9555.PcaError as e:
            raise TtciError('Error initialize PCA9555 module: %s' % e)
        except smogcheck_ina219.InaError as e:
            raise TtciError('Error initialize INA219 module: %s' % e)

    def TTCI_Get_Main_Power_Metrics(self):
        """Gets voltage and current measurements from INA219 Main Power.

        See docstring of getPowerMetrics() in smogcheck_ina219.py.
        """
        return self.ina_main_obj.getPowerMetrics()

    def TTCI_Get_Backup_Power_Metrics(self):
        """Gets voltage and current measurements from INA219 Backup Power.

        See docstring of getPowerMetrics() in smogcheck_ina219.py.
        """
        return self.ina_backup_obj.getPowerMetrics()

    def TTCI_Set_Main_Power_Control(self, turn_on):
        """De/activated TPM Main Power.

        Args:
          turn_on: a boolean, on (true) = set bit to 1.

        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
        """
        return self.pca_obj.setPCAcontrol('main_power', turn_on=turn_on)

    def TTCI_Set_Backup_Power_Control(self, turn_on):
        """De/activated TPM Backup Power.

        Args:
          turn_on: a boolean, on (true) = set bit to 1.

        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
        """
        return self.pca_obj.setPCAcontrol('backup_power', turn_on=turn_on)

    def TTCI_Set_Reset_Control(self, turn_on):
        """De/activated TPM Reset.

        Exception note:
          for TPM Reset, true means setting bit value to 0 (not 1).

        Args:
          turn_on: a boolean, on (true) = set bit to 0.

        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
        """
        return self.pca_obj.setPCAcontrol('reset', turn_on=not(turn_on))

    def TTCI_Set_PP_Control(self, turn_on):
        """De/activated TPM Physical Presence.

        Args:
          turn_on: a boolean, on (true) = set bit to 1.

        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
        """
        return self.pca_obj.setPCAcontrol('pp', turn_on=turn_on)

    def TTCI_Set_TPM_I2C_Control(self, turn_on):
        """Enable/Disable I2C communication with TPM.

        Args:
          turn_on: a boolean, on (true) = set bit to 1.

        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
        """
        return self.pca_obj.setPCAcontrol('tpm_i2c', turn_on=turn_on)

    def TTCI_Get_Main_Power_Status(self):
        """Checks bit value of Main Power.

        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
        """
        return self.pca_obj.getPCAbitStatus('main_power')

    def TTCI_Get_Backup_Power_Status(self):
        """Checks bit value of Backup Power.

        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
        """
        return self.pca_obj.getPCAbitStatus('backup_power')

    def TTCI_Get_PP_Status(self):
        """Checks bit value of Physical Presence.

        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
        """
        return self.pca_obj.getPCAbitStatus('pp')

    def TTCI_Get_TPM_I2C_Status(self):
        """Checks bit value of TPM I2C.

        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
        """
        return self.pca_obj.getPCAbitStatus('tpm_i2c')

    def TTCI_Set_LEDs(self, bit_value, failure, warning):
        """De/activates PCA9555 LEDs.

        See docstring of setLEDs() in smogcheck_pca9555.py.
        """
        return self.pca_obj.setLEDs(bit_value, failure, warning)

    def TTCI_Get_Switch_Status(self):
        """Checks status of DIP Switches (2-bit).

        See docstring of getSwitchStatus() in smogcheck_pca9555.py.
        """
        return self.pca_obj.getSwitchStatus()

    def TTCI_Get_LED_Status(self):
        """Checks LED status.

        See docstring of getLEDstatus() in smogcheck_pca9555.py.
        """
        return self.pca_obj.getLEDstatus()


def computeTimeElapsed(end, start):
    """Computes time difference in microseconds.

    Args:
      end: a datetime.datetime() object, end timestamp.
      start: a datetime.datetime() object, start timestamp.

    Returns:
      usec: an integer.
    """
    t = end - start
    usec = 1000000 * t.seconds + t.microseconds
    logging.info('Elapsed time = %d usec', usec)
    return usec
