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

needRoot
daliI2COK

usage() {
	die 'gwhw dali query [short-address] [list/table/raw]'
}

ADDR="${1:-0}"
shift
OPT="${1:-list}"
shift
#############################################################

toBits() {
	# $1: value to convert
	case "$1" in
		*--) echo "?"; return;
	esac
	val="$(( $1 ))"
	bitmap="$(( 0x80 ))"
	bits=
	while [ "$bitmap" -gt 0 ]; do
		if [ "$(( val & bitmap ))" -gt 0 ]; then
			bits="${bits}1"
		else
			bits="${bits}0"
		fi
		bitmap="$(( bitmap >> 1 ))"
	done
	echo "${bits}"
}

toYN() {
	# $1: value to convert
	case "$1" in
		*ff) echo "Yes"
		;;
		*--) echo "No"
		;;
		*) echo "?"
	esac
}

toDec() {
	# $1: value to convert
	case "$1" in
		*--) echo "?"
		;;
		*) echo "$(( $1 ))"
	esac
}

querySupported() {
	case "${1}" in
		9[0-9ab]) true ;;
		a[0-5])   true ;;
		b?)       true ;;
		c[0-4])   true ;;
		*)        false
	esac
}

queryDescription() {
	case "${1}" in
		90) echo "Status value (XX)"
		;;
		91) echo "Is working (Y/N)"
		;;
		92) echo "Lamp failure (Y/N)"
		;;
		93) echo "Lamp is operating (Y/N)"
		;;
		94) echo "Received level out of limit (Y/N)"
		;;
		95) echo "In reset state (Y/N)"
		;;
		96) echo "Missing short address (Y/N)"
		;;
		97) echo "Version number (XX)"
		;;
		98) echo "DTR content (XX)"
		;;
		99) echo "Device type (XX)"
		;;
		9a) echo "Physical min level (XX)"
		;;
		9b) echo "In power failure mode (Y/N)"
		;;
		a0) echo "Current light level (XX)"
		;;
		a1) echo "Max allowed light level (XX)"
		;;
		a2) echo "Min allowed light level (XX)"
		;;
		a3) echo "Power up level (XX)"
		;;
		a4) echo "System failure level (XX)"
		;;
		a5) echo "Fade time X and fade rate Y (XY)"
		;;
		b?) echo "Scene $(( 0x${1:1} )) light level (XX)"
		;;
		c0) echo "Group 0-7  bit pattern (XX)"
		;;
		c1) echo "Group 8-15 bit pattern (XX)"
		;;
		c2) echo "Random address HH bits"
		;;
		c3) echo "Random address MM bits"
		;;
		c4) echo "Random address LL bits"
		;;
	esac
}

expandValue() {
	# $1 cmd
	# $2 value
	case "${2}" in
		*ER) echo "ERROR"; return;
		;;
		*TT) echo "TIMEOUT"; return;
		;;
	esac
	case "${1}" in
		90) toBits "$2"
		;;
		91) toYN "$2"
		;;
		92) toYN "$2"
		;;
		93) toYN "$2"
		;;
		94) toYN "$2"
		;;
		95) toYN "$2"
		;;
		96) toYN "$2"
		;;
		97) toDec "$2"
		;;
		98) toDec "$2"
		;;
		99) toDec "$2"
		;;
		9a) toDec "$2"
		;;
		9b) toYN "$2"
		;;
		a0) toDec "$2"
		;;
		a1) toDec "$2"
		;;
		a2) toDec "$2"
		;;
		a3) toDec "$2"
		;;
		a4) toDec "$2"
		;;
		a5) echo "${2:2:1}/${2:3:1}"
		;;
		b?) toDec "$2"
		;;
		c0) toBits "$2"
		;;
		c1) toBits "$2"
		;;
		c2) toBits "$2"
		;;
		c3) toBits "$2"
		;;
		c4) toBits "$2"
		;;
	esac
}

#############################################################
ADDR2="$(addrToHex "$ADDR")"

query() {
	# $1: placeholder for unsupported
	A="${DSLOT0}"; B="${DSLOT1}"
	B1=90
	daliTX3B 02 "${ADDR2}" 0x90 $B; usleep 1000
	C=$A; A=$B; B=$C
	skip=
	for i in $(printf "%02x\n" $(seq $(( 0x91 )) $(( 0xc4 )) ) ); do
		querySupported $i || { skip="$skip$1"; continue; }
		daliTX3B 2 "${ADDR2}" 0x$i $B; daliRX4BW $A
		[ -z "$skip" ] || { printf $skip; skip=; }
		C=$A; A=$B; B=$C
	done
	daliRX4BW $A
}

list() {
	query \
	| while read a b c d; do
		desc="$(queryDescription "${c:2}")"
		case "${a}" in
			0x2?) result="${d:2}"
			;;
			0x3?) result="--"
			;;
			0x?3) result="TT"
			;;
			*) result="ER"
		esac
		val="$(expandValue "${c:2}" "0x${result}")"
		printf "%s: %s %8s   %s\n" "${c:2}" "${result}" "${val}" "${desc}"
	done
}

tableHex() {
	v=$((0x90))
	printf "     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f"
	query "skip\n" \
	| while read a b c d; do
		[ $((v%16)) = "0" ] && printf "\n%02x:" "$v"
		case "${a}" in
			0x2?) printf " ${d:2}"
			;;
			0x3?) printf " --"
			;;
			0x?3) printf " TT"
			;;
			skip) printf " NS"
			;;
			*) printf " ER"
		esac
		: $((v++))
	done
	printf "\n"
}

#############################################################

case "${OPT}" in
	hex|hex-table|table) tableHex
	;;
	list) list
	;;
	raw) query
esac
