chiark / gitweb /
more or less proper placement of movpos letters
authorian <ian>
Sun, 1 Jun 2008 21:25:46 +0000 (21:25 +0000)
committerian <ian>
Sun, 1 Jun 2008 21:25:46 +0000 (21:25 +0000)
hostside/gui
hostside/gui-plan-testdata
hostside/lib.tcl
hostside/multiplex

index 2036083139682c1b5c805adcc99dbe02a88226e5..c864504ab1ea06767b83494e5163dae16dbe9161 100755 (executable)
@@ -4,6 +4,14 @@ source lib.tcl
 
 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 }
@@ -17,20 +25,28 @@ proc widgets-dgram {} {
 
 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
     }
 }
@@ -42,8 +58,8 @@ proc 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 {
@@ -51,7 +67,7 @@ proc movpos-button-setdisplay {mid} {
        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} {
@@ -74,12 +90,45 @@ proc gui-pipe-readable {args} {
     }
 }
 
-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]
@@ -93,6 +142,23 @@ proc engage {} {
        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
 }
@@ -121,14 +187,15 @@ proc subseg-end-get-centroid {cpage seg feat posn} {
 }
 
 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]
@@ -166,6 +233,7 @@ proc main {} {
     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 {
index 2c72d4aa828d0e786a87a43cb6144455d09ccab5..064bad2ea1f9eff53d406167bd5666c5e6be0d0d 100644 (file)
@@ -8,5 +8,5 @@ movpos X7 feat P ? point
 movpos X7 gunk P 1 point
 movpos A5 feat P 2 point
 movpos Q0 feat Q 0 two
-movpos X8 feat Q 0 three
+movpos X8 feat P 0 three
 picio out polarity <X2,X3,X4,Q3>
index 36c74302f28962aceaeb3852e15b96ee248be1f2..33c14ac4760db4683d5daf34306e668eaf28656b 100644 (file)
@@ -24,6 +24,11 @@ proc setting {varname defvalue regexp} {
     set re $regexp
 }
 
+proc readable {whatfor conn} {
+    while {[gets $conn l]>=0} { $whatfor-inputline $conn $l }
+    if {[eof $conn]} { $whatfor-eof $conn }
+}
+
 proc parse-argv {formalargs} {
     # formalargs: list; if list is [list *] then any is allowed
     # sets argv to list of non-option args
index 3aaca94dc3da8538f266565573af6530bb1c68d0..1b97aba7f2a1c08afe3d541c0f384b9b49d239f3 100755 (executable)
@@ -338,11 +338,6 @@ proc client-disable-readable {conn} {
 
 #---------- general IO ----------
 
-proc readable {whatfor conn} {
-    while {[gets $conn l]>=0} { $whatfor-inputline $conn $l }
-    if {[eof $conn]} { $whatfor-eof $conn }
-}
-
 proc xmit-puts {conn msg} {
     global conns errorInfo
     if {![info exists conns($conn)]} return