# Copyright (c) 2013 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.
# TODO (sbasi) crbug.com/187492 - Implement BBuart.
"""Allow creation of uart interface for beaglebone devices."""
import logging
import re
import subprocess

import bbmux_controller
import uart

BITS_RE = 'cs(?P<value>[5-8])'
PARITY_RE = '\-?parodd'
SBITS_RE = '(?P<value>\-?cstopb)'
SPEED_RE = 'speed (?P<value>[0-9]*) baud'
PARITY_MAP = {0: '-parenb', 1: 'parodd', 2: '-parodd'}
SBITS_MAP = {0: '-cstopb', 1: '-cstopb', 2: 'cstopb'}

# Map of interfaces to tty.
TTY_MAP = {
    1: '/dev/ttyO1',  # Uart1/ec_uart
    2: '/dev/ttyO2',  # Uart2/cpu_uart
    4: '/dev/ttyO4',  # Uart4/atmega_uart
    5: '/dev/ttyO5'
}  # Uart3/legacy_uart- Uart3 is connected to
# Beaglebone Uart5.

DEFAULT_UART_SETTINGS = {'baudrate': 115200, 'bits': 8, 'parity': 0, 'sbits': 0}

STTY_EXTRA_ARGS = [
    '-ignbrk', '-brkint', '-ignpar', '-parmrk', '-inpck', '-istrip', '-inlcr',
    '-igncr', '-icrnl', '-ixon', '-ixoff', '-iuclc', '-ixany', '-imaxbel',
    '-iutf8', '-opost', '-olcuc', '-ocrnl', 'onlcr', '-onocr', '-onlret',
    '-ofill', '-ofdel', 'nl0', 'cr0', 'tab0', 'bs0', 'vt0', 'ff0', '-isig',
    '-icanon', '-iexten', '-echo', '-echoe', '-echok', '-echonl', '-noflsh',
    '-xcase', '-tostop', '-echoprt', '-echoctl', '-echoke'
]

# Uart Signal Names
TXD_PATTERN = 'uart%d_txd'
TXD_MODE = 0x0
RXD_PATTERN = 'uart%d_rxd'
RXD_MODE = 0X2


class BBuartError(Exception):
  """Class for exceptions of Buart."""

  def __init__(self, msg, value=0):
    """BBuartError constructor.

    Args:
      msg: string, message describing error in detail
      value: integer, value of error when non-zero status returned.  Default=0
    """
    super(BBuartError, self).__init__(msg, value)
    self.msg = msg
    self.value = value


class BBuart(uart.Uart):
  """Provides interface to a beaglebone's UART interfaces.

  Instance Variables:
    _interface: interface dictionary for this interface.
    _uart_num: UART port number for this controller.
    _pty: pseudo terminal for this UART interface.
    _bbmux_controller: controller to select and setup signals on the
                        beaglebone's pins.
  """

  def __init__(self, interface):
    super(BBuart, self).__init__()
    self._interface = interface
    self._uart_num = interface['uart_num']
    self._pty = TTY_MAP[self._uart_num]
    if bbmux_controller.use_omapmux():
      self._bbmux_controller = bbmux_controller.BBmuxController()
      self.open()
    self._logger = logging.getLogger('bbuart')
    self._logger.debug('Initialized BBuart for interface %s with tty:%s',
                       interface, self._pty)
    # Beaglebone defaults to a baudrate of 9600, set it to what servo expects.
    self.set_uart_props(DEFAULT_UART_SETTINGS)

  def _open_pin(self, params, pattern, mode):
    """Selects a Uart signal (TX or RX) through the OMAP Muxes.

    Most of the uart signals are labelled properly in the mux files; however,
    uart 5 is not. Therefore any interfaces with specifically labelled
    transmit or receive signals can provide the mux file name and which select
    value to use via the params arg.

    Args:
      params: can be None. If not a list of muxfile name and and the select
              value to open this signal.
      pattern: if params is not supplied, the signal pattern to use to select
               this signal.
      mode: mode value to set the pull of the pin.
    """
    if params:
      self._bbmux_controller.set_muxfile(params[0], mode, params[1])
    else:
      # Have the bbmux controller determine the correct mux file and select
      # value.
      self._bbmux_controller.set_pin_mode(pattern % self._uart_num, mode)

  def open(self):
    """Opens access to beaglebone uart interface.

    Only necessary on Beaglebone kernel 3.2
    """
    self._open_pin(self._interface.get('txd', None), TXD_PATTERN, TXD_MODE)
    self._open_pin(self._interface.get('rxd', None), RXD_PATTERN, RXD_MODE)

  def close(self):
    """Closes connection to beaglebone uart interface.

    Raises:
      BBuartError: If close fails
    """
    pass

  def _get_value(self, output, regex):
    """Parses output supplied from stty to retrieve an Uart attribute.

    Args:
      output: output supplied from stty.
      regex: regex to retrieve a value from output. Note this regex requires
             a group named 'value'

    Raises:
      BBuartError: If regex is invalid or failed to retrieve 'value' from the
                   output.
    """
    if 'value' not in regex:
      # Invalid regex passed in.
      raise BBuartError('Improper regex passed in: %s.' % regex)
    value = re.search(regex, output)
    if not value:
      raise BBuartError('Failed to retrieve a value for %s with output: %s'
                        ' using regex: %s' % (self._pty, output, regex))
    return value.group('value')

  def _get_sbits(self, output):
    """Parses stty output to retrieve Uart sbits.

    Args:
      output: output supplied from stty.

    Returns:
      integer, number of stop bits. Can be 0|1|2 inclusive where:
          0: 1 stop bit
          2: 2 stop bits
    """
    # stty only returns 1 or 2 stop bits.
    value = self._get_value(output, SBITS_RE)
    if '-' in value:
      return 0
    else:
      return 2

  def _get_parity(self, output):
    """Parses stty output to retrieve Uart parity.

    Args:
      output: output supplied from stty.

    Returns:
      parity of 0-2 inclusive where:
          0: no parity
          1: odd parity
          2: even parity
    """
    if '-parenb' in output:
      # Parity is disabled.
      parity = 0
    else:
      par_mode = re.search(PARITY_RE, output)
      if par_mode.group(0) is '-parodd':
        parity = 2
      else:
        parity = 1
    return parity

  def get_uart_props(self):
    """Gets the uart's properties.

    Calls stty and parses it's output. Example (shortened) output:

    speed 115200 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    -parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts

    Returns:
      dict where:
        baudrate: integer of uarts baudrate
        bits: integer, number of bits of data Can be 5|6|7|8 inclusive
        parity: integer, parity of 0-2 inclusive where:
          0: no parity
          1: odd parity
          2: even parity
        sbits: integer, number of stop bits.  Can be 0|1|2 inclusive where:
          0: 1 stop bit
          1: 1.5 stop bits
          2: 2 stop bits

    Raises:
      BBuartError: Unable to properly parse stty output.
    """
    self._logger.debug('Getting uart properties for interface: %s.',
                       self._interface)
    line_props = {}
    stty_args = ['stty', '-F', self._pty, '-a']
    self._logger.debug('Calling %s', ' '.join(stty_args))
    try:
      output = subprocess.check_output(stty_args)
    except subprocess.CalledProcessError as e:
      raise BBuartError('Failed to get uart properites for %s with error: %s.' %
                        (self._pty, e))

    line_props['baudrate'] = int(self._get_value(output, SPEED_RE), 0)
    line_props['parity'] = self._get_parity(output)
    line_props['bits'] = int(self._get_value(output, BITS_RE), 0)
    line_props['sbits'] = self._get_sbits(output)

    return line_props

  def set_uart_props(self, line_props):
    """Sets the uart's properties.

    Args:
      line_props: dict where:
        baudrate: integer of uarts baudrate
        bits: integer, number of bits of data ( prior to stop bit)
        parity: integer, parity of 0-2 inclusive where
          0: no parity
          1: odd parity
          2: even parity
        sbits: integer, number of stop bits.  Can be 0|1|2 inclusive where:
          0: 1 stop bit
          1: 1.5 stop bits
          2: 2 stop bits

    Raises:
      BBuartError: If failed to set line properties
    """
    self._logger.debug('Setting line props to: %s', line_props)
    self._uart_props_validation(line_props, exception_type=BBuartError)

    bits = 'cs%d' % line_props['bits']
    # According to the web, a UART set to 1 stop bit can receive 1.5 fine.
    sbits = SBITS_MAP[line_props['sbits']]
    parity = PARITY_MAP[line_props['parity']]

    stty_args = [
        'stty', '-F', self._pty,
        '%d' % line_props['baudrate'], bits, sbits, parity
    ]
    stty_args.extend(STTY_EXTRA_ARGS)
    try:
      subprocess.check_output(stty_args)
    except subprocess.CalledProcessError as e:
      raise BBuartError('Failed to set uart properites for %s with output: %s.'
                        ' Error: %s.' % (self._pty, e.output, e))

  def get_pty(self):
    """Gets path to pty for communication to/from uart.

    Returns:
      String path to the pty connected to the uart
    """
    return self._pty
