From 4fbb73f881452024b2f5e897e0f682c80dbd94aa Mon Sep 17 00:00:00 2001 From: thisiszeev Date: Thu, 11 Dec 2025 10:52:08 +0200 Subject: [PATCH] Add fstab/doled.sh --- fstab/doled.sh | 604 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 604 insertions(+) create mode 100644 fstab/doled.sh diff --git a/fstab/doled.sh b/fstab/doled.sh new file mode 100644 index 0000000..37c8b76 --- /dev/null +++ b/fstab/doled.sh @@ -0,0 +1,604 @@ +#!/bin/bash + +function msleep { + perl -e "select(undef,undef,undef,${1}/1000)" +} + +function setBlue { + echo "${1}" > /sys/devices/leds_ulogo/leds/ulogo_ctrl/subsystem/blue/brightness +} + +function setWhite { + echo "${1}" > /sys/devices/leds_ulogo/leds/ulogo_ctrl/subsystem/white/brightness +} + +function removeQueue { + echo "Removing ${1} from the queue..." + sed -i "s|^${1}$||g" "/tmp/doled/doled.queue" +} + +function doSet { + setBlue ${1} + setWhite ${2} + msleep ${3} + if [[ ${4} == "lock" ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + fi +} + +function doToggle { + local n + + for ((n=0; n<${7}; n++)); do + doSet ${1} ${2} ${3} + doSet ${4} ${5} ${6} + done + if [[ ${8} == "lock" ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + fi +} + +function doFade { + local blue + local white + local blue_diff + local white_diff + local blue_range + local white range + local range + local max_steps_forward + local max_steps_backward + local steps_forward + local steps_backward + local delay_forward + local delay_backwards + local n + local s + + max_steps_forward=$((${5}/5)) + blue_diff=$((${1}-${3})) + blue_range=${blue_diff#-} + white_diff=$((${2}-${4})) + white_range=${white_diff#-} + if [[ ${blue_range} == 0 ]] && [[ ${white_range} -gt 0 ]]; then + steps_forward=$(( white_range < max_steps_forward ? white_range : max_steps_forward )) + elif [[ ${blue_range} -gt 0 ]] && [[ ${white_range} == 0 ]]; then + steps_forward=$(( blue_range < max_steps_forward ? blue_range : max_steps_forward )) + elif [[ ${blue_range} -gt 0 ]] && [[ ${white_range} -gt 0 ]]; then + range=$(( blue_range < white_range ? blue_range : white_range )) + steps_forward=$(( range < max_steps_forward ? range : max_steps_forward )) + else + steps_forward=${max_steps_forward} + fi + delay_forward=$((${5}/steps_forward)) + if [[ ${6} -ge 5 ]]; then + max_steps_backward=$((${6}/5)) + if [[ ${blue_range} == 0 ]] && [[ ${white_range} -gt 0 ]]; then + steps_backward=$(( white_range < max_steps_backward ? white_range : max_steps_backward )) + elif [[ ${blue_range} -gt 0 ]] && [[ ${white_range} == 0 ]]; then + steps_backward=$(( blue_range < max_steps_backward ? blue_range : max_steps_backward )) + elif [[ ${blue_range} -gt 0 ]] && [[ ${white_range} -gt 0 ]]; then + range=$(( blue_range < white_range ? blue_range : white_range )) + steps_backward=$(( range < max_steps_backward ? range : max_steps_backward )) + else + steps_backward=${max_steps_backward} + fi + delay_backward=$((${6}/steps_backward)) + fi + for ((n=0; n<${7}; n++)); do + for ((s=0; s<${steps_forward}; s++)); do + blue=$((${1}-(blue_diff*s/(steps_forward-1)))) + white=$((${2}-(white_diff*s/(steps_forward-1)))) + doSet ${blue} ${white} ${delay_forward} + done + if [[ ${6} -ge 5 ]]; then + for ((s=0; s<${steps_backward}; s++)); do + blue=$((${3}+(blue_diff*s/(steps_backward-1)))) + white=$((${4}+(white_diff*s/(steps_backward-1)))) + doSet ${blue} ${white} ${delay_backward} + done + fi + done + if [[ ${8} == "lock" ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + fi +} + +function doLoop { + local n + local i + + for ((n=0; n<${2}; n++)); do + for ((i=$((index+1)); i<$((index+${1}+1)); i++)); do + if [[ ${cmds[${i}]} == "set" ]]; then + #echo "doSet ${opts1[${i}]} ${opts2[${i}]} ${opts3[${i}]}" >> "/tmp/doled/${lockfilename}.errors" + doSet ${opts1[${i}]} ${opts2[${i}]} ${opts3[${i}]} + elif [[ ${cmds[${i}]} == "toggle" ]]; then + #echo "doToggle ${opts1[${i}]} ${opts2[${i}]} ${opts3[${i}]} ${opts4[${i}]} ${opts5[${i}]} ${opts6[${i}]} ${opts7[${i}]}" >> "/tmp/doled/${lockfilename}.errors" + doToggle ${opts1[${i}]} ${opts2[${i}]} ${opts3[${i}]} ${opts4[${i}]} ${opts5[${i}]} ${opts6[${i}]} ${opts7[${i}]} + elif [[ ${cmds[${i}]} == "fade" ]]; then + #echo "doFade ${opts1[${i}]} ${opts2[${i}]} ${opts3[${i}]} ${opts4[${i}]} ${opts5[${i}]} ${opts6[${i}]} ${opts7[${i}]}" >> "/tmp/doled/${lockfilename}.errors" + doFade ${opts1[${i}]} ${opts2[${i}]} ${opts3[${i}]} ${opts4[${i}]} ${opts5[${i}]} ${opts6[${i}]} ${opts7[${i}]} +# elif [[ ${cmds[${i}]} == "loop" ]]; then +# #echo "doLoop ${opts1[${i}]} ${opts2[${i}]}" >> "/tmp/doled/${lockfilename}.errors" +# doLoop ${opts1[${i}]} ${opts2[${i}]} + elif [[ ${cmds[${i}]} == "stop" ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + doSet 0 0 5 + removeQueue "${filename}" + fi + done + done + if [[ ${3} == "lock" ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + fi +} + +if [[ -z ${1} ]]; then + echo "Must give LED sequence file name..." >&2 + echo "Example:" >&2 + echo "./doled.sh filename" >&2 + exit 1 +fi + +declare filename="${1}" +declare lockfilename="${filename//\//.}" +if [[ ${lockfilename:0:1} == "." ]]; then + lockfilename="${lockfilename:1}" +fi + +mkdir -p "/tmp/doled" +touch "/tmp/doled/doled.queue" + +if [[ ! -f "${filename}" ]]; then + echo "Given LED sequence file name does not exist..." >&2 + exit 2 +fi + +if [[ ${2} == "remove" ]]; then + removeQueue ${filename} + exit 0 +fi + +if ! grep -q "^${filename}$" "/tmp/doled/doled.queue"; then + echo "Adding ${filename} to the queue..." + echo "${filename}" >> "/tmp/doled/doled.queue" +else + echo "${filename} is already in the queue..." +fi + +if [[ -f "/tmp/doled/doled.lock" ]]; then + echo "doled.sh is already running..." + exit 3 +fi + +touch "/tmp/doled/doled.lock" +uled-ctrl off + +while [[ $(cat "/tmp/doled/doled.queue" | wc -l) -gt 0 ]]; do + while read -r filename; do + [[ "${filename}" =~ ^#.*$ || -z "${filename}" ]] && continue + + lockfilename="${filename//\//.}" + if [[ ${lockfilename:0:1} == "." ]]; then + lockfilename="${lockfilename:1}" + fi + + if [[ ! -f "${filename}" ]]; then + removeQueue ${filename} + else + + declare -a cmds + declare -a opts1 + declare -a opts2 + declare -a opts3 + declare -a opts4 + declare -a opts5 + declare -a opts6 + declare -a opts7 + declare -a jumps + declare -A jumppoints + declare -A jumpcount + declare count=0 + declare errors=0 + declare index=0 + + echo "Loading and checking sequence file ${filename}..." + rm -f "/tmp/doled/${lockfilename}.errors" + while read -r cmd opt1 opt2 opt3 opt4 opt5 opt6 opt7; do + + ((count++)) + + [[ "${cmd}" =~ ^#.*$ || -z "${cmd}" ]] && continue + + if [[ ${cmd,,} == "set" ]]; then + ## Set a brightness per colour and wait a duration + ## opt1 = blue value : 0-255 / on / off + ## opt2 = white value : 0-255 / on / off + ## opt3 = duration : integer 5-5000 (ms) + if [[ ${opt1,,} == "on" ]] || [[ ${opt1} -gt 255 ]]; then + opt1=255 + elif [[ ${opt1,,} == "off" ]] || [[ ${opt1} -lt 0 ]]; then + opt1=0 + fi + if [[ ! ${opt1} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt1 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt2,,} == "on" ]] || [[ ${opt2} -gt 255 ]]; then + opt2=255 + elif [[ ${opt2,,} == "off" ]] || [[ ${opt2} -lt 0 ]]; then + opt2=0 + fi + if [[ ! ${opt2} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt2 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ! ${opt3} =~ ^(5000|[1-4][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[5-9])$ ]]; then + echo "Error at line ${count} : opt3 must be 5-5000" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + opt4=0 + opt5=0 + opt6=0 + opt7=0 + elif [[ ${cmd,,} == "toggle" ]]; then + ## Toggle between two sets of brightness per colour with a duration for each and a count number of times + ## opt1 = first blue value : 0-255 / on / off + ## opt2 = first white value : 0-255 / on / off + ## opt3 = first duration : integer 5-5000 (ms) + ## opt4 = second blue value : 0-255 / on / off + ## opt5 = second white value : 0-255 / on / off + ## opt6 = second duration : integer 5-5000 (ms) + ## opt7 = count : 1-256 or omitted + if [[ ${opt1,,} == "on" ]] || [[ ${opt1} -gt 255 ]]; then + opt1=255 + elif [[ ${opt1,,} == "off" ]] || [[ ${opt1} -lt 0 ]]; then + opt1=0 + fi + if [[ ! ${opt1} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt1 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt2,,} == "on" ]] || [[ ${opt2} -gt 255 ]]; then + opt2=255 + elif [[ ${opt2,,} == "off" ]] || [[ ${opt2} -lt 0 ]]; then + opt2=0 + fi + if [[ ! ${opt2} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt2 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ! ${opt3} =~ ^(5000|[1-4][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[5-9])$ ]]; then + echo "Error at line ${count} : opt3 must be 5-5000" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt4,,} == "on" ]] || [[ ${opt4} -gt 255 ]]; then + opt4=255 + elif [[ ${opt4,,} == "off" ]] || [[ ${opt4} -lt 0 ]]; then + opt4=0 + fi + if [[ ! ${opt4} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt4 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt5,,} == "on" ]] || [[ ${opt5} -gt 255 ]]; then + opt5=255 + elif [[ ${opt5,,} == "off" ]] || [[ ${opt5} -lt 0 ]]; then + opt5=0 + fi + if [[ ! ${opt5} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt5 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ! ${opt6} =~ ^(5000|[1-4][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[5-9])$ ]]; then + echo "Error at line ${count} : opt6 must be 5-5000" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ -z ${opt7} ]]; then + opt7=1 + fi + if [[ ! ${opt7} =~ ^(25[0-6]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[1-9])$ ]]; then + echo "Error at line ${count} : opt7 must be 1-256" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + elif [[ ${cmd,,} == "fade" ]]; then + ## Fade from a start brightness per colour to an end brightness per colour for a duration time + ## Optional reverse fade direction for another duration time + ## Optional count number of fade cycles + ## opt1 = start blue value : 0-255 / on / off + ## opt2 = start white value : 0-255 / on / off + ## opt3 = end blue value : 0-255 / on / off + ## opt4 = end white value : 0-255 / on / off + ## opt5 = duration : integer 5-5000 (ms) + ## opt6 = reverse duration : integer (ms) (optional) + ## opt7 = count : 1-256 (optional - set opt6 to 0 if using opt7 but not opt 6) + if [[ ${opt1,,} == "on" ]] || [[ ${opt1} -gt 255 ]]; then + opt1=255 + elif [[ ${opt1,,} == "off" ]] || [[ ${opt1} -lt 0 ]]; then + opt1=0 + fi + if [[ ! ${opt1} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt1 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt2,,} == "on" ]] || [[ ${opt2} -gt 255 ]]; then + opt2=255 + elif [[ ${opt2,,} == "off" ]] || [[ ${opt2} -lt 0 ]]; then + opt2=0 + fi + if [[ ! ${opt2} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt2 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt3,,} == "on" ]] || [[ ${opt3} -gt 255 ]]; then + opt3=255 + elif [[ ${opt3,,} == "off" ]] || [[ ${opt3} -lt 0 ]]; then + opt3=0 + fi + if [[ ! ${opt3} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt3 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ${opt4,,} == "on" ]] || [[ ${opt4} -gt 255 ]]; then + opt4=255 + elif [[ ${opt4,,} == "off" ]] || [[ ${opt4} -lt 0 ]]; then + opt4=0 + fi + if [[ ! ${opt4} =~ ^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$ ]]; then + echo "Error at line ${count} : opt4 must be on, off or 0-255" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ! ${opt5} =~ ^(5000|[1-4][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[5-9])$ ]]; then + echo "Error at line ${count} : opt5 must be 5-5000" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ -z ${opt6} ]]; then + opt6=0 + fi + if [[ ! ${opt6} =~ ^(5000|[1-4][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[5-9]|0)$ ]]; then + echo "Error at line ${count} : opt6 must be 5-5000, 0 if using opt7 or can be omitted if not using opt7" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ -z ${opt7} ]]; then + opt7=1 + fi + if [[ ! ${opt7} =~ ^(25[0-6]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[1-9])$ ]]; then + echo "Error at line ${count} : opt7 must be 1-256 or omitted" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + elif [[ ${cmd,,} == "loop" ]]; then + ## Loop the next number of lines count number of times + ## opt1 = number of sequential lines to loop : 2-256 + ## opt2 = count : 2-256 + if [[ ! ${opt1} =~ ^(25[0-6]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])$ ]]; then + echo "Error at line ${count} : opt1 must be 2-256" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ ! ${opt2} =~ ^(25[0-6]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[2-9])$ ]]; then + echo "Error at line ${count} : opt2 must be 2-256" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + opt3=0 + opt4=0 + opt5=0 + opt6=0 + opt7=0 + elif [[ ${cmd,,} == "stop" ]]; then + ## no opts as it stops the file + opt1=0 + opt2=0 + opt3=0 + opt4=0 + opt5=0 + opt6=0 + opt7=0 + elif [[ ${cmd,,} == "restart" ]]; then + ## no opts as it starts the file back at the beginning + opt1=0 + opt2=0 + opt3=0 + opt4=0 + opt5=0 + opt6=0 + opt7=0 + elif [[ ${cmd,,} == "label" ]]; then + ## Defines a jump point. Opt1 is the name of the jump point and must be 2 characters or more and must start with a letter and only contain letters, numbers, hyphens and underscores. + if [[ ! ${opt1} =~ ^[A-Za-z][A-Za-z0-9_-]+$ ]]; then + echo "Error at line ${count} : opt1 must be string starting with a letter and containing only letters, digits, hyphens and underscores" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + if [[ -n ${jumppoints[${opt1}]} ]]; then + echo "Error at line ${count} : opt1 can only be unique once in the sequence" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + opt2=0 + opt3=0 + opt4=0 + opt5=0 + opt6=0 + opt7=0 + elif [[ ${cmd,,} == "jump" ]]; then + ## Jumps to a jump point. Opt1 is the name of the jump point and must be 2 characters or more and must start with a letter and only contain letters, numbers, hyphens and underscores. + if [[ ! ${opt1} =~ ^[A-Za-z][A-Za-z0-9_-]+$ ]]; then + echo "Error at line ${count} : opt1 must be string starting with a letter and containing only letters, digits, hyphens and underscores" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + opt2=0 + opt3=0 + opt4=0 + opt5=0 + opt6=0 + opt7=0 +# elif [[ ${cmd,,} == "load" ]]; then +# ## Loads a png to the oled display if opt1="image" +# ## Loads a sequence of pngs to the oled display if opt1="images" +# elif [[ ${cmd,,} == "unload" ]]; then +# ## Blanks out the oled display and stops any sequence started by "load images" +# elif [[ ${cmd,,} == "var" ]]; then +# ## Defines a variable +# ## opt1 is variable name +# ## opt2 is variable value (default = 0) +# ## opt3 is variable type (default = int | options are int, bool, float) +# ## opt4 is variable lower limit value (default = 0) +# ## opt5 is variable lower limit value (default = 255) +# elif [[ ${cmd,,} == "inc" ]]; then +# ## Increments a variable +# ## opt1 is variable name +# ## opt2 is the increment value (default = 1) +# elif [[ ${cmd,,} == "dec" ]]; then +# ## Decrements a variable +# ## opt1 is variable name +# ## opt2 is the decrement value (default = 1) +# elif [[ ${cmd,,} == "if" ]]; then +# ## Opens if conditional block +# elif [[ ${cmd,,} == "elif" ]]; then +# ## Subsequent if conditional block +# elif [[ ${cmd,,} == "fi" ]]; then +# ## Closes if conditional block +# elif [[ ${cmd,,} == "else" ]]; then +# ## Aternative to if conditional blocks +# elif [[ ${cmd,,} == "while" ]]; then +# ## Opens while conditional loop block +# elif [[ ${cmd,,} == "elihw" ]]; then +# ## Closes while conditional loop block +# elif [[ ${cmd,,} == "until" ]]; then +# ## Opens until conditional loop block +# elif [[ ${cmd,,} == "litnu" ]]; then +# ## Closes until conditional loop block +# elif [[ ${cmd,,} == "for" ]]; then +# ## Opens for loop block +# elif [[ ${cmd,,} == "rof" ]]; then +# ## Closes for loop block +# elif [[ ${cmd,,} == "sum" ]]; then +# ## Do sum (+ - * /) - must be able to support float +# elif [[ ${cmd,,} == "inv" ]]; then +# ## Invert a variable. true becomes false, int and float becomes the equivelent value based on distance from lower and upper limit +# elif [[ ${cmd,,} == "wait" ]]; then +# ## Pause for a number of milliseconds +# elif [[ ${cmd,,} == "run" ]]; then +# ## Runs a sequence from an external sequence file then continues with the current sequence file +# elif [[ ${cmd,,} == "return" ]]; then +# ## Returns to the original location of the last jump command and then continues with the sequence +# elif [[ ${cmd,,} == "" ]]; then +# ## + else + echo "Error at line ${count} : ${cmd,,} is not a valid command" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + + if [[ ${errors} == 0 ]]; then + cmds+=(${cmd,,}) + opts1+=(${opt1}) + opts2+=(${opt2}) + opts3+=(${opt3}) + opts4+=(${opt4}) + opts5+=(${opt5}) + opts6+=(${opt6}) + opts7+=(${opt7}) + if [[ ${cmd,,} == "label" ]]; then + jumppoints[${opt1}]=${index} + fi + if [[ ${cmd,,} == "jump" ]]; then + jumpcount[${opt1}]=${count} + jumps+=(${opt1}) + jumps=($(echo "${jumps}" | tr ' ' '\n' | sort | uniq)) + fi + ((index++)) + fi + + done < "${filename}" + + for jump in ${jumps[@]}; do + if [[ -z ${jumppoints[${jump}]} ]]; then + echo "Error at line ${jumpcount[${jump}]} : Jump point ${jump} is called but is not labelled" >> "/tmp/doled/${lockfilename}.errors" + ((errors++)) + fi + done + + if [[ ${errors} -gt 0 ]]; then + echo "A total of ${errors} were found! Exiting..." >> "/tmp/doled/${lockfilename}.errors" + removeQueue "${filename}" + else + + #/sys/devices/leds_ulogo/leds/ulogo_ctrl/subsystem/blue + #/sys/devices/leds_ulogo/leds/ulogo_ctrl/subsystem/white + + echo "Starting sequence... ${filename}" + + index=0 + + while grep -q "^${filename}$" "/tmp/doled/doled.queue" && [[ ${#cmds[@]} -ge ${index} ]]; do + + if [[ ! -f "/tmp/doled/${lockfilename}.lock" ]]; then + if [[ ${cmds[${index}]} == "set" ]]; then + touch "/tmp/doled/${lockfilename}.lock" + #echo "doSet ${opts1[${index}]} ${opts2[${index}]} ${opts3[${index}]} lock &" >> "/tmp/doled/${lockfilename}.errors" + doSet ${opts1[${index}]} ${opts2[${index}]} ${opts3[${index}]} lock & + ((index++)) + elif [[ ${cmds[${index}]} == "toggle" ]]; then + touch "/tmp/doled/${lockfilename}.lock" + #echo "doToggle ${opts1[${index}]} ${opts2[${index}]} ${opts3[${index}]} ${opts4[${index}]} ${opts5[${index}]} ${opts6[${index}]} ${opts7[${index}]} lock &" >> "/tmp/doled/${lockfilename}.errors" + doToggle ${opts1[${index}]} ${opts2[${index}]} ${opts3[${index}]} ${opts4[${index}]} ${opts5[${index}]} ${opts6[${index}]} ${opts7[${index}]} lock & + ((index++)) + elif [[ ${cmds[${index}]} == "fade" ]]; then + touch "/tmp/doled/${lockfilename}.lock" + #echo "doFade ${opts1[${index}]} ${opts2[${index}]} ${opts3[${index}]} ${opts4[${index}]} ${opts5[${index}]} ${opts6[${index}]} ${opts7[${index}]} lock &" >> "/tmp/doled/${lockfilename}.errors" + doFade ${opts1[${index}]} ${opts2[${index}]} ${opts3[${index}]} ${opts4[${index}]} ${opts5[${index}]} ${opts6[${index}]} ${opts7[${index}]} lock & + ((index++)) + elif [[ ${cmds[${index}]} == "loop" ]]; then + touch "/tmp/doled/${lockfilename}.lock" + #echo "doLoop ${opts1[${index}]} ${opts2[${index}]} lock &" >> "/tmp/doled/${lockfilename}.errors" + doLoop ${opts1[${index}]} ${opts2[${index}]} lock & + index=$((index+${opts1[${index}]}+1)) + elif [[ ${cmds[${index}]} == "stop" ]]; then +# rm -f "/tmp/doled/${lockfilename}.lock" + doSet 0 0 5 + removeQueue "${filename}" + elif [[ ${cmds[${index}]} == "restart" ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + doSet 0 0 5 + index=0 + elif [[ ${cmds[${index}]} == "label" ]]; then + if [[ ${jumppoints[${opts1[${index}]}]} != ${index} ]]; then + echo "Runtime error : label ${opts1[${index}]} has moved to ${index}, expecting ${jumppoints[${opts1[${index}]}]}" >> "/tmp/doled/${lockfilename}.errors" + rm -f "/tmp/doled/${lockfilename}.lock" + doSet 0 0 5 + removeQueue "${filename}" + fi + elif [[ ${cmds[${index}]} == "jump" ]]; then + if [[ ! ${jumppoints[${opts1[${index}]}]} =~ ^[0-9]+$ ]]; then + echo "Runtime error : jump is trying to locate an invalid jumppoint at ${jumppoints[${opts1[${index}]}]}" >> "/tmp/doled/${lockfilename}.errors" + fi + index=${jumppoints[${opts1[${index}]}]} + elif [[ ${index} -ge ${#cmds[@]} ]]; then + rm -f "/tmp/doled/${lockfilename}.lock" + doSet 0 0 5 + ((index++)) + fi + fi + + done + fi + fi + unset cmds + unset opts1 + unset opts2 + unset opts3 + unset opts4 + unset opts5 + unset opts6 + unset opts7 + unset jumps + unset jumpcount + unset jumppoints + done < "/tmp/doled/doled.queue" + sed -i '/^$/d' "/tmp/doled/doled.queue" +done + +while [[ -f "/tmp/doled/${lockfilename}.lock" ]]; do + msleep 250 +done + +doSet 0 0 5 +rm -f "/tmp/doled/doled.lock"