From: ian Date: Mon, 28 Mar 2005 16:44:37 +0000 (+0000) Subject: utils.c (trackloc_...) compiles X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=3571f23a4343d7196e3a58d57dccfe2cd92bc195;p=trains.git utils.c (trackloc_...) compiles --- diff --git a/hostside/Makefile b/hostside/Makefile index 0950743..545a991 100644 --- a/hostside/Makefile +++ b/hostside/Makefile @@ -18,7 +18,7 @@ layoutinfo.h: ../layout/ours.layout-data.c Makefile %.c: layoutinfo.h -safety: safety.o ../layout/ours.layout-data.o +safety: safety.o utils.o ../layout/ours.layout-data.o $(LINK) encode.o: nmra-packets.h diff --git a/hostside/safety.h b/hostside/safety.h index 0bc5269..2408248 100644 --- a/hostside/safety.h +++ b/hostside/safety.h @@ -142,8 +142,10 @@ void trackloc_further(TrackLocation *tloc, long *remain_io); void trackloc_reverse(TrackLocation *tloc); /* Reverses tloc without changing its actual location. */ -const SegmentLinkInfo *trackloc_segmentlink_near(const TrackLocation *tloc); -const SegmentLinkInfo *trackloc_segmentlink_far(const TrackLocation *tloc); +const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc); +const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc, + const SegPosCombInfo *pci, + unsigned far); /*========== useful macros and declarations ==========*/ diff --git a/hostside/utils.c b/hostside/utils.c index 13c5eb2..4a17714 100644 --- a/hostside/utils.c +++ b/hostside/utils.c @@ -1,40 +1,39 @@ -const SegmentLinkInfo *trackloc_segmentlink_near(const TrackLocation *tloc) { - SegmentState *seg = s->segments[tloc->segn]; - const SegmentInfo *segi= &safety_segis[tloc->segn]; +/* + */ - return (tloc->backwards ? &segi->forwards : - seg->pt_sideways ? &segi->sideways : - &segi->backwards); +#include + +#include "safety.h" + +const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc) { + State *s= &safety_state; + SegmentState *seg= &s->segments[tloc->segn]; + const SegmentInfo *segi= &info_segments[tloc->segn]; + + assert(seg->movposcomb < segi->n_poscombs); + return &segi->poscombs[seg->movposcomb]; } - -const SegmentLinkInfo *trackloc_segmentlink_far(const TrackLocation *tloc) { - SegmentState *seg = s->segments[tloc->segn]; - const SegmentInfo *segi= &safety_segis[tloc->segn]; - return (tloc->backwards ? &segi->backwards : - seg->pt_sideways ? &segi->sideways : - &segi->forwards); +const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc, + const SegPosCombInfo *pci, + unsigned far) { + return (tloc->backwards ^ far) ? &pci->backwards : &pci->forwards; } long trackloc_remaininseg(const TrackLocation *tloc) { - State *s = &safety_state; - SegmentState *seg = s->segments[tloc->segn]; - const SegmentInfo *segi= &safety_segis[tloc->segn]; - const SegmentLinkInfo *lnki_near, *lnki_far; + const SegPosCombInfo *pci; long segment_len; - - lnki_near= trackloc_segmentlink_near(tloc); - lnki_far= trackloc_segmentlink_far(tloc); - segment_len= linki_near->dist + link_far->dist; + + pci= trackloc_segposcomb(tloc); + segment_len= pci->dist; assert(tloc->into <= segment_len); - return segment_len - tloc->info; + return segment_len - tloc->into; } void trackloc_further(TrackLocation *tloc, long *remain_io) { - State *s = &safety_state; - SegmentState *seg = s->segments[tloc->segn]; - const SegmentInfo *segi= &safety_segis[tloc->segn]; + const SegPosCombInfo *pci; const SegmentLinkInfo *lnki_far; + long segment_remain; segment_remain= trackloc_remaininseg(tloc); @@ -42,7 +41,8 @@ void trackloc_further(TrackLocation *tloc, long *remain_io) { tloc->into += *remain_io; *remain_io= 0; } else { - lnki_far= trackloc_segmentlink_far(tloc); + pci= trackloc_segposcomb(tloc); + lnki_far= trackloc_segmentlink(tloc, pci, 1); *remain_io -= segment_remain; tloc->segn= lnki_far->next; tloc->into= 0; @@ -51,7 +51,7 @@ void trackloc_further(TrackLocation *tloc, long *remain_io) { } void trackloc_reverse(TrackLocation *tloc) { - tloc->into= trackloc_remaininseg(tloc->into); + tloc->into= trackloc_remaininseg(tloc); tloc->backwards ^= 1; }