#!/usr/bin/wish
#
#

global line
global argv
set line ""
set VERSION ""

proc draw_compas_rec {CANVAS CANVAS_W CANVAS_H COMPASS TARGET} {
	set x [expr $CANVAS_W / 2]
	$CANVAS delete compass
	$CANVAS create rec 1 1 $CANVAS_W 45 -fill black -tags compass
	$CANVAS create line $x 5 $x 25 -fill red -tags compass
	set y 7
	set v 5
	$CANVAS create polygon $x $y [expr {$x + $v}] [expr {$y - $v}] [expr {$x - $v}] [expr {$y - $v}] -fill green -tags compass
	set y 25
	$CANVAS create polygon $x $y [expr {$x + $v}] [expr {$y + $v}] [expr {$x - $v}] [expr {$y + $v}] -fill green -tags compass
	for {set N [expr $COMPASS - $CANVAS_W / 2]} {$N <= [expr $COMPASS + $CANVAS_W / 2]} {set N [expr $N + 1]} {
		set OFFSET [expr $N - $COMPASS + $CANVAS_W / 2]
		set N2 $N
		if {$N2 >= 360} {
			set N2 [expr $N2 - 360]
		} elseif {$N2 < 0} {
			set N2 [expr $N2 + 360]
		}
		if {[expr $N2 % 90] == 0} {
			$CANVAS create line $OFFSET 23 $OFFSET 30 -fill white -tags compass
			if {$N2 == 0 || $N2 == 360} {
				$CANVAS create text $OFFSET 15 -text "N" -tags compass_text -fill white -tags compass
			} elseif {$N2 == 90} {
				$CANVAS create text $OFFSET 15 -text "E" -tags compass_text -fill white -tags compass
			} elseif {$N2 == 180} {
				$CANVAS create text $OFFSET 15 -text "S" -tags compass_text -fill white -tags compass
			} elseif {$N2 == 270} {
				$CANVAS create text $OFFSET 15 -text "W" -tags compass_text -fill white -tags compass
			}
		} elseif {[expr $N2 % 45] == 0} {
			$CANVAS create line $OFFSET 23 $OFFSET 30 -fill white -tags compass
			$CANVAS create text $OFFSET 15 -text "$N2" -tags compass_text -fill white -tags compass
		} elseif {[expr $N2 % 15] == 0} {
			$CANVAS create line $OFFSET 25 $OFFSET 30 -fill white -tags compass
		} elseif {[expr $N2 % 5] == 0} {
			$CANVAS create line $OFFSET 27 $OFFSET 30 -fill gray -tags compass
		}
	}
	$CANVAS create text $x 39 -text "$COMPASS" -tags compass_text -fill white -tags compass
	set x [expr $TARGET - $COMPASS + $CANVAS_W / 2]
	set y 7
	$CANVAS create polygon $x $y [expr {$x + $v}] [expr {$y - $v}] [expr {$x - $v}] [expr {$y - $v}] -outline green -tags compass
}

proc draw_batt_bar {CANVAS CANVAS_W CANVAS_H VALUE ALARM} {
	$CANVAS delete batt
#	$CANVAS create rec 1 1 $CANVAS_W $CANVAS_H -fill black -tags batt
#	$CANVAS create rec 3 3 [expr $CANVAS_W - 2] [expr $CANVAS_H - 2] -fill red -tags batt
#	$CANVAS create rec 3 [expr $CANVAS_H - ($CANVAS_H * $VALUE / 100) + 2] [expr $CANVAS_W - 2] [expr $CANVAS_H - 2] -fill green -tags batt
	$CANVAS create line 1 [expr $CANVAS_H - ($CANVAS_H * $VALUE / 100) + 2] $CANVAS_W [expr $CANVAS_H - ($CANVAS_H * $VALUE / 100) + 2] -fill blue -tags batt
	$CANVAS create line 1 [expr $CANVAS_H - ($CANVAS_H * $ALARM / 100) + 2] $CANVAS_W [expr $CANVAS_H - ($CANVAS_H * $ALARM / 100) + 2] -fill black -tags batt
	$CANVAS create text [expr $CANVAS_W / 2] [expr $CANVAS_H - 17] -text "$VALUE%" -tags compass_text -fill black -tags batt
}

proc draw {TITLE TAG LEN} {
	set Y 2
	set H 2
	set R 4
	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 140 -height [expr $Y + (($LEN) * $R)]
	pack .$TAG.screen -side top -fill x
	set N 1
	while {$N <= $LEN} {
		eval .$TAG.screen create rectangle 0 [expr $Y + ($N - 1) * $R] [expr 128] [expr $Y + ($N - 1) * $R + $H] -width 1
		eval .$TAG.screen create rectangle 0 [expr $Y + ($N - 1) * $R] 64 [expr $Y + ($N - 1) * $R + $H] -width 1 -tags $TAG$N -fill red
		incr N
	}
}

proc update2 {TAG VALUES LEN FAC OFFSET} {
	set Y 2
	set H 2
	set R 4
	set N 1
	while {$N <= $LEN} {
		set value [expr [expr [lindex $VALUES $N] + $OFFSET] / $FAC / 2]
		if {$value < 0} {
			set value 0
		} elseif {$value > 255} {
			set value 255
		}
		eval .$TAG.screen coords $TAG$N 0 [expr $Y + ($N - 1) * $R] $value [expr $Y + ($N - 1) * $R + $H]
		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 0
	fconfigure $iChannel -buffering none
	fileevent $iChannel readable ""
	return $iChannel
}

proc send_channel {CHANNEL VALUE} {
	global Serial
	puts $Serial "SCH;$CHANNEL;$VALUE\n"
}

proc send_cmd {CMD} {
	global Serial
	puts -nonewline $Serial "$CMD"
}

proc get_update {} {
	global SYSINFO
	global VERSION
	global Serial
	global argv

	close $Serial

	set RUNNING_VERSION $VERSION
	set LAST_VERSION "0"
	catch {
		exec xterm -e "wget -O - http://www.rcopen24.org/targets/[lindex [split $SYSINFO "/"] 0]/[lindex [split $SYSINFO "/"] 1]/index.html > rx-tool_wget.TmP"
		set LAST_VERSION [string trimright [lindex [split [exec cat rx-tool_wget.TmP | grep "[lindex [split $SYSINFO "/"] 0]/[lindex [split $SYSINFO "/"] 1]/[lindex [split $SYSINFO "/"] 0]_[lindex [split $SYSINFO "/"] 1]-[lindex [split $SYSINFO "/"] 2].srec:VERSION="] "="] 1] " ->"]
	}
	catch {exec rm -rf rx-tool_wget.TmP}
	if {$LAST_VERSION != "0"} {
		if {$LAST_VERSION > $RUNNING_VERSION} {
			puts "## FOUND UPDATES ($LAST_VERSION > $RUNNING_VERSION) ##"
			set DOWNLOAD_OK 0
			catch {
				puts "wget http://www.rcopen24.org/targets/[lindex [split $SYSINFO "/"] 0]/[lindex [split $SYSINFO "/"] 1]/[lindex [split $SYSINFO "/"] 0]_[lindex [split $SYSINFO "/"] 1]-[lindex [split $SYSINFO "/"] 2].srec > rx-tool_wget-srec.TmP"
				exec xterm -e "wget -O - http://www.rcopen24.org/targets/[lindex [split $SYSINFO "/"] 0]/[lindex [split $SYSINFO "/"] 1]/[lindex [split $SYSINFO "/"] 0]_[lindex [split $SYSINFO "/"] 1]-[lindex [split $SYSINFO "/"] 2].srec > rx-tool_wget-srec.TmP"
				set DOWNLOAD_OK 1
			}
			if {$DOWNLOAD_OK == 1} {
				puts "start flashing new firmware (meshprog -t [lindex $argv 0] -f rx-tool_wget-srec.TmP)..."
				catch {
					exec xterm -e "meshprog -t [lindex $argv 0] -f rx-tool_wget-srec.TmP"
					after 1000
				}
			} else {
				puts "Error loading last Version from:"
				puts "	http://www.rcopen24.org/targets/[lindex [split $SYSINFO "/"] 0]/[lindex [split $SYSINFO "/"] 1]/[lindex [split $SYSINFO "/"] 0]_[lindex [split $SYSINFO "/"] 1]-[lindex [split $SYSINFO "/"] 2].srec"
			}
			catch {exec rm -rf rx-tool_wget-srec.TmP}
		} else {
			puts "You have allready the newest Firmware-Version: $RUNNING_VERSION"
		}
		puts "LAST_VERSION=$LAST_VERSION"
	} else {
		puts "Error reading last Version from:"
		puts "	http://www.rcopen24.org/targets/[lindex [split $SYSINFO "/"] 0]/[lindex [split $SYSINFO "/"] 1]/index.html"
	}

	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]
	send_cmd "c"
	after 100
	send_cmd "I"
}

proc rd_chid {chid} {
	global line
	global VERSION
	global SYSINFO
	set msg [read $chid 1]
	if {$msg == "\n"} {
#		puts "$line"
		if {[string match "SYSINFO:*" $line]} {
			set SYSINFO [lrange [split $line ":"] 1 end]
			set VERSION [lindex [split $SYSINFO "/"] 3]
			wm title . "RCOPEN24 RX-Tool ($SYSINFO)"
		} elseif {[string match "MT:*" $line]} {
			set TEXT [lrange [split $line ":"] 2 end]
			catch {
				wm title .menu "RCOPEN24 Menu: $TEXT"
			}
		} elseif {[string match "ME:*:*" $line]} {
			set TEXT [lindex [split [lrange [split $line ":"] 2 end] "="] 0]
			set VALUE [lrange [split [lrange [split $line ":"] 2 end] "="] 1 end]
			set ID [lindex [split $line ":"] 1]
#			puts "$ID: $TEXT == $VALUE"
			catch {
				eval .menu.topm.frame_list.me$ID.n configure -text \"$TEXT\"
				eval .menu.topm.frame_list.me$ID.v configure -text \"$VALUE\"
				eval .menu.topm.frame_list.me$ID.n configure -relief flat
				eval .menu.topm.frame_list.me$ID.v configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 1].n configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 1].v configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 1].n configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 1].v configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 2].n configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 2].v configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 2].n configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 2].v configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 3].n configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 3].v configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 3].n configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 3].v configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 4].n configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 4].v configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 4].n configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 4].v configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 5].n configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 5].v configure -text \"\"
				eval .menu.topm.frame_list.me[expr $ID + 5].n configure -relief flat
				eval .menu.topm.frame_list.me[expr $ID + 5].v configure -relief flat
			}
			if {[string match ">*" $TEXT]} {
				catch {
					eval .menu.topm.frame_list.me$ID.n configure -relief sunken
					eval .menu.topm.frame_list.me$ID.v configure -relief sunken
				}
			}




		} elseif {[string match "ADC;*" $line]} {
			update2 "a.adc" [split $line ";"] 4 8 0
			draw_batt_bar .c.screen3 40 240 [expr [lindex [split $line ";"] 1] * 100 / 1024] 75
		} elseif {[string match "CHV;*" $line]} {
			update2 "a.channel" [split $line ";"] 8 16 2048
		} elseif {[string match "FSV;*" $line]} {
			update2 "a.failsave" [split $line ";"] 8 16 2048
		} elseif {[string match "LQI;*" $line]} {
			update2 "b.lqi" [split $line ";"] 16 1 0
		} elseif {[string match "RSI;*" $line]} {
			update2 "b.rssi" [split $line ";"] 16 .11 0
		} elseif {[string match "SCN;*" $line]} {
			update2 "b.noise" [split $line ";"] 16 0.12 0

		} elseif {[string match "MAG;*" $line]} {

			set COMPASS [expr [lindex [split $line ";"] 1] / 10.0]
			.c.screen delete compass
			.c.screen create arc 11 11 60 60 -start [expr -$COMPASS + 90.0] -extent 0 -fill blue -width 2 -tags compass
			.c.screen delete compass_text
			.c.screen create text 37 44 -text $COMPASS -tags compass_text

			set COMPASS [expr [lindex [split $line ";"] 1] / 10]
			draw_compas_rec .c.screen2 240 40 $COMPASS 230


		} elseif {[string match "AHR;*" $line]} {

			set COMPASS [expr [lindex [split $line ";"] 3] / 100.0]
			.c.screen delete compass
			.c.screen create arc 11 11 60 60 -start [expr -$COMPASS + 90.0] -extent 0 -fill blue -width 2 -tags compass
			.c.screen delete compass_text
			.c.screen create text 37 44 -text $COMPASS -tags compass_text

			set COMPASS [expr [lindex [split $line ";"] 3] / 100]
			draw_compas_rec .c.screen2 240 40 $COMPASS 230

		} elseif {[string match "ETC;*" $line]} {
			set line2 [split $line ";"]
			.frame1.last_error configure -text "Last-Error: [lindex $line2 1]"
			.frame1.quality_errors configure -text "Quality-Errors: [lindex $line2 2]/[lindex $line2 3] ([lindex $line2 4]%)"
			.frame2.txid configure -text "TXID: [lindex $line2 5]"
			.frame2.setup_txid configure -text "Setup-TXID: [lindex $line2 6]"
			.frame2.seq configure -text "Sequence: [lindex $line2 7]"
		}
		set line ""
	} else {
		set line "$line$msg"
	}
}


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

frame .frame3
pack .frame3 -side top -fill x -expand yes

	button .frame3.bind -text "Bind" -command {
		send_cmd "b"
	}
	pack .frame3.bind -side left -fill x -expand yes

	button .frame3.falisave -text "set Failsave" -command {
		send_cmd "f"
	}
	pack .frame3.falisave -side left -fill x -expand yes

	button .frame3.update -text "Update" -command {
		send_cmd "c"
		after 100
		send_cmd "I"
	}
	pack .frame3.update -side left -fill x -expand yes

	button .frame3.reset -text "Reset" -command {
		send_cmd "r"
		after 3000
		send_cmd "c"
		after 100
		send_cmd "I"
	}
	pack .frame3.reset -side left -fill x -expand yes

	button .frame3.flash -text "Flash" -command {
		get_update
	}
	pack .frame3.flash -side left -fill x -expand yes

	button .frame3.menu -text "Menu" -command {
		global argv


	toplevel .menu
#	wm geometry .menu 320x240


frame .menu.topm
pack .menu.topm -side top -fill both -expand yes


button .menu.topm.left -text "<<" -command {
	send_cmd "1"
	after 100
	send_cmd "c"
}
pack .menu.topm.left -side left -fill y -expand no

frame .menu.topm.frame_list -border 2 -relief raised
pack .menu.topm.frame_list -side left -fill both -expand yes

	frame .menu.topm.frame_list.me0
	pack .menu.topm.frame_list.me0 -side top -fill both -expand yes

		label .menu.topm.frame_list.me0.n -text "sss"
		pack .menu.topm.frame_list.me0.n -side left -fill x -expand yes

		label .menu.topm.frame_list.me0.v -text ""
		pack .menu.topm.frame_list.me0.v -side right -fill x -expand yes

	frame .menu.topm.frame_list.me1
	pack .menu.topm.frame_list.me1 -side top -fill both -expand yes

		label .menu.topm.frame_list.me1.n -text ""
		pack .menu.topm.frame_list.me1.n -side left -fill x -expand yes

		label .menu.topm.frame_list.me1.v -text ""
		pack .menu.topm.frame_list.me1.v -side right -fill x -expand yes

	frame .menu.topm.frame_list.me2
	pack .menu.topm.frame_list.me2 -side top -fill both -expand yes

		label .menu.topm.frame_list.me2.n -text ""
		pack .menu.topm.frame_list.me2.n -side left -fill x -expand yes

		label .menu.topm.frame_list.me2.v -text ""
		pack .menu.topm.frame_list.me2.v -side right -fill x -expand yes

	frame .menu.topm.frame_list.me3
	pack .menu.topm.frame_list.me3 -side top -fill both -expand yes

		label .menu.topm.frame_list.me3.n -text ""
		pack .menu.topm.frame_list.me3.n -side left -fill x -expand yes

		label .menu.topm.frame_list.me3.v -text ""
		pack .menu.topm.frame_list.me3.v -side right -fill x -expand yes

	frame .menu.topm.frame_list.me4
	pack .menu.topm.frame_list.me4 -side top -fill both -expand yes

		label .menu.topm.frame_list.me4.n -text ""
		pack .menu.topm.frame_list.me4.n -side left -fill x -expand yes

		label .menu.topm.frame_list.me4.v -text ""
		pack .menu.topm.frame_list.me4.v -side right -fill x -expand yes


button .menu.topm.right -text ">>" -command {
	send_cmd "3"
	after 100
	send_cmd "c"
}
pack .menu.topm.right -side right -fill y -expand no




	frame .menu.cursor
	pack .menu.cursor -side left -fill x -expand yes
	
		button .menu.cursor.up -text "Up" -command {
			send_cmd "8"
			after 100
			send_cmd "c"
		}
		pack .menu.cursor.up -side top -fill x -expand yes
	
		button .menu.cursor.down -text "Down" -command {
			send_cmd "2"
			after 100
			send_cmd "c"
		}
		pack .menu.cursor.down -side bottom -fill x -expand yes
	
		button .menu.cursor.left -text "-" -command {
			send_cmd "4"
			after 100
			send_cmd "c"
		}
		pack .menu.cursor.left -side left -fill x -expand yes
	
		button .menu.cursor.right -text "+" -command {
			send_cmd "6"
			after 100
			send_cmd "c"
		}
		pack .menu.cursor.right -side right -fill x -expand yes


send_cmd "s"
after 100
send_cmd "c"



	}
	pack .frame3.menu -side left -fill x -expand yes



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

	label .frame1.last_error -text "Last-Error: 0"
	pack .frame1.last_error -side left -fill none -expand yes

	label .frame1.quality_errors -text "Quality: 0"
	pack .frame1.quality_errors -side left -fill none -expand yes

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

	label .frame2.txid -text "TXID: 0"
	pack .frame2.txid -side left -fill none -expand yes

	label .frame2.setup_txid -text "Setup-TXID: 0"
	pack .frame2.setup_txid -side left -fill none -expand yes

	label .frame2.seq -text "Sequence: 0"
	pack .frame2.seq -side left -fill none -expand yes

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

	draw "ADC's" "a.adc" 4
	draw "Channel's" "a.channel" 8
	draw "Failsave's" "a.failsave" 8

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

	draw "LQI" "b.lqi" 16
	draw "RSSI" "b.rssi" 16
	draw "Noise" "b.noise" 16

frame .c
#pack .c -side top -fill x

	canvas .c.screen -relief raised -width 140 -height 140
	pack .c.screen -side top -fill x

	.c.screen create oval 1 1 70 70 -fill green
	for {set N 0} {$N < 360} {set N [expr $N + 10]} {
		.c.screen create arc 1 1 70 	70 -start $N -extent 0 -fill blue
	}
	.c.screen create oval 11 11 60 60 -fill gray
	.c.screen create arc 1 1 70 70 -start 90 -extent 0 -fill blue -tags compass
	.c.screen create text 37 44 -text "11" -tags compass_text

	canvas .c.screen2 -relief raised -width 240 -height 45
	pack .c.screen2 -side top
	draw_compas_rec .c.screen2 240 40 190 230

	canvas .c.screen3 -relief raised -width 40 -height 240
	pack .c.screen3 -side top
	draw_batt_bar .c.screen3 40 240 86 75

	.c.screen3 create rec 1 1 40 240 -fill black
	for {set N 0} {$N <= 240} {set N [expr $N + 4]} {
		set COLOR "[format "#%0.2x%0.2x%0.2x" [expr 255 - $N] $N 10]"
		.c.screen3 create rectangle 2 $N 40 [expr $N + 4] -fill $COLOR -outline $COLOR
	}


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]
send_cmd "c"
after 100
send_cmd "I"


