chiark / gitweb /
simulation - compiles but not yet tested
[trains.git] / hostside / realtime.h
1 /*
2  * declarations for realtime daemon
3  */
4
5 #ifndef REALTIME_H
6 #define REALTIME_H
7
8 #include "daemons.h"
9 #include "auproto-pic.h"
10 #include "dliste.h"
11
12 #include <stdarg.h>
13 #include <string.h>
14 #include <errno.h>
15 #include <assert.h>
16 #include <stdlib.h>
17 #include <limits.h>
18 #include <stddef.h>
19 #include <ctype.h>
20 #include <math.h>
21
22 #include <sys/types.h>
23 #include <sys/time.h>
24 #include <sys/stat.h>
25 #include <sys/mman.h>
26 #include <sys/wait.h>
27
28 #include <unistd.h>
29 #include <fcntl.h>
30 #include <dirent.h>
31
32 #include "../layout/layout-data.h"
33
34 typedef struct Segment Segment;
35 typedef struct Train Train;
36 typedef struct TimeoutEvent TimeoutEvent;
37
38 /*---------- from retransmit.c ----------*/
39
40 typedef struct RetransmitRelaxedNode RetransmitRelaxedNode;
41 typedef union RetransmitUrgentNode RetransmitUrgentNode;
42 typedef unsigned Retransmit__Time;
43
44   /* Contents of the retransmission nodes is generally all for use by
45    * retransmit.c only; as a special exception, caller may edit pi
46    * directly.  Normally, though, pi is set by supplying an NMRA
47    * command to one of the _queue functions; iff the Nmra* is
48    * non-null, _queue will add an NMRA checksum and update pi.
49    */
50 struct RetransmitRelaxedNode {
51   PicInsn pi;
52   DLIST_NODE(RetransmitRelaxedNode) rr;
53 };
54 union RetransmitUrgentNode {
55   PicInsn pi;
56   struct {
57     RetransmitRelaxedNode relaxed;
58     int ix;
59     Retransmit__Time when;
60     DLIST_NODE(RetransmitUrgentNode) queue;
61   } u;
62 };
63
64 void retransmit_start(void);
65 void retransmit_something(void);
66
67 void retransmit_relaxed_queue(RetransmitRelaxedNode *rn, Nmra *n);
68 void retransmit_relaxed_requeue(RetransmitRelaxedNode *rn, Nmra *n);
69 void retransmit_relaxed_cancel(RetransmitRelaxedNode *rn);
70
71 void retransmit_urgent_queue(RetransmitUrgentNode *rn, Nmra *n);
72 void retransmit_urgent_queue_relaxed(RetransmitUrgentNode *urg, Nmra *n);
73 void retransmit_urgent_requeue(RetransmitUrgentNode *rn, Nmra *n);
74 void retransmit_urgent_cancel(RetransmitUrgentNode *rn);
75
76   /* ... NB: these are NOT idempotent.  Use _requeue it's queued;
77    * _requeue is just _cancel followed by queue. */
78
79 /*---------- features, filled in by record, used by features.c ----------*/
80
81 #define FEATURESADDR_TRANSMITS 4
82   /* 0..2 are func0to4 func5to8 func9to12 and speed cmd
83    * pi.l is 0 if not transmitting */
84
85 typedef struct FeaturesAddr {
86   struct FeaturesAddr *next;
87   int addr, cbitmap;
88   RetransmitRelaxedNode rn[FEATURESADDR_TRANSMITS];
89 } FeaturesAddr;
90
91 typedef struct {
92   FeaturesAddr *a;
93   int bitval; /* may have no or several bits set */
94   int speedstep; /* -ve means backwards; 0 means not to use motor for feat */
95 } FeaturesFeature;
96
97 typedef struct FeaturesTarget {
98   struct FeaturesTarget *next;
99   char *pname;
100   char *featchs; /* null-terminated */
101   FeaturesFeature **feats; /* same order as featchs */
102 } FeaturesTarget;
103
104 extern int n_trains;
105 extern Train *trains;
106 extern Segment *segments;
107
108 extern FeaturesTarget *feattargs;
109 extern FeaturesAddr *feataddrs;
110
111 /*---------- global variables, in realtime.c ----------*/
112
113 extern CommandInput cmdi;
114 extern int picio_send_noise;
115
116 #define UPO (&(cmdi.out))
117
118 /*---------- from/for startup.c ----------*/
119
120 #include "stastate.h"
121
122 void sta_startup(void);
123 void sta_finalising_done(void);
124 void serial_moredata(PicInsn *buf);
125
126 extern StartupState sta_state;
127 extern const char *const stastatelist[];
128
129 void resolve_begin(void); /* from resolve.c */
130 int resolve_complete(void);
131 void resolve_motioncheck(void);
132
133 /*---------- from/for record.c and persist.c ----------*/
134
135 void records_parse(const char **argv);
136 void persist_entrails_interpret(void);
137 void persist_entrails_run_converter(void);
138 void persist_install(void);
139
140 extern const char *persist_fn;
141 extern char *persist_record_converted;
142
143 void persist_map_veryearly(void);
144
145 /*---------- from/for realtime.c ----------*/
146
147 void oupicio(const char *dirn, const PicInsnInfo *pii, int objnum);
148 void ouhex(const char *word, const Byte *command, int length);
149
150 void serial_transmit(const PicInsn *pi);
151
152 /*---------- for/from simulate.c ----------*/
153
154 const char *simulate;
155 void serial_indata_process(int buf_used);
156
157 void sim_initialise(void);
158 void sim_run(void);
159
160 void mgettimeofday(struct timeval *tv); /* contains magic for simulation */
161 void *toev_callback(oop_source *source, struct timeval tv, void *t_v);
162
163 void sim_toev_start(TimeoutEvent *toev);
164 void sim_toev_stop(TimeoutEvent *toev);
165 void sim_mgettimeofday(struct timeval *tv);
166
167 extern PicInsn serial_buf;
168
169 /*---------- from actual.c ----------*/
170
171 int picinsn_polarity_testbit(const PicInsn *pi, const SegmentInfo *segi);
172   /* this belongs in {au,skel}proto-pic.[ch] really but it's
173    * more convenient here. */
174
175 /*---------- from movpos.c ----------*/
176
177 void points_turning_on(void);
178 void points_all_abandon(void);
179
180 /*---------- from eventhelp.c ----------*/
181
182 typedef void TimeoutEventFn(TimeoutEvent*);
183 struct TimeoutEvent {         /* Undefined   Idle      Running     set by   */
184   int running;                /*  any         0         1           toev_   */
185   int duration; /*ms*/        /*  any         any[1]    any[1]      caller  */
186   TimeoutEventFn *callback;   /*  any         any       valid[2]    caller  */
187   struct timeval abs;         /*  any         any       valid       toev_   */
188   const char *pclass, *pinst; /*  any         any       valid       caller  */
189 };  /* [1] duration must be >=0 or -1 when toev_start is called;
190      * [2] callback may be modified while timeout is running;
191      *      value used is that prevailing when timeout happens
192      * when the timeout happens, TimeoutEvent's state goes from R to I
193      * and then callback member is read and the function called
194      */
195
196 void toev_init(TimeoutEvent*);    /* U -> I */
197 void toev_start(TimeoutEvent*);   /* IR -> R; reads duration */
198   /* if duration is -1 then is same as toev_stop */
199 void toev_stop(TimeoutEvent*);    /* IR -> I */
200
201 /*---------- tbi ----------*/
202
203 void choreographers_all_abandon(void);
204
205 #define DUPO(ctx) UPO, "debug " ctx " : "
206
207 #include "record.h"
208
209 #define PERSIST_CONVERT_OPTION "--persist-convert-entrails"
210
211 #include "safety.h"
212
213 #define CTYPE(isfoobar,ch) (isfoobar((unsigned char)(ch)))
214
215 #endif /*REALTIME_H*/