2 * declarations for realtime daemon
9 #include "auproto-pic.h"
19 #include <sys/types.h>
22 #include "../layout/layout-data.h"
23 #include "realtime+dflags.h"
25 typedef struct Segment Segment;
26 typedef struct Train Train;
27 typedef struct TimeoutEvent TimeoutEvent;
29 /*---------- from retransmit.c ----------*/
31 typedef struct RetransmitRelaxedNode RetransmitRelaxedNode;
32 typedef union RetransmitUrgentNode RetransmitUrgentNode;
33 typedef unsigned Retransmit__Time;
35 /* Contents of the retransmission nodes is generally all for use by
36 * retransmit.c only; as a special exception, caller may edit pi
37 * directly. Normally, though, pi is set by supplying an NMRA
38 * command to one of the _queue functions; iff the Nmra* is
39 * non-null, _queue will add an NMRA checksum and update pi.
41 struct RetransmitRelaxedNode {
43 DLIST_NODE(RetransmitRelaxedNode) rr;
45 union RetransmitUrgentNode {
48 RetransmitRelaxedNode relaxed;
50 Retransmit__Time when;
51 DLIST_NODE(RetransmitUrgentNode) queue;
55 void retransmit_start(void);
56 void retransmit_something(void);
58 void retransmit_relaxed_queue(RetransmitRelaxedNode *rn, Nmra *n);
59 void retransmit_relaxed_requeue(RetransmitRelaxedNode *rn, Nmra *n);
60 void retransmit_relaxed_cancel(RetransmitRelaxedNode *rn);
62 void retransmit_urgent_queue(RetransmitUrgentNode *rn, Nmra *n);
63 void retransmit_urgent_queue_relaxed(RetransmitUrgentNode *urg, Nmra *n);
64 void retransmit_urgent_requeue(RetransmitUrgentNode *rn, Nmra *n);
65 void retransmit_urgent_cancel(RetransmitUrgentNode *rn);
67 /* ... NB: these are NOT idempotent. Use _requeue it's queued;
68 * _requeue is just _cancel followed by queue. */
70 /*---------- features, filled in by record, used by features.c ----------*/
72 #define FEATURESADDR_TRANSMITS 4
73 /* 0..2 are func0to4 func5to8 func9to12 and speed cmd
74 * pi.l is 0 if not transmitting */
76 typedef struct FeaturesAddr {
77 struct FeaturesAddr *next;
79 RetransmitRelaxedNode rn[FEATURESADDR_TRANSMITS];
84 int bitval; /* may have no or several bits set */
85 int speedstep; /* -ve means backwards; 0 means not to use motor for feat */
88 typedef struct FeaturesTarget {
89 struct FeaturesTarget *next;
91 char *featchs; /* null-terminated */
92 FeaturesFeature **feats; /* same order as featchs */
97 extern Segment *segments;
99 extern FeaturesTarget *feattargs;
100 extern FeaturesAddr *feataddrs;
102 /*---------- global variables, in realtime.c ----------*/
104 extern CommandInput cmdi;
105 extern int picio_send_noise;
107 #define CIXF_U 0x0000ffffu
108 #define CIXF_FORCE 0x00010000u
109 #define CIXF_ANYSTA 0x00020000u
111 /*---------- from/for startup.c ----------*/
113 #include "stastate.h"
115 void sta_startup(void);
116 void sta_finalising_done(void);
117 void serial_moredata(PicInsn *buf);
119 extern StartupState sta_state;
120 extern const char *const stastatelist[];
122 void resolve_begin(void); /* from resolve.c */
123 int resolve_complete(void);
124 void resolve_motioncheck(void);
126 void waggle_settle(void); /* from movpos.c */
127 void waggle_startup_manual(void);
129 /*---------- from/for record.c and persist.c ----------*/
131 void records_parse(const char **argv);
132 void persist_entrails_interpret(void);
133 void persist_entrails_run_converter(void);
134 void persist_install(void);
136 extern const char *persist_fn;
137 extern char *persist_record_converted;
139 void persist_map_veryearly(void);
141 /*---------- from/for realtime.c ----------*/
143 void oupicio(const char *dirn, const PicInsnInfo *pii, int obj, int v,
144 void (*qprintf)(const char *fmt, ...));
145 void ouhex(const char *word, const Byte *command, int length);
146 void ouhex_nosim(const char *word, const Byte *command, int length);
148 void serial_transmit(const PicInsn *pi);
149 void command_doline(ParseState *ps, CommandInput *cmdi_arg);
150 const CmdInfo *current_cmd;
152 /*---------- for/from simulate.c ----------*/
154 void serial_indata_process(int buf_used);
156 void sim_initialise(const char *logduplicate);
159 void simlog_ccb(char *m, size_t l, void *u);
160 void simlogv(const char *fmt, va_list al);
161 void simlog(const char *fmt, ...);
162 void simlog_serial(const Byte *data, int length);
163 void simlog_flush(void);
164 void simlog_open(const char *fn);
166 void mgettimeofday(struct timeval *tv); /* contains magic for simulation */
167 void *toev_callback(oop_source *source, struct timeval tv, void *t_v);
169 void sim_toev_start(TimeoutEvent *toev);
170 void sim_toev_stop(TimeoutEvent *toev);
171 void sim_mgettimeofday(struct timeval *tv);
173 extern int simlog_full;
174 extern const char *simulate;
176 extern PicInsn serial_buf;
178 /*---------- from actual.c ----------*/
180 int picinsn_polarity_testbit(const PicInsn *pi, const SegmentInfo *segi);
181 /* this belongs in {au,skel}proto-pic.[ch] really but it's
182 * more convenient here. */
184 /*---------- from movpos.c ----------*/
186 void points_turning_on(void);
187 void motions_all_abandon(void);
189 /*---------- from eventhelp.c ----------*/
191 extern const char toev_fast_pclass[];
193 typedef void TimeoutEventFn(TimeoutEvent*);
194 struct TimeoutEvent { /* Undefined Idle Running set by */
195 int running; /* any 0 1 toev_ */
196 int duration; /*ms*/ /* any any[1] any[1] caller */
197 TimeoutEventFn *callback; /* any any valid[2] caller */
198 struct timeval abs; /* any any valid toev_ */
199 const char *pclass, *pinst; /* any any valid caller */
200 }; /* [1] duration must be >=0 or -1 when toev_start is called;
201 * [2] callback may be modified while timeout is running;
202 * value used is that prevailing when timeout happens
203 * when the timeout happens, TimeoutEvent's state goes from R to I
204 * and then callback member is read and the function called
207 void toev_init(TimeoutEvent*); /* U -> I */
208 void toev_start(TimeoutEvent*); /* IR -> R; reads duration */
209 /* if duration is -1 then is same as toev_stop */
210 void toev_stop(TimeoutEvent*); /* IR -> I */
212 /*---------- from rtprio.c ----------*/
214 void realtime_priority(void);
216 #define RTFEAT_DEFAULTS 0100u /* turns on MLOCK and SCHEDPRIO iff not sim */
217 #define RTFEAT_MEM 0001u /* mlock */
218 #define RTFEAT_CPU 0002u /* hard CPU scheduling priority */
220 #define RTFEAT_ALL_SHIFT 16
221 #define RTFEAT_ALL(x) (RTFEAT_##x << RTFEAT_ALL_SHIFT)
222 /* RTFEAT_ALL(FOO) is relevant only if RTFEAT_FOO selected, and means
223 * not to apply the normal limit to the grabbing of FOO */
225 extern unsigned rtfeats_use;
227 void ouvprintf(const char *fmt, va_list al);
228 void ouprintf(const char *fmt, ...);
230 void ouvprintf_only(const char *fmt, va_list al);
231 void ouprintf_only(const char *fmt, ...);
233 void debug_count_event(const char *what);
235 #define DEBUGP(a,k) (dflags_##a & DBIT_##a##_##k)
237 #define COND_DPRINTF(cond, a,k, fmt, ...) \
238 ((cond) ? ouprintf_only("debug " #a "/" #k " : " fmt,##__VA_ARGS__) : (void)0)
240 #define DPRINTF(a,k,f,...) COND_DPRINTF(DEBUGP(a,k),a,k,f,##__VA_ARGS__)
241 #define DPRINTF1(a,k,f,...) COND_DPRINTF((DP)=DEBUGP(a,k), a,k,f,##__VA_ARGS__)
242 #define DPRINTF2(f,...) ((DP) ? ouprintf_only(f,##__VA_ARGS__) : (void)0)
244 /*---------- tbi ----------*/
246 void choreographers_all_abandon(void);
250 #define PERSIST_CONVERT_OPTION "--persist-convert-entrails"
255 #endif /*REALTIME_H*/