proc pagew {page} { return ".picture-$page" }
+proc debug {m} { puts $m }
+
+proc sconn {m} {
+ global sconn
+ puts "=> $m"
+ puts $sconn $m
+}
+
proc widgets-dgram {} {
global cpage geometry
if {[string length $geometry]} { wm geometry . $geometry }
proc movpos-button-gvars {mid} {
upvar #0 mp_details($mid) details
+ if {![info exists details]} { return 0 }
uplevel 1 [list manyset $details cpage key seg feat poslocs]
uplevel 1 { set w [pagew $cpage].movpos-$mid }
upvar #0 mp_state($mid) state
- uplevel 1 [list manyset $state posn moving]
+ uplevel 1 [list manyset $state posn]
+ return 1
+}
+
+proc movpos-button-sstate {mid} {
+ upvar #0 mp_state($mid) state
+ set state [uplevel 1 { list $posn } ]
}
proc widgets-movpos {} {
global mp_details
foreach mid [array names mp_details] {
upvar #0 mp_state($mid) state
- set state {? stable}
+ set state {?}
movpos-button-gvars $mid
set w [pagew $cpage].movpos-$mid
- button $w -text $key -command [list movpos-invoked $mid]
+ button $w -text $key -padx 0 -pady 0 -borderwidth 0 \
+ -command [list movpos-invoked $mid]
movpos-button-setdisplay $mid
}
}
# whether a train's plan includes a different position
# whether autopoint
movpos-button-gvars $mid
- set fg black
- set bg white
+ set fg white
+ set bg black
$w configure -background $bg -foreground $fg \
-activebackground $bg -activeforeground $fg
switch -exact $posn {
default { manyset [lindex $poslocs $posn] x y }
}
place $w -anchor center -x $x -y $y
-puts " place $w -anchor center -x $x -y $y"
+puts " $key $posn place $w -anchor center -x $x -y $y"
}
proc bgerror {emsg} {
}
}
-proc engage {} {
- global gui_pipe server port pages
- global sconn
+proc train-event-eof {} {
+ error "lost connection to train set"
+}
- set sconn [socket $server $port]
- fconfig-trainproto $sconn
+set event_dispatch_body {}
+
+proc register-event {re args body} {
+ global event_dispatch_body
+ regsub -all {\W+} $re - proc
+ set proc "event/$proc/[join $args -]"
+ set suffix {}
+ set number 0
+ while {![catch { info args $proc$suffix }]} { set suffix [incr number] }
+ append proc $suffix
+
+ proc $proc [concat l $args] $body
+ set al ""
+ foreach a $args { append al " \$$a" }
+
+ append event_dispatch_body \
+ " if {\[regexp [list $re] \$l dummy $args]} {\n" \
+ " debug \"$proc$al\"\n" \
+ " eval [list $proc] \[list \$l$al]\n" \
+ " return\n" \
+ " }\n"
+}
+
+register-event {^.movpos (\w+) feat (\w+) ([01]|\?) } {seg feat posn_new} {
+ set mid $seg/$feat
+ if {![movpos-button-gvars $mid]} return
+ set posn $posn_new
+ movpos-button-sstate $mid
+ movpos-button-setdisplay $mid
+}
+
+register-event {^=connected} {} {
+ global pages gui_pipe server port
+
+ sconn "select-replay ?movpos_*_feat"
foreach page $pages {
set w [pagew $page]
fconfigure $gui_pipe -blocking no
fileevent $gui_pipe readable gui-pipe-readable
}
+}
+
+register-event {^=failed} {} { error "multiplexer failed: $l" }
+register-event {^=denied} {} { error "multiplexer denied us: $l" }
+
+append event_dispatch_body {
+ puts "ignored $l"
+}
+
+proc train-event-inputline {sconn l} $event_dispatch_body
+
+proc engage {} {
+ global server port sconn
+
+ set sconn [socket $server $port]
+ fconfig-trainproto $sconn
+ fileevent $sconn readable {readable train-event $sconn}
start_commandloop
}
}
proc movpos-bindkey-1 {cpage key seg feat} {
- manyset [subseg-end-get-centroid $cpage $seg $feat 0] mx my
+ global posdeviation
+ manyset [subseg-end-get-centroid $cpage $seg $feat {}] mx my
set mid $seg/$feat
puts "$mid centroid $mx $my"
foreach posn {0 1} {
manyset [subseg-end-get-centroid $cpage $seg $feat $posn] x y
set dx [expr {$x-$mx}]; set dy [expr {$y-$my}]
set d [expr {sqrt($dx*$dx + $dy*$dy)}]
- set mul [expr {10.0 / ($d + 1e-6)}]
+ set mul [expr {$posdeviation / ($d + 1e-6)}]
set x [expr {$mx + $mul*$dx}]
set y [expr {$my + $mul*$dy}]
lappend poslocs [list $x $y]
global pages cpage
setting server railway {[[0-9a-z:].*}
setting geometry {} {[-+]\d+[-+]\d+}
+ setting posdeviation 10 {\d+}
uplevel #0 source gui-config
parse-argv {}
foreach cpage $pages {