#!/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 #----------------------------------------------------------------------------------- }