#!/bin/ash

state="status"

dect="Dect Configuration"
mainswversion="SW Version"
mainmenu="$dect&$mainswversion"

dectreg="Register Dect"
dectring="Ring Handsets"
dectset="Set date/time"
dectmenu="$dectreg&$dectring&$dectset"

app_mnt_pt=/mnt/appfs/vodia
app_factory=${app_mnt_pt}/factory
app_runtime=${app_mnt_pt}/runtime
bin_dir=${app_runtime}/pbx
logo_dir=${bin_dir}

disptimer=120
dispdelay=5

restart_fpsrv()
{
  fpsrv_pid=`pgrep td_lib_fp_srv`
  if [ $? -ne 0 ] ; then
    return -1
  fi
  kill -9 ${fpsrv_pid}
  sleep 5
  return 0
}

display_cmd()
{
  td_fp_tool display "$@"
  if [ $? -ne 0 ] ; then
    restart_fpsrv
  fi
  return 0
}

disp () {
    display_cmd clear 0
    display_cmd write_string 0 2 6 "$1"
    display_cmd write_string 0 2 18 "$2"
    display_cmd flush 0
}

keyb () {
    timeout=$1
    td_fp_tool button wait all pressed "$timeout" txt | awk '{if($4 == "name"){print substr($5, 2, 2);}}'
}

ipaddr () {
    link=$(ifconfig | awk '{ if ($2 == "Link") link = $1;  if ($1 == "inet") {printf "%s:%s&", link, substr($2, 6)} }')
    echo "$link"
}

incindex () {
    max=$(echo $2 | awk '{n=split($0, array, "&")} END{print n }')
    ret=$(($1+1))
    if [ "$ret" -gt "$max" ]; then
	ret=1
    fi
    echo "$ret"
}

decindex () {
    max=$(echo $2 | awk '{n=split($0, array, "&")} END{print n }')
    ret=$(($1-1))
    if [ "$ret" -le 0 ]; then
	ret="$max"
    fi
    echo "$ret"
}

getitem () {
    ret=$(echo "$2" | cut -d'&' -f"$1")
    echo "$ret" 
}

friendlyname () {
    arg1=$(echo "$1" | tr -d ' ')
    if [ -z $(echo "$arg1"|sed "/lan/d") ]; then
	echo "LAN"
    elif [ -z $(echo "$arg1"|sed "/wan/d") ]; then
	echo "WAN"
    else
	echo "$1"
    fi
}

format () {
    echo "$1"
}

timer=0;

getmessages () {
    file="/mnt/appfs/tmp/dispmessages.txt"
    messages=""
    if [ -f "$file" ]; then
	while IFS='' read -r line || [[ -n "$line" ]]; do
            firstchar=$(echo "$line" | cut -c1)
            if [ " ${firstchar} " = " ! " ]; then
              line=$(echo "$line" | cut -c2-)
              timer=0                                             
              brightness "20"
            fi                   
	    if [[ "$messages" = "" ]]; then
		messages="$line"
	    else
		messages="$messages&$line"
	    fi
	done < "$file"
    fi
    echo "$messages"
 }

brightness () {
   td_fp_tool display brightness "$1"
}

status () {
    #disp "Status"
    display_cmd clear 0
    display_cmd write_pixmap 0 34 0 60 29 "${logo_dir}/Vodia_logo_60x29.bmp.td_fp"
    display_cmd flush 0
    item=0;
    timer=0;
    while true
    do
	ips=$(ipaddr)
	msgs=$(getmessages)
	if [ -n msgs ]; then
	  msgs="$msgs&"  
	fi
	displist="$ips$msgs"
	key=$(keyb 5000)
	if [ "$key" = "" ]; then
	    if [ $timer -lt $disptimer ]; then
		timer=$((timer+1))
	    fi
	    if [ $timer = $disptimer ]; then
		brightness "0"
	    fi
	    item=$((item+1))
	    ip=$(echo "$displist" | cut -d'&' -f"$item")
	    if [ -n "$ip" ] && [ $(echo "$ip" | tr -d ' ' | cut -d':' -f2) = "127.0.0.1" ]; then
	    	item=$((item+1))
	    	ip=$(echo "$displist" | cut -d'&' -f"$item")
	    fi
	    if [ -z "$ip" ]; then
		item=1
		ip=$(echo "$displist" | cut -d'&' -f"$item")
	    fi
	    #echo "$ip"
	    line1=$(echo "$ip" | cut -d':' -f1)
	    line2=$(echo "$ip" | cut -d':' -f2)
	    disp1=$(friendlyname "$line1")
	    disp2=$(format "$line2")
	    disp "$disp1:" "$disp2"
	elif [ "$key" = "OK" ]; then
	    brightness "20"
	    state="menu"
	    return 1
	elif [ "$key" = "F1" ]; then
	    state="status"
	    disp "WPS:" "Starting WPS"
	    td_cli wps start wlan0
	    td_cli wps start wlan2
	    disp "WPS:" "WPS ready for you!"                                      
	    sleep ${dispdelay}
	    return 1
	else
	    state="status"
	    brightness "20"
	    return 1
	fi
    done
}

menu () {
    menuitems="$1"
    returnstate="$2"
    topline="$3"
    idx=1
    menuitem=$(getitem "$idx" "$menuitems")
    disp "$topline" "$menuitem"
    while true
    do
	key=$(keyb 0)
	if [ "$key" = "LE" ]; then
	    state="$returnstate"
	    return 1
	elif [ "$key" = "UP" ]; then
	    idx=$(incindex "$idx" "$menuitems")
	    menuitem=$(getitem "$idx" "$menuitems")
	    disp "$topline" "$menuitem"
	elif [ "$key" = "DO" ]; then
	    idx=$(decindex "$idx" "$menuitems")
	    menuitem=$(getitem "$idx" "$menuitems")
	    disp "$topline" "$menuitem"
	elif [ "$key" = "OK" ]; then
	    state="$menuitem"
	    #echo "$state"
	    return 1
	fi
    done
}

showversion () {
    disp "SW Version" $(cat "$bin_dir/version")
    key=$(keyb 0)
    state="menu"
}

dect () {
    if [ "$1" = "register" ]; then
	echo 1 > /proc/pagemode
    elif [ "$1" = "ring" ]; then
	echo 2 > /proc/pagemode
    elif [ "$1" = "set" ]; then
	echo 3 > /proc/pagemode
    fi
    state="menu"
}    

main () {
    brightness "20"
    while true
    do
	if [ "$state" = "status" ]; then
	    status
	elif [ "$state" = "menu" ]; then
	    menu "$mainmenu" "status" "Main Menu"
	elif [ "$state" = "$mainswversion" ]; then
	    showversion
	elif [ "$state" = "$dect" ]; then
	    menu "$dectmenu" "menu" "$dect"
	elif [ "$state" = "$dectreg" ]; then
	    dect "register"
	elif [ "$state" = "$dectring" ]; then
	    dect "ring"
	elif [ "$state" = "$dectset" ]; then
	    dect "set"
	else
	    state="status"
	fi
    done
}

main
