В OpenWrt при необходимости добавления нескольких разных действий при нажатии на одну и ту же аппаратную кнопку обычно принято варьировать длительность нажатия. Для этого есть встроенная переменная $SEEN, позволяющая максимально упростить этот процесс. Пример скрипта с ее использованием был показан ранее. Но иногда может быть удобнее отличать не длительность нажатий, а их количество.
Логика обработки последовательных нажатий на кнопку несколько сложнее. При первом нажатии необходимо инициализировать цикл ожидания, который будет проверять, изменилось ли состояние кнопки в течение последующих секунд. При дальнейших нажатиях необходимо записывать информацию о том, что нажатие было совершено. Цикл ожидания при отсутствии изменений в течение более 2 секунд должен прерываться и считывать информацию о количестве совершенных нажатий. Заметим, что цикл необходимо запускать отдельно вне скрипта обработчика hotplug.d, т.к. в hotplug пока не завершится обработка одного события, обработка следующего события не начнется.
Итак, используем для хранения временных данных файл /var/run/.hotplug.button.lock.
В /etc/hotplug.d/button создаем скрипт 00-hwbutton:
# Generic hardware button handler with subsequent presses tracking # Copyright (C) 2013 Erinome.net if [ "$BUTTON" = "reset" ] ; then if [ "$ACTION" = "released" ] ; then lockfile="/var/run/.hotplug.button.lock" if [ -e $lockfile ] then echo $((`cat $lockfile` + 1)) > $lockfile exit fi echo 1 > $lockfile button-handler.sh & fi fi
Второй скрипт создаем по пути /usr/bin/button-handler.sh:
#!/bin/ash # Generic hardware button handler with subsequent presses tracking # Copyright (C) 2013 Erinome.net lockfile="/var/run/.hotplug.button.lock" cnt=1 while [ 1 ] do sleep 2 cntnew=`cat $lockfile` if [ "$cnt" = "$cntnew" ] then break; fi cnt=$cntnew done rm $lockfile case "$cnt" in 1) logger "button pressed 1 time" ;; 2) logger "button pressed 2 times" ;; 3) logger "button pressed 3 times" ;; *) logger "button pressed $cnt times" ;; esac
Не забываем разрешить запуск созданного скрипта:
root@OpenWrt:~# chmod +x /usr/bin/button-handler.sh
Чтобы эти скрипты не самоуничтожились при обновлении прошивки, добавляем их в /etc/sysupgrade.conf.
Теперь скрипт-обработчик button-handler.sh можно настроить на запуск любых действий в зависимости от количества последовательных нажатий на выбранную кнопку на роутере.