Home | History | Annotate | Download | only in cellular
      1 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """Constants, enums, and basic types for cellular base station emulation."""
      6 
      7 DEFAULT_TIMEOUT = 10
      8 
      9 
     10 def Enum(enum_name, items):
     11     """Build a class with a member for each item.
     12 
     13     Arguments:
     14       members: A list of items for the enum.  They must be valid python
     15        identifiers
     16     """
     17     class output(object):
     18         pass
     19 
     20     for item in items:
     21         setattr(output, item, enum_name + ':' + item)
     22 
     23     return output
     24 
     25 
     26 Technology = Enum('Technology', [
     27     'GPRS',
     28     'EGPRS',
     29     'WCDMA',
     30     'HSDPA',
     31     'HSUPA',
     32     'HSDUPA',
     33     'HSPA_PLUS',
     34     'CDMA_2000',
     35     'EVDO_1X',
     36     'LTE'
     37 ])
     38 
     39 TechnologyFamily = Enum('TechnologyFamily', [
     40     'UMTS',
     41     'CDMA',
     42     'LTE'
     43 ])
     44 
     45 TechnologyToFamily = {
     46     Technology.GPRS: TechnologyFamily.UMTS,
     47     Technology.EGPRS: TechnologyFamily.UMTS,
     48     Technology.WCDMA: TechnologyFamily.UMTS,
     49     Technology.HSDPA: TechnologyFamily.UMTS,
     50     Technology.HSUPA: TechnologyFamily.UMTS,
     51     Technology.HSDUPA: TechnologyFamily.UMTS,
     52     Technology.HSPA_PLUS: TechnologyFamily.UMTS,
     53     Technology.CDMA_2000: TechnologyFamily.CDMA,
     54     Technology.EVDO_1X: TechnologyFamily.CDMA,
     55     Technology.LTE: TechnologyFamily.LTE,
     56 }
     57 
     58 
     59 UeGsmDataStatus = Enum('GsmDataStatus', [
     60     'NONE',
     61     'IDLE',
     62     'ATTACHING',
     63     'ATTACHED',
     64     'DETACHING',
     65     'PDP_ACTIVATING',
     66     'PDP_ACTIVE',
     67     'PDP_DEACTIVATING',
     68 ])
     69 
     70 UeC2kDataStatus = Enum('C2kDataStatus', [
     71     'OFF',
     72     'DORMANT',
     73     'DATA_CONNECTED',
     74 ])
     75 
     76 UeEvdoDataStatus = Enum('EvdoDataStatus', [
     77     'CONNECTION_CLOSING',
     78     'CONNECTION_NEGOTIATE',
     79     'CONNECTION_REQUEST',
     80     'DATA_CONNECTED',
     81     'DORMANT',
     82     'HANDOFF',
     83     'IDLE',
     84     'PAGING',
     85     'SESSION_CLOSING',
     86     'SESSION_NEGOTIATE',
     87     'SESSION_OPEN',
     88     'UATI_REQUEST',
     89 ])
     90 
     91 # todo(byronk): Move this LTE specific data into the LTE call_box object
     92 UeLteDataStatus = Enum('LteDataStatus', [
     93     'OFF',
     94     'IDLE',
     95     'CONNECTED',
     96     'REGISTERED',
     97     'LOOPBACK',
     98     'RELEASE',
     99     'UNAVAILABLE',
    100 ])
    101 
    102 # Each cell technology has a different connection state machine.  For
    103 # generic tests, we want to abstract that away.  UeGenericDataStatus
    104 # is this abstraction, and RatToGenericDataStatus is a map from
    105 # specific states to this generic status.
    106 
    107 
    108 # TODO(rochberg):  Do we need connecting/disconnecting for this level of test?
    109 UeGenericDataStatus = Enum('UeGenericDataStatus', [
    110     'NONE',             # UE not seen or in transition to/from REGISTERED
    111     'REGISTERED',       # Network knows about UE
    112     'CONNECTED',        # Data can be sent
    113     'CONNECTING',
    114     'DISCONNECTING',
    115 ])
    116 
    117 
    118 RatToGenericDataStatus = {
    119     UeGsmDataStatus.NONE: UeGenericDataStatus.NONE,
    120     UeGsmDataStatus.IDLE: UeGenericDataStatus.NONE,
    121     UeGsmDataStatus.ATTACHING: UeGenericDataStatus.NONE, # Transition
    122     UeGsmDataStatus.ATTACHED: UeGenericDataStatus.REGISTERED,
    123     UeGsmDataStatus.DETACHING: UeGenericDataStatus.NONE, # Transition
    124     UeGsmDataStatus.PDP_ACTIVATING: UeGenericDataStatus.CONNECTING,
    125     UeGsmDataStatus.PDP_ACTIVE: UeGenericDataStatus.CONNECTED,
    126     UeGsmDataStatus.PDP_DEACTIVATING: UeGenericDataStatus.DISCONNECTING,
    127 
    128     UeC2kDataStatus.OFF: UeGenericDataStatus.NONE,
    129     UeC2kDataStatus.DORMANT: UeGenericDataStatus.CONNECTED,
    130     UeC2kDataStatus.DATA_CONNECTED: UeGenericDataStatus.CONNECTED,
    131 
    132     UeEvdoDataStatus.CONNECTION_CLOSING: UeGenericDataStatus.DISCONNECTING,
    133     UeEvdoDataStatus.CONNECTION_NEGOTIATE: UeGenericDataStatus.CONNECTING,
    134     UeEvdoDataStatus.CONNECTION_REQUEST: UeGenericDataStatus.CONNECTING,
    135     UeEvdoDataStatus.DATA_CONNECTED: UeGenericDataStatus.CONNECTED,
    136     UeEvdoDataStatus.DORMANT: UeGenericDataStatus.CONNECTED,
    137     UeEvdoDataStatus.HANDOFF: UeGenericDataStatus.CONNECTING,
    138     UeEvdoDataStatus.IDLE: UeGenericDataStatus.CONNECTED,
    139     UeEvdoDataStatus.PAGING: UeGenericDataStatus.CONNECTED,
    140     UeEvdoDataStatus.SESSION_CLOSING: UeGenericDataStatus.DISCONNECTING,
    141     UeEvdoDataStatus.SESSION_NEGOTIATE: UeGenericDataStatus.CONNECTING,
    142     UeEvdoDataStatus.SESSION_OPEN: UeGenericDataStatus.REGISTERED,
    143     UeEvdoDataStatus.UATI_REQUEST: UeGenericDataStatus.NONE,
    144     UeLteDataStatus.OFF: UeGenericDataStatus.NONE,
    145     UeLteDataStatus.IDLE: UeGenericDataStatus.NONE,
    146     UeLteDataStatus.CONNECTED: UeGenericDataStatus.CONNECTED,
    147     UeLteDataStatus.REGISTERED: UeGenericDataStatus.REGISTERED,
    148     UeLteDataStatus.LOOPBACK: UeGenericDataStatus.NONE,
    149     UeLteDataStatus.RELEASE: UeGenericDataStatus.DISCONNECTING,
    150     UeLteDataStatus.UNAVAILABLE: UeGenericDataStatus.NONE
    151 }
    152 
    153 
    154 class Power(object):
    155     """Useful power levels, in dBm."""
    156     OFF = -200
    157     DEFAULT = -35
    158 
    159 
    160 class SmsAddress(object):
    161     def __init__(self, address, address_type='INAT', address_plan='ISDN'):
    162         """Constructs an SMS address.
    163 
    164         For expediency, the address type arguments come from the GPIB
    165         commands for the Agilent 8960.  See
    166         http://wireless.agilent.com/rfcomms/refdocs/
    167                gsmgprs/gprsla_hpib_sms.html#CIHDGBIH
    168 
    169         Arguments:
    170             address:  1-10 octets
    171             address_type:  INAT, NAT, NET, SUBS, ALPH, ABBR, RES
    172             address_plan:  ISDN, DATA, TEL, SCS1, SCS2, PRIV, NATional,
    173                            ERMes, RES
    174         """
    175         self.address = address
    176         self.address_type = address_type
    177         self.address_plan = address_plan
    178 
    179 
    180 class TestEnvironment(object):
    181     def __init__(self, event_loop):
    182         pass
    183 
    184     def RequestBaseStations(self,
    185                             configuration,
    186                             requirements_list):
    187         """Requests a set of base stations that satisfy the given requirements.
    188 
    189         Arguments:
    190             configuration:  configuration dictionary
    191             requirements_list: A list of lists of technologies that must be
    192                                supported
    193 
    194         Returns: a list of base stations.
    195         """
    196         pass
    197 
    198     def TimedOut(self):
    199         """Called by base stations when an expected event hasn't occurred."""
    200         pass
    201