#!/bin/bash
do {
	#////////////////////////////////////
	# 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

	setvar INPUT = '0'
	if [[ $1 =~ ^-?[0-9]+$ ]] {
		setvar INPUT = "$1"
	}

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

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

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

	#OUTPUT_MODE_1 (RPI status LEDs)

	#OUTPUT_MODE_2 (Sound)

	proc Output_On {

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

			#Set color
			echo -e $TERM_COLOUR
			clear

		#RPi status LEDs
		} elif (( $OUTPUT_MODE == 1 )) {

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

		} elif (( $OUTPUT_MODE == 2 )) {

			#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 &
			setvar pid = ""$!

		}

	}

	proc Output_Off {

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

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

		#RPi status LEDs
		} elif (( $OUTPUT_MODE == 1 )) {

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

		} elif (( $OUTPUT_MODE == 2 )) {

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

		}
	}


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

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

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

	proc 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"

	}

	proc Mc_Dot {

		Output_On
		sleep $MC_DURATION_UNIT
		Output_Off
		sleep $MC_DURATION_UNIT

	}

	proc Mc_Dash {

		Output_On
		sleep $MC_DURATION_DASH
		Output_Off
		sleep $MC_DURATION_UNIT

	}

	proc Mc_Next_Char {

		sleep $MC_DURATION_DASH

	}

	proc Mc_Next_Word {

		sleep $MC_DURATION_WORD

	}

	#AR
	proc Mc_End_of_Message {

		Mc_Next_Word
		Mc_Dot
		Mc_Dash
		Mc_Dot
		Mc_Dash
		Mc_Dot
		Mc_Next_Word

	}

	proc Convert_Text_To_Morsecode {

		case (CHAR_CURRENT) {
			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
			}
		}

	}

	#/////////////////////////////////////////////////////////////////////////////////////
	# Main Loop
	#/////////////////////////////////////////////////////////////////////////////////////
	#Check for input file
	if test ! -f $FP_TEXTFILE_INPUT {
		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
	}

	#-----------------------------------------------------------------------------------
	#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
	{
		#Space (new word)
		if test $CHAR_CURRENT = " " {

			Mc_Next_Word

		#Next char
		} else {

			Mc_Next_Char
			Convert_Text_To_Morsecode

		}

	} < "$FP_TEXTFILE_LOWERCASE"

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

}