#!/bin/sh
#############################################################
path="${0%/*}"
. "$path/inc/gwhw.inc"
. "$path/inc/dali.inc"

needRoot
daliI2COK

usage() {
	die 'gwhw dali test [from: short/group/br] [to: short/group | level] [level]'
}

ADDR1="${1}"
shift
ADDR2="${1:-${ADDR1:-63}}"
shift
LVL="${1}"
shift
#############################################################
setLevel() {
	ADDRHEX="$(addrToHex "$1" 0)"
	daliTX3B 0x00 "${ADDRHEX}" "$(( $2 ))" "$3"
}

setLevelHighLow() {
	setLevel "$1" "${LVL}" "${DSLOT0}"
	setLevel "$1" "${LVL}" "${DSLOT1}"
	sleep 2
	setLevel "$1" 1  "${DSLOT0}"
	setLevel "$1" 1  "${DSLOT1}"
}

recallMAX() {
	ADDRHEX="$(addrToHex "$1" 1)"
	daliTX3B 0x00 "${ADDRHEX}" 0x05 "$2"
}

recallMIN() {
	ADDRHEX="$(addrToHex "$1" 1)"
	daliTX3B 0x00 "${ADDRHEX}" 0x06 "$2"
}

recallMaxMin() {
	recallMAX "$1" "${DSLOT0}"
	recallMAX "$1" "${DSLOT1}"
	sleep 2
	recallMIN "$1" "${DSLOT0}"
	recallMIN "$1" "${DSLOT1}"
}

#############################################################
# RECALL MAX/MIN are absolute level commands

# Custom level
if [ "${ADDR1::1}" = 'l' ]; then
	LVL="${ADDR1:1}"
	ADDR1=""
fi
if [ "${ADDR2::1}" = 'l' ]; then
	LVL="${ADDR2:1}"
	ADDR2="${ADDR1:-63}"
fi
if [ "${LVL::1}" = 'l' ]; then
	LVL="${LVL:1}"
fi
ADDR1="${ADDR1:-0}"

if [ -z "${LVL}" ]; then
	case "x${ADDR1::1}${ADDR2::1}" in
		xgg)
			echo "RECALL MAX/MIN LEVEL for groups ${ADDR1} to ${ADDR2}"
			for i in $(seq "${ADDR1:1}" "${ADDR2:1}"); do echo "group $i"; recallMaxMin "g$i"; done
		;;
		xbb)
			echo "Broadcast RECALL MAX/MIN LEVEL"
			recallMaxMin br
		;;
		x[0-9][0-9])
			echo "RECALL MAX/MIN LEVEL for short ${ADDR1} to ${ADDR2}"
			for i in $(seq "${ADDR1}" "${ADDR2}"); do echo "lamp $i"; recallMaxMin "$i"; done
		;;
		*) die "Invalid range"
	esac
else
		case "x${ADDR1::1}${ADDR2::1}" in
		xgg)
			echo "Set level ${LVL} and 1 for groups ${ADDR1} to ${ADDR2}"
			for i in $(seq "${ADDR1:1}" "${ADDR2:1}"); do echo "group $i"; setLevelHighLow "g$i"; done
		;;
		xbb)
			echo "Broadcast Set level ${LVL} and 1"
			setLevelHighLow br
		;;
		x[0-9][0-9])
			echo "Set level ${LVL} and 1 for short ${ADDR1} to ${ADDR2}"
			for i in $(seq "${ADDR1}" "${ADDR2}"); do echo "lamp $i"; setLevelHighLow "$i"; done
		;;
		*) die "Invalid range"
	esac
fi
echo "done"
