#!/usr/bin/wish
#
#

global line
set line ""

proc draw {TITLE TAG LEN} {
	global VALUE
	global VALUE2
	set Y 2
	set H 12
	set R 12
	frame .$TAG
	pack .$TAG -side left -fill x
	label .$TAG.errors1 -text "$TITLE"
	pack .$TAG.errors1 -side top -fill x -expand yes
	canvas .$TAG.screen -relief raised -width 320 -height [expr $Y + (($LEN) * $R)]
	pack .$TAG.screen -side top -fill x
	set N 1
	while {$N <= $LEN} {
		eval .$TAG.screen create rectangle 1 [expr $Y + ($N - 1) * $R] 320 [expr $Y + ($N - 1) * $R + $H] -width 1
		eval .$TAG.screen create rectangle 1 [expr $Y + ($N - 1) * $R] 160 [expr $Y + ($N - 1) * $R + $H] -width 1 -tags $TAG$N-3 -fill yellow
		eval .$TAG.screen create rectangle 1 [expr $Y + ($N - 1) * $R] 160 [expr $Y + ($N - 1) * $R + $H] -width 1 -tags $TAG$N-2 -fill green
		eval .$TAG.screen create rectangle 1 [expr $Y + ($N - 1) * $R] 320 [expr $Y + ($N - 1) * $R + $H] -width 1 -tags $TAG$N   -fill red
		set VALUE($N) 0
		set VALUE2($N) 0
		incr N
	}
}


proc update {TAG VALUES LEN FAC} {
	global VALUE
	global VALUE2
	set Y 2
	set H 12
	set R 12
	set N 1
	while {$N <= $LEN} {
		if {[string is integer [lindex $VALUES $N]]} {
			set value [expr [expr [lindex $VALUES $N]] * 320 / 16]
			eval .$TAG.screen coords $TAG$N   1 [expr $Y + ($N - 1) * $R] [expr $value + 1] [expr $Y + ($N - 1) * $R + $H]
			eval .$TAG.screen coords $TAG$N-2 1 [expr $Y + ($N - 1) * $R] [expr \$VALUE($N) + 1] [expr $Y + ($N - 1) * $R + $H]
			eval .$TAG.screen coords $TAG$N-3 1 [expr $Y + ($N - 1) * $R] [expr \$VALUE2($N) + 1] [expr $Y + ($N - 1) * $R + $H]

			if {$value >= $VALUE($N)} {
				set VALUE($N) $value
			} else {
				incr VALUE($N) -1
			}

			if {$value >= $VALUE2($N)} {
				set VALUE2($N) $value
			} else {
				set VALUE2($N) [expr $VALUE2($N) - 0.01]
			}

			incr N
		}
	}
}

proc Serial_Init {ComPort ComRate} {
	set iChannel [open $ComPort w+]
	set rate $ComRate
	fconfigure $iChannel -mode $ComRate,n,8,1
	fconfigure $iChannel -blocking 1
	fconfigure $iChannel -buffering line
	fileevent $iChannel readable ""
	return $iChannel
}

proc rd_chid {chid} {
	global line
	set msg [read $chid 1]
	if {$msg == "\n"} {
		if {[string match "S;*" $line]} {
			puts "#$line#"
			update "b.rssi" [split $line ";"] 16 3
		}
		set line ""
	} else {
		set line "$line$msg"
	}
}


#wm geometry . 320x250
wm title . "RCOPEN24 Scanner-Tool"

frame .b
pack .b -side top -fill x

	draw "RSSI" "b.rssi" 16

if {[lindex $argv 0] != ""} {
	puts "Open Serial-Port: [lindex $argv 0]"

	if {[lindex $argv 1] != ""} {
		set Serial [Serial_Init "[lindex $argv 0]" [lindex $argv 1]]
	} else {
		set Serial [Serial_Init "[lindex $argv 0]" 38400]
	}
} else {
	puts "USAGE: rx-tool COMPORT [BAUD]"
	exit 1
}

fileevent $Serial readable [list rd_chid $Serial]


