1 # Copyright (c) 2014 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 import cdma_activate_machine 6 import connect_cdma_machine 7 import connect_machine 8 import disable_machine 9 import disconnect_machine 10 import enable_machine 11 import pm_constants 12 import register_cdma_machine 13 import register_machine 14 15 class StateMachineFactory(object): 16 """ 17 State machines are created by the |Modem| objects by calling methods from 18 an object of type StateMachineFactory. 19 20 To supply your own state machines, simply pass in your own subclass of 21 |StateMachineFactory| that provides your implementations of the 22 state machine. 23 24 This default implementation allows tailoring the different state machines to 25 be interactive as needed. 26 27 """ 28 def __init__(self): 29 self._bus = None 30 self._interactive = set() 31 32 33 def SetBus(self, bus): 34 """ 35 Set the default dbus bus. 36 37 @param bus: The dbus bus. 38 39 """ 40 self._bus = bus 41 42 43 def SetInteractiveAll(self): 44 """ 45 Set all machines to be launched in interactive mode. 46 47 All core pseudomodem machines should appear here. If you add a state 48 machine to pseudomodem, please add it here so that tests can easily run 49 it in interactive mode. 50 51 """ 52 self.SetInteractive(pm_constants.STATE_MACHINE_CDMA_ACTIVATE) 53 self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT) 54 self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT_CDMA) 55 self.SetInteractive(pm_constants.STATE_MACHINE_DISABLE) 56 self.SetInteractive(pm_constants.STATE_MACHINE_DISCONNECT) 57 self.SetInteractive(pm_constants.STATE_MACHINE_ENABLE) 58 self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER) 59 self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER_CDMA) 60 61 62 def SetInteractive(self, machine_name): 63 """ 64 Set the given machine to be launched in interative mode. 65 66 @param machine_name: The name of the machine to be launched in 67 interactive mode. 68 69 """ 70 self._interactive.add(machine_name) 71 72 73 def CreateMachine(self, machine_name, *args, **kwargs): 74 """ 75 Create an instance of the given machine. 76 77 @param machine_name: The name of the machine to be created. All 78 supported machine names are exported as constants in the 79 |pm_constants| module. 80 @param *args, **kwargs: Arguments to pass to the machine constructor. 81 @returns: A new instance of the deseried machine 82 83 """ 84 if machine_name == pm_constants.STATE_MACHINE_CDMA_ACTIVATE: 85 machine = cdma_activate_machine.CdmaActivateMachine(*args, **kwargs) 86 elif machine_name == pm_constants.STATE_MACHINE_CONNECT: 87 machine = connect_machine.ConnectMachine(*args, **kwargs) 88 elif machine_name == pm_constants.STATE_MACHINE_CONNECT_CDMA: 89 machine = connect_cdma_machine.ConnectCdmaMachine(*args, **kwargs) 90 elif machine_name == pm_constants.STATE_MACHINE_DISABLE: 91 machine = disable_machine.DisableMachine(*args, **kwargs) 92 elif machine_name == pm_constants.STATE_MACHINE_DISCONNECT: 93 machine = disconnect_machine.DisconnectMachine(*args, **kwargs) 94 elif machine_name == pm_constants.STATE_MACHINE_ENABLE: 95 machine = enable_machine.EnableMachine(*args, **kwargs) 96 elif machine_name == pm_constants.STATE_MACHINE_REGISTER: 97 machine = register_machine.RegisterMachine(*args, **kwargs) 98 elif machine_name == pm_constants.STATE_MACHINE_REGISTER_CDMA: 99 machine = register_cdma_machine.RegisterCdmaMachine(*args, **kwargs) 100 else: 101 # Reaching here is a non recoverable programming error. 102 assert False 103 104 if machine_name in self._interactive: 105 machine.EnterInteractiveMode(self._bus) 106 return machine 107