Menu
Categories
Обработка последовательного нажатия кнопок в hotplug.d
March 31, 2013 Сеть и интернет

В 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  ; then
	if  ; then
		lockfile="/var/run/.hotplug.button.lock"
		if 
		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 
do
	sleep 2
	cntnew=`cat $lockfile`
	if 
	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 можно настроить на запуск любых действий в зависимости от количества последовательных нажатий на выбранную кнопку на роутере.

Leave a Reply




*