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