# 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