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.
78 lines
2.7 KiB
78 lines
2.7 KiB
# Copyright (c) 2014 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.
|
|
|
|
"""
|
|
This module provides bindings for PseudoModem Manager.
|
|
|
|
"""
|
|
|
|
import dbus
|
|
import logging
|
|
|
|
import mm1_proxy
|
|
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.cros.cellular import mm1_constants
|
|
from autotest_lib.client.cros.cellular.pseudomodem import pm_constants
|
|
|
|
|
|
class PseudoMMProxy(mm1_proxy.ModemManager1Proxy):
|
|
"""A wrapper around a DBus proxy for PseudoModem Manager."""
|
|
|
|
# Used for software message propagation latencies.
|
|
SHORT_TIMEOUT_SECONDS = 2
|
|
|
|
@property
|
|
def iface_testing(self):
|
|
"""@return org.chromium.Pseudomodem.Testing DBus interface."""
|
|
return dbus.Interface(
|
|
self._bus.get_object(mm1_constants.I_MODEM_MANAGER,
|
|
pm_constants.TESTING_PATH),
|
|
pm_constants.I_TESTING)
|
|
|
|
|
|
def iface_ism(self, machine_name, timeout_seconds=SHORT_TIMEOUT_SECONDS):
|
|
"""
|
|
Get the testing interface of the given interactive state machine.
|
|
|
|
@param machine_name: The name of the interactive state machine.
|
|
@param timeout_seconds: Max number of seconds to wait until interactive
|
|
state machine becomes available.
|
|
@return dbus.Interface for the testing interface of
|
|
InteractiveScanningMachine.
|
|
@raise mm1_proxy.ModemManager1ProxyError if a valid DBus object can't
|
|
be found.
|
|
|
|
"""
|
|
def _get_machine(ignore_error):
|
|
machine = self._bus.get_object(
|
|
mm1_constants.I_MODEM_MANAGER,
|
|
'/'.join([pm_constants.TESTING_PATH, machine_name]))
|
|
if machine is None:
|
|
return None
|
|
|
|
i_machine = dbus.Interface(machine, pm_constants.I_TESTING_ISM)
|
|
# Only way to know if this DBus object is valid is to call a
|
|
# method on it.
|
|
try:
|
|
i_machine.IsWaiting() # Ignore result.
|
|
return i_machine
|
|
except dbus.exceptions.DBusException as e:
|
|
if ignore_error:
|
|
return None
|
|
logging.debug(e)
|
|
raise mm1_proxy.ModemManager1ProxyError(
|
|
'Failed to obtain a valid object for interactive '
|
|
'state machine %s. DBus error: %s',
|
|
machine_name,
|
|
repr(e))
|
|
|
|
try:
|
|
utils.poll_for_condition(
|
|
lambda: _get_machine(True), timeout=timeout_seconds)
|
|
except utils.TimeoutError as e:
|
|
pass
|
|
|
|
return _get_machine(False)
|