chiark / gitweb /
new units: doubles everywhere; wip new safety
authorian <ian>
Sat, 19 Apr 2008 00:02:41 +0000 (00:02 +0000)
committerian <ian>
Sat, 19 Apr 2008 00:02:41 +0000 (00:02 +0000)
hostside/analyse-speeds
hostside/persist.c
hostside/record-l.l
hostside/record-y.y
hostside/record.c
hostside/resolve.c
hostside/safety.h
hostside/speed.c
layout/data2safety
layout/layout-data.h

index bc9d866f1c6350497c8bcb966dc4a0aa4986484a..1742248bd74f21bbef1c8ba881898669f609ceeb 100755 (executable)
@@ -99,12 +99,12 @@ perl <$o.table.tmp >$o.record.tmp -ne '
        sub calcwait ($$) {
                my ($step,$wholetime) = @_;
                return 0 if $step<0 || $step>=$steps;
-               return $wholetime * 1000.0 *
+               return $wholetime *
                        ($speed[$step+1] - $speed[$step]) / $max;
        }
        for ($step=0; $step<$nxt; $step++) {
-               printf  "train %s step %d=%d %d/%d\n",
-                       "'$train'", $step, $speed[$step]*1e6,
+               printf  "train %s step %d=%f %f/%f\n",
+                       "'$train'", $step, $speed[$step]*1e3,
                        calcwait($step-1,'$acceltime'),
                        calcwait($step,'$deceltime')
                                or die $!;
index 1335bc7027eef4d9d06afd54ba2cde0e25723050..739b5aa67d12aca848714a92cef28cfa844995e6 100644 (file)
@@ -373,7 +373,7 @@ void persist_entrails_run_converter(void) {
     if (!tra->pname || !tra->foredetect ||
        !tra->foredetect->i || !tra->foredetect->i->pname)
       continue;
-    printf("train %s at %s%s:%d+-%d\n",
+    printf("train %s at %s%s:%f+-%f\n",
           tra->pname, tra->backwards ? "-" : "",
           tra->foredetect->i->pname, tra->maxinto, tra->uncertainty);
   }
index 578f51f08c11bfeb4a01daa22b022a83f70d2f0c..07f7803c7b6057b86c89324d49d55d0fdb468c3f 100644 (file)
@@ -33,6 +33,7 @@ end           { STR END; }
 
 [0-9]{0,8}     { record_yylval.num= strtoul(yytext,0,10); return NUM; }
 [0-9]{9}       { record_yyerror("number too long"); }
+[0-9][0-9]*\.[0-9]* { record_yylval.dbl= strtod(yytext,0); return DBL; }
 
 [-+:=~/]       { record_yylval.name= 0; return yytext[0]; }
 
index 903fefd45de33ea0be22dcd3b38d25d603945318..12b003e5c7bcb47b792f8c9d964a1fbadedcadac 100644 (file)
@@ -14,16 +14,19 @@ static Train *cur_train;
   FeaturesFeature *feature;
   FeaturesAddr *feataddr;
   int num;
+  double dbl;
 }
 
 %token <name>  TRAIN FEATURE SEG  IS AT HAS STEP HOME END  IDENT FEATLETTER
 %token <name>  NL
 %token <num>   NUM
+%token <dbl>   DBL
 
 %type <name>           ident
 %type <train>          train
 %type <seg>            seg
 %type <num>            backwards
+%type <dbl>            dbl
 %type <feature>                feature
 %type <feataddr>       feataddr
 
@@ -37,16 +40,16 @@ file:               end
        |       line NL { record_tempzone_clear(); } file
 
 line:          /* empty */
-       |       TRAIN train IS NUM NUM '+' NUM '+' NUM
+       |       TRAIN train IS NUM dbl '+' dbl '+' dbl
        {         if ($2) record_train_is($2,$4,$5,$7,$9);
        }
-       |       TRAIN train AT backwards seg ':' NUM '+' '-' NUM
+       |       TRAIN train AT backwards seg ':' dbl '+' '-' dbl
        {         if ($2) record_train_at($2,$4,$5,$7,$10);
        }
        |       TRAIN train HOME { cur_train=$2; } segments
        {
        }
-       |       TRAIN train STEP NUM '=' NUM NUM '/' NUM
+       |       TRAIN train STEP NUM '=' dbl dbl '/' dbl
        {         if (!trains) record_train_step_count();
                  else if ($2) record_train_step($2,$4,$6,$7,$9);
        }
@@ -68,8 +71,11 @@ backwards:   /* empty */ { $$= 0; }
 
 segments:      { cur_train= (void*)-1; }
        |       backwards seg { record_train_home(cur_train,$1,$2); } segments
+
 ident:         TRAIN | SEG | IS | AT | HAS | STEP | HOME | END
        |       IDENT | FEATLETTER
+dbl:           DBL
+       |       NUM { $$= $1 }
 
 seg:           ident { $$= record_pname2seg($1); }
 train:         ident { $$= record_pname2train($1); }
index 9b5470699dfbb535d3a1dfd7e220a98220260dcb..c9106a0a41135978e6b0468e9d63022043caeb7e 100644 (file)
@@ -297,9 +297,9 @@ void record_train_step(Train *tra, int step, int speed, int upw, int downw) {
   curvebufused++;
 
   new->step= step;
-  new->speed= speed * 1e-6 * SPEED_UNIT;
-  new->upwait= upw * 1e-3;
-  new->downwait= downw * 1e-3;
+  new->speed= speed;
+  new->upwait= upw;
+  new->downwait= downw;
 }
 
 static int speedcurveentry_compare(const void *av, const void *bv) {
index 32a55c676a6b5690f7a312212fceb163cdd6a4b2..0c7bc33f4161f21d875dd90537d36f8b49d0d9fa 100644 (file)
@@ -320,7 +320,7 @@ int resolve_complete(void) {
     }      
 
     if (d->owner)
-      d->until_detect= 1;
+      d->until_detect= 1e-3;
 
     if (d->i->n_poscombs>1) {
       d->movposcomb= -1;
index 4d22969ab40110ee851f9bfde6505606bd63123f..2dcb0c6838f3678dff6628f1c0f277a590cd30ad 100644 (file)
 
 /*========== more basic types etc. ==========*/
 
-typedef short TimeInterval; /*ms*/
+typedef double TimeInterval; /*s*/
 
 /*---------- units and scales ----------*/
 
 /*
  * Distances are in mm.
- * Times are in ms.
- * Speeds are in fixed point: unit is 1/SPEED_UNIT m/s
- *
- * To calculate with speeds and times without using floating point
- * it turns out that we can cope with distances of up to
- *   2^(31-SPEED_SHIFT) mm
+ * Times are generally in s.
  */
 
-#define SPEED_SHIFT 16     /* units of 15um/s, max distance 2^15mm =~ 32m */
-#define SPEED_UNIT (1L<<SPEED_SHIFT) /* ms/mm */
-
 /*========== state of the layout ==========*/
 
 typedef struct MovPosChange MovPosChange;
 
 typedef struct {
   int step;
-  long speed;
+  Speed speed;
   TimeInterval upwait, downwait; /* between this insn and next one */
 } SpeedCurveEntry;
 
@@ -295,23 +287,18 @@ const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
 
 /*---------- calculations with fixed point speeds ----------*/
 
-#define DIVIDE_ROUNDING_UP(num,den)   (((num) + (den) - 1) / (den))
-#define DIVIDE_ROUNDING_DOWN(num,den) ( (num)             / (den))
-
-#define SPEED_CALC_TIME(speed,dist,round) \
-  DIVIDE_ROUNDING_##round((dist) * SPEED_UNIT, (speed))
-
-#define SPEED_CALC_DIST(speed,time,round) \
-  DIVIDE_ROUNDING_##round((time) * (speed), SPEED_UNIT)
+#define SPEED_CALC_TIME(speed,dist,round) ((dist) / ((speed)+1e-6))
+#define SPEED_CALC_DIST(speed,time,round) ((time) * (speed))
 
 /*---------- safety margin parameters ----------*/
 
 #define CLEAR_FORESIGHT_TIME 500 /*ms*/
-#define AUTOSTOP_MAXSPEED ((50 * SPEED_UNIT)/1000) /* 50 mm/s */
+#define AUTOSTOP_MAXSPEED 50.0 /*mm/s*/
 #define AUTOSTOP_UNCERTAINTY 20  /*mm*/
 #define ESTOP_UNCERTAINTY 300  /*mm*/
 #define ESTOP_DEADTIME    2000 /*ms*/
 
+#define TIMEINTERVAL2MS(ti) ((ti) * 1000.0)
 #define SPEED_CLEAR_MULT SPEED_CALC_DIST(1,CLEAR_FORESIGHT_TIME,UP)
 
 #endif /*SAFETY_H*/
index 83befdc66da3cc74bde8e7eb3a8ad695ca5d73e8..7b991bdaac00754fa55c1c2b47cf99b0f92df3be 100644 (file)
@@ -60,7 +60,7 @@ void speedmanager_emergencystop(Train *tra) {
 
   toev_stop(&tra->accel.more);
   tra->accel.more.callback= estop_done;
-  tra->accel.more.duration= ESTOP_DEADTIME;
+  tra->accel.more.duration= TIMEINTERVAL2MS(ESTOP_DEADTIME);
   toev_start(&tra->accel.more);
 }
 
@@ -69,12 +69,14 @@ static void adjust_next(Train *tra, int inautostop) {
 
   if (tra->accel.target > tra->accel.commanded) {
     tra->accel.commanded++;
-    tra->accel.more.duration= tra->accel.curve[tra->accel.commanded].upwait;
+    tra->accel.more.duration=
+      TIMEINTERVAL2MS(tra->accel.curve[tra->accel.commanded].upwait);
     newspeed= tra->accel.curve[tra->accel.commanded].speed;
   } else if (tra->accel.target < tra->accel.commanded) {
     newspeed= tra->accel.curve[tra->accel.commanded].speed;
     tra->accel.commanded--;
-    tra->accel.more.duration= tra->accel.curve[tra->accel.commanded].downwait;
+    tra->accel.more.duration=
+      TIMEINTERVAL2MS(tra->accel.curve[tra->accel.commanded].downwait);
   } else {
     return;
   }
@@ -164,7 +166,7 @@ void speedmanager_speedchange_request(Train *tra, long speed) {
 
   if (curve[found].speed < speed && speed != INT_MAX)
     logmsg(EC_Invalid, tra,0,
-          "requested speed %ld excessive; capping at %ld",
+          "requested speed %ld excessive; capping at %f",
           speed, curve[found].speed);
 
   changereq_internal(tra, found, 0);
index 95c1eb9666b95d62ea16c68525e7bfbf30251dda..cfac5beb92487203e79118d4d8e388d48fd35cf5 100755 (executable)
@@ -493,7 +493,7 @@ sub writeout () {
                              ($comb / $featr->{Weight}) % $featr->{Posns});
            }
            o("$delim\n");
-           o(sprintf " { %-7s%4d",
+           o(sprintf " { %-7s%7.3f",
              '"'.$pi.'",',
              $segr->{Dist}[$comb]);
            for ($end=0; $end<2; $end++) {
index bf57f2ca4f3838c51aea89eddabad77a0b8044f9..f6eb3e2f122a030b46df29d7829389cce6467a3c 100644 (file)
 typedef int TrainNum;
 typedef int SegmentNum;
 typedef long MovPosComb;
-typedef long Speed;
 typedef int BoardObject;
 typedef int Small;
-typedef int Distance;
 typedef short SegmentNumInMap;
 
+typedef double Speed;
+typedef double Distance;
+
 typedef enum {
   mfk_none,
   mfk_point