Обработка последовательного нажатия кнопок в hotplug.d

В 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 можно настроить на запуск любых действий в зависимости от количества последовательных нажатий на выбранную кнопку на роутере.

This entry was posted in Сеть и интернет and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>