Source code for stoqlib.lib.devicemanager

# -*- Mode: Python; coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2007 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##

"""Device handling, probing hardware
"""

import operator
import platform

try:
    import gudev
    gudev  # pylint: disable=W0104
except ImportError:
    gudev = None

try:
    import dbus
    dbus  # pylint: disable=W0104
except ImportError:
    dbus = None

from stoqlib.lib.translation import locale_sorted

if dbus:
    class _HALDevice(object):
        def __init__(self, bus, udi):
            self._device = dbus.Interface(
                bus.get_object('org.freedesktop.Hal', udi),
                'org.freedesktop.Hal.Device')

        def get(self, property):
            return self._device.GetProperty(property)

    class _HALManager(object):
        def __init__(self):
            self._bus = dbus.SystemBus()
            hal_obj = self._bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
            self._hal = dbus.Interface(hal_obj, 'org.freedesktop.Hal.Manager')

        def find_device(self, capability):
            for udi in self._hal.FindDeviceByCapability(capability):
                yield _HALDevice(self._bus, udi)


[docs]class SerialDevice(object): """An object representing a serial device :attribute device_name: the device name, /dev/ttyXXX """ def __init__(self, device_name): """ Create a new SerialDevice object. :param device_name: name of the device """ self.device_name = device_name
[docs]class DeviceManager(object): """DeviceManager is responsible for interacting with hardware devices. It optionally uses HAL to probe the system """ def __init__(self): self._hal_manager = None if dbus: try: self._hal_manager = _HALManager() except dbus.DBusException: pass def _get_default_devices(self): if platform.system() == "Windows": # This could be something to run in all cases, since it appears to # work for linux as well. This way this code could be a lot simpler. # TODO: Test this on other versions of ubuntu from serial.tools.list_ports import comports ports = [] for port in comports(): ports.append(SerialDevice(port.device)) return ports else: return [SerialDevice('/dev/ttyS0'), SerialDevice('/dev/ttyS1')] def _get_hal_devices(self): devices = [] for device in self._hal_manager.find_device(capability=u'serial'): devices.append(SerialDevice(device.get('serial.device'))) return devices def _get_gudev_devices(self): client = gudev.Client(["tty", 'usb-serial']) devices = [] # usb serial devices for dev in client.query_by_subsystem("usb-serial"): devices.append(SerialDevice('/dev/' + dev.get_name())) # serial tty devices for dev in client.query_by_subsystem("tty"): parent = dev.get_parent() if parent is None: continue if parent.get_driver() != 'serial': continue devices.append(SerialDevice('/dev/' + dev.get_name())) return devices
[docs] def get_serial_devices(self): """Get a list of serial devices available on the system :returns: a list of :class:`SerialDevice` """ if gudev: devices = self._get_gudev_devices() elif self._hal_manager: devices = self._get_hal_devices() else: devices = self._get_default_devices() return locale_sorted(devices, key=operator.attrgetter('device_name'))