From ad88cad0754f9d3f9ef761253d139ba04f796626 Mon Sep 17 00:00:00 2001 From: ian Date: Sun, 23 Jul 2006 11:14:59 +0000 Subject: [PATCH] found, checkin before liberator repair --- hostside/errorcodes.h.gen | 1 + hostside/rtmacros.h | 13 +++++++++++++ hostside/safety.c | 29 +++++++++++++++-------------- hostside/safety.h | 5 +++++ hostside/speed.c | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 hostside/rtmacros.h create mode 100644 hostside/speed.c diff --git a/hostside/errorcodes.h.gen b/hostside/errorcodes.h.gen index a3093dc..7608367 100755 --- a/hostside/errorcodes.h.gen +++ b/hostside/errorcodes.h.gen @@ -2,6 +2,7 @@ @f= qw( OK + Invalid Safety ); diff --git a/hostside/rtmacros.h b/hostside/rtmacros.h new file mode 100644 index 0000000..45d88be --- /dev/null +++ b/hostside/rtmacros.h @@ -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*/ diff --git a/hostside/safety.c b/hostside/safety.c index 21956f8..d8c5802 100644 --- a/hostside/safety.c +++ b/hostside/safety.c @@ -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; diff --git a/hostside/safety.h b/hostside/safety.h index deb577c..770b614 100644 --- a/hostside/safety.h +++ b/hostside/safety.h @@ -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 index 0000000..ba4dced --- /dev/null +++ b/hostside/speed.c @@ -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); +} -- 2.30.2