chiark / gitweb /
found, checkin before liberator repair
authorian <ian>
Sun, 23 Jul 2006 11:14:59 +0000 (11:14 +0000)
committerian <ian>
Sun, 23 Jul 2006 11:14:59 +0000 (11:14 +0000)
hostside/errorcodes.h.gen
hostside/rtmacros.h [new file with mode: 0644]
hostside/safety.c
hostside/safety.h
hostside/speed.c [new file with mode: 0644]

index a3093dc5d04189da4ac5f842e06f0f0a72b0a6be..7608367ef39f933659c80159b1d8e23b56413466 100755 (executable)
@@ -2,6 +2,7 @@
 
 @f= qw(
        OK
+       Invalid
        Safety
        );
 
diff --git a/hostside/rtmacros.h b/hostside/rtmacros.h
new file mode 100644 (file)
index 0000000..45d88be
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * macros which help some files in the realtime daemon
+ */
+
+#ifndef RTMACROS_H
+#define RTMACROS_H
+
+#define S     State *s= &safety_state
+#define TRA   TrainState *tra= &s->trains[tran]
+#define TRAI  const TrainInfo *trai= &info_trains[tran];
+#define SEG   SegmentState *seg= &s->segments[segn]
+
+#endif /*RTMACROS_H*/
index 21956f8a436e625d2bf2d20c1b7aab2e79a7535e..d8c58020edc3eb83e91dd10a1672b9587d90f33b 100644 (file)
@@ -34,7 +34,7 @@ static void lay_train_pass(LayTrainState *l,
                           TrackLocation tloc, long advance,
                           long speed, unsigned backwards,
                           unsigned check_clash) {
-  State *s= &safety_state;
+  S;
   SegmentNum segn;
   SegmentState *seg;
   const SegmentInfo *segi;
@@ -104,7 +104,7 @@ static void lay_train_pass(LayTrainState *l,
 }
 
 static void lay_train_inversions(LayTrainState *l) {
-  State *s= &safety_state;
+  S;
   SegmentNum segn;
   SegmentState *seg;
   const SegmentInfo *segi;
@@ -131,7 +131,7 @@ static void lay_train_inversions(LayTrainState *l) {
 }
 
 static void lay_train_done(LayTrainState *l) {
-  State *s= &safety_state;
+  S;
   SegmentNum segn;
   SegmentState *seg;
   
@@ -148,9 +148,7 @@ static void lay_train_done(LayTrainState *l) {
 }
 
 static ErrorCode lay_train(TrainNum tran, long added_slop) {
-  State *s= &safety_state;
-  TrainState *tra= &s->trains[tran];
-  const TrainInfo *trai= &info_trains[tran];
+  S; TRA; TRAI;
   SegmentNum segn;
   SegmentState *seg;
   TrackLocation tloc;
@@ -212,10 +210,9 @@ static void setspeed(TrainNum tran, Speed newspeed) {
 }
 
 void safety_notify_detection(SegmentNum segn) {
-  State *s= &safety_state;
-  SegmentState *seg= &s->segments[segn];
+  S; SEG;
   TrainNum tran= seg->owner;
-  TrainState *tra= &s->trains[tran];
+  TRA;
   ErrorCode ec;
   TrackLocation tloc;
 
@@ -253,21 +250,25 @@ void safety_notify_detection(SegmentNum segn) {
 }
 
 void safety_emergencystop(TrainNum tran) {
-  State *s= &safety_state;
+  S; TRA;
   ErrorCode ec;
-  TrainState *tra= &s->trains[tran];
 
   tra->speed= 0;
+  fixme /* this is wrong
+          we need to take into account the finite stopping time or distance
+          of the train
+          and predict and track its location while it stops
+       */;
+
   actual_emergencystop(tran);
   ec= lay_train(tran, ESTOP_UNCERTAINTY);
   if (ec) safety_panic(tran, NOTA(Segment), "emergency stop forbidden!");
-  speedmanager_speedchange_notify(tran);
+  speedmanager_emergencystop_notify(tran);
 }
 
 void safety_requestspeed(TrainNum tran, long newspeed) {
-  State *s= &safety_state;
+  S; TRA;
   long oldspeed;
-  TrainState *tra= &s->trains[tran];
   ErrorCode ec;
 
   oldspeed= tra->speed;
index deb577cee3105d22fc0ce54be29252211a614494..770b61414082d4f5080adbe59de0d721d6fea561 100644 (file)
@@ -32,6 +32,8 @@ typedef struct {
   unsigned                         /*   uncertainty less far advanced      */
     backwards:1; /* train is moving backwards wrt its own front and back */
   Speed speed;
+  Speed speedtarget; fixme put this in some different array ?
+  TimeoutEvent speedadjust; fixme initialise
 } TrainState;
 
 typedef struct {
@@ -100,6 +102,9 @@ void safety_notify_detection(SegmentNum segn);
 
 /*========== speedmgr.c ==========*/
 
+void speedmanager_speedchange_request(TrainNum tran, Speed speed);
+
+void speedmanager_emergencystop_notify(TrainNum tran);
 void speedmanager_speedchange_notify(TrainNum tran);
   /* To be called only by safety.c, whenever speed is actually set.
    * New speed has already been recorded in State. */
diff --git a/hostside/speed.c b/hostside/speed.c
new file mode 100644 (file)
index 0000000..ba4dced
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * realtime
+ * speed manager
+ */
+
+#include "realtime.h"
+
+static void adjust_next(TrainNum tran) {
+  S; TRA;
+  calculate next speed step in the appropriate direction
+    call safety_setspeed
+
+
+speedmanager_speedchange_notify {
+  fixme need to know whether this is a countermand or not
+
+  actually send speed to train
+    (fixme: combine speedmanager and actual?)
+    queue an adjust_next
+
+  make speedmanager also responsible for doing actuals ?
+  pass speed step number through ?
+
+void speedmanager_speedchange_request(TrainNum tran, Speed speed) {
+  S; TRA; TRAI;
+
+  if (speed > trai->maxspeed) {
+    logmsg(EC_Invalid, tran, NOTA(SegmentNum),
+          "requested speed %l excessive; capping at %l",
+          (long)speed, (long)trai->maxspeed);
+    speed= trai->maxspeed;
+  }
+  tra->targetspeed= speed;
+  if (!speedadjust->running)
+    adjust_next(tran);
+}