shell/gpio.sh
author František Kučera <franta-hg@frantovo.cz>
Thu, 24 Oct 2019 22:03:40 +0200
branchv_0.1
changeset 5 f176e4893d17
parent 3 34e954f3ed1c
permissions -rw-r--r--
fix license version: GNU GPLv3
     1 #!/bin/bash
     2 
     3 # GPIO.sh
     4 # Copyright © 2016 František Kučera (frantovo.cz)
     5 #
     6 # This program is free software: you can redistribute it and/or modify
     7 # it under the terms of the GNU General Public License as published by
     8 # the Free Software Foundation, version 3 of the License.
     9 #
    10 # This program is distributed in the hope that it will be useful,
    11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
    12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13 # GNU General Public License for more details.
    14 #
    15 # You should have received a copy of the GNU General Public License
    16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
    17 
    18 # GPIO.sh is a set of functions for controlling GPIO pins of Raspberry Pi or similar computer
    19 
    20 _gpio_valid_port() {
    21 	case $1 in 0|1|4|7|8|9|10|11|14|15|17|18|21|22|23|24|25)
    22 		return 0;;
    23 	*)
    24 		return 1;;
    25 	esac
    26 }
    27 
    28 # export -f _gpio_valid_port
    29 # seq 0 30 | xargs -n1 bash -c 'printf "%4s" "$0: "; _gpio_valid_port $0 ; if [ $? -eq 0 ]; then echo "valid port number"; else echo; fi'
    30 
    31 
    32 _gpio_log_error() {
    33 	# TODO: $(date --rfc-3339=seconds) or ● ?
    34 	echo -e "\e[1;31m$1\e[0m"; > /dev/stderr;
    35 }
    36 
    37 _gpio_log_warning() {
    38 	echo -e "\e[2;33m$1 \e[0m"; > /dev/stderr;
    39 }
    40 
    41 
    42 # open (export) the port and set its direction
    43 # parameters:
    44 #	port number
    45 #	direction: in/out
    46 gpio_open() {
    47 	local port="$1";
    48 	local direction="$2";
    49 	if [ $# -ne 2 ] || [[ "$direction" != @("in"|"out") ]]; then _gpio_log_error "usage: ${FUNCNAME[0]} <port> <in|out>"; return 1; fi
    50 	if ! _gpio_valid_port "$port";                          then _gpio_log_error "invalid port number: $port";            return 1; fi;
    51 	
    52 	if [ -d  "/sys/class/gpio/gpio$port" ]; then 
    53 		_gpio_log_warning "port $port is already exported → will just set direction: $direction";
    54 	else
    55 		echo "$port" > "/sys/class/gpio/export" || return 1;
    56 	fi;
    57 	
    58 	echo "$direction" > "/sys/class/gpio/gpio$1/direction";
    59 }
    60 
    61 
    62 # close (unexport) the port and set its direction
    63 # parameters:
    64 #	port number
    65 gpio_close() {
    66 	local port="$1";
    67 	if [ $# -ne 1 ];               then _gpio_log_error "usage: ${FUNCNAME[0]} <port>"; return 1; fi
    68 	if ! _gpio_valid_port "$port"; then _gpio_log_error "invalid port number: $port";   return 1; fi;
    69 	
    70 	if [ -d  "/sys/class/gpio/gpio$port" ]; then 
    71 		echo "$port" > "/sys/class/gpio/unexport";
    72 	else
    73 		_gpio_log_error "port $port is not open";
    74 		return 1;
    75 	fi;
    76 }
    77 
    78 # reads value of given port
    79 # parameters:
    80 #	port number
    81 gpio_read() {
    82 	local port="$1";
    83 	if [ $# -ne 1 ];               then _gpio_log_error "usage: ${FUNCNAME[0]} <port>"; return 1; fi
    84 	if ! _gpio_valid_port "$port"; then _gpio_log_error "invalid port number: $port";   return 1; fi;
    85 	
    86 	if ! cat "/sys/class/gpio/gpio$port/value"; then
    87 		_gpio_log_error "unable to read value of port $port";
    88 		return 1;
    89 	fi
    90 }
    91 
    92 # writes the value to given port
    93 # parameters:
    94 #	port number
    95 #	value: 0/1
    96 gpio_write() {
    97 	local port="$1";
    98 	local value="$2";
    99 	if [ $# -ne 2 ] || [[ "$value" != @("0"|"1") ]]; then _gpio_log_error "usage: ${FUNCNAME[0]} <port> <0|1>"; return 1; fi
   100 	if ! _gpio_valid_port "$port";                   then _gpio_log_error "invalid port number: $port";         return 1; fi;
   101 	
   102 	if ! echo "$value" > "/sys/class/gpio/gpio$port/value"; then
   103 		_gpio_log_error "unable to write value $value to port $port";
   104 		return 1;
   105 	fi
   106 }
   107