# -*- coding: utf-8 -*-
# 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.

import unittest

import factory_common  # pylint: disable=W0611
from cros.factory.test.rf.cellular import GetIMEI
from cros.factory.test.rf.modem import Modem
from cros.factory.test.rf.utils import IsInRange
from cros.factory.test import factory
from cros.factory.test.pytests.rf_framework import RfFramework
from cros.factory.utils.sync_utils import PollForCondition
from cros.factory.test.rf.n1914a import N1914A

ENABLE_FACTORY_TEST_MODE_COMMAND = 'AT+CFUN=5'
DISABLE_FACTORY_TEST_MODE_COMMAND = 'AT+CFUN=1'

START_TX_TEST_COMMAND = 'AT+ALLUP="%s",%d,"on",75'
START_TX_TEST_RESPONSE = 'ALLUP: ON'

READ_RSSI_COMMAND = 'AT+AGC="%s",%d,"%s"'
READ_RSSI_RESPONSE = r'RSSI: ([-\d]+)'

ENABLE_TX_MODE_TIMEOUT_SECS = 5
TX_MODE_POLLING_INTERVAL_SECS = 0.5


class RadiatedCellular(RfFramework, unittest.TestCase):

  def __init__(self, *args, **kwargs):
    super(RadiatedCellular, self).__init__(*args, **kwargs)
    self.measurements = None
    self.power_meter_ip = None
    self.power_meter_port = None
    self.modem_path = None
    self.modem = None
    self.n1914a = None

  def PreTestOutsideShieldBox(self):
    factory.console.info('PreTestOutsideShieldBox called')
    # TODO(itspeter): Check all parameters are in expected type.
    self.measurements = self.config['tx_measurements']
    self.power_meter_ip = self.config['fixture_ip']
    self.power_meter_port = self.config['fixture_port']
    self.modem_path = self.config['modem_path']

  def PreTestInsideShieldBox(self):
    factory.console.info('PreTestInsideShieldBox called')
    # TODO(itspeter): Ask user to enter shield box information.
    # TODO(itspeter): Check the existence of Ethernet.
    # TODO(itspeter): Verify the validity of shield-box and calibration_config.

    # Initialize the power_meter.
    self.n1914a = N1914A(self.power_meter_ip)
    self.n1914a.SetRealFormat()
    self.n1914a.SetAverageFilter(port=self.power_meter_port, avg_length=None)
    self.n1914a.SetRange(port=self.power_meter_port, range_setting=1)
    self.n1914a.SetTriggerToFreeRun(port=self.power_meter_port)
    self.n1914a.SetContinuousTrigger(port=self.power_meter_port)

  def PrimaryTest(self):
    for measurement in self.measurements:
      measurement_name = measurement['measurement_name']
      factory.console.info('Testing %s', measurement_name)
      try:

        self.n1914a.SetMeasureFrequency(
            self.power_meter_port, measurement['frequency'])
        # Start continuous transmit
        # This may fail the first time if the modem isn't ready;
        # try a few more times.
        PollForCondition(poll_method=(
            lambda: self.StartTxTest(
                measurement['band_name'], measurement['channel'])),
                         timeout_secs=ENABLE_TX_MODE_TIMEOUT_SECS,
                         poll_interval_secs=TX_MODE_POLLING_INTERVAL_SECS,
                         condition_name='Start TX test')
        self.modem.ExpectLine('')
        self.modem.ExpectLine('OK')

        # Measure the channel power.
        tx_power = self.n1914a.MeasureOnceInBinary(self.power_meter_port)
        min_power = measurement['avg_power_threshold'][0]
        max_power = measurement['avg_power_threshold'][1]
        if not IsInRange(tx_power, min_power, max_power):
          failure = 'Power for %r is %7.2f, out of range (%s,%s)' % (
              measurement_name, tx_power, min_power, max_power)
          factory.console.info(failure)
          self.failures.append(failure)
      except Exception as e:
        # In order to collect more data, finish the whole test even if it fails.
        self.failures.append(
            'Unexpected failure on %s: %s' % (measurement_name, e))

  def PostTest(self):
    # TODO(itspeter): Switch to production drivers.
    # TODO(itspeter): Upload result to shopfloor server.
    # TODO(itspeter): Determine the test result.
    # TODO(itspeter): save statistic of measurements to csv file.
    pass

  def GetUniqueIdentification(self):
    return GetIMEI()

  def GetEquipmentIdentification(self):
    return str(self.RunEquipmentCommand(N1914A.GetMACAddress, self.n1914a))

  def EnterFactoryMode(self):
    factory.console.info('Entering factory test mode(FTM)')
    self.modem = Modem(self.modem_path)
    self.modem.SendCommand(ENABLE_FACTORY_TEST_MODE_COMMAND)
    self.modem.ExpectLine('OK')

  def ExitFactoryMode(self):
    factory.console.info('Exiting factory test mode(FTM)')
    self.modem.SendCommand(DISABLE_FACTORY_TEST_MODE_COMMAND)

  def StartTxTest(self, band_name, channel):
    self.modem.SendCommand(START_TX_TEST_COMMAND % (band_name, channel))
    line = self.modem.ReadLine()
    if 'restricted to FTM' in line:
      factory.console.info('Factory test mode not ready: %r' % line)
      return False
    return True
