blob: c5fcb8ec986ad8319b58fb41af327631cfc0f1d4 [file] [log] [blame]
# -*- 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