#!/bin/sh

_FUNCTIONS=/etc/rc.d/functions
[ -f ${_FUNCTIONS} ] && . ${_FUNCTIONS}

/bin/rm -f /tmp/hotkeys
/usr/bin/mkfifo /tmp/hotkeys
cat /dev/input/event0 > /tmp/hotkeys &
cat /dev/input/event1 > /tmp/hotkeys &

export KEYS="WAIT-1-2-3-4-5-6-7-8-9-0---DEL--Q-W-E-R-T-Y-U-I-O-P---ENTER--A-S\
-D-F-G-H-J-K-L----SHIFT--Z-X-C-V-B-N-M--DOT-SLASH---ALT-SPACE----------------\
-----------------TEXT-BACK-SELECT--SYM----HOME------NEXTL-LEFT-RIGHT---PREV--\
---VOLDOWN-VOLUP-------UP-DOWN-NEXTR---------------MENU"

export CHARS="SPACE-SYM DR SELECT-SYM DL DU SELECT-SYM DR DR DR DR SELECT-SYM\
 DR DR DR DR DR DD SELECT-SYM DR DR DR DR DD SELECT-SYM DL DD SELECT-SYM DU S\
ELECT-SYM DL DL DL DL DL SELECT-SYM DL DL DL DL SELECT-SYM DR DR DR DR DU SEL\
ECT-SYM DR DR DR DU SELECT-SYM SELECT-SYM DR DR DU SELECT-DOT-SLASH-0-1-2-3-4\
-5-6-7-8-9-SYM DD SELECT-SYM DR DR DD SELECT-SYM DL DL DL SELECT-SYM DR DR DR\
 SELECT-SYM DL DL SELECT-SYM DL SELECT-SYM DR DU SELECT-SHIFT A-SHIFT B-SHIFT\
 C-SHIFT D-SHIFT E-SHIFT F-SHIFT G-SHIFT H-SHIFT I-SHIFT J-SHIFT K-SHIFT L-SH\
IFT M-SHIFT N-SHIFT O-SHIFT P-SHIFT Q-SHIFT R-SHIFT S-SHIFT T-SHIFT U-SHIFT V\
-SHIFT W-SHIFT X-SHIFT Y-SHIFT Z-SYM DR DR DR DR DR DR DD SELECT-SYM DL DL DL\
 DD DD SELECT-SYM DL DL DL DL DD DD SELECT-SYM DL DL DL DL DL DL SELECT-SYM D\
R DR DR DD SELECT-SYM DL DL DL DD SELECT-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-\
S-T-U-V-W-X-Y-Z-SYM DR DR DR DR DR DR SELECT-SYM DR DR DR DR DR SELECT-SYM DL\
 DL DL DL DD SELECT-SYM DL DL DD SELECT"

SKIP=0

send_keys()
{
	let SKIP=$SKIP+`/bin/echo -n "$*" | /usr/bin/awk '
		BEGIN {
			split(ENVIRON["KEYS"], keys, "-")
			for (i = 1; i < 140; i++)
				if (length(keys[i]))
					codes[keys[i]] = i
			RS = " "
		}
		
		{
			code = codes[$_]
			if (code == 1)
				system("/bin/usleep 500000")
			else if (code)
				print "send", code
			system("/bin/usleep 10000")
		}' | /usr/bin/tee -a $KEYPAD $FIVEWAY | /usr/bin/wc -l`
}

send_string()
{
	SEQ=`/bin/echo -n "$1" | /usr/bin/awk '
		BEGIN {
			split(ENVIRON["CHARS"], chars, "-")
			for (i = 32; i < 127; i++)
				ord[sprintf("%c", i)] = i - 31;
			FS=""
		}
		
		{
			for (i = 1; i <= NF; i++)
				if (ord[$i])
					print chars[ord[$i]]
		}'`
	let ROT=`/bin/cat /sys/module/eink_fb_hal_broads/parameters/bs_orientation`+2*`/bin/cat /sys/module/eink_fb_hal_broads/parameters/bs_upside_down`
	case "$ROT" in
		0)
			DU="UP" DR="RIGHT" DD="DOWN" DL="LEFT"
			;;
		1)
			DU="LEFT" DR="UP" DD="RIGHT" DL="DOWN"
			;;
		2)
			DU="DOWN" DR="LEFT" DD="UP" DL="RIGHT"
			;;
		3)
			DU="RIGHT" DR="DOWN" DD="LEFT" DL="UP"
			;;
	esac
	
	send_keys $2 `/bin/echo -n $SEQ | /bin/sed -e "s/ DU/ $DU/g" -e "s/ DR/ $DR/g" -e "s/ DD/ $DD/g" -e "s/ DL/ $DL/g"` $3
}

case "$1" in

	start)
		KEY1=0
		KEY2=0
		KEY3=0
		awk '
			BEGIN {
				split("'$KEYS'", keys, "-")
				for (i = 1; i < 140; i++) {
					t = sprintf("%c", i)
					ord[t] = keys[i]
				}
				RS = "\xFF"
				i = 0
			}

			{
				if (i == 10)
					j = ord[$_]
				if (i == 12 && $_ == "\x01")
					print j
				i = (i + length($_) + 1) % 16
			}' /tmp/hotkeys | \
		while read KEY
		do
			if [ -z "$KEY" ]; then
				continue;
			elif [ $SKIP != 0 ]; then
				let SKIP=$SKIP-1
				continue;
			elif [ -f /mnt/us/hotkeys/$KEY1-$KEY.sh ]; then
				. /mnt/us/hotkeys/$KEY1-$KEY.sh
			elif [ -f /mnt/us/hotkeys/$KEY.sh ]; then
				. /mnt/us/hotkeys/$KEY.sh
			fi
			KEY3=$KEY2
			KEY2=$KEY1
			KEY1=$KEY
		done &
	        ;;

	stop)
                /bin/kill `pidof hotkeys`
                ;;
	*)
		msg "Usage: $0 {start|stop}" W >&2
		exit 1
		;;
esac

exit 0
