return seg->i->poscombs[seg->movposcomb].dist;
}
+static void finalise_callback_debug(const char *what, TrackLocation *t,
+ struct TrackAdvanceContext *c) {
+ oprintf(DUPO("resolving") " finalise %s"
+ " %s%s owner=%s res_detect=%d resfin_done=%d\n",
+ what, t->backwards?"-":"", t->seg->i->pname,
+ t->seg->owner ? t->seg->owner->pname : "0",
+ t->seg->res_detect, t->seg->resfin_done);
+}
+
static int findhead_nextseg(TrackLocation *t, struct TrackAdvanceContext *c,
MovPosComb *mpc_io, Segment *before) {
FindEndUserContext *u= c->u;
+
+ finalise_callback_debug("findhead_nextseg",t,c);
+
if (t->seg->owner != u->train) return -1;
u->furthest= t->seg;
if (!t->seg->res_detect) { u->extraspace= 0; return -1; }
static int walkback_nextseg(TrackLocation *t, struct TrackAdvanceContext *c,
MovPosComb *mpc_io, Segment *before) {
FindEndUserContext *u= c->u;
+
+ finalise_callback_debug("walkback_nextseg",t,c);
+
if (t->seg->owner != u->train) return -1;
t->seg->tr_backwards= !t->backwards;
t->seg->resfin_done= 1;
tc.getmovpos= 0;
tc.u= &u;
+ u.train= tra;
u.extraspace= MARGIN_NOSE + tra->head;
u.furthest= 0;
+ oprintf(DUPO("resolving") " finalise %s start=%s%s es=%d\n",
+ tra->pname,
+ t.backwards?"-":"", t.seg->i->pname,
+ u.extraspace);
+
r= findhead_nextseg(&t,&tc,0,0); assert(!r);
trackloc_advance(&t,&tc);
+ oprintf(DUPO("resolving") " finalise es=%d furthest=%s fdd(%s)=%d\n",
+ u.extraspace, u.furthest->i->pname,
+ tra->foredetect->i->pname, segdist(tra->foredetect));
+
tra->maxinto= segdist(tra->foredetect) - u.extraspace;
if (tra->maxinto < 0) tra->maxinto= 0;
tra->uncertainty= tra->maxinto;
}
t.seg= tra->foredetect;
- t.remain= 0;
+ t.remain= segdist(tra->foredetect) - u.extraspace;
t.backwards= !tra->foredetect->tr_backwards;
tc.distance= tra->detectable + tra->tail + MARGIN_NOSE;
r= walkback_nextseg(&t,&tc,0,0); assert(!r);
trackloc_advance(&t,&tc);
+ oprintf(DUPO("resolving") " finalise maxi=%d unc=%d;"
+ " remaining distance=%d\n",
+ tra->maxinto, tra->uncertainty, tc.distance);
+
if (tc.distance) {
tra->uncertainty -= tc.distance;
if (tra->uncertainty < 0)