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