#!/bin/bash
{
	#////////////////////////////////////
	# DietPi Morse Code Script
	#
	#////////////////////////////////////
	# Created by Daniel Knight / daniel.knight@dietpi.com / dietpi.com
	#
	#////////////////////////////////////
	#
	# Info:
	# - Converts and renders a text file into morse code
	#
	# Usage:
	# - dietpi-morsecode 0/noinput	= Output to Term
	# - dietpi-morsecode 1			= Output to both RPi status LED's
	# - dietpi-morsecode 2			= Output to ALSA (sound)
	#////////////////////////////////////

	#At the end of the day, if your using this, your probably in a life threating situation.
	#I doubt your Transmission downloads, or webserver is going to be more important.
	#So, Lets change the nice to -10 (High priority) ;)
	renice -n -10 $$ &> /dev/null

	INPUT=0
	if [[ $1 =~ ^-?[0-9]+$ ]]; then
		INPUT=$1
	fi

	#Import DietPi-Globals ---------------------------------------------------------------
	. /DietPi/dietpi/func/dietpi-globals
	G_CHECK_ROOT_USER
	export G_PROGRAM_NAME='DietPi-Morsecode'
	#Import DietPi-Globals ---------------------------------------------------------------

	#/////////////////////////////////////////////////////////////////////////////////////
	# Output Data
	#/////////////////////////////////////////////////////////////////////////////////////
	OUTPUT_MODE=$INPUT

	#OUTPUT_MODE_0 (TERM/SCREEN)
	TERM_X=$(tput cols)
	TERM_Y=$(tput lines)
	TERM_TOTAL_CHARS=$(( $TERM_X * $TERM_Y - 1))		#How many printed chars are required to fill screen?
	TERM_COLOUR="\e[48;5;15m"

	#OUTPUT_MODE_1 (RPI status LEDs)

	#OUTPUT_MODE_2 (Sound)

	Output_On(){

		#TERM/SCREEN Output
		if (( $OUTPUT_MODE == 0 )); then

			#Set color
			echo -e "$TERM_COLOUR"
			clear

		#RPi status LEDs
		elif (( $OUTPUT_MODE == 1 )); then

			echo 1 > /sys/class/leds/led0/brightness
			echo 1 > /sys/class/leds/led1/brightness

		elif (( $OUTPUT_MODE == 2 )); then

			#Isnt quick enough in bash. cant get buffer/latency low enough to make it usable.
			speaker-test -b 40000 -t sine -f 800 -l 1 -p 1 &> /dev/null &
			pid=$!

		fi

	}

	Output_Off(){

		#TERM/SCREEN Output
		if (( $OUTPUT_MODE == 0 )); then

			#reset colour
			echo -e "\e[0m"
			clear

		#RPi status LEDs
		elif (( $OUTPUT_MODE == 1 )); then

			echo 0 > /sys/class/leds/led0/brightness
			echo 0 > /sys/class/leds/led1/brightness

		elif (( $OUTPUT_MODE == 2 )); then

			kill -9 $pid
			#killall speaker-test &> /dev/null

		fi
	}


	#/////////////////////////////////////////////////////////////////////////////////////
	# Morse Code Data
	#/////////////////////////////////////////////////////////////////////////////////////
	CHAR_CURRENT=0

	#Filepaths
	FP_TEXTFILE_INPUT="$HOME/dietpi-morsecode"
	FP_TEXTFILE_LOWERCASE="/tmp/.dietpi-morsecode_lowercase"

	#Define single unit duration (essentially the speed at which the morse code is outputted)
	MC_DURATION_UNIT=0.15
	#Dash and next char duration ( MC_DURATION_UNIT * 3 )
	MC_DURATION_DASH=$(echo - | awk "{print $MC_DURATION_UNIT * 3}")
	#New word duration ( MC_DURATION_UNIT * 7 )
	MC_DURATION_WORD=$(echo - | awk "{print $MC_DURATION_UNIT * 7}")

	Mc_Convert_Input_Textfile_Lowercase(){

		echo -e "DietPi-Morsecode\n"
		echo -e "Converting input file to lowercase......\n"
		dd if="$FP_TEXTFILE_INPUT" of="$FP_TEXTFILE_LOWERCASE" conv=lcase &> /dev/null
		echo -e "Completed\nRendering to Output_Mode $OUTPUT_MODE"

	}

	Mc_Dot(){

		Output_On
		sleep $MC_DURATION_UNIT
		Output_Off
		sleep $MC_DURATION_UNIT

	}

	Mc_Dash(){

		Output_On
		sleep $MC_DURATION_DASH
		Output_Off
		sleep $MC_DURATION_UNIT

	}

	Mc_Next_Char(){

		sleep $MC_DURATION_DASH

	}

	Mc_Next_Word(){

		sleep $MC_DURATION_WORD

	}

	#AR
	Mc_End_of_Message(){

		Mc_Next_Word
		Mc_Dot
		Mc_Dash
		Mc_Dot
		Mc_Dash
		Mc_Dot
		Mc_Next_Word

	}

	Convert_Text_To_Morsecode(){

		case "$CHAR_CURRENT" in
			0)
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dash
			;;
			1)
				Mc_Dot
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dash
			;;
			2)
				Mc_Dot
				Mc_Dot
				Mc_Dash
				Mc_Dash
				Mc_Dash
			;;
			3)
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dash
				Mc_Dash
			;;
			4)
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dash
			;;
			5)
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			6)
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			7)
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			8)
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dot
			;;
			9)
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dot
			;;
			a)
				Mc_Dot
				Mc_Dash
			;;
			b)
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			c)
				Mc_Dash
				Mc_Dot
				Mc_Dash
				Mc_Dot
			;;
			d)
				Mc_Dash
				Mc_Dot
				Mc_Dot
			;;
			e)
				Mc_Dot
			;;
			f)
				Mc_Dot
				Mc_Dot
				Mc_Dash
				Mc_Dot
			;;
			g)
				Mc_Dash
				Mc_Dash
				Mc_Dot
			;;
			h)
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			i)
				Mc_Dot
				Mc_Dot
			;;
			j)
				Mc_Dot
				Mc_Dash
				Mc_Dash
				Mc_Dash
			;;
			k)
				Mc_Dash
				Mc_Dot
				Mc_Dash
			;;
			l)
				Mc_Dot
				Mc_Dash
				Mc_Dot
				Mc_Dot
			;;
			m)
				Mc_Dash
				Mc_Dash
			;;
			n)
				Mc_Dash
				Mc_Dot
			;;
			o)
				Mc_Dash
				Mc_Dash
				Mc_Dash
			;;
			p)
				Mc_Dot
				Mc_Dash
				Mc_Dash
				Mc_Dot
			;;
			q)
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dash
			;;
			r)
				Mc_Dot
				Mc_Dash
				Mc_Dot
			;;
			s)
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			t)
				Mc_Dash
			;;
			u)
				Mc_Dot
				Mc_Dot
				Mc_Dash
			;;
			v)
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dash
			;;
			w)
				Mc_Dot
				Mc_Dash
				Mc_Dash
			;;
			x)
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dash
			;;
			y)
				Mc_Dash
				Mc_Dot
				Mc_Dash
				Mc_Dash
			;;
			z)
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dot
			;;
			".")
				Mc_Dot
				Mc_Dash
				Mc_Dot
				Mc_Dash
				Mc_Dot
				Mc_Dash
			;;
			",")
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dash
				Mc_Dash
			;;
			":")
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dot
			;;
			"'")
				Mc_Dot
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dash
				Mc_Dot
			;;
			"-")
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dash
			;;
			"/")
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dash
				Mc_Dot
			;;
			"@")
				Mc_Dot
				Mc_Dash
				Mc_Dash
				Mc_Dot
				Mc_Dash
				Mc_Dot
			;;
			"=")
				Mc_Dash
				Mc_Dot
				Mc_Dot
				Mc_Dot
				Mc_Dash
			;;
		esac

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Main Loop
	#/////////////////////////////////////////////////////////////////////////////////////
	#Check for input file
	if [ ! -f "$FP_TEXTFILE_INPUT" ]; then
		clear
		echo -e "\nNo textfile was found. Please create a file at:\n$FP_TEXTFILE_INPUT\nThis file will then be converted to Morse Code."
		exit
	fi

	#-----------------------------------------------------------------------------------
	#Convert input textfile file to lowercase
	Mc_Convert_Input_Textfile_Lowercase
	#-----------------------------------------------------------------------------------
	#Process file (read char one at a time, convert to morse code and render)
	while read -r -n1 CHAR_CURRENT
	do
		#Space (new word)
		if [ "$CHAR_CURRENT" = " " ]; then

			Mc_Next_Word

		#Next char
		else

			Mc_Next_Char
			Convert_Text_To_Morsecode

		fi

	done < "$FP_TEXTFILE_LOWERCASE"

	#Send end of message (AR)
	Mc_End_of_Message
	#-----------------------------------------------------------------------------------
	#Del temp files
	rm "$FP_TEXTFILE_LOWERCASE"
	#-----------------------------------------------------------------------------------
	exit
	#-----------------------------------------------------------------------------------

}