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 ==========*/
-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 <assert.h>
+
+#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);
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;
}
void trackloc_reverse(TrackLocation *tloc) {
- tloc->into= trackloc_remaininseg(tloc->into);
+ tloc->into= trackloc_remaininseg(tloc);
tloc->backwards ^= 1;
}