From a49bb3fafa4fce510022cc62310bbee5d7858ab0 Mon Sep 17 00:00:00 2001 From: ian Date: Fri, 25 Apr 2008 18:49:17 +0000 Subject: [PATCH] wip on resolution bugs --- hostside/TODO | 7 ++++++- hostside/resolve.c | 31 ++++++++++++++++++++++++++++++- hostside/trackloc.c | 4 ++-- hostside/x.gdb | 2 +- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/hostside/TODO b/hostside/TODO index 004fb89..8e6f926 100644 --- a/hostside/TODO +++ b/hostside/TODO @@ -1,5 +1,10 @@ bugs - startup resolve crashes due to findhead_nextseg returning -1 + startup resolve fails due to shinkansen not being + as long as expected and thus seeming to + overrun the rear + - user should put it as close to the head as + possible + can we fail resolution at this point ? want to document commands [!]movfeat and speed diff --git a/hostside/resolve.c b/hostside/resolve.c index aea6188..bda9b47 100644 --- a/hostside/resolve.c +++ b/hostside/resolve.c @@ -360,9 +360,21 @@ static int segdist(Segment *seg) { 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; } @@ -376,6 +388,9 @@ static int findhead_nextseg(TrackLocation *t, struct TrackAdvanceContext *c, 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; @@ -405,12 +420,22 @@ static void resolve_train_finalise(Segment *startpoint) { 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; @@ -421,7 +446,7 @@ static void resolve_train_finalise(Segment *startpoint) { } 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; @@ -430,6 +455,10 @@ static void resolve_train_finalise(Segment *startpoint) { 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) diff --git a/hostside/trackloc.c b/hostside/trackloc.c index 98a6e37..3305861 100644 --- a/hostside/trackloc.c +++ b/hostside/trackloc.c @@ -51,8 +51,8 @@ int trackloc_getlink(TrackLocation *t, TrackAdvanceContext *c, } assert(mpc < t->seg->i->n_poscombs); pci= &t->seg->i->poscombs[t->seg->movposcomb]; - if (*pci_r) *pci_r= pci; - if (*link_r) *link_r= &pci->link[t->backwards]; + if (pci_r) *pci_r= pci; + if (link_r) *link_r= &pci->link[t->backwards]; return 0; } diff --git a/hostside/x.gdb b/hostside/x.gdb index a162012..a393f9f 100644 --- a/hostside/x.gdb +++ b/hostside/x.gdb @@ -7,7 +7,7 @@ set args -s/dev/ttyUSB0 shinkansen.speeds.record homes.record break vdie break nmra_errchk_fail break predict_problem -#break resolve.c:337 +break safety_panic run -- 2.30.2