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