From acd388488c361e409e7a9d3d44f135bd43a84fa5 Mon Sep 17 00:00:00 2001 From: ian Date: Sun, 8 Jun 2008 20:10:23 +0000 Subject: [PATCH] res_movposset needed because we can restart the resolution, losing track of what we have set --- hostside/record.c | 1 + hostside/resolve.c | 103 ++++++++++++++++++++++++--------------------- hostside/safety.h | 1 + 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/hostside/record.c b/hostside/record.c index d557579..29dcc60 100644 --- a/hostside/record.c +++ b/hostside/record.c @@ -425,6 +425,7 @@ static void alloc(void) { FOR_SEG { seg->owner= 0; seg->seg_inverted= 0; + seg->res_movposset= 0; seg->movposcomb= -1; seg->moving= 0; seg->motion= seg->motion_newplan= 0; diff --git a/hostside/resolve.c b/hostside/resolve.c index ac85588..e7045ab 100644 --- a/hostside/resolve.c +++ b/hostside/resolve.c @@ -168,9 +168,12 @@ static int resmain_getmovpos(TrackLocation *t, TrackAdvanceContext *c, d->tr_backwards ^= d->owner->backwards; *use_io= d->movposcomb; DPRINTF(resolving,main, "getmovpos %s E %u\n", pn, *use_io); - } else { + } else if (!d->res_movposset) { *use_io= -1; DPRINTF(resolving,main, "getmovpos %s N -1\n", pn); + } else if (d->motion) { + *use_io= movpos_change_intent(d->motion); + DPRINTF(resolving,main, "getmovpos %s M %u\n", pn, *use_io); } return 0; } @@ -324,58 +327,53 @@ static int resolve_complete_main(void) { problems++; } } - return problems; -} - -static int resolve_complete_movpos_segment(Segment *d) { - int problems= 0; + TrackAdvanceContext tac; MovPosComb target; tac.getmovpos= resmain_getmovpos; - d->iselem_u= 0; + FOR_SEGMENT(d,NOOP,NOOP) { + if (problems) return problems; - target= just_getmovpos(d,&tac); + d->iselem_u= 0; - if (d->i->invertible) { - Segment *interferer= segment_interferes(&tac,d); - if (interferer) { - actual_inversions_start(); - d->seg_inverted= interferer->seg_inverted - ^ d->i->interferes_polarity_opposed; - actual_inversions_segment(d); - actual_inversions_done(); + target= just_getmovpos(d,&tac); + + if (d->i->invertible) { + Segment *interferer= segment_interferes(&tac,d); + if (interferer) { + actual_inversions_start(); + d->seg_inverted= interferer->seg_inverted + ^ d->i->interferes_polarity_opposed; + actual_inversions_segment(d); + actual_inversions_done(); + } } - } - if (d->i->n_poscombs>1) { - d->movposcomb= -1; - if (target >= 0) { - assert(!d->motion); - ErrorCode ec= movpos_reserve(d,-1,&d->motion,target,-1); - if (ec) { - ouprintf("resolution movpos-change-failed %s/%s %s\n", - d->i->pname, d->i->poscombs[target].pname, - errorcodelist[ec]); - problems++; + if (d->i->n_poscombs>1) { + if (target >= 0) { + if (!d->moving) { + movpos_unreserve(d->motion); + d->motion= 0; + } + ErrorCode ec= movpos_reserve(d,-1,&d->motion,target,-1); + if (ec) { + ouprintf("resolution movpos-change-failed %s/%s %s\n", + d->i->pname, d->i->poscombs[target].pname, + errorcodelist[ec]); + problems++; + } else { + d->res_movposset= 1; + } } + } else { + assert(!d->i->n_movfeats); + d->movposcomb= 0; } - } else { - assert(!d->i->n_movfeats); - d->movposcomb= 0; } return problems; } -static int resolve_complete_movpos(void) { - SEGMENT_ITERVARS(d); - int problems= 0; - - FOR_SEGMENT(d,NOOP,NOOP) - problems += resolve_complete_movpos_segment(d); - return problems; -} - #undef iselem_u /*---------- heads and tails of trains, final placement ----------*/ @@ -389,6 +387,18 @@ typedef struct { int extraspace; } FindEndUserContext; +static int findends_getmovpos(TrackLocation *t, TrackAdvanceContext *c, + MovPosComb *use_io) { + const char *pn= t->seg->i->pname; + if (t->seg->motion) *use_io= movpos_change_intent(t->seg->motion); + if (*use_io<0) { + DPRINTF(resolving,ends, " getmovpos %s fails\n", pn); + return -1; + } + DPRINTF(resolving,ends, " getmovpos %s -> %d\n", pn, *use_io); + return 0; +} + static int segdist(Segment *seg) { TrackLocation t; int r; @@ -397,7 +407,7 @@ static int segdist(Segment *seg) { t.seg= seg; mpc= seg->movposcomb; - r= resmain_getmovpos(&t,0,&mpc); + r= findends_getmovpos(&t,0,&mpc); assert(!r); assert(mpc >= 0); return seg->i->poscombs[mpc].dist; } @@ -482,7 +492,7 @@ static int resolve_complete_ends_train(Train *tra) { tc.distance= TL_DIST_INF; tc.nextseg= findhead_nextseg; - tc.getmovpos= resmain_getmovpos; + tc.getmovpos= findends_getmovpos; tc.trackend= 0; tc.u= &u; @@ -500,11 +510,6 @@ static int resolve_complete_ends_train(Train *tra) { tra->foredetect->tr_backwards?"-":"", tra->foredetect->i->pname, segdist(tra->foredetect)); -// if (u.furthest != tra->foredetect) { -// int problems= resolve_complete_movpos_segment(u.furthest); -// if (problems) return problems; -// } - tra->maxinto= segdist(tra->foredetect) - u.extraspace; if (tra->maxinto < 0) { ouprintf("resolution mispositioned head %s %s %d\n", @@ -591,8 +596,6 @@ int resolve_complete(void) { problems= resolve_complete_main(); if (!problems) problems += resolve_complete_ends(); - if (!problems) - problems += resolve_complete_movpos(); if (problems) { ouprintf("resolution problems %d\n",problems); @@ -623,5 +626,9 @@ void resolve_motioncheck(void) { FOR_SEG if (seg->moving) return; + FOR_SEG + if (seg->i->n_poscombs>1 && !seg->res_movposset) + seg->movposcomb= -1; + sta_finalising_done(); } diff --git a/hostside/safety.h b/hostside/safety.h index 452eace..6756e92 100644 --- a/hostside/safety.h +++ b/hostside/safety.h @@ -74,6 +74,7 @@ struct Segment { det_ignore:1, det_expected:1, /* safety.c */ moving:1, /* feature(s) have been told to change */ mark0,mark1,mark2,mark3, /* for temporary private uses */ + res_movposset:1, /* we have set the position so it is known good */ res_detect:1; /* detection noticed here during resolution */ MovPosComb movposcomb; /* -1 means not known or moving */ MovPosChange *motion; /* if ->moving, owned by movpos, otherwise by safety */ -- 2.30.2