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 ----------*/
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= findends_getmovpos(&t,0,&mpc);
+ r= resmain_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= findends_getmovpos;
+ tc.getmovpos= resmain_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);