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;
}
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 ----------*/
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;
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;
}
tc.distance= TL_DIST_INF;
tc.nextseg= findhead_nextseg;
- tc.getmovpos= resmain_getmovpos;
+ tc.getmovpos= findends_getmovpos;
tc.trackend= 0;
tc.u= &u;
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",
problems= resolve_complete_main();
if (!problems)
problems += resolve_complete_ends();
- if (!problems)
- problems += resolve_complete_movpos();
if (problems) {
ouprintf("resolution problems %d\n",problems);
FOR_SEG
if (seg->moving) return;
+ FOR_SEG
+ if (seg->i->n_poscombs>1 && !seg->res_movposset)
+ seg->movposcomb= -1;
+
sta_finalising_done();
}