CommandInput cmdi;
-static const char *device;
+static const char *device= "/dev/ttya0";
/*---------- general event handling ----------*/
/*---------- logging etc. ----------*/
-static char *transegn2suffixstring(TrainNum tran, SegmentNum segn) {
- /* Either arg may be NOTA(...), in which case it's not included.
+static char *transegn2suffixstring(Train *tra, Segment *seg) {
+ /* Either arg may be 0, in which case it's not included.
* Result string will be empty, or start with ": "
* Result string is from malloc.
* Never fails.
*/
- const char *tra, *seg;
+ const char *trapn, *segpn;
char *s;
int r;
- seg= SOMEP(segn) ? info_segments[segn].pname : 0;
- tra= SOMEP(tran) ? info_trains[tran].pname : 0;
+ segpn= seg ? seg->i->pname : 0;
+ trapn= tra ? tra->pname : 0;
r= asprintf(&s, "%s%s%s%s%s",
- seg||tra ? ":" : "",
- seg ? " @" : "",
- seg ? seg : "",
- tra ? " " : "",
- tra ? tra : "");
- if (r<0) diee("vasprintf failed in transegn2suffixstring "
- "tran=%lu segn=%lu", (unsigned long)tran, (unsigned long)segn);
+ segpn||trapn ? ":" : "",
+ segpn ? " @" : "",
+ segpn ? segpn : "",
+ trapn ? " " : "",
+ trapn ? trapn : "");
+ if (r<0) diee("vasprintf failed in transegn2suffixstring");
return s;
}
-void vlogmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,
+void vlogmsg(ErrorCode ec, Train *tra, const SegmentInfo *segi,
const char *fmt, va_list al) {
oprintf(UPO, "message %s ", ec ? errorcodelist[ec] : "info");
ovprintf(UPO,fmt,al);
- if (SOMEP(segn) || SOMEP(tran)) oprintf(UPO, ":");
- if (SOMEP(segn)) oprintf(UPO, " @%s", info_segments[segn].pname);
- if (SOMEP(tran)) oprintf(UPO, " %s", info_trains[tran].pname);
+ if (segi || tra) oprintf(UPO, ":");
+ if (segi) oprintf(UPO, " @%s", segi->pname);
+ if (tra) oprintf(UPO, " %s", tra->pname);
oprintf(UPO, "\n");
}
-void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,const char *fmt,...) {
+void logmsg(ErrorCode ec, Train *tra, const SegmentInfo *segi,
+ const char *fmt,...) {
va_list al;
va_start(al,fmt);
- vlogmsg(ec,tran,segn,fmt,al);
+ vlogmsg(ec,tra,segi,fmt,al);
va_end(al);
}
-void safety_vpanic(TrainNum tran, SegmentNum segn,const char *fmt,va_list al) {
+void safety_vpanic(Train *tra, Segment *seg,const char *fmt,va_list al) {
char *msg, *where;
PicInsn piob;
if (vasprintf(&msg,fmt,al) < 0)
diee("vasprintf failed in safety_vpanic fmt=\"%s\"", fmt);
- where= transegn2suffixstring(tran,segn);
+ where= transegn2suffixstring(tra,seg);
die("fatal safety problem: %s%s", msg, where);
}
-void safety_panic(TrainNum tran, SegmentNum segn, const char *fmt, ...) {
+void safety_panic(Train *tra, Segment *seg, const char *fmt, ...) {
va_list al;
va_start(al,fmt);
- safety_panic(tran, segn, fmt, al);
+ safety_panic(tra, seg, fmt, al);
}
-ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt,...) {
+ErrorCode safety_problem(Train *tra, Segment *seg, const char *fmt,...) {
va_list al;
va_start(al,fmt);
- vlogmsg(EC_Safety, tran, segn, fmt, al);
+ vlogmsg(EC_Safety, tra, seg?seg->i:0, fmt, al);
va_end(al);
return EC_Safety;
}
segn < info_nsegments;
segn++, segi++) {
if (!segi->invertible) continue;
- if (!picinsn_polarity_testbit(pi,segn)) continue;
+ if (!picinsn_polarity_testbit(pi,segi)) continue;
oprintf(UPO,"%s%s", delim, segi->pname);
delim= ",";
}
int main(int argc, const char **argv) {
oop_source_sys *sys_events;
+ const char *arg;
int r;
- device= argv[1];
- if (!device) device= "/dev/ttya0";
+ while ((arg=*++argv) && *arg=='-') {
+ arg++;
+ switch (*arg++) {
+ case 's': device= arg; break;
+ default: badusage("unknown option");
+ }
+ }
+
+ records_parse(argv);
sys_events= oop_sys_new(); if (!sys_events) diee("oop_sys_new");
events= oop_sys_source(sys_events); massert(events);