chiark / gitweb /
also parse homes.record
authorian <ian>
Wed, 13 Feb 2008 18:39:23 +0000 (18:39 +0000)
committerian <ian>
Wed, 13 Feb 2008 18:39:23 +0000 (18:39 +0000)
hostside/homes.record [new file with mode: 0644]
hostside/record-i.h
hostside/record-l.l
hostside/record-y.y
hostside/record.c
hostside/safety.h

diff --git a/hostside/homes.record b/hostside/homes.record
new file mode 100644 (file)
index 0000000..284fbf2
--- /dev/null
@@ -0,0 +1 @@
+train santafe home X5 X6
index eddb6808d3a2ba0d7887f3f95aa851f85b92d25d..0da12a78110ef5d8435923f1d20a78abb0eb4f67 100644 (file)
@@ -11,6 +11,7 @@ void record_train_at(Train *tra, int backw, Segment *seg, int maxi, int unc);
 void record_train_is(Train *tra, int addr, int head, int det, int tail);
 void record_train_step(Train *tra, int step, int speed, int upw, int downw);
 void record_train_step_count(void);
+void record_train_home(Train *tra, int backw, Segment *seg);
 void record_seg_has(Segment *seg, int backw, Train *tra);
 void record_seg_at(Segment *seg, const char *movposcomb_pname);
 
index 68edcb3cb3e15dde504b9869566a6bd52353bd23..1422456bb26c1a5320dd6984854b0c92c268b296 100644 (file)
@@ -22,7 +22,8 @@ seg           { STR SEG; }
 is             { STR IS; }
 at             { STR AT; }
 has            { STR HAS; }
-step           { STR STEP; }           
+step           { STR STEP; }
+home           { STR HOME; }
 end            { STR END; }
  /* new keywords must be added to %token<name> and ident: in record-y.y */
 
index 5a97fdaea12c0a9abc60483ba6c4293e4e8b41c1..2a3cb7a399888edb58b32f17852db2659377d2da 100644 (file)
@@ -3,6 +3,8 @@
 %{
 #include "record-i.h"
 #include "record-l.h"
+
+static Train *cur_train;
 %}
 
 %union {
@@ -12,7 +14,7 @@
   int num;
 }
 
-%token <name>  TRAIN SEG  IS AT HAS STEP END  IDENT
+%token <name>  TRAIN SEG  IS AT HAS STEP HOME END  IDENT
 %token <name>  NL
 %token <num>   NUM
 
@@ -37,6 +39,9 @@ line:         /* empty */
        |       TRAIN train AT backwards seg ':' NUM '+' '-' NUM
        {         if ($2) record_train_at($2,$4,$5,$7,$10);
        }
+       |       TRAIN train { cur_train=$2; } HOME segments
+       {
+       }
        |       TRAIN train STEP NUM '=' NUM NUM '/' NUM
        {         if (!trains) record_train_step_count();
                  else if ($2) record_train_step($2,$4,$6,$7,$9);
@@ -51,7 +56,9 @@ line:         /* empty */
 backwards:     /* empty */ { return 0; }
        |       '-' { return 1; }
 
-ident:         TRAIN | SEG | IS | AT | HAS | STEP | END | IDENT
+segments:      { cur_train= 0; }
+       |       backwards seg { record_train_home(cur_train,$1,$2); } segments
+ident:         TRAIN | SEG | IS | AT | HAS | STEP | HOME | END | IDENT
 
 seg:           ident { $$= record_pname2seg($1); }
 train:         ident { $$= record_pname2train($1); }
index bc2be620f510b86eb5c84a70370fd214a2026446..074135b657d027c2884d024ad29b80566935bf11 100644 (file)
@@ -7,6 +7,7 @@
  *  train <trainpn> at [-]<foredetectpn>:<maxinto>+-<uncertainty>
  *  train <trainpn> is <addr> <head>+<detectable>+<tail>
  *  train <trainpn> step <step>=<speed> <upwait>/<downwait>
+ *  train <trainpn> home [-]<segpn> [-]<segpn> [-]<segpn>
  *  seg <segpn> has [-]<ownerpn>
  *  seg <segpn> at <movposcomb>
  *
@@ -124,6 +125,12 @@ void record_train_at(Train *tra, int backw, Segment *seg, int maxi, int unc) {
   tra->backwards= backw;
 }
   
+void record_train_home(Train *tra, int backw, Segment *seg) {
+  if (!tra) return;
+  seg->home= tra;
+  seg->ho_backwards= backw;
+}
+  
 void record_seg_has(Segment *seg, int backw, Train *tra) {
   seg->owner= tra;
   seg->tr_backwards= backw;
index a4806f92cce55f37d49754558c740d58aaf4e9af..d7dd84718400c28dab36c262de5ebfe3daa78bd7 100644 (file)
@@ -66,8 +66,10 @@ struct Train {
 
 struct Segment {
   Train *owner;                                  /* or 0 */
+  Train *home;                                   /* or 0 */
   unsigned
     tr_backwards:1, /* train's motion is (would be) backwards wrt track */
+    ho_backwards:1, /* home train has its front and rear backwards wrt track */
     movfeat_moving:1, /* feature(s) have been told to change to movposcomb */
     cm_autostop:1, /* train should stop on detection */
     seg_inverted:1, /* polarity is inverted */