Files
own-your-cloudkey/fstab/doled.sh
2025-12-11 10:52:08 +02:00

605 lines
24 KiB
Bash

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