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 |