@f= qw(
OK
+ Invalid
Safety
);
--- /dev/null
+/*
+ * 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*/
TrackLocation tloc, long advance,
long speed, unsigned backwards,
unsigned check_clash) {
- State *s= &safety_state;
+ S;
SegmentNum segn;
SegmentState *seg;
const SegmentInfo *segi;
}
static void lay_train_inversions(LayTrainState *l) {
- State *s= &safety_state;
+ S;
SegmentNum segn;
SegmentState *seg;
const SegmentInfo *segi;
}
static void lay_train_done(LayTrainState *l) {
- State *s= &safety_state;
+ S;
SegmentNum segn;
SegmentState *seg;
}
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;
}
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;
}
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;
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 {
/*========== 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. */
--- /dev/null
+/*
+ * 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);
+}