#!/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 { 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 { 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