chiark / gitweb /
utils.c (trackloc_...) compiles
authorian <ian>
Mon, 28 Mar 2005 16:44:37 +0000 (16:44 +0000)
committerian <ian>
Mon, 28 Mar 2005 16:44:37 +0000 (16:44 +0000)
hostside/Makefile
hostside/safety.h
hostside/utils.c

index 095074321c1a5a012e5e27c6e77b674ba25ead82..545a9910172ca78d7eb8ce637786c3b6ee82d36e 100644 (file)
@@ -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
index 0bc5269f927c45e80686d26ed4d8ee37b43ee41d..2408248a11ccbfe162e6c6eeae48e19e3170b748 100644 (file)
@@ -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 ==========*/
 
index 13c5eb29832303d82dc0fd687d7b03762adb9410..4a1771448a2e110d3d3ba76251a70ad5db2eb09a 100644 (file)
@@ -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 <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);
 
@@ -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;
 }