adafruit-beaglebone-io-python/Adafruit_BBIO/sysfs.py
Sam Bristow eff11b83fe Use print() function in all code and docs
Low-hanging fruit of Python3 compatibility work.

I've left fix_py_compile.py as it is only ever going to be run under
Python 2.
2018-10-09 23:34:26 +13:00

118 lines
3.9 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2014 MIT OpenCourseWare
# Copyright (c) 2017 Adafruit Industries
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Code originally published at http://stackoverflow.com/questions/4648792/ and
# subsequently forked at https://github.com/ponycloud/python-sysfs
#
# Original author: Benedikt Reinartz <filmor@gmail.com>
# Contributors:
# - Jan Dvořák <mordae@anilinux.org>
# - Jonathon Reinhart https://github.com/JonathonReinhart
# - Ondřej Koch <o.koch@zerusnet.com>
# - David Planella <david.planella@ubuntu.com>
"""
Simplistic Python SysFS interface. It enables access to the sys filesystem device
nodes and to get and set their exposed attributes.
Usage examples::
from sysfs import sys
# Print all block devices in /sys, with their sizes
for block_dev in sys.block:
print(block_dev, str(int(block_dev.size) / 1048576) + ' M')
>>> import sysfs
>>> # Read/write Beaglebone Black's eQEP module attributes
>>> eqep0 = sysfs.Node("/sys/devices/platform/ocp/48300000.epwmss/48300180.eqep")
>>> # Read eqep attributes
>>> eqep0.enabled
'1'
>>> eqep0.mode
'0'
>>> eqep0.period
'1000000000'
>>> eqep0.position
'0'
>>> # Write eqep attributes. They should be strings.
>>> eqep0.position = str(2)
>>> eqep0.position
'2'
"""
from os import listdir
from os.path import isdir, isfile, join, realpath, basename
__all__ = ['sys', 'Node']
class Node(object):
__slots__ = ['_path_', '__dict__']
def __init__(self, path='/sys'):
self._path_ = realpath(path)
if not self._path_.startswith('/sys/') and not '/sys' == self._path_:
raise RuntimeError('Using this on non-sysfs files is dangerous!')
self.__dict__.update(dict.fromkeys(listdir(self._path_)))
def __repr__(self):
return '<sysfs.Node "%s">' % self._path_
def __str__(self):
return basename(self._path_)
def __setattr__(self, name, val):
if name.startswith('_'):
return object.__setattr__(self, name, val)
path = realpath(join(self._path_, name))
if isfile(path):
with open(path, 'w') as fp:
fp.write(val)
else:
raise RuntimeError('Cannot write to non-files.')
def __getattribute__(self, name):
if name.startswith('_'):
return object.__getattribute__(self, name)
path = realpath(join(self._path_, name))
if isfile(path):
with open(path, 'r') as fp:
return fp.read().strip()
elif isdir(path):
return Node(path)
def __setitem__(self, name, val):
return setattr(self, name, val)
def __getitem__(self, name):
return getattr(self, name)
def __iter__(self):
return iter(getattr(self, name) for name in listdir(self._path_))
sys = Node()