From: ian Date: Sat, 12 Apr 2008 12:11:12 +0000 (+0000) Subject: sane handling of incoming detections X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?p=trains.git;a=commitdiff_plain;h=45e93e31a0ede2462dfe6b04b2ebd86d80c3b254 sane handling of incoming detections --- diff --git a/hostside/parse-proto-spec b/hostside/parse-proto-spec index c35319e..0dc083d 100755 --- a/hostside/parse-proto-spec +++ b/hostside/parse-proto-spec @@ -95,7 +95,7 @@ sub process_line () { $v{noiselevel}= ($cname =~ m/nmradone/ ? 3 : $cname =~ m/p[io]ng/ ? 2 : - $cname =~ m/detect/ ? 1 : + $cname =~ m/detect/ ? 2 : 0); $v{cnameyn}= $cname.$yval; $v{cnameynu}= uc($cname.$yval); diff --git a/hostside/startup.c b/hostside/startup.c index 2e9ed33..f6a318c 100644 --- a/hostside/startup.c +++ b/hostside/startup.c @@ -207,10 +207,23 @@ void on_pic_spurious(const PicInsnInfo *pii, const PicInsn *pi, int objnum) { " detection interrupts\"", objnum); } -void on_pic_detect1(const PicInsnInfo *pii, const PicInsn *pi, int segn) { - Segment *seg; - if (segn >= NUM_SEGMENTS) die("PIC sent detect @#%#x out of range",segn); +static SegmentNum on_pic_detect_prep(int detyn, int objnum) { + SegmentNum segn; + + if (objnum >= info_segmentmaplen || + (segn= info_segmentmap[objnum]) < 0) + die("PIC sent detect%d @#%#x not in map",detyn,objnum); + oprintf(UPO,"picio in detect%d %s\n",detyn,info_segments[segn].pname); + + return segn; +} + +void on_pic_detect1(const PicInsnInfo *pii, const PicInsn *pi, int objnum) { + SegmentNum segn; + Segment *seg; + + segn= on_pic_detect_prep(1,objnum); seg= &segments[segn]; switch (sta_state) { @@ -239,6 +252,7 @@ void on_pic_nmradone(const PicInsnInfo *pii, const PicInsn *pi, int objnum) { } void on_pic_detect0(const PicInsnInfo *pii, const PicInsn *pi, int objnum) { + on_pic_detect_prep(0,objnum); } void choreographers_all_abandon(void) { } diff --git a/layout/data2safety b/layout/data2safety index 58097be..7e8e0eb 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -503,17 +503,18 @@ sub writeout () { } o("\n};\n"); o("const BoardObject info_maxreverse= $maxreverseobjnum;\n"); - o("#define U -1\n"); + o("#define u -1\n"); o("const SegmentNumInMap info_segmentmap[]= {\n"); $i=0; foreach $seg (@sensemap) { o(!$i ? ' ' : !($i % 12) ? ",\n " : ","); - o(defined($seg) ? sprintf("%4d",$seg) : ' U'); + o(defined($seg) ? sprintf("%4d",$seg) : ' u'); $i++; } o("\n};\n". + "#undef u\n". "const int info_segmentmaplen= ".scalar(@sensemap).";\n"); }