chiark / gitweb /
sort out stopping distances conversion into .record
authorian <ian>
Tue, 22 Apr 2008 22:02:59 +0000 (22:02 +0000)
committerian <ian>
Tue, 22 Apr 2008 22:02:59 +0000 (22:02 +0000)
hostside/Makefile
hostside/TODO
hostside/analyse-speeds
hostside/record-i.h
hostside/record-y.y
hostside/record.c
hostside/shinkansen.manual
hostside/shinkansen.stopping [deleted file]

index 55a6ea60b4d0562378c88e3f434d6b51e78ad6f4..66881bfd13f735308f70ec238c3608b3c5b5be9a 100644 (file)
@@ -62,8 +62,8 @@ selectors.h retransmit-table.h errorcodes.h stastate.h: %: %.gen
 safety:                safety.o utils.o trackloc.o ../layout/ours.layout-data.o
                $(LINK)
 
-%.speeds.ps %.speeds.record: ./analyse-speeds
-               ./$^ $*
+%.speeds.ps %.speeds.record: ./analyse-speeds ../layout/ours.redacted.shellvars
+               ./$< $*
 
 %:             %.gen
                ./$^ $o
index c38c614f8e2848029e313e275ff87c1aac9bc6e8..b337aec06c18c54e80c57cd013164ff9051b09b7 100644 (file)
@@ -1,5 +1,3 @@
-convert .stopping to appropriate .speeds.record
-
 either only POLARITY when we've had POLARISED or delete
  that bit from the docs
 
index d7b20126629413b3c24960811196572d291f72a1..4df9ef91af724b0299519eba2df32d96d17ca155 100755 (executable)
@@ -22,7 +22,14 @@ o=$train.speeds
 acceltime=100000
 deceltime=30000
 
+exec 3>$o.stopping.tmp
+stops-from () {
+       printf >&3 '%d %d %s\n' $1 $(( $2 )) $3
+}
+. ../layout/ours.redacted.shellvars
 . $train.manual
+exec 3>&-
+
 for f in address length nondetfore nondetrear acceltime deceltime; do
 #                 [mm]   [mm]          [mm]    [ms]        [ms]
        eval "v=\$$f"
@@ -70,7 +77,36 @@ set output '$o.table.tmp'
 plot '$o.all.tmp' smooth sbezier
 END
 
-perl <$o.table.tmp >$o.record.tmp -ne '
+sort -rn <$o.stopping.tmp >$o.stopping-sorted.tmp
+
+perl <$o.stopping-sorted.tmp >$o.record.tmp -ne '
+ BEGIN {
+       $last_step= 127;
+       $last_stoptime= undef;
+
+       print   "train '$train' is '$address'".
+               " '$nondetfore'".
+               "+'$(( $length - $nondetfore - $nondetrear ))'".
+               "+'$nondetrear'\n"
+                       or die $!;
+ }
+       die unless m/^(\d+)\s+(\d+)(?:\s+([-.0-9]+))?\s*$/;
+       ($step,$stopdist,$stoptime) = ($1,$2,$3);
+       die unless $step < $last_step;
+       if (defined $stoptime) {
+               $stoptime= eval $stoptime; defined $stoptime or die "$@ ?";
+       } else {
+               die unless $last_stoptime;
+               $stoptime= $last_stoptime;
+       }
+       printf "train '$train' stops %3d: %4d %5d\n", $step,$stopdist,
+               $stoptime*1000
+                       or die $!;
+       $last_step= $step;
+       $last_stoptime= $stoptime;
+'
+
+perl <$o.table.tmp >>$o.record.tmp -ne '
  BEGIN {
        use IO::Handle;
        $nxt= 1;
@@ -86,27 +122,14 @@ perl <$o.table.tmp >$o.record.tmp -ne '
        $max= $speed;
        $nxt++;
  END {
-       warn "warning: '$train': decreases at steps @decreases\n"
+       die "'$train': decreases at steps @decreases\n"
                if @decreases;
        $steps= $nxt-1;
-       warn "warning: '$train': expected 126 steps, found $steps\n"
+       die "'$train': expected 126 steps, found $steps\n"
                unless $steps==126;
-       print   "train '$train' is '$address'".
-               " '$nondetfore'".
-               "+'$(( $length - $nondetfore - $nondetrear ))'".
-               "+'$nondetrear'\n"
-                       or die $!;
-       sub calcwait ($$) {
-               my ($step,$wholetime) = @_;
-               return 0 if $step<0 || $step>=$steps;
-               return $wholetime * 1000 *
-                       ($speed[$step+1] - $speed[$step]) / $max;
-       }
        for ($step=0; $step<$nxt; $step++) {
-               printf  "train %s step %d=%f %d/%d\n",
-                       "'$train'", $step, $speed[$step],
-                       calcwait($step-1,'$acceltime'),
-                       calcwait($step,'$deceltime')
+               printf  "train %s step %d=%f\n",
+                       "'$train'", $step, $speed[$step]
                                or die $!;
        }
        STDOUT->error and die $!;
@@ -114,7 +137,7 @@ perl <$o.table.tmp >$o.record.tmp -ne '
  }
 '
 
-rm $o.all.tmp
+rm $o.{all,stopping,stopping-sorted}.tmp
 
 for f in ps record; do
        mv -f $o.$f.tmp $o.$f
index e876cf7c2c7e671d9a78b239a7c021cc7599a7cd..8d90c395299af22390846814b2db4885309574cf 100644 (file)
@@ -11,7 +11,7 @@ void record_train_is(Train *tra, int addr, int head, int det, int tail);
 void record_train_home(Train *tra, int backw, Segment *seg);
 void record_train_step_speed(Train *tra, int step, double speed);
 void record_train_stopregime_count(void);
-void record_train_stopregime(Train *tra, double speed, int xs, int ts);
+void record_train_stopregime(Train *tra, int step, int xs, int ts);
 void record_seg_has(Segment *seg, int backw, Train *tra);
 void record_seg_at(Segment *seg, const char *movposcomb_pname);
 void record_feature_nmrafeat(FeaturesFeature*, FeaturesAddr*, int num);
index 964b0cb9531d9d54f754e94f252578fe38587a53..0a0211ffb38888c83d5be24865d25f1a971e62cd 100644 (file)
@@ -50,9 +50,9 @@ line:         /* empty */
        |       TRAIN train STEP NUM '=' dbl
        {         if ($2) record_train_step_speed($2,$4,$6);
        }
-       |       TRAIN train STOPS dbl NUM NUM
+       |       TRAIN train STOPS NUM ':' NUM NUM
        {         if (!trains) record_train_stopregime_count();
-                 else if ($2) record_train_stopregime($2,$4,$5,$6);
+                 else if ($2) record_train_stopregime($2,$4,$6,$7);
        }
        |       SEG seg HAS backwards train
        {         if ($2 && $5) record_seg_has($2,$4,$5);
index 3dcfe58aecaae334c7a94de10bb2c997d504930c..b2e1e53a9b0cf9978672aa962ad1095c5a8964d8 100644 (file)
@@ -4,11 +4,10 @@
  * File format:
  *
  *  max-trains num
- *  train <trainpn> at [-]<foredetectpn>:<maxinto>+-<uncertainty>
  *  train <trainpn> is <addr> <head>+<detectable>+<tail>
- *  train <trainpn> step <step>=<speed>
- *  train <trainpn> step <step> at <distance> after <milliseconds>
  *  train <trainpn> home [-]<segpn> [-]<segpn> [-]<segpn>
+ *  train <trainpn> step <step>=<speed>
+ *  train <trainpn> stops <step> at <distance> after <milliseconds>
  *  seg <segpn> has [-]<ownerpn>
  *  seg <segpn> at <movposcomb>
  *  feature <trainorfeatpn> <letter> is <addr> <nmranum>
@@ -259,11 +258,13 @@ void record_train_stopregime_count(void) {
   rangebufsz++;
 }
 
-void record_train_stopregime(Train *tra, double from, int xs, int ts) {
+void record_train_stopregime(Train *tra, int step, int xs, int ts) {
   Train *other;
   SpeedRange *new;
   int i;
 
+  if (step<1 || step>126) record_yyerror("stop regime step out of range");
+
   if (rangebufused >= rangebufsz)
     record_yyerror("more speed points on 2nd pass!");
 
@@ -296,7 +297,7 @@ void record_train_stopregime(Train *tra, double from, int xs, int ts) {
   new= &tra->speedregimes[tra->n_speedregimes++];
   rangebufused++;
 
-  new->speed= from;
+  new->speed= step;
   new->xs= xs;
   new->ts= ts;
 }
@@ -310,7 +311,7 @@ static int speedregime_compare(const void *av, const void *bv) {
 
 static void speeds_postprocess(void) {
   TRA_IV;
-  int step;
+  int step, i;
 
   FOR_TRA {
     if (!tra->speedregimes || tra->speedcurve[1]<0) {
@@ -322,14 +323,18 @@ static void speeds_postprocess(void) {
 
     qsort(tra->speedregimes, tra->n_speedregimes,
          sizeof(*tra->speedregimes), speedregime_compare);
-    if (tra->speedregimes[tra->n_speedregimes-1].speed
-       <= tra->speedcurve[SPEEDSTEPS-1])
+    if (tra->speedregimes[tra->n_speedregimes-1].speed < 126)
       die("config: speed curve missing top point for %s", tra->pname);
 
     for (step=1; step<=SPEEDSTEPS; step++)
       if (tra->speedcurve[step] < 0)
        die("config: speed curve for %s missing step %d", tra->pname, step);
     tra->speedcurve[0]= 0;
+
+    for (i=0; i<tra->n_speedregimes; i++) {
+      step= tra->speedregimes[i].speed;
+      tra->speedregimes[i].speed= tra->speedcurve[step];
+    }
   }
 }
 
index 4b3086666d48216c0707f9eedb767fafb3f91456..ae3b2db12bc6dd5c363785774bc2f18d63c747ac 100644 (file)
@@ -2,3 +2,11 @@ address=1
 length=1119
 nondetfore=29
 nondetrear=29
+
+# in tests with CV4 = 3:
+stops-from     126     $lX5+$lX6+$lX8P0+$lX10-123      34.9-28.4
+stops-from     100     $lX5+$lX6+321                   29.1-23.7
+stops-from     70      340                             28.8-25.1
+stops-from     30      62                              24.0-22.2
+stops-from     10      10                              19.7-18.5
+stops-from     1       1
diff --git a/hostside/shinkansen.stopping b/hostside/shinkansen.stopping
deleted file mode 100644 (file)
index 2957642..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# in tests with CV4 = 3
-
-stops-from     126     $lX5+$lX6+$lX8P0+$lX10-123      34.9-28.4
-stops-from     100     $lX5+$lX6+321                   29.1-23.7
-stops-from     70      340                             28.8-25.1
-stops-from     30      62                              24.0-22.2
-stops-from     10      10                              19.7-18.5
-stops-from     1       1