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

needRoot
daliI2COK

usage() {
	die 'gwhw dali scan [dec-table/hex-table/list/raw/long]'
}

OPT="${1:-dec-table}"
shift

OPT2="$1"
shift

LAST_ADDR=127
#############################################################

genGroupSeq() {
	for addr in $(seq 129 2 ${LAST_ADDR}); do
		echo "2 $addr 0x91"
	done
}

genSeq() {
	for addr in $(seq 1 2 ${LAST_ADDR}); do
		echo "2 $addr 0x91"
	done
}

genLongSeq() {
	for addr in $(seq 1 2 ${LAST_ADDR}); do
		for cmd in 0xc2 0xc3 0xc4 0x91; do
			echo "2 $addr $cmd"
		done
	done
}

daliTXRXSeq() {
	if "$MSPDALI"; then
		mspdali | awk '/^</{print $2, $3, $4, $5}'
		return
	fi
	
	A="${DSLOT0}"; B="${DSLOT1}"
	read a b c
	daliTX3B $a $b $c $B; usleep 1000
	C=$A; A=$B; B=$C
	while read a b c; do
		daliTX3B $a $b $c $B; daliRX4BW $A
		C=$A; A=$B; B=$C
	done
	daliRX4BW $A
}

daliTXRX() {
	genSeq | daliTXRXSeq
}

listDec() {
	v=0
	daliTXRX \
	| while read a b c d; do
		if [ "$v" -ge 64 ]; then
			# In hex, as it would not fit with decimal 
			printf "G%x" "$(( v-64 ))"
		else
			printf "%02d" "$v"
		fi
		case "$a$c$d" in
			0x220x910xff)
				printf ": OK\n"
				;;
			0x820x91*)
				printf ": XX\n"
				;;
			0x?3*)
				printf ": TT\n"
				;;
			*)
				printf ": --\n"
		esac
		: $((v++))
	done
}

tableHex() {
	v=0
	printf "     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f"
	daliTXRX \
	| while read a b c d; do
		[ $((v%16)) = "0" ] && printf "\n%02x:" "$v"
		case "$a$c$d" in
			0x220x910xff)
				if [ "$v" -ge 64 ]; then
					printf " G%x" "$(( v-64 ))"
				else
					printf " %02x" "$v"
				fi
				;;
			0x820x91*)
				printf " XX"
				;;
			0x?3*)
				printf " TT"
				;;
			*)
				printf " --"
		esac
		: $((v++))
	done
	printf "\n"
}

tableDec() {
	v=0
	printf "     0  1  2  3  4  5  6  7  8  9"
	daliTXRX \
	| while read a b c d; do
		[ $((v%10)) = "0" ] && printf "\n%02d:" "$v"
		case "$a$c$d" in
			0x220x910xff)
				if [ "$v" -ge 64 ]; then
					# In hex, as it would not fit with decimal 
					printf " G%x" "$(( v-64 ))"
				else
					printf " %02d" "$v"
				fi
				;;
			0x820x91*)
				printf " XX"
				;;
			0x?3*)
				printf " TT"
				;;
			*)
				printf " --"
		esac
		: $((v++))
	done
	printf "\n"
}

listDecLong() {
	v=0
	genLongSeq | daliTXRXSeq \
	| while read a b c d; do
		case "$a$c$d" in
			0x220x910xff)
				printf "%02d: OK ${hh}${mm:2}${ll:2} ($((${hh}${mm:2}${ll:2})))\n" "$v"
				;;
			0x820x91*)
				printf "%02d: XX\n" "$v"
				;;
			0x?3*)
				printf " TT"
				;;
			0x??0x91*)
				printf "%02d: --\n" "$v"
				;;
			0x220xc2*) hh="$d"
				;;
			0x220xc3*) mm="$d"
				;;
			0x220xc4*) ll="$d"
				;;
		esac
		case "$a$c$d" in
			0x??0x91*)
				: $((v++))
		esac
	done
}

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

case "${OPT}${OPT2}" in
	*+g*) LAST_ADDR=159
	;;
esac


case "${OPT}" in
	dec|dec-table) tableDec
	;;
	hex|hex-table) tableHex
	;;
	list) listDec
	;;
	raw) daliTXRX
	;;
	long) listDecLong
	;;
	rawlong) genLongSeq | daliTXRXSeq
	;;
	*) tableDec
esac

