605 lines
24 KiB
Bash
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"
|