You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
4.7 KiB
115 lines
4.7 KiB
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import logging
|
|
|
|
import pm_errors
|
|
import state_machine
|
|
|
|
from autotest_lib.client.cros.cellular import mm1_constants
|
|
|
|
class EnableMachine(state_machine.StateMachine):
|
|
"""
|
|
EnableMachine handles the state transitions involved in bringing the modem
|
|
to the ENABLED state.
|
|
|
|
"""
|
|
def __init__(self, modem, return_cb, raise_cb):
|
|
super(EnableMachine, self).__init__(modem)
|
|
self.return_cb = return_cb
|
|
self.raise_cb = raise_cb
|
|
|
|
|
|
def Cancel(self):
|
|
""" Overriden from superclass. """
|
|
logging.info('EnableMachine: Canceling enable.')
|
|
super(EnableMachine, self).Cancel()
|
|
state = self._modem.Get(mm1_constants.I_MODEM, 'State')
|
|
reason = mm1_constants.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
|
|
if state == mm1_constants.MM_MODEM_STATE_ENABLING:
|
|
logging.info('EnableMachine: Setting state to DISABLED.')
|
|
self._modem.ChangeState(mm1_constants.MM_MODEM_STATE_DISABLED,
|
|
reason)
|
|
self._modem.enable_step = None
|
|
if self.raise_cb:
|
|
self.raise_cb(pm_errors.MMCoreError(
|
|
pm_errors.MMCoreError.CANCELLED, 'Operation cancelled'))
|
|
|
|
|
|
def _HandleDisabledState(self):
|
|
assert self._modem.disable_step is None
|
|
assert self._modem.disconnect_step is None
|
|
logging.info('EnableMachine: Setting power state to ON')
|
|
self._modem.SetUInt32(mm1_constants.I_MODEM, 'PowerState',
|
|
mm1_constants.MM_MODEM_POWER_STATE_ON)
|
|
logging.info('EnableMachine: Setting state to ENABLING')
|
|
reason = mm1_constants.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
|
|
self._modem.ChangeState(mm1_constants.MM_MODEM_STATE_ENABLING, reason)
|
|
return True
|
|
|
|
|
|
def _HandleEnablingState(self):
|
|
assert self._modem.disable_step is None
|
|
assert self._modem.disconnect_step is None
|
|
logging.info('EnableMachine: Setting state to ENABLED.')
|
|
reason = mm1_constants.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
|
|
self._modem.ChangeState(mm1_constants.MM_MODEM_STATE_ENABLED, reason)
|
|
return True
|
|
|
|
|
|
def _HandleEnabledState(self):
|
|
assert self._modem.disable_step is None
|
|
assert self._modem.disconnect_step is None
|
|
logging.info('EnableMachine: Searching for networks.')
|
|
self._modem.enable_step = None
|
|
if self.return_cb:
|
|
self.return_cb()
|
|
self._modem.RegisterWithNetwork()
|
|
return False
|
|
|
|
|
|
def _GetModemStateFunctionMap(self):
|
|
return {
|
|
mm1_constants.MM_MODEM_STATE_DISABLED:
|
|
EnableMachine._HandleDisabledState,
|
|
mm1_constants.MM_MODEM_STATE_ENABLING:
|
|
EnableMachine._HandleEnablingState,
|
|
mm1_constants.MM_MODEM_STATE_ENABLED:
|
|
EnableMachine._HandleEnabledState
|
|
}
|
|
|
|
|
|
def _ShouldStartStateMachine(self):
|
|
state = self._modem.Get(mm1_constants.I_MODEM, 'State')
|
|
# Return success if already enabled.
|
|
if state >= mm1_constants.MM_MODEM_STATE_ENABLED:
|
|
logging.info('Modem is already enabled. Nothing to do.')
|
|
if self.return_cb:
|
|
self.return_cb()
|
|
return False
|
|
if self._modem.enable_step and self._modem.enable_step != self:
|
|
# There is already an enable operation in progress.
|
|
# Note: ModemManager currently returns "WrongState" for this case.
|
|
# The API suggests that "InProgress" should be returned, so that's
|
|
# what we do here.
|
|
logging.error('There is already an ongoing enable operation')
|
|
if state == mm1_constants.MM_MODEM_STATE_ENABLING:
|
|
message = 'Modem enable already in progress.'
|
|
else:
|
|
message = 'Modem enable has already been initiated' \
|
|
', ignoring.'
|
|
raise pm_errors.MMCoreError(pm_errors.MMCoreError.IN_PROGRESS,
|
|
message)
|
|
elif self._modem.enable_step is None:
|
|
# There is no enable operation going on, cancelled or otherwise.
|
|
if state != mm1_constants.MM_MODEM_STATE_DISABLED:
|
|
message = 'Modem cannot be enabled if not in the DISABLED' \
|
|
' state.'
|
|
logging.error(message)
|
|
raise pm_errors.MMCoreError(pm_errors.MMCoreError.WRONG_STATE,
|
|
message)
|
|
logging.info('Starting Enable')
|
|
self._modem.enable_step = self
|
|
return True
|