From: ian Date: Sun, 18 May 2008 20:09:57 +0000 (+0000) Subject: better management of new planning X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=af2afe27b20d4788b3bc83d3e08a0838c2c467f5;p=trains.git better management of new planning --- diff --git a/hostside/commands.c b/hostside/commands.c index 7da070c..b3b8bb2 100644 --- a/hostside/commands.c +++ b/hostside/commands.c @@ -254,7 +254,7 @@ static int cmd_movpos(ParseState *ps, const CmdInfo *ci) { } ms= -1; - if (ps->remain) + if (ps->remain && CIXF_FORCE) MUSTECR( ps_neednumber(ps,&ms,0,100000,"milliseconds") ); MUSTECR( ps_neednoargs(ps) ); diff --git a/hostside/safety.c b/hostside/safety.c index f494173..67181f7 100644 --- a/hostside/safety.c +++ b/hostside/safety.c @@ -852,6 +852,7 @@ ErrorCode predict(Train *tra, struct timeval tnow, unsigned flags, "-V"[ seg->pred_vacated ], "-p"[ seg->will_polarise ]); + /* set ownership and det_ignore */ if (seg->pred_present || seg->pred_vacated) { seg->owner= tra; seg->det_ignore= seg->now_present; @@ -859,6 +860,20 @@ ErrorCode predict(Train *tra, struct timeval tnow, unsigned flags, seg->det_ignore= 0; seg->owner= 0; } + + /* garbage collect our previous plan */ + if (!seg->owner) { + assert(!seg->motion_newplan); + if (!seg->moving) { + movpos_unreserve(seg->motion); + seg->motion= 0; + } + } + if (seg->owner != tra) + continue; + + /* now it's our segment: */ + if (seg->motion_newplan == seg->motion) { seg->motion_newplan= 0; } else { @@ -902,6 +917,12 @@ ErrorCode predict(Train *tra, struct timeval tnow, unsigned flags, actual_inversions_done(); report_train_ownerships(tra,u.hindmost,0); + + if (u.desire_move && !u.desire_move->owner) + /* Oh! Train must be slower and less far advanced than expected. + * Well, then we can move it right away. */ + return movpos_change(u.desire_move,u.desire_movposcomb,-1,0); + return 0; xproblem: @@ -1072,7 +1093,7 @@ ErrorCode safety_movposchange(Segment *seg, MovPosComb comb, u.train= seg->owner; if (!seg->owner) - return 0; + return movpos_change(seg,comb,-1,0); if (allow_queueing<2) { if (seg->det_ignore)