chiark / gitweb /
print object numbers in hex
[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         if ($speed < $max) { push @decreases, $step; $speed= $max; }
85         $speed[$step]= $speed;
86         $max= $speed;
87         $nxt++;
88  END {
89         warn "warning: '$train': decreases at steps @decreases\n"
90                 if @decreases;
91         $steps= $nxt-1;
92         warn "warning: '$train': expected 126 steps, found $steps\n"
93                 unless $steps==126;
94         print   "train '$train' is '$address'".
95                 " '$nondetfore'".
96                 "+'$(( $length - $nondetfore - $nondetrear ))'".
97                 "+'$nondetrear'\n"
98                         or die $!;
99         sub calcwait ($$) {
100                 my ($step,$wholetime) = @_;
101                 return 0 if $step<0 || $step>=$steps;
102                 return $wholetime * 1000.0 *
103                         ($speed[$step+1] - $speed[$step]) / $max;
104         }
105         for ($step=0; $step<$nxt; $step++) {
106                 printf  "train %s step %d=%d %d/%d\n",
107                         "'$train'", $step, $speed[$step]*1e6,
108                         calcwait($step-1,'$acceltime'),
109                         calcwait($step,'$deceltime')
110                                 or die $!;
111         }
112         STDOUT->error and die $!;
113         print "end\n" or die $!;
114  }
115 '
116
117 rm $o.all.tmp
118
119 for f in ps record; do
120         mv -f $o.$f.tmp $o.$f
121 done