2013年12月1日 星期日

控制 LED 的 script

檔案 http://sh4twbox.googlecode.com/files/ledctl2.sh

只能用在註冊成 Platform Device 的 LED 燈上。


ledctl2.sh {show | red | blue | purple | off | s | r | b | p | o}
ledctl2.sh set {on | off | keep | k | TRIGGER} [on | off | keep | k | TRIGGER]
2013/12/07:修改 script 配合修正過的LED控制狀態

因為多了 Trigger 模式設定,
可設定的狀態增加了不少。

在 Trigger 不是 none 的情況下,
設定控制亮暗的 brightness 設定為亮時,
會同時自動更改 Trigger 成 none,
會一直維持恆亮。

但是要設定 brightness 為暗時,
卻不會同時更改 Trigger 為 none,
只要 Trigger 再次把 LED 點亮,
brightness 設定又會再次歸 Trigger 控制,
LED又會亮起來。
所以在設定 brightness 為暗之前,
要先手動把 Trigger 設定成 none。
(brightness : /sys/devices/platform/leds-gpio.0/leds/LD5/brightness
及 /sys/devices/platform/leds-gpio.0/leds/LD5/brightness)

為了相容之前透過 user space 控制GPIO 的方式,
同樣做了簡單控制顏色的方式:

# ledctl2.sh show
顯示目前 LED 狀態,

多了第三個可用Trigger ,
目前使用中的Trigger 以 [ ] 標示。
如果 Trigger 不是 none,
則 On Off 狀態則表示執行 ledctl2.sh show 時,
Trigger 當時控制情況。

# ledctl2.sh red
# ledctl2.sh r
持續顯示紅色

# ledctl2.sh blue
# ledctl2.sh b
持續顯示藍色

# ledctl2.sh purple
# ledctl2.sh p
持續顯示紫色

# ledctl2.sh off
# ledctl2.sh o
持續全暗

由於 Trigger 可以在編譯 kernel 時選擇,
可多可少,
就不適合做成固定的指令,
就統一以 kernel 中的名稱直接傳入到控制用的 sysfs 的檔案,
在變動參數的情況下,
就要把每個燈的控制完全獨立才行了。

如果做成 ledctl2.sh blue on red off 這樣,
每次要輸入的控制指令太長了,
決定寫成多加 set 就好,
後面接著藍色LED狀態及紅色LED狀態,
再省掉就會讓第一個 off 與先前簡單控制方式的 off 混淆。

省還可以再省,
所以也可以直接只設定藍色LED 狀態,
像是 ledctl2.sh set off ,
單獨把藍色設定為暗,
不影響紅色狀態。

keep 則是因為在設定紅色LED 時,
無法省略設定藍色LED 的參數。
當不想改變又不知道藍色LED 狀態時,
可以填入 keep 或 k 保持藍色LED 目前設定狀態,
又可以達到設定紅色LED 狀態的目的。

# ledctl2.sh set on off
持續顯示藍色,
如同 ledctl2.sh blue 或 ledctl2.sh b 。

# ledctl2.sh set off on
持續顯示紅色
如同 ledctl2.sh red 或 ledctl2.sh r

# ledctl2.sh set on on
持續顯示紫色
如同 ledctl2.sh purple 或 ledctl2.sh p

# ledctl2.sh set off off 
持續全暗的狀態
如同 ledctl2.sh off 或 ledctl2.sh o

# ledctl2.sh set keep on
# ledctl2.sh set k on
不改變藍色LED狀態,
紅色LED狀態設定為恆亮。

# ledctl2.sh set keep heartbeat
# ledctl2.sh set k heartbeat
不改變藍色LED狀態,
紅色LED Trigger 設定為 heartbeat

因為目前將 LED 設定為 Platform device 時,
retain_state_suspended 設定為1,
所以 suspend to memory 時,
會維持進入 suspend 之前的狀態,
如果是紅色,
就會一直持續紅色,
並不會有 Trigger 的效果。
因此目前要分辨進入 suspend 與離開 suspend 狀態,
只能在平常設定會閃動的 Trigger,
如果不閃動就是已進入 suspend 狀態,
喚醒後,
會自動恢復 Trigger 的控制狀態繼續閃動。

以下是用於 sh shell 的 script
(部份參考 dlintw 的 sh4twbox 系統中 ledctl.sh) 

#!/bin/sh
set -o errexit
ver="ledctl.sh ver. 2.1.1 : for LEDs as platform device"
ioroot=/sys/devices/platform/leds-gpio.0/leds
ioblue=$ioroot/LD5
iored=$ioroot/LD6
on=`cat $ioblue/max_brightness`
off=0
blue_stat="off"
red_stat="off"

[ -r $ioroot ] || (echo "Err: this kernel do not support LEDs as Platform device

case "$1" in
  show|s)
    if [ `cat $ioblue/brightness` -gt $off ] ; then blue_stat="on" ; fi
    if [ `cat $iored/brightness` -gt $off ] ; then red_stat="on" ; fi
    echo "Color Status  Trigger"
    echo "Blue  $blue_stat      `cat $ioblue/trigger`"
    echo "Red   $red_stat       `cat $iored/trigger`"
    ;;
  blue|b)
    echo $on > $ioblue/brightness
    echo "none" > $iored/trigger
    echo $off > $iored/brightness
    ;;
  red|r)
    echo "none" > $ioblue/trigger
    echo $off > $ioblue/brightness
    echo $on > $iored/brightness
    ;;
  purple|p)
    echo $on > $ioblue/brightness
    echo $on > $ioblue/brightness
    ;;
  off|o)
    echo "none" > $ioblue/trigger
    echo $off > $ioblue/brightness
    echo "none" > $iored/trigger
    echo $off > $iored/brightness
    ;;
# directly set blue led and red led status
  set|S)
    if [ $# -ge 2 ]; then
      case "$2" in
        on) echo $on > $ioblue/brightness ;;
        off)
          echo "none" > $ioblue/trigger
          echo $off > $ioblue/brightness
          ;;
        keep|k) ;;
        *) echo $2 > $ioblue/trigger ;;
      esac
      if [ $# -eq 3 ]; then
        case "$3" in
          on) echo $on > $iored/brightness ;;
          off)
            echo "none" > $iored/trigger
            echo $off > $iored/brightness
            ;;
          keep|k) ;;
          *) echo $3 > $iored/trigger ;;
        esac
      fi
    else
      echo "       $0 set {on | off | keep | k | TRIGGER} [on | off | keep | k | TRIGGER]"
    fi
    ;;
  *)
      echo "Usage: $0 {show | red | blue | purple | off | s | r | b | p | o}"
      echo "       $0 set {on | off | keep | k | TRIGGER} [on | off | keep | k | TRIGGER]"
    ;;
esac


1 則留言:

  1. 閃爍的呼吸燈很好用,網樂通有沒有當機、關機、開機一目了然。

    回覆刪除