chiark / gitweb /
giant reorg abolishes TrainNum most of the time; working on making it build
[trains.git] / hostside / actual.c
1 /*
2  * realtime
3  * implementation of safety algorithm's decisions
4  */
5
6 #include "realtime.h"
7
8 static PicInsn polarityinsn= { { 0x90 }, 0 };
9
10 #define OPONBIT_BYTE (polarityinsn.d[bytenum])
11 #define OPONBIT(body) do{                               \
12     BoardObject bo;                                     \
13     int bytenum, bitnum;                                \
14     Byte bitv;                                          \
15                                                         \
16     bo= segi->invert;                                   \
17     assert(bo);                                         \
18     bytenum= (bo + 3) / 7;                              \
19     bitnum= bytenum ? 6 - (bo + 3) % 7 : 3 - bo;        \
20     bitv= 1u << bitnum;                                 \
21                                                         \
22     { body }                                            \
23   }while(0)
24
25 int picinsn_polarity_testbit(const PicInsn *pi, const SegmentInfo *segi) {
26   OPONBIT({
27     return !!(OPONBIT_BYTE & bitv);
28   });
29 }
30
31 void actual_inversions_start(void) {
32   polarityinsn.l= (info_maxreverse + 4 + 6) / 7;
33 }
34
35 void actual_inversions_segment(Segment *seg) {
36   const SegmentInfo *segi= seg->i;
37   
38   OPONBIT({
39     Byte *insnbyte= &OPONBIT_BYTE;
40     if (seg->seg_inverted) *insnbyte |= bitv;
41     else *insnbyte &= ~bitv;
42   });
43 }
44
45 void actual_inversions_done(void) {
46   serial_transmit(&polarityinsn);
47 }