blob: 17906369b41e221a6d314196b55942586bd08f75 [file] [log] [blame]
# 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 mm1
import state_machine
class EnableMachine(state_machine.StateMachine):
def Cancel(self):
logging.info('EnableMachine: Canceling enable.')
super(EnableMachine, self).Cancel()
state = self._modem.Get(mm1.I_MODEM, 'State')
reason = mm1.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
if state == mm1.MM_MODEM_STATE_ENABLING:
logging.info('EnableMachine: Setting state to DISABLED.')
self._modem.ChangeState(mm1.MM_MODEM_STATE_DISABLED, reason)
self._modem.enable_step = None
def _HandleDisabledState(self):
assert self._modem.disable_step is None
assert self._modem.connect_step is None
assert self._modem.disconnect_step is None
logging.info('EnableMachine: Setting power state to ON')
self._modem.SetUInt32(mm1.I_MODEM, 'PowerState',
mm1.MM_MODEM_POWER_STATE_ON)
logging.info('EnableMachine: Setting state to ENABLING')
reason = mm1.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
self._modem.ChangeState(mm1.MM_MODEM_STATE_ENABLING, reason)
return True
def _HandleEnablingState(self):
assert self._modem.disable_step is None
assert self._modem.connect_step is None
assert self._modem.disconnect_step is None
logging.info('EnableMachine: Setting state to ENABLED.')
reason = mm1.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
self._modem.ChangeState(mm1.MM_MODEM_STATE_ENABLED, reason)
return True
def _HandleEnabledState(self):
assert self._modem.disable_step is None
assert self._modem.connect_step is None
assert self._modem.disconnect_step is None
logging.info('EnableMachine: Searching for networks.')
self._modem.enable_step = None
self._modem.RegisterWithNetwork()
return False
def _GetModemStateFunctionMap(self):
return {
mm1.MM_MODEM_STATE_DISABLED: EnableMachine._HandleDisabledState,
mm1.MM_MODEM_STATE_ENABLING: EnableMachine._HandleEnablingState,
mm1.MM_MODEM_STATE_ENABLED: EnableMachine._HandleEnabledState
}
def _ShouldStartStateMachine(self):
state = self._modem.Get(mm1.I_MODEM, 'State')
if self._modem.enable_step and self._modem.enable_step != self:
# There is already an enable operation in progress.
logging.error('There is already an ongoing enable operation')
if state == mm1.MM_MODEM_STATE_ENABLING:
message = 'Modem enable already in progress.'
else:
message = 'Modem enable has already been initiated' \
', ignoring.'
raise mm1.MMCoreError(mm1.MMCoreError.IN_PROGRESS, message)
elif self._modem.enable_step is None:
# There is no enable operation going on, cancelled or otherwise.
if state != mm1.MM_MODEM_STATE_DISABLED:
message = 'Modem cannot be enabled if not in the DISABLED' \
' state.'
logging.error(message)
raise mm1.MMCoreError(mm1.MMCoreError.WRONG_STATE, message)
logging.info('Starting Enable')
self._modem.enable_step = self
return True