# 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.
"""Configure cellular data emulation setup."""
import time
import common
from autotest_lib.client.cros.cellular import base_station_8960
from autotest_lib.client.cros.cellular import base_station_pxt
from autotest_lib.client.cros.cellular import cellular_logging
from autotest_lib.client.cros.cellular import ether_io_rf_switch
from autotest_lib.client.cros.cellular import prologix_scpi_driver, scpi
log = cellular_logging.SetupCellularLogging('emulator_config')
class Error(Exception):
pass
# TODO(byronk): Move this to the base_station_interface file or factory file
def _BaseStationFactory(c, technology):
"""Create a base station from a base station labconfig dictionary."""
adapter = c['gpib_adapter']
#TODO(byronk): get rid of the legacy single letter variable names
s = scpi.Scpi(
prologix_scpi_driver.PrologixScpiDriver(
hostname=adapter['address'],
port=adapter['ip_port'],
gpib_address=adapter['gpib_address']),
opc_on_stanza=True)
if technology == 'Technology:LTE':
return base_station_pxt.BaseStationPxt(s)
else:
return base_station_8960.BaseStation8960(s)
# TODO(byronk): Make this a factory class, move to a better file
def _CreateRfSwitch(config):
if 'rf_switch' not in config.cell:
return None
switch_config = config.cell['rf_switch']
if switch_config['type'] != 'ether_io':
raise KeyError('Could not configure switch of type %s' %
switch_config['type'])
return ether_io_rf_switch.RfSwitch(switch_config['address'])
def StartDefault(config, technology):
"""Set up a base station and turn it on. Return BS and verifier."""
# TODO(byronk): Stop using strings here. Config class? enum?
call_box_name_part = '8960'
if 'LTE' in technology:
call_box_name_part = 'pxt'
bs = None
# Find the first matching base station. Only a problem when we go to 3.
# TODO(byronk):This should be in the factory part
for cfg in config.cell['basestations']:
tp = cfg['type']
if call_box_name_part in tp:
bs_config = cfg
log.info('Using this call box: %s ' % cfg)
break
if bs_config is None:
raise Error(
'None of these base stations support %s: %s' %
(technology, config.cell['basestations']))
# Match up to the legacy names. TODO(byronk) :fix this mess
#TODO(byronk): get rid of the legacy single letter variable names
c = cfg
bs = _BaseStationFactory(bs_config, technology)
rf_switch = _CreateRfSwitch(config)
if rf_switch:
port = config.get_rf_switch_port()
log.info(
'Changing switch port from %s to %s' % (rf_switch.Query(), port))
rf_switch.SelectPort(port)
with bs.checker_context:
bs.SetBsNetmaskV4(c['bs_netmask'])
bs.SetBsIpV4(*c['bs_addresses'])
bs.SetUeIpV4(*c['ue_rf_addresses'])
bs.SetUeDnsV4(*c['ue_dns_addresses'])
bs.SetTechnology(technology)
bs.SetPower(-40)
verifier = bs.GetAirStateVerifier()
bs.Start()
# TODO(rochberg): Why does this seem to be necessary?
time.sleep(5)
return bs, verifier