chiark / gitweb /
4a1771448a2e110d3d3ba76251a70ad5db2eb09a
[trains.git] / hostside / trackloc.c
1 /*
2  */
3
4 #include <assert.h>
5
6 #include "safety.h"
7
8 const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc) {
9   State *s= &safety_state;
10   SegmentState *seg= &s->segments[tloc->segn];
11   const SegmentInfo *segi= &info_segments[tloc->segn];
12
13   assert(seg->movposcomb < segi->n_poscombs);
14   return &segi->poscombs[seg->movposcomb];
15 }
16
17 const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
18                                             const SegPosCombInfo *pci,
19                                             unsigned far) {
20   return (tloc->backwards ^ far) ? &pci->backwards : &pci->forwards;
21 }
22   
23 long trackloc_remaininseg(const TrackLocation *tloc) {
24   const SegPosCombInfo *pci;
25   long segment_len;
26
27   pci= trackloc_segposcomb(tloc);
28   segment_len= pci->dist;
29   assert(tloc->into <= segment_len);
30   return segment_len - tloc->into;
31 }  
32
33 void trackloc_further(TrackLocation *tloc, long *remain_io) {
34   const SegPosCombInfo *pci;
35   const SegmentLinkInfo *lnki_far;
36   long segment_remain;
37
38   segment_remain= trackloc_remaininseg(tloc);
39
40   if (*remain_io <= segment_remain) {
41     tloc->into += *remain_io;
42     *remain_io= 0;
43   } else {
44     pci= trackloc_segposcomb(tloc);
45     lnki_far= trackloc_segmentlink(tloc, pci, 1);
46     *remain_io -= segment_remain;
47     tloc->segn= lnki_far->next;
48     tloc->into= 0;
49     tloc->backwards ^= lnki_far->next_backwards;
50   }
51 }
52
53 void trackloc_reverse(TrackLocation *tloc) {
54   tloc->into= trackloc_remaininseg(tloc);
55   tloc->backwards ^= 1;
56 }
57