load chiark_tcl_hbytes-1.so
-set port /dev/ttyUSB0
-set loco 2
-
-# Put loco 2 on track segment X5
+# Put loco on track segment X5 ish, facing anticlockwise
proc debug_r {m} { puts -nonewline stderr "$m\r" }
proc debug {m} { puts stderr $m }
}
proc startup {} {
- global port rwy buf last_fast_speed
+ global port rwy buf last_fast_speed noise
set rwy [open $port r+]
fconfigure $rwy -blocking no -buffering none -encoding binary \
-translation binary
fileevent $rwy readable readable
set buf {}
set last_fast_speed 0
+ set noise [hbytes random 256]
}
proc readable {} {
xmit-now
}
-proc record-mm-per-s {speed distance start finish} {
- debug "S $speed: $distance / ( $finish-$start = [expr {$finish-$start}] )"
- set mmpers [expr {$distance*1.0/($finish-$start)}]
- puts [format "%3d %g" $speed $mmpers]
-}
-
proc now-ms {} {
clock clicks -milliseconds
}
proc now-ms-click {} {
+ global noise
set now [now-ms]
if {[catch {
- exec dd if=/bin/ls of=/dev/dsp count=1 > /dev/null
- } m]} { debug $m }
+ set dsp [open /dev/dsp w]
+ fconfigure $dsp -encoding binary -translation binary
+ puts -nonewline $dsp [hbytes h2raw $noise]
+ close $dsp
+ } emsg]} {
+ debug "noise: $emsg"
+ catch { close $dsp }
+ }
return $now
}
+proc record-mm-per-s {speed mm ms} {
+ debug "S $speed: $mm / $ms"
+ set mmpers [expr {$mm*1.0/$ms}]
+ puts [format "%3d %g" $speed $mmpers]
+}
proc timing-start {} {
global start
set start [now-ms-click]
}
-proc timing-finish {speed distance} {
+proc timing-finish {} {
global start
set finish [now-ms-click]
- record-mm-per-s $speed $distance $start $finish
+ return [expr {$finish-$start}]
}
proc goto-slow-start-position {speed} {
run-until $speed 9804
timing-start
run-until $speed 980a
- timing-finish $speed 231
+ record-mm-per-s $speed 231 [timing-finish]
instruct-stop-for 100
}
if {$deficit < 0} break
}
set last_fast_speed $speed
- run-until $speed 9804
- timing-start
- run-until $speed 9809
- timing-finish $speed 483
+ set ms 0; set mm 0
+ while {$ms < 2000} {
+ run-until $speed 9804
+ timing-start
+ run-until $speed 980a
+ incr ms [timing-finish]
+ incr mm 231
+ debug "+ $mm / $ms"
+ run-until-not $speed 980a 100
+ }
+ record-mm-per-s $speed $mm $ms
}
proc speed-test {speed} {
}
}
+set port [lindex $argv 0]
+set loco [lindex $argv 1]
+
startup
-foreach s $argv {
+
+foreach s [lrange $argv 2 end] {
speed-test $s
}
instruct-stop-for 500