#!/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]'
}

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

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

daliTXRX() {
	A="${DSLOT0}"; B="${DSLOT1}"
	daliTX3B 2 1 0x91 $B; usleep 1000
	C=$A; A=$B; B=$C
	for addr in $(seq 3 2 127); do
		daliTX3B 2 $addr 0x91 $B; daliRX4BW $A
		C=$A; A=$B; B=$C
	done
	daliRX4BW $A
}

listDec() {
	v=0
	daliTXRX \
	| while read a b c d; do
		case "$a$c$d" in
			0x220x910xff)
				printf "%02d: OK\n" "$v"
				;;
			0x820x91*)
				printf "%02d: XX\n" "$v"
				;;
			0x?3*)
				printf " TT"
				;;
			*)
				printf "%02d: --\n" "$v"
		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)
				printf " %02x" "$v"
				;;
			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)
				printf " %02d" "$v"
				;;
			0x820x91*)
				printf " XX"
				;;
			0x?3*)
				printf " TT"
				;;
			*)
				printf " --"
		esac
		: $((v++))
	done
	printf "\n"
}

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

case "${OPT}" in
	dec|dec-table) tableDec
	;;
	hex|hex-table) tableHex
	;;
	list) listDec
	;;
	raw) daliTXRX
esac

