View difference between Paste ID: 1UCnbVNT and z2p618S6
SHOW: | | - or go back to the newest paste.
1-
##### common for all of these #####
1+
# These examples assume /dev/gpio contains symlinks for sysfs gpios.
2
#
3
# Example udev rule:
4
#
5-
_gpio_dir = Path('/dev/gpio')
5+
#	SUBSYSTEM=="subsystem", KERNEL=="gpio", ACTION=="add", \
6
#		RUN+="/bin/mkdir -p /dev/gpio"
7
#
8
#	SUBSYSTEM=="gpio", ACTION=="add", TEST=="value", ATTR{label}!="sysfs", \
9-
##### version 1
9+
#		RUN+="/bin/ln -sT '/sys/class/gpio/%k' /dev/gpio/%s{label}"
10
#
11
# save as e.g. /etc/udev/rules.d/gpio-symlinks.rules
12-
    return int( (_gpio_dir/name/'value').read_text() )
12+
# then "sudo update-initramfs -u" (unless you don't use initramfs) and reboot
13
#
14
#
15-
    (_gpio_dir/name/'value').write_text( str(value) )
15+
# This code is written to be simple and correct, not necessarily efficient.
16
# Performance can probably be greatly improved by keeping a file descriptor
17
# open for the 'value' attribute and using os.pread() and os.write().  This
18
# would also be the first step towards supporting input change events.
19
#
20
# This also assumes that the direction (input/output) of gpios has already
21
# been setup, e.g. in DT.  Attempting to set the value of an input will not
22
# change it to output, it will simply fail.  For a slightly more elaborate
23-
##### version 2
23+
# version of 'variant 1' that includes changing the direction of gpios and
24
# also has more comments and error checking, see https://pastebin.com/cVHktYPn
25
26
27
##### variant 1
28-
        self._value_path = _gpio_dir/name/'value'
28+
29
from pathlib import Path
30
31
def gpio_get_value( name ):
32
    return int( Path('/dev/gpio', name, 'value').read_text() )
33
34
def gpio_set_value( name, value ):
35
    Path('/dev/gpio', name, 'value').write_text( str(value) )
36
37
print( gpio_get_value( 'my-input' ) )
38
print( gpio_get_value( 'my-output' ) )
39
gpio_set_value( 'my-output', 1 )
40
41
42
43
##### variant 2
44
45-
##### version 3
45+
46
47
class Gpio:
48
    def __init__( self, name ):
49
        self.name = name
50-
        self._value_path = _gpio_dir/name/'value'
50+
        self._value_path = Path( '/dev/gpio', name, 'value' )
51
52
    def get_value( self ):
53
        return int( self._value_path.read_text() )
54
55
    def set_value( self, value ):
56
        self._value_path.write_text( str( value ) )
57
58
my_input = Gpio('my-input')
59
my_output = Gpio('my-output')
60
61
print( my_input.get_value() )
62
print( my_output.get_value() )
63
my_output.set_value( 1 )
64
65
66
67
##### variant 3
68
69
from pathlib import Path
70
71
class Gpio:
72
    def __init__( self, name ):
73
        self.name = name
74
        self._value_path = Path( '/dev/gpio', name, 'value' )
75
76
    @property
77
    def value( self ):
78
        return int( self._value_path.read_text() )
79
80
    @value.setter
81
    def value( self, value ):
82
        self._value_path.write_text( str( value ) )
83
84
my_input = Gpio('my-input')
85
my_output = Gpio('my-output')
86
87
print( my_input.value )
88
print( my_output.value )
89
my_output.value = 1