chiark / gitweb /
giant reorg abolishes TrainNum most of the time; working on making it build
[trains.git] / hostside / realtime.c
index cb8274c6ac6cbc840281d673634734f22f1fcfaf..629b5152460c079388ff4b4867b742bc4496c0ff 100644 (file)
@@ -10,7 +10,7 @@ const char *progname= "realtime";
 
 CommandInput cmdi;
 
-static const char *device;
+static const char *device= "/dev/ttya0";
 
 /*---------- general event handling ----------*/
 
@@ -40,48 +40,48 @@ static void *read_exception(oop_source *evts, int fd,
 
 /*---------- 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;
 
@@ -91,20 +91,20 @@ void safety_vpanic(TrainNum tran, SegmentNum segn,const char *fmt,va_list al) {
   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;
 }
@@ -199,7 +199,7 @@ void serial_transmit(const PicInsn *pi) {
         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= ",";
     }
@@ -224,10 +224,18 @@ void serial_transmit(const PicInsn *pi) {
 
 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);