315 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			315 lines
		
	
	
	
		
			7.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/sh
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# gunze-setup, copied and adapted from microtouch-setup.
							 | 
						||
| 
								 | 
							
								# Most of this code is duplicated, this is definitely not good.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This program is execute by tclsh if we are in the console, and by wish
							 | 
						||
| 
								 | 
							
								# otherwise (assuming we are under a graphic environment
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#the following is a comment for tcl \
							 | 
						||
| 
								 | 
							
								if [ $TERM = "linux" ] ; then exec tclsh $0 $* ; fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#the following is another comment for tcl \
							 | 
						||
| 
								 | 
							
								exec wish $0 $*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								########### That's Tcl...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The Gunze touchscreens don't adapt their output to calibration, so
							 | 
						||
| 
								 | 
							
								# we must save calibration information somewhere...
							 | 
						||
| 
								 | 
							
								set datafile /etc/gpm-calibration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								puts "Calibration program for Gunze touch-screens"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# check generic permission
							 | 
						||
| 
								 | 
							
								set who [exec whoami]
							 | 
						||
| 
								 | 
							
								if [string compare $who root] {
							 | 
						||
| 
								 | 
							
								    puts stderr "you must be root to be able to run this program"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# check if we can access this file
							 | 
						||
| 
								 | 
							
								if [catch {set F [open $datafile a]} err] {
							 | 
						||
| 
								 | 
							
								    puts stderr "$argv0: Can't open $datafile: $err"
							 | 
						||
| 
								 | 
							
								    exit 1
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								close $F
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Look for /dev/touchscreen or /dev/mouse
							 | 
						||
| 
								 | 
							
								if [file exists /dev/mouse] {
							 | 
						||
| 
								 | 
							
								    set dev /dev/mouse
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								if [file exists /dev/touchscreen] {
							 | 
						||
| 
								 | 
							
								    set dev /dev/touchscreen
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								if ![info exists dev] {
							 | 
						||
| 
								 | 
							
								    puts stderr "$argv0: need to access /dev/touchscreen or /dev/mouse"
							 | 
						||
| 
								 | 
							
								    exit 1
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# horrible, for the linux console
							 | 
						||
| 
								 | 
							
								proc goto {x y} {
							 | 
						||
| 
								 | 
							
								    set x [expr $x]
							 | 
						||
| 
								 | 
							
								    set y [expr $y]
							 | 
						||
| 
								 | 
							
								    puts -nonewline [format "\x1B\[%03i;%03iH" $y $x]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# an abort procedure, and one to read touchscreen data
							 | 
						||
| 
								 | 
							
								proc do_abort {msg} {
							 | 
						||
| 
								 | 
							
								    if ![string compare $env(TERM) linux] {
							 | 
						||
| 
								 | 
							
									goto 0 $env(LINES)-2
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
									wm withdraw .
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    puts stderr $msg
							 | 
						||
| 
								 | 
							
								    killall -CONT gpm
							 | 
						||
| 
								 | 
							
								    exit 1
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								proc get_position file {
							 | 
						||
| 
								 | 
							
								    global dev
							 | 
						||
| 
								 | 
							
								    while 1 {
							 | 
						||
| 
								 | 
							
									gets $file string
							 | 
						||
| 
								 | 
							
									if [scan $string %c%d,%d  cmd x y]!=3 {
							 | 
						||
| 
								 | 
							
									    do_abort  "Received wrong data \"$string\" from $dev"
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									# If release ('R') it's done
							 | 
						||
| 
								 | 
							
									if $cmd==0x52 {
							 | 
						||
| 
								 | 
							
									    return "$sx $sy"
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									# If a touch event ('T'), save it
							 | 
						||
| 
								 | 
							
									if $cmd==0x54 {
							 | 
						||
| 
								 | 
							
									    set sx $x; set sy $y
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
									    do_abort "Received wrong data \"$string\" from $dev"
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ![string compare $env(TERM) linux] {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Text-mode calibration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if {![info exists env(COLUMNS)] || ![info exists env(LINES)]} {
							 | 
						||
| 
								 | 
							
									puts stderr "Please set COLUMNS and LINES in your environment"
							 | 
						||
| 
								 | 
							
									puts stderr " for example, you can issue"
							 | 
						||
| 
								 | 
							
									puts stderr "        eval `resize`"
							 | 
						||
| 
								 | 
							
									puts stderr " in your shell before running this program"
							 | 
						||
| 
								 | 
							
									exit 1
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    fconfigure stdout -buffering none
							 | 
						||
| 
								 | 
							
								    exec clear > /dev/tty
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # To calibrate, draw targets at 1/8 and 7/8 x-y
							 | 
						||
| 
								 | 
							
								    set x [expr $env(COLUMNS)/8]
							 | 
						||
| 
								 | 
							
								    set y [expr $env(LINES)/8]
							 | 
						||
| 
								 | 
							
								    set X [expr $env(COLUMNS) - $x]
							 | 
						||
| 
								 | 
							
								    set Y [expr $env(LINES) - $y]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # half x and y
							 | 
						||
| 
								 | 
							
								    set hx [expr $env(COLUMNS)/2]
							 | 
						||
| 
								 | 
							
								    set hy [expr $env(LINES)/2]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    goto $hx-10 $hy-1; puts -nonewline "Please touch the lower"
							 | 
						||
| 
								 | 
							
								    goto $hx-10 $hy-0; puts -nonewline "left target, then the"
							 | 
						||
| 
								 | 
							
								    goto $hx-10 $hy+1; puts -nonewline "upper right target."
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    exec killall -STOP gpm
							 | 
						||
| 
								 | 
							
								    set F [open $dev r+]; # $dev is /dev/touchscreen or /dev/mouse
							 | 
						||
| 
								 | 
							
								    fconfigure $F -buffering none -translation auto
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Draw the target
							 | 
						||
| 
								 | 
							
								    goto $x $Y-1; puts -nonewline "|"
							 | 
						||
| 
								 | 
							
								    goto $x-1 $Y; puts -nonewline "-+-"
							 | 
						||
| 
								 | 
							
								    goto $x $Y+1; puts -nonewline "|"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Read coordinates
							 | 
						||
| 
								 | 
							
								    set first [get_position $F]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #remove the target, draw the other
							 | 
						||
| 
								 | 
							
								    goto $x $Y-1; puts -nonewline " "
							 | 
						||
| 
								 | 
							
								    goto $x-1 $Y; puts -nonewline "   "
							 | 
						||
| 
								 | 
							
								    goto $x $Y+1; puts -nonewline " "
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    goto $X $y-1; puts -nonewline "|"
							 | 
						||
| 
								 | 
							
								    goto $X-1 $y; puts -nonewline "-+-"
							 | 
						||
| 
								 | 
							
								    goto $X $y+1; puts -nonewline "|"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Read coordinates
							 | 
						||
| 
								 | 
							
								    set second [get_position $F]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # remove the target
							 | 
						||
| 
								 | 
							
								    goto $X $y-1; puts -nonewline " "
							 | 
						||
| 
								 | 
							
								    goto $X-1 $y; puts -nonewline "   "
							 | 
						||
| 
								 | 
							
								    goto $X $y+1; puts -nonewline " "
							 | 
						||
| 
								 | 
							
								    close $F
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    exec killall -CONT gpm
							 | 
						||
| 
								 | 
							
								    goto 0 $env(LINES)-2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Now save the coordinates
							 | 
						||
| 
								 | 
							
								    set F [open $datafile w]
							 | 
						||
| 
								 | 
							
								    puts $F "# Calibration coordinates for Gunze device"
							 | 
						||
| 
								 | 
							
								    puts $F "$first $second"
							 | 
						||
| 
								 | 
							
								    close $F
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    puts "Done"
							 | 
						||
| 
								 | 
							
								    exit 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# X calibration. This is Tk, so we can use the canvas items.
							 | 
						||
| 
								 | 
							
								# However, there is uncertainty about the absolute X and Y...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set wid [winfo screenwidth .]
							 | 
						||
| 
								 | 
							
								set hei [winfo screenheight .]
							 | 
						||
| 
								 | 
							
								wm geometry . ${wid}x${hei}+0+0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set x [expr $wid/8]
							 | 
						||
| 
								 | 
							
								set y [expr $hei/8]
							 | 
						||
| 
								 | 
							
								set X [expr $wid - $x]
							 | 
						||
| 
								 | 
							
								set Y [expr $hei - $y]
							 | 
						||
| 
								 | 
							
								set hx [expr $wid/2]
							 | 
						||
| 
								 | 
							
								set hy [expr $hei/2]
							 | 
						||
| 
								 | 
							
								set cwid [expr 2*$x]
							 | 
						||
| 
								 | 
							
								set chei [expr 2*$y]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The offset variables account for window manager borders etc
							 | 
						||
| 
								 | 
							
								set xoff1 0
							 | 
						||
| 
								 | 
							
								set yoff1 0
							 | 
						||
| 
								 | 
							
								set xoff2 0
							 | 
						||
| 
								 | 
							
								set yoff2 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								proc recanvas {} {
							 | 
						||
| 
								 | 
							
								    global x y X Y xoff1 xoff2 yoff1 yoff2
							 | 
						||
| 
								 | 
							
								    catch {.l.c delete line}
							 | 
						||
| 
								 | 
							
								    catch {.r.c delete line}
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    set x1 [expr $x-$xoff1]
							 | 
						||
| 
								 | 
							
								    set y1 [expr $Y-$yoff1]
							 | 
						||
| 
								 | 
							
								    set x2 [expr $X-$xoff2]
							 | 
						||
| 
								 | 
							
								    set y2 [expr $y-$yoff2]
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    .l.c create line [expr $x1-50] $y1 [expr $x1+50] $y1 \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								    .l.c create line $x1 [expr $y1-50] $x1 [expr $y1+50] \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    .r.c create line [expr $x2-50] $y2 [expr $x2+50] $y2 \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								    .r.c create line $x2 [expr $y2-50] $x2 [expr $y2+50] \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pack [frame .l] -side left -expand true -fill both 
							 | 
						||
| 
								 | 
							
								pack [frame .m] -side left -expand true -fill both 
							 | 
						||
| 
								 | 
							
								pack [frame .r] -side left -expand true -fill both 
							 | 
						||
| 
								 | 
							
								pack [canvas .l.c -width $cwid -hei $chei -scrollregion "0 0 $cwid $chei" \
							 | 
						||
| 
								 | 
							
									] -side bottom 
							 | 
						||
| 
								 | 
							
								pack [frame .l.f] -expand true -fill both; #filler
							 | 
						||
| 
								 | 
							
								pack [canvas .r.c -width $cwid -hei $chei -scrollregion "0 0 $cwid $chei" \
							 | 
						||
| 
								 | 
							
									] -side top
							 | 
						||
| 
								 | 
							
								pack [frame .r.f] -expand true -fill both; #filler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pack [label .m.t -text "Gunze Calibrator" -foreground blue] -pady 40
							 | 
						||
| 
								 | 
							
								pack [label .m.l -bd 5 -relief raised] -expand true -fill both
							 | 
						||
| 
								 | 
							
								pack [label .m.s] -expand true -fill both
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bind .l.c <Enter> {
							 | 
						||
| 
								 | 
							
								    set xoff1 [expr %X - %x]
							 | 
						||
| 
								 | 
							
								    set yoff1 [expr %Y - %y]
							 | 
						||
| 
								 | 
							
								    set x1 [expr $x-$xoff1]
							 | 
						||
| 
								 | 
							
								    set y1 [expr $Y-$yoff1]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    catch {.l.c delete line}
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    .l.c create line [expr $x1-50] $y1 [expr $x1+50] $y1 \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								    .l.c create line $x1 [expr $y1-50] $x1 [expr $y1+50] \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    set done1 1
							 | 
						||
| 
								 | 
							
								    update
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								bind .r.c <Enter> {
							 | 
						||
| 
								 | 
							
								    set xoff2 [expr %X - %x]
							 | 
						||
| 
								 | 
							
								    set yoff2 [expr %Y - %y]
							 | 
						||
| 
								 | 
							
								    set x2 [expr $X-$xoff2]
							 | 
						||
| 
								 | 
							
								    set y2 [expr $y-$yoff2]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    catch {.r.c delete line}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    .r.c create line [expr $x2-50] $y2 [expr $x2+50] $y2 \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								    .r.c create line $x2 [expr $y2-50] $x2 [expr $y2+50] \
							 | 
						||
| 
								 | 
							
									    -width 3 -fill red -tag line
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    set done2 1
							 | 
						||
| 
								 | 
							
								    update
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set done1 0; set done2 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								update
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.m.l config -text "Please move the mouse towards\n\
							 | 
						||
| 
								 | 
							
									the lower left corner, until a cross\n\
							 | 
						||
| 
								 | 
							
									appears (there's no need to click)"
							 | 
						||
| 
								 | 
							
								vwait done1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								update
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if !$done2 {
							 | 
						||
| 
								 | 
							
								    .m.l config -text "Please move the mouse towards\n\
							 | 
						||
| 
								 | 
							
									    the upper right corner, until a cross\n\
							 | 
						||
| 
								 | 
							
									    appears (there's no need to click)"
							 | 
						||
| 
								 | 
							
								    vwait done2
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.m.l config -text "\nWait....\n"
							 | 
						||
| 
								 | 
							
								after 1000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.m.l config -text "Please touch the lower-left taget\n\
							 | 
						||
| 
								 | 
							
									and then the upper-right target\n\
							 | 
						||
| 
								 | 
							
									to calibrate the touch screen"
							 | 
						||
| 
								 | 
							
								update
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exec killall -STOP gpm
							 | 
						||
| 
								 | 
							
								set F [open $dev r+]; # $dev is /dev/touchscreen or /dev/mouse
							 | 
						||
| 
								 | 
							
								fconfigure $F -buffering none -translation auto
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.m.s configure -text "Calibration started"
							 | 
						||
| 
								 | 
							
								update
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Read coordinates
							 | 
						||
| 
								 | 
							
								set first [get_position $F]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.l.c itemco line -fill green
							 | 
						||
| 
								 | 
							
								.m.s configure -text "First target ok"
							 | 
						||
| 
								 | 
							
								update
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Read coordinates
							 | 
						||
| 
								 | 
							
								set second [get_position $F]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.r.c itemco line -fill green
							 | 
						||
| 
								 | 
							
								.m.s configure -text "Second target ok"
							 | 
						||
| 
								 | 
							
								update
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								close $F
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exec killall -CONT gpm
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Now save the coordinates
							 | 
						||
| 
								 | 
							
								set F [open $datafile w]
							 | 
						||
| 
								 | 
							
								puts $F "# Calibration coordinates for Gunze device"
							 | 
						||
| 
								 | 
							
								puts $F "$first $second"
							 | 
						||
| 
								 | 
							
								close $F
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								after 1000
							 | 
						||
| 
								 | 
							
								.m.s configure -text ""
							 | 
						||
| 
								 | 
							
								pack [button .m.b -text Ok -command exit]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exit 0
							 | 
						||
| 
								 | 
							
								
							 |