Имеется одноплатный компьютер с Линухами на борту (дистриб archlinuxarm). К плате подключено 9 кнопок через GPIO. Хочется из этой железки сделать монитор ip-камер. Собственно накидал до безобразия простой скрипт следующего содержания:
#!/bin/sh
#
fbset -fb /dev/fb0 -xres 768 -yres 576 -vxres 768 -vyres 576
# Open the GPIO port
#
echo "4" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio4/direction
echo "17" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio17/direction
echo "21" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio21/direction
echo "22" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio22/direction
echo "18" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio18/direction
echo "23" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio23/direction
echo "24" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio24/direction
echo "25" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio25/direction
echo "8" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio8/direction
# Read forever
while [ "1" = "1" ]; do
if [ "1" = `cat /sys/class/gpio/gpio4/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.1/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio17/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.2/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio21/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.3/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio22/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.4/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio18/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.5/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio23/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.6/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio24/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.7/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio25/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.8/mjpg/1/video.mjpg"&
fi
if [ "1" = `cat /sys/class/gpio/gpio8/value` ]; then
killall -v mplayer
mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.9/mjpg/1/video.mjpg"&
fi
done
exit 0
Впринципе оно работает - видео оно показывает и по нажатию кнопок видеопотоки переключаются, но... частота опроса кнопок низковата - чтобы кнопка сработала нужно её 1-2 секунды удерживать. Пробовал в loop-e оставить только cat /sys/class/gpio/gpioХ/value - тогда цыферки очень быстро бегут и срабатывают они мгновенно, а тут... Видимо луп получился слишком тяженый и условия if по долгу обрабатываются.
В общем в голову приходит только вариант с двумя параллельно работающими loop-ами - один занимается опросом GPIO портов и записью состояния кнопок в какую-нибудь переменную, а второй читает эту переменную и запускает в нужный момент соответствующий mplayer. Но как это можно реализовать в bash-е (и можно ли вобще) я не знаю.
Посоветуйте как эту проблему лучше решить.