proc pagew {page} { return ".picture-$page" }
proc debug {m} { puts $m }
-
proc warning {m} { puts stderr $m }
+proc fixme {args} { puts stderr "####FIXME##### $args #####FIXME#####" }
proc sconn {m} {
global sconn
" }\n"
}
+#---------- handling of commands we issue ----------
+
+proc scmd {onresult ctrlr commandstr args} {
+ # later, calls
+ # eval [list $onresult-ok|nak|error $ackornakmessage] $args
+ global commands_queued
+ sconn $commandstr
+ lappend commands_queued [list $ctrlr $onresult $args]
+}
+
+proc scmd_result {oknakerr message reporterrtrain reporterrmsg} {
+ global commands_queued
+ manyset [lindex $commands_queued 0] ctrlr onresult args
+ set commands_queued [lrange $commands_queued 1 end]
+ if {[string length $reporterrmsg]} {
+ report-problem $ctrlr $reporterrtrain $reporterrmsg
+ }
+ eval [list "$onresult-$oknakerr" $message] $args
+}
+
+register-event {} {} {^\+ack \S+ ok } { scmd_result ok $l {} "" }
+register-event {} {train segment error} \
+ {^\+ack \S+ SignallingPredictedProblem (\S+) (\S+) \: (.*) $} {
+ set m $train
+ if {![string compare - $segment]} { append m " at " $segment }
+ append m ": " $error
+ scmd_result err $l $train $m
+}
+register-event {} {} {^\+ack } { scmd_result err $l {} $l }
+register-event {} {} {^\+nack \S+ } { scmd_result nak $l {} $l }
+
+proc routinecmd-nak {m args} { error "got nak to routine command: $m" }
+proc routinecmd-err {m args} { }
+proc routinecmd-ok {m args} { }
+
+proc mustsucceed-nak {m args} { error "unexpected nak: $m" }
+proc mustsucceed-err {m args} { error "unexpected error: $m" }
+proc mustsucceed-ok {m args} { }
+
+proc report-problem-report-stderr {m} { puts stderr "*** $m" }
+set report_problem_report report-problem-report-stderr
+
+proc report-problem {ctrlr train message} {
+ global report_problem_report
+ eval $report_problem_report [list "$ctrlr: $message"]
+ if {[string length $train]} {
+ speedws-train-problem $train
+ }
+}
+
#---------- movpos (overlay buttons, keybindings, execution) ----------
proc movpos-button-gvars {mid} {
movpos-button-gvars $mid
set w [pagew $cpage].movpos-$mid
button $w -text $key -padx 0 -pady 0 -borderwidth 0 \
- -command [list movpos-invoked $mid]
+ -command [list movpos-invoked $mid "plan $cpage"]
movpos-button-setdisplay $mid
}
}
place $w -anchor center -x $x -y $y
}
-proc movpos-invoked {mid} {
+proc movpos-invoked {mid ctrlr} {
global movfeatcommand
movpos-button-gvars $mid
switch -exact $posn {
0 { set new_posn 1 }
default { set new_posn 0 }
}
- sconn "$movfeatcommand $seg $feat $new_posn"
+ scmd routinecmd $ctrlr "$movfeatcommand $seg $feat $new_posn"
}
register-event ?movpos_*_feat {seg feat posn_new} \
upvar #0 mp_details($mid) details
set details [list $cpage $key $seg $feat $poslocs]
- bind . <Key-[string tolower $key]> [list movpos-invoked $mid]
+ bind . <Key-[string tolower $key]> [list movpos-invoked $mid "keyboard"]
}
#---------- computation of movpos button locations
# variables:
# $train_commanded($train) $speed_step
-# $speed_commanding $w of the one we're commanding, or unset
# $speedws [list $w ...]
#
# speed/${w}(...) aka s(...):
# $s(train) train selected, or something not \w+
# $s(optionmenu) optionmenu widget name
-# $s(queuedupdown) integer, always set
+# $s(queuedupdown) integer
+# $s(commanding) set if we have a speed command in the queue
# $s(lastproblem) [clock clicks -milliseconds]
#
# We don't worry too much about races: in particular, we don't mind
lappend $speedws $w
set s(queuedupdown) 0
+ set s(commanding) 0
frame $w -relief groove
set s(optionmenu) [tk_optionMenu $w.train speed/${w}(train) {}]
$w problem configure -text $message
}
-proc speed-check-sendcommand {} {
- global speed_commanding speedws
+proc speedw-check-sendcommand {w} {
+ global speedws
if {[info exists speed_commanding]} return
for {set i 0} {$i < [llength $speedws]} {incr i} {
set w [lindex $speedws $i]
fixme
set newspeed [speedud-calc-newspeed ]
- sconn "speed $s(train) 4"
+ scmd fixme fixme "speed $s(train) 4"
}
}
foreach w $speedws { eval [list $command $w] $args }
}
+proc speedws-train-problem {train} {
+ speedws-forall speedw-train-problem $train
+}
+proc speedw-train-problem {w train} {
+ fixme "prevent forthcoming speed increase requests for just a bit"
+}
+
register-event stastate {state} \
{^stastate (\w+|\-) } {
global ctrain trains statstate
register-event {} {} {^=connected } {
global pages gui_pipe server port event_selections
- sconn "select-replay [concat $event_selections]"
+ scmd mustsucceed {} "select-replay [concat $event_selections]"
foreach page $pages {
set w [pagew $page]