From: ian Date: Sun, 8 Jun 2008 20:00:46 +0000 (+0000) Subject: check in abortive confused attempt to deal with resolution movpos bug; will revert... X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=d2576f265659f3ac64de5de1679183c1ffa8fd80;p=trains.git check in abortive confused attempt to deal with resolution movpos bug; will revert right away --- diff --git a/hostside/resolve.c b/hostside/resolve.c index c15b44e..ac85588 100644 --- a/hostside/resolve.c +++ b/hostside/resolve.c @@ -324,49 +324,58 @@ 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; - FOR_SEGMENT(d,NOOP,NOOP) { - if (problems) return problems; + d->iselem_u= 0; - d->iselem_u= 0; + target= just_getmovpos(d,&tac); - 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->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) { + 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++; } - } 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 ----------*/ @@ -380,18 +389,6 @@ 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; @@ -400,7 +397,7 @@ static int segdist(Segment *seg) { t.seg= seg; mpc= seg->movposcomb; - r= findends_getmovpos(&t,0,&mpc); + r= resmain_getmovpos(&t,0,&mpc); assert(!r); assert(mpc >= 0); return seg->i->poscombs[mpc].dist; } @@ -485,7 +482,7 @@ static int resolve_complete_ends_train(Train *tra) { tc.distance= TL_DIST_INF; tc.nextseg= findhead_nextseg; - tc.getmovpos= findends_getmovpos; + tc.getmovpos= resmain_getmovpos; tc.trackend= 0; tc.u= &u; @@ -503,6 +500,11 @@ 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", @@ -589,6 +591,8 @@ 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);