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