chiark / gitweb /
e4dc53c80c3b1dd517d0f89f32058ccb9a89f455
[trains.git] / hostside / analyse-speeds
1 #!/bin/bash
2 usage () { cat <<END >&2; exit 1 \
3
4 usage: ./speeds-analyse <train>
5   reads: <train>-*.speeds
6   writes: <train>.speeds.ps
7   writes: <train>.speeds.record
8 END
9 }
10
11 set -e
12
13 test $# = 1 || usage
14 case "$1" in -*) usage ;; esac
15
16 train=$1; shift
17
18 o=$train.speeds
19
20 >$o.all.tmp
21
22 acceltime=100000
23 deceltime=30000
24
25 . $train.manual
26 for f in address length nondetfore nondetrear acceltime deceltime; do
27 #                  [mm]   [mm]          [mm]    [ms]        [ms]
28         eval "v=\$$f"
29         if [ "x$v" = x ]; then echo >&2 "missing $train $f"; exit 1; fi
30 done
31
32 for f in $train-*.speeds; do
33         this="'$f'"
34         if head -1 $f | grep '^[A-Za-z]' >/dev/null; then
35                 this="$this using 2:3"
36         fi
37         each="$each, $this"
38         perl -pe 's/^[A-Za-z]\w*//' $f >>$o.all.tmp
39 done
40
41 gnuplot <<END
42 set pointsize 0.3
43 set terminal postscript
44 set key top left
45 set xrange [0:127]
46 set output '$o.ps.tmp'
47 set ylabel "speed [m/s]"
48 set xlabel "nmra speed step 1..126"
49 plot '$o.all.tmp' smooth sbezier notitle  $each
50 END
51
52 ed -s $o.ps.tmp <<END >/dev/null
53 /^%%Title/
54 s/\.tmp$//
55 w
56 END
57
58 max=`
59     sort -rnu $train.speeds.all.tmp |head -1 |awk '{print $1}'
60     case "${PIPESTATUS[*]}" in "0 0 0" | "141 0 0");;
61         *) echo >&2 "? ${PIPESTATUS[*]}"; exit 127;; esac
62 `
63
64 gnuplot <<END
65 set terminal table
66 set samples $max
67 set xrange [1:$max]
68 unset autoscale x
69 set output '$o.table.tmp'
70 plot '$o.all.tmp' smooth sbezier
71 END
72
73 perl <$o.table.tmp >$o.record.tmp -ne '
74  BEGIN {
75         use IO::Handle;
76         $nxt= 1;
77         $max= 0;
78         $speed[0]= 0;
79  }
80         next if m/^\#/; next unless m/\S/;
81         die unless m/^\s*(\d+)\s+([0-9.]+)\s/;
82         ($step,$speed) = ($1,$2);
83         die "$step $nxt" unless $step==$nxt;
84         $speed[$step]= $speed;
85         die "decrease $step $nxt $max" if $speed < $max;
86         $max= $speed;
87         $nxt++;
88  END {
89         $steps= $nxt-1;
90         warn "warning: '$train': expected 126 steps, found $steps\n"
91                 unless $steps==126;
92         print   "train '$train' is '$address'".
93                 " '$nondetfore'".
94                 "+'$(( $length - $nondetfore - $nondetrear ))'".
95                 "+'$nondetrear'\n"
96                         or die $!;
97         sub calcwait ($$) {
98                 my ($step,$wholetime) = @_;
99                 return 0 if $step<0 || $step>=$steps;
100                 return $wholetime * 1000.0 *
101                         ($speed[$step+1] - $speed[$step]) / $max;
102         }
103         for ($step=0; $step<$nxt; $step++) {
104                 printf  "train %s step %d=%d %d/%d\n",
105                         "'$train'", $step, $speed[$step]*1e6,
106                         calcwait($step-1,'$acceltime'),
107                         calcwait($step,'$deceltime')
108                                 or die $!;
109         }
110         STDOUT->error and die $!;
111         print "end\n" or die $!;
112  }
113 '
114
115 rm $o.all.tmp
116
117 for f in ps record; do
118         mv -f $o.$f.tmp $o.$f
119 done