3 load chiark_tcl_hbytes-1.so
8 # Put loco 2 on track segment X5
10 proc debug_r {m} { puts -nonewline stderr "$m\r" }
11 proc debug {m} { puts stderr $m }
15 puts -nonewline $rwy [hbytes h2raw $str]
19 global port rwy buf last_fast_speed
20 set rwy [open $port r+]
21 fconfigure $rwy -blocking no -buffering none -encoding binary \
27 fileevent $rwy readable readable
34 append buf [hbytes raw2h [read $rwy]]
35 while {[regexp {^((?:[89a-f].)*[0-7].)(.*)$} $buf dummy msg buf]} {
40 proc settle-cancel-after {} {
43 after cancel $settle_after
49 global until detend settle_detend settle_time settle_after
52 if {[lsearch $settle_detend $msg]<0} { debug_r "o $msg"; return }
55 set settle_after [after $settle_time { set until 1}]
61 if {[lsearch $detend $msg]<0} { debug_r "I $msg"; return }
71 puts stderr "huh? $msg"
85 proc speed-msg {speed} {
87 list speed126 $loco [expr {abs($speed)}] [expr {$speed<0}]
90 proc run-until {speed new_detend} {
91 global loco until detend settle_time settle_detend
92 set detend $new_detend
96 xmit [speed-msg $speed]
100 proc run-until-not {speed new_detend new_settle} {
101 global loco until detend settle_time settle_detend
102 set detend $new_detend
103 set settle_detend $new_detend
104 hbytes xor settle_detend 0800
105 set settle_time $new_settle
106 catch { unset until }
107 xmit [speed-msg $speed]
111 proc instruct-speed-for {speed ms} {
112 global loco until detend settle_detend
113 catch { unset until }
116 xmit [speed-msg $speed]
117 after $ms { set until 1 }
121 proc instruct-stop-for {ms} {
122 instruct-speed-for 0 $ms
126 global errorInfo errorCode
127 puts stderr "----------\nBGERROR\n$m\n$errorInfo\n$errorCode\n----------"
131 global xmit_after xmit_msg
133 set xmit_after [after 10 xmit-now]
136 global xmit_msg xmit_after detend settle_detend settle_time
137 set msg [eval [list exec ./hostside-old -s/dev/stdout] $nmral]
138 set xmit_msg [hbytes raw2h $msg]
139 debug "> $xmit_msg $nmral (E $detend $settle_detend $settle_time)"
140 catch { after cancel $xmit_after }
144 proc record-mm-per-s {speed distance start finish} {
145 debug "S $speed: $distance / ( $finish-$start = [expr {$finish-$start}] )"
146 set mmpers [expr {$distance*1.0/($finish-$start)}]
147 puts [format "%3d %g" $speed $mmpers]
151 clock clicks -milliseconds
154 proc now-ms-click {} {
157 exec dd if=/bin/ls of=/dev/dsp count=1 > /dev/null
162 proc timing-start {} {
164 set start [now-ms-click]
166 proc timing-finish {speed distance} {
168 set finish [now-ms-click]
169 record-mm-per-s $speed $distance $start $finish
172 proc goto-slow-start-position {speed} {
173 global last_fast_speed
174 if {$last_fast_speed >= 0} {
175 run-until -100 {9804 980a}
176 set last_fast_speed -1
179 run-until-not -40 9804 100
180 instruct-speed-for -40 [expr {$speed*$speed}]
181 instruct-stop-for 1000
184 proc slow-speed-test {speed} {
185 debug "==================== $speed S ===================="
186 goto-slow-start-position $speed
187 run-until $speed 9804
189 run-until $speed 980a
190 timing-finish $speed 231
191 instruct-stop-for 100
194 proc fast-speed-test {speed} {
195 global last_fast_speed
196 debug "==================== $speed F ===================="
198 set acceltime [expr {abs($last_fast_speed-$speed)*100}]
200 set finish [expr {$start + $acceltime}]
202 # we go round and round, keeping track of roughly where we
203 # are, until there has been enough time to get the speed right
204 run-until $speed 9809
205 run-until $speed 9814
206 set deficit [expr {$finish - [now-ms]}]
208 if {$deficit < 0} break
210 set last_fast_speed $speed
211 run-until $speed 9804
213 run-until $speed 9809
214 timing-finish $speed 483
217 proc speed-test {speed} {
219 slow-speed-test $speed
221 fast-speed-test $speed
229 instruct-stop-for 500