#!/bin/sh
#
# TazBerry - SliTaz Raspberry Pi Config Tool
#
# Copyright (C) 2014 SliTaz ARM - BSD License
# Author: Christophe Lincoln <pankso@slitaz.org>
#
. /lib/libtaz.sh

title="{ TazBerry }"
config="/boot/config.txt"
tmpdir="/tmp/tazberry"
tmp="$tmpdir/$$"
height="20"
width="72"

# Use a tmp directory
mkdir -p ${tmpdir}

# Small built-in help
help() {
	cat << EOT

$(boldify "$(gettext 'Usage:')") $(basename $0) [command|rpi_function]

$(boldify "$(gettext 'Commands:')")
  oclock            $(gettext 'Display overclocking information')
  ls-functions      $(gettext 'List TazBerry functions')
  testsuite         $(gettext 'Run TazBerry testsuite')

EOT
}

#
# RPi functions
#

# This could move to /usr/bin/slitaz-??? or something since it's not
# ARM specific
rpi_stats() {
	ip=$(ifconfig | fgrep -A 1 "encap:Ethernet" | fgrep "inet" | cut -d ":" -f 2)
	mem_total=$(free -m | fgrep "Mem:" | awk '{print $2}')
	mem_used=$(free -m | fgrep "Mem:" | awk '{print $3}')
	mem_used_pct=$(( ( ${mem_used} * 100) / ${mem_total} ))
	cat << EOT
$(gettext 'Kernel')       : $(uname -snrm)
$(gettext 'Uptime')       : $(uptime | awk '{print $3}' | sed s"/:/h /" | sed s"/,/min/")
$(gettext 'Network IP')   : $(echo $ip | awk '{print $1}')
$(gettext 'CPU heat')     : $(awk '{printf "%3.1f C\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
$(gettext 'Processes')    : $(ps | wc -l)
$(gettext 'Memory usage') : ${mem_used_pct}%
EOT
}

rpi_turbo() {
	if ! fgrep -q 'force_turbo=1' ${config}; then
		gettext "Enabling Raspberry Pi force turbo..."
		echo "force_turbo=1" >> ${config}; status
	else
		gettext "Disabling Raspberry Pi force turbo..."
		sed -i '/force_turbo=1/'d ${config}; status
	fi
}

# RPi Overclocking
rpi_oclock() {
	cat << EOT
none    700MHz  ARM 250MHz core 400MHz SDRAM 0 overvolt
modest  800MHz  ARM 300MHz core 400MHz SDRAM 0 overvolt
medium  900MHz  ARM 333MHz core 450MHz SDRAM 2 overvolt
high    950MHz  ARM 450MHz core 450MHz SDRAM 6 overvolt
turbo   1000MHz ARM 500MHz core 500MHz SDRAM 6 overvolt
EOT
}

#
# GUI Functions
#

# Usage: msg_box "title" "message"
msg_box() {
	dialog --title "{ $1 }" --cr-wrap \
		--ok-label "TazBerry" --msgbox "\n$2" ${height} ${width}
}

# Usage: text_box "file"
text_box() {
	local file="$1"
	if [ -f "$file" ]; then
		dialog --cr-wrap \
			--title " $(gettext 'Viewing file:') $file " \
			--extra-button \
			--extra-label "Edit file" \
			--ok-label "TazBerry" \
			--textbox ${file} ${height} ${width}
	else
		dialog --title "$title" \
			--msgbox "\nERROR: $file does not exist" 10 ${width}
	fi
	# Handle options
	case "$?" in
		3) editor ${file} ;;
	esac
}

# Usage: tail_box "file"
tail_box() {
	dialog --title " $(gettext 'Watching file:') $2 " \
		--tailbox "$1" ${height} ${width}
}

# Packages info and spk-up button
pkgs_box() {
	out="$tmpdir/spk-info.txt"
	spk info --output=raw > ${out}
	dialog --cr-wrap \
		--title "{ $(gettext 'Packages') }" \
		--extra-button \
		--extra-label "$(gettext 'Upgrade')" \
		--ok-label "TazBerry" \
		--textbox "$out" ${height} ${width}
	# Handle options
	case "$?" in
		3) spk-up && gettext "Press ENTER to go back to TazBerry"; read ;;
	esac
}

oclock_box() {
	out="$tmpdir/overclocking.txt"
	cat > ${out} << EOT

Overclocking modes:
-------------------
$(rpi_oclock)

Current /boot/config.txt
------------------------
$(cat $config)

EOT
	dialog --cr-wrap \
		--title "$title" \
		--ok-label "TazBerry" \
		--textbox "$out" ${height} ${width}
}

# Main Dialog menu
main_box() {
	dialog \
		--clear \
		--title "$title" \
		--ok-label "Exec" \
		--cancel-label "Quit" \
		--menu "" ${height} ${width} 14 \
"rpi-stats"      "$(gettext 'Show some RPi system stats')" \
"cmdline.txt"    "$(gettext 'View boot args /boot/cmdline.txt')" \
"config.txt"     "$(gettext 'View config file /boot/config.txt')" \
"rpi-turbo"      "$(gettext 'Enable or disable RPi turbo on next boot')" \
"oclock"         "$(gettext 'Overclocking information and config')" \
"packages"       "$(gettext 'Packages info and upgrade (spk)')" \
"keyboard"       "$(gettext 'System keyboard setting')" \
"root-passwd"    "$(gettext 'Change root password')" \
"reboot"         "$(gettext 'Reboot SliTaz')" \
"halt"           "$(gettext 'Halt the Raspberry Pi')" \
"quit"           "$(gettext 'Exit from TazBerry tool')" 2>${tmp}
	
	# Handle options
	opt=${?}
	case "$opt" in
		1|255) rm -rf ${tmpdir} && exit 0 ;;
	esac
	
	# Handle actions
	action=$(cat $tmp)
	case "$action" in
		rpi-stats)
			msg_box "RPi Stats" "$(rpi_stats)" ;;
		cmdline.txt)
			text_box /boot/cmdline.txt ;;
		config.txt)
			text_box ${config} ;;
		rpi-turbo)
			rpi_turbo && newline 
			gettext "Press ENTER to go back to TazBerry"; read ;;
		oclock)
			oclock_box ;;
		packages)
			pkgs_box ;;
		keyboard)
			tazkeymap ;;
		reboot)
			reboot ;;
		root-passwd)
			slitaz-config root_passwd ;;
		halt)
			halt ;;
		quit)
			rm -rf ${tmpdir} && exit 0 ;;
	esac
}

# Progress bar testsuite
gauge_box() {
    { for i in $(seq 1 100); do
		echo $i
		sleep 0.01
	done
    echo 100; } | dialog --title "{ TazBerry }" \
		--gauge "Work in progress..." 6 ${width} 0
}

#
# Handle commands
#

case "$1" in
	oclock)
		newline
		boldify "Overclocking modes:"
		rpi_oclock
		boldify "Current config.txt:"
		cat ${config}
		newline ;;
	
	ls-functions)
		newline
		boldify "$(gettext 'TazBerry functions list')"
		separator
		grep "^rpi_*" $0 | awk '{print "  ", $1}' 
		newline ;;
	
	testsuite)
		gauge_box 
		msg_box "Testsuite" "Test message"
		rpi_stats 
		newline ;;
	 
	rpi_*) 
		# Execute functions 
		$@ ;;
	
	"")
		# No args: display Ncurses dialog
		while true; do
			main_box
		done ;;
	
	*|*help|-h)
		# Display help
		help ;;
esac

# Clean exit
rm -rf ${tmpdir}
exit 0
