chiark / gitweb /
finish logging and safety_panic
authorian <ian>
Wed, 5 Jul 2006 21:25:46 +0000 (21:25 +0000)
committerian <ian>
Wed, 5 Jul 2006 21:25:46 +0000 (21:25 +0000)
hostside/common.h
hostside/errorcodes.h.gen
hostside/gui-plan.c
hostside/main.c
hostside/realtime.c
hostside/utils.c

index 008d21976f0a94a4fe8cf7e0f351cc716db804bf..83754b392ba8075912e92aa90668bb1252baf820 100644 (file)
@@ -93,6 +93,8 @@ void diee(const char *fmt, ...) __attribute__((noreturn,format(printf,1,2)));
 void diem(void) __attribute__((noreturn));
 
 void die_hook(void);
+void die_vprintf_hook(const char *fmt, va_list al)
+     __attribute__((format(printf,1,0)));
 
 void *mmalloc(size_t sz);
 char *mstrdupl(const char *s, int l);
index f624b0e0cc566b8cc90fa6a93212305037c11fd5..a3093dc5d04189da4ac5f842e06f0f0a72b0a6be 100755 (executable)
@@ -1,10 +1,31 @@
 #!/usr/bin/perl
-print "typedef enum {\n" or die $!;
-foreach $f (qw(
-              OK
-              Safety
-              )) {
-    $_= $f; s/\-//g;
-    printf "  EC_%s,\n", $_;
-}
-print "} ErrorCode;\n" or die $!;
+
+@f= qw(
+       OK
+       Safety
+       );
+
+
+    
+$decl= "const char *const errorcodelist[]";
+
+print <<END
+typedef enum {
+END
+    ."  ".(join ",\n  ", map {
+       $f=$_; $f =~ s/\-//g; "EC_$f";
+    } @f).<<END
+
+} ErrorCode;
+
+extern $decl;
+#define DEFINE_ERRORCODELIST_DATA \\
+$decl= { \\
+END
+    ."  ".(join ", \\\n  ", map {
+       '"'.(lc).'"';
+    } @f).<<END
+ \\
+};
+END
+    or die $!;
index 961ef1944d2b57c21928486838140a5ec5141c15..9e1f5922ba34ab74cb76076efef3bb9127f17695 100644 (file)
@@ -58,6 +58,7 @@ static const char *badcmdreport_data;
 static size_t badcmdreport_recsz;
 
 void die_hook(void) { }
+void die_vprintf_hook(const char *fmt, va_list al) { }
 
 static void diex(const char *fn, const char *w) __attribute__((noreturn));
 static void diex(const char *fn, const char *w) {
index f14a5dfc557867b386ba6330e997bc742e4d0fb7..6ea07ec49bd17d2fbcae3c2f91434b3c9d0b9703 100644 (file)
@@ -28,6 +28,7 @@ static const char *serial_port;
 static Nmra buf;
 
 void die_hook(void) { }
+void die_vprintf_hook(const char *fmt, va_list al) { }
 
 static void badusage(const char *why) {
   fprintf(stderr,"bad usage: %s\n",why); exit(8);
index fa1e3d45acfe0d9dc2b5a92942d53f6d857dbeec..cb8274c6ac6cbc840281d673634734f22f1fcfaf 100644 (file)
@@ -40,13 +40,6 @@ static void *read_exception(oop_source *evts, int fd,
 
 /*---------- logging etc. ----------*/
 
-void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,const char *fmt,...) {
-  va_list al;
-  va_start(al,fmt);
-  vlogmsg(ec,tran,segn,fmt,al);
-  va_end(al);
-}
-
 static char *transegn2suffixstring(TrainNum tran, SegmentNum segn) {
   /* Either arg may be NOTA(...), in which case it's not included.
    * Result string will be empty, or start with ": "
@@ -57,8 +50,8 @@ static char *transegn2suffixstring(TrainNum tran, SegmentNum segn) {
   char *s;
   int r;
 
-  seg= ~segn ? info_segments[segn].pname : 0;
-  tra= ~tran ? info_trains[tran].pname : 0;
+  seg= SOMEP(segn) ? info_segments[segn].pname : 0;
+  tra= SOMEP(tran) ? info_trains[tran].pname : 0;
 
   r= asprintf(&s, "%s%s%s%s%s",
              seg||tra ? ":" : "",
@@ -71,8 +64,29 @@ static char *transegn2suffixstring(TrainNum tran, SegmentNum segn) {
   return s;
 }
 
+void vlogmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,
+            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);
+  oprintf(UPO, "\n");
+}
+
+void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,const char *fmt,...) {
+  va_list al;
+  va_start(al,fmt);
+  vlogmsg(ec,tran,segn,fmt,al);
+  va_end(al);
+}
+
 void safety_vpanic(TrainNum tran, SegmentNum segn,const char *fmt,va_list al) {
   char *msg, *where;
+  PicInsn piob;
+
+  enco_pic_off(&piob);
+  serial_transmit(&piob);
 
   if (vasprintf(&msg,fmt,al) < 0)
     diee("vasprintf failed in safety_vpanic fmt=\"%s\"", fmt);
@@ -126,8 +140,12 @@ void ouhex(const char *word, const Byte *command, int length) {
   }
   oprintf(UPO, "\n");
 }
-
-void die_hook() {
+void die_vprintf_hook(const char *fmt, va_list al) {
+  ovprintf(UPO, fmt, al);
+}
+void die_hook(void) {
   int e;
   e= obc_tryflush(UPO);
   if (e) fprintf(stderr,"(unwritten command output: %s)\n",strerror(e));
@@ -231,3 +249,5 @@ int main(int argc, const char **argv) {
   oop_sys_run(sys_events);
   abort();
 }
+
+DEFINE_ERRORCODELIST_DATA
index 8b128cd0f5a9159f237b78146bad315e6143bee1..3b5e307dc454a3ab62c1bb851d6b3b9057ac483d 100644 (file)
 
 #include "common.h"
 
+static void vdie_vprintf(const char *fmt, va_list al) {
+  va_list al_copy;
+  va_copy(al_copy,al);
+  vfprintf(stderr,fmt,al_copy);
+  die_vprintf_hook(fmt,al);
+}
+
+static void vdie_printf(const char *fmt, ...) {
+  va_list al;
+  va_start(al,fmt);
+  vdie_vprintf(fmt,al);
+  va_end(al);
+}
+
 void vdie(const char *fmt, int ev, va_list al) {
+  vdie_printf("%s: fatal: ", progname);
+  vdie_vprintf(fmt,al);
+  if (ev) vdie_printf(": %s",strerror(ev));
+  vdie_printf("\n");
   die_hook();
-  fprintf(stderr, "%s: fatal: ", progname);
-  vfprintf(stderr,fmt,al);
-  if (ev) fprintf(stderr,": %s",strerror(ev));
-  fputc('\n',stderr);
   exit(12);
 }