franta-hg@0: #!/bin/bash franta-hg@0: franta-hg@0: # GPIO.sh franta-hg@0: # Copyright © 2016 František Kučera (frantovo.cz) franta-hg@0: # franta-hg@0: # This program is free software: you can redistribute it and/or modify franta-hg@0: # it under the terms of the GNU General Public License as published by franta-hg@0: # the Free Software Foundation, either version 3 of the License, or franta-hg@0: # (at your option) any later version. franta-hg@0: # franta-hg@0: # This program is distributed in the hope that it will be useful, franta-hg@0: # but WITHOUT ANY WARRANTY; without even the implied warranty of franta-hg@0: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the franta-hg@0: # GNU General Public License for more details. franta-hg@0: # franta-hg@0: # You should have received a copy of the GNU General Public License franta-hg@0: # along with this program. If not, see . franta-hg@0: franta-hg@0: # GPIO.sh is a set of functions for controlling GPIO pins of Raspberry Pi or similar computer franta-hg@0: franta-hg@0: _gpio_valid_port() { franta-hg@0: case $1 in 0|1|4|7|8|9|10|11|14|15|17|18|21|22|23|24|25) franta-hg@0: return 0;; franta-hg@0: *) franta-hg@0: return 1;; franta-hg@0: esac franta-hg@0: } franta-hg@0: franta-hg@0: # export -f _gpio_valid_port franta-hg@0: # 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' franta-hg@0: franta-hg@0: franta-hg@0: _gpio_log_error() { franta-hg@0: # TODO: $(date --rfc-3339=seconds) or ● ? franta-hg@0: echo -e "\e[1;31m$1\e[0m"; > /dev/stderr; franta-hg@0: } franta-hg@0: franta-hg@0: _gpio_log_warning() { franta-hg@0: echo -e "\e[2;33m$1 \e[0m"; > /dev/stderr; franta-hg@0: } franta-hg@0: franta-hg@0: franta-hg@0: # open (export) the port and set its direction franta-hg@0: # parameters: franta-hg@0: # port number franta-hg@0: # direction: in/out franta-hg@0: gpio_open() { franta-hg@0: local port="$1"; franta-hg@0: local direction="$2"; franta-hg@0: if [ $# -ne 2 ] || [[ "$direction" != @("in"|"out") ]]; then _gpio_log_error "usage: ${FUNCNAME[0]} "; return 1; fi franta-hg@0: if ! _gpio_valid_port "$port"; then _gpio_log_error "invalid port number: $port"; return 1; fi; franta-hg@0: franta-hg@0: if [ -d "/sys/class/gpio/gpio$port" ]; then franta-hg@0: _gpio_log_warning "port $port is already exported → will just set direction: $direction"; franta-hg@0: else franta-hg@0: echo "$port" > "/sys/class/gpio/export" || return 1; franta-hg@0: fi; franta-hg@0: franta-hg@0: echo "$direction" > "/sys/class/gpio/gpio$1/direction"; franta-hg@0: } franta-hg@0: franta-hg@0: franta-hg@0: # close (unexport) the port and set its direction franta-hg@0: # parameters: franta-hg@0: # port number franta-hg@0: gpio_close() { franta-hg@0: local port="$1"; franta-hg@0: if [ $# -ne 1 ]; then _gpio_log_error "usage: ${FUNCNAME[0]} "; return 1; fi franta-hg@0: if ! _gpio_valid_port "$port"; then _gpio_log_error "invalid port number: $port"; return 1; fi; franta-hg@0: franta-hg@0: if [ -d "/sys/class/gpio/gpio$port" ]; then franta-hg@0: echo "$port" > "/sys/class/gpio/unexport"; franta-hg@0: else franta-hg@0: _gpio_log_error "port $port is not open"; franta-hg@0: return 1; franta-hg@0: fi; franta-hg@0: } franta-hg@0: franta-hg@0: # reads value of given port franta-hg@0: # parameters: franta-hg@0: # port number franta-hg@0: gpio_read() { franta-hg@0: local port="$1"; franta-hg@0: if [ $# -ne 1 ]; then _gpio_log_error "usage: ${FUNCNAME[0]} "; return 1; fi franta-hg@0: if ! _gpio_valid_port "$port"; then _gpio_log_error "invalid port number: $port"; return 1; fi; franta-hg@0: franta-hg@0: if ! cat "/sys/class/gpio/gpio$port/value"; then franta-hg@0: _gpio_log_error "unable to read value of port $port"; franta-hg@0: return 1; franta-hg@0: fi franta-hg@0: } franta-hg@0: franta-hg@0: # writes the value to given port franta-hg@0: # parameters: franta-hg@0: # port number franta-hg@0: # value: 0/1 franta-hg@0: gpio_write() { franta-hg@0: local port="$1"; franta-hg@0: local value="$2"; franta-hg@0: if [ $# -ne 2 ] || [[ "$value" != @("0"|"1") ]]; then _gpio_log_error "usage: ${FUNCNAME[0]} <0|1>"; return 1; fi franta-hg@0: if ! _gpio_valid_port "$port"; then _gpio_log_error "invalid port number: $port"; return 1; fi; franta-hg@0: franta-hg@0: if ! echo "$value" > "/sys/class/gpio/gpio$port/value"; then franta-hg@0: _gpio_log_error "unable to write value $value to port $port"; franta-hg@0: return 1; franta-hg@0: fi franta-hg@0: } franta-hg@0: