197b42feecb57714dd543ab8010866d87c94cc609Thieu Le# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg# Use of this source code is governed by a BSD-style license that can be 3fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg# found in the LICENSE file. 4fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 5fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg"""Configure cellular data emulation setup.""" 6630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubertimport time 7fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 8630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubertimport common 997b42feecb57714dd543ab8010866d87c94cc609Thieu Lefrom autotest_lib.client.cros.cellular import base_station_8960 10630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubertfrom autotest_lib.client.cros.cellular import base_station_pxt 11630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubertfrom autotest_lib.client.cros.cellular import cellular_logging 123987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochbergfrom autotest_lib.client.cros.cellular import ether_io_rf_switch 13fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochbergfrom autotest_lib.client.cros.cellular import prologix_scpi_driver, scpi 14fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 15630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubertlog = cellular_logging.SetupCellularLogging('emulator_config') 16630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert 17630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert 180b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochbergclass Error(Exception): 190b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg pass 20fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 21630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert# TODO(byronk): Move this to the base_station_interface file or factory file 22630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubertdef _BaseStationFactory(c, technology): 230b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg """Create a base station from a base station labconfig dictionary.""" 24fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 25fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg adapter = c['gpib_adapter'] 26630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert #TODO(byronk): get rid of the legacy single letter variable names 27fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg s = scpi.Scpi( 28fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg prologix_scpi_driver.PrologixScpiDriver( 2991d57f0fd6adbafac8c8e90a28097f8f1edad427David Rochberg hostname=adapter['address'], 30fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg port=adapter['ip_port'], 3197b42feecb57714dd543ab8010866d87c94cc609Thieu Le gpib_address=adapter['gpib_address']), 32630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert opc_on_stanza=True) 33630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert if technology == 'Technology:LTE': 34630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert return base_station_pxt.BaseStationPxt(s) 35630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert else: 36630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert return base_station_8960.BaseStation8960(s) 37fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 38fa2ddb8bae799e3c97ecd15f8e4f9c13136b10abDavid Rochberg 39630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert# TODO(byronk): Make this a factory class, move to a better file 403987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochbergdef _CreateRfSwitch(config): 413987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg if 'rf_switch' not in config.cell: 423987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg return None 433987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg switch_config = config.cell['rf_switch'] 443987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg if switch_config['type'] != 'ether_io': 453987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg raise KeyError('Could not configure switch of type %s' % 463987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg switch_config['type']) 473987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg return ether_io_rf_switch.RfSwitch(switch_config['address']) 483987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg 493987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg 503987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochbergdef StartDefault(config, technology): 510b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg """Set up a base station and turn it on. Return BS and verifier.""" 52630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert # TODO(byronk): Stop using strings here. Config class? enum? 53630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert call_box_name_part = '8960' 54630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert if 'LTE' in technology: 55630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert call_box_name_part = 'pxt' 56630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert 57630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert bs = None 58630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert # Find the first matching base station. Only a problem when we go to 3. 59630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert # TODO(byronk):This should be in the factory part 60630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert for cfg in config.cell['basestations']: 61630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert tp = cfg['type'] 62630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert if call_box_name_part in tp: 63630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert bs_config = cfg 64630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert log.info('Using this call box: %s ' % cfg) 65630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert break 66630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert if bs_config is None: 67630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert raise Error( 68630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert 'None of these base stations support %s: %s' % 69630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert (technology, config.cell['basestations'])) 70630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert 71630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert # Match up to the legacy names. TODO(byronk) :fix this mess 72630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert #TODO(byronk): get rid of the legacy single letter variable names 73630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert c = cfg 74630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert bs = _BaseStationFactory(bs_config, technology) 75472dde4670cf97d939f9a0db29314a3a92cd1efaDavid Rochberg 763987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg rf_switch = _CreateRfSwitch(config) 773987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg if rf_switch: 783987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg port = config.get_rf_switch_port() 79630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert log.info( 803987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg 'Changing switch port from %s to %s' % (rf_switch.Query(), port)) 813987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg rf_switch.SelectPort(port) 823987b40ba3b4180487493aeb4d6d6bfbaab4dad0David Rochberg 830b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg with bs.checker_context: 840b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.SetBsNetmaskV4(c['bs_netmask']) 850b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.SetBsIpV4(*c['bs_addresses']) 86472dde4670cf97d939f9a0db29314a3a92cd1efaDavid Rochberg 870b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.SetUeIpV4(*c['ue_rf_addresses']) 880b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.SetUeDnsV4(*c['ue_dns_addresses']) 89472dde4670cf97d939f9a0db29314a3a92cd1efaDavid Rochberg 900b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.SetTechnology(technology) 910b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.SetPower(-40) 920b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg verifier = bs.GetAirStateVerifier() 930b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg bs.Start() 94472dde4670cf97d939f9a0db29314a3a92cd1efaDavid Rochberg 950b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg # TODO(rochberg): Why does this seem to be necessary? 960b1de6b231825bf9b65a74238799aeb14d64a7cfDavid Rochberg time.sleep(5) 97472dde4670cf97d939f9a0db29314a3a92cd1efaDavid Rochberg 98630f29391fabb13a6e6d191fa747e81512bcb726Byron Kubert return bs, verifier 99