Aus PISACORE
Wechseln zu: Navigation, Suche

Script zum reagieren auf Tastatur Tasten.

Siehe dazu auch Python: Reagieren auf Tastatur Tasten

#!/bin/bash

declare -A GPIO
GPIO['a']=17    ;# red
GPIO['1']=22    ;# green


## init GPIOpin
for key in ${!GPIO[@]}; do
    if [ ! -f /sys/class/gpio/gpio${GPIO[$key]}/value ]; then    
        echo ${GPIO[$key]} > /sys/class/gpio/export    
        echo out > /sys/class/gpio/gpio${GPIO[$key]}/direction    
    fi
done


function schalten() {
    ## get current state
    local GPIOstate=$(cat /sys/class/gpio/gpio${1}/value)

    ## switch state
    local NEWstate=$(( ! $GPIOstate ))
    echo $NEWstate > /sys/class/gpio/gpio${1}/value
    echo "switched GPIOpin $1 from $GPIOstate to $NEWstate"
}

function _exit() {
    stty sane
    #echo -e '\nQuit\n'
    exit 0
}
trap _exit SIGHUP SIGINT SIGTERM EXIT

#stty -echo -icanon -icrnl time 0 min 0
stty -echo

while :; do
    read -n 1 keypress
    if [ "$keypress" == "a" ]; then
        echo "Key 'a' is pressed"
        schalten ${GPIO[$keypress]}
    elif [ "$keypress" == "1" ]; then
        echo "Key '1' is pressed"
        schalten ${GPIO[$keypress]}
    else
        echo "Unknown key: $keypress"
    fi
done

#!/bin/bash

function identify_key {
    local key="$@"
    local printable=""
     
    case "$key" in
       "1b") echo "ESC ($key)";;
       "09") echo "TAB ($key)";;
       "1b 1b") echo "DOUBLE ESC ($key)";;
       "7f") echo "BKS ($key)";;
       "1b 5b 41") echo "UP ($key)";;
     
       "1b 5b 42") echo "DOWN ($key)";;
       "1b 5b 43") echo "RIGHT ($key)";;
       "1b 5b 44") echo "LEFT ($key)";;
     
       "1b 5b 47") echo "NUM5 ($key)";;
       "1b 5b 50") echo "PAUSE ($key)";;
     
       "1b 5b 31 7e") echo "HOME ($key)";;
       "1b 5b 32 7e") echo "INS ($key)";;
       "1b 5b 33 7e") echo "DEL ($key)";;
       "1b 5b 34 7e") echo "END ($key)";;
       "1b 5b 35 7e") echo "PGUP ($key)";;
       "1b 5b 36 7e") echo "PGDN ($key)";;
     
       "1b 5b 5b 41") echo "F1 ($key)";;
       "1b 5b 5b 42") echo "F2 ($key)";;
       "1b 5b 5b 43") echo "F3 ($key)";;
       "1b 5b 5b 44") echo "F4 ($key)";;
       "1b 5b 5b 45") echo "F5 ($key)";;
       "1b 5b 31 37 7e") echo "F6 ($key)";;
       "1b 5b 31 38 7e") echo "F7 ($key)";;
       "1b 5b 31 39 7e") echo "F8 ($key)";;
       "1b 5b 32 30 7e") echo "F9 ($key)";;
       "1b 5b 32 31 7e") echo "F10 ($key)";;
       "1b 5b 32 33 7e") echo "F11 ($key)";;
       "1b 5b 32 34 7e") echo "F12 ($key)";;
     
       "1b 1b 5b 5b 41") echo "ALT+F1 ($key)";;
       "1b 1b 5b 5b 42") echo "ALT+F2 ($key)";;
       "1b 1b 5b 5b 43") echo "ALT+F3 ($key)";;
       "1b 1b 5b 5b 44") echo "ALT+F4 ($key)";;
       "1b 1b 5b 5b 45") echo "ALT+F5 ($key)";;
       "1b 1b 5b 31 37 7e") echo "ALT+F6 ($key)";;
       "1b 1b 5b 31 38 7e") echo "ALT+F7 ($key)";;
       "1b 1b 5b 31 39 7e") echo "ALT+F8 ($key)";;
       "1b 1b 5b 32 30 7e") echo "ALT+F9 ($key)";;
       "1b 1b 5b 32 31 7e") echo "ALT+F10 ($key)";;
       "1b 1b 5b 32 33 7e") echo "ALT+F11 ($key)";;
       "1b 1b 5b 32 34 7e") echo "ALT+F12 ($key)";;
       "") echo "SPACE or INTRO";;
       *) # check if it's ALT+xx
          if [ ${#key} -gt 2 ] && [ "${key:0:2}" == "1b" ]; then
             # if string length greather than 2 and starts by Escape (1b)
             printable="\x"${key:3}   # erases the starting '1b ' 
             printf "ALT+%b (%s)\n" "$printable" "$key"
          else
             printable="\x"$key
             printf "%b (%s)\n" "$printable" "$key"
          fi
          ;;
    esac
}
 
 
 
function key_5b {
  # process '1b 5b ...' keys and return values
 
  local key=$1
  local keyA=""
  local keyB=""
  local keyC=""
 
  keyA=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
  case "$keyA" in
     "31" | "32" | "33" | "34" | "35" | "36") # Must read the following key
             read -rsn1 -t 1 key   # Wait 1 second max for next key
             if [ "$key" == "" ]; then
                # 'ESC + [ + A|B|C|....F' keys pressed (very fast)
                 echo "$keyA"
             else
                 keyB=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
                 if [ "$keyB" == "7e" ]; then
                    # got '~', uses to be the last key so return "XX 7e" where XX is [31|32|33|34|35|36]
                    echo "$keyA $keyB"
                 else
                    read -rsn1 -t 1 key   # Wait 1 second max for next key
                    if [ "$key" == "" ]; then
                       # 'A|B|C|....F + XX' keys pressed (very fast)
                       echo "$keyA $keyB"
                    else
                       keyC=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
                       # max depth level, so return
                       echo "$keyA $keyB $keyC"
                    fi
                 fi
              fi
              ;;
        "5b") # read another key and return (uses to be F1 ... F5 keys) '1b 5b 5b [41|42|43|44|45]'
              read -rsn1 -t 1 key   # Wait 1 second max for next key
              keyB=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
              echo "$keyA $keyB"
              ;;
           *) # Uses to be UP or other arrow keys '1b 5b [41|42|43|44]' so return
              echo "$keyA"
              ;;
  esac
}
 
 
 
function getkey {
  local key=""
  local key1=""
  local key2=""
  local key3=""
  local key4=""

  oldifs="$IFS"
  IFS=" "

  read -rsn1 key
  key1=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
  if [ "$key1" == "1b" ]; then
     read -rsn1 -t 1 key   # Wait 1 second max for next key
     if [ ! "$key" == "" ]; then
        key2=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
        case "$key2" in
           "1b") # it could be a double ESC or an ALT+Fx key
                 read -rsn1 -t 1 key   # Wait 1 second max for next key
                 if [ "$key" == "" ]; then
                    # "1b 1b" 'ESC' key pressed 2 times (very fast)
                    echo "$key1 $key2"
                 else
                    # "1b 1b ..." Uses to be ALT+F? key pressed
                    key3=`echo -n "$key" |  hexdump -ve '1/1 "%.2x\n"'`; key=""
                    if [ "$key3" == "5b" ]; then
                       read -rsn1 -t 1 key   # Wait 1 second max for next key
                       if [ "$key" == "" ]; then
                          # "1b 1b 5b" 'ESC + ESC + [' keys pressed (very fast)
                          echo "$key1 $key2 $key3"
                       else
                          echo "$key1 $key2 $key3 $(key_5b $key)"
                       fi
 
                    else
                       # Unknown key '1b 1b XX' so return
                       echo "$key1 $key2 $key3"
                    fi
                 fi
                 ;;
           "5b") # Several posibilities "1b 5b ..."
                 read -rsn1 -t 1 key   # Wait 1 second max for next key
                 if [ "$key" == "" ]; then
                    # "1b 5b" 'ESC + [' keys pressed (very fast)
                    echo "$key1 $key2"
                 else
                    echo "$key1 $key2 $(key_5b $key)"
                 fi
 
                 ;;
              *) # ESC + Other key pressed (very fast) or ALT+xx
                 echo "$key1 $key2"
                 ;;
        esac
     else
        # ESC key pressed
        echo "$key1"
     fi
  else
     echo "$key1"
  fi
 
  IFS="$oldifs"
  return 0
}
 
 
while true; do
  echo "----------------------------"
  tecla=$(getkey)
  identify_key $tecla
done