From: ian Date: Mon, 5 May 2008 11:49:46 +0000 (+0000) Subject: cope with X1/X2 opposing interference X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=beabb0cb5614ed3941ccfdd35c166126bbbc5ffc;p=trains.git cope with X1/X2 opposing interference --- diff --git a/hostside/resolve.c b/hostside/resolve.c index 0c5c55c..7fdd39d 100644 --- a/hostside/resolve.c +++ b/hostside/resolve.c @@ -337,7 +337,8 @@ static int resolve_complete_main(void) { Segment *interferer= segment_interferes(&tac,d); if (interferer) { actual_inversions_start(); - d->seg_inverted= interferer->seg_inverted; + d->seg_inverted= interferer->seg_inverted + ^ d->i->interferes_polarity_opposed; actual_inversions_segment(d); actual_inversions_done(); } diff --git a/hostside/safety.c b/hostside/safety.c index d21a05d..803512e 100644 --- a/hostside/safety.c +++ b/hostside/safety.c @@ -787,9 +787,8 @@ ErrorCode predict(Train *tra, int accelerate, Segment *interferer= segment_interferes(0,seg); if (interferer && !interferer->will_polarise && interferer->i->invertible) { - /* no provision for interfering invertible segments - * with opposing ideas about neutral polarity */ - interferer->seg_inverted= seg->seg_inverted; + interferer->seg_inverted= seg->seg_inverted + ^ seg->i->interferes_polarity_opposed; actual_inversions_segment(interferer); } } else { diff --git a/layout/data2safety b/layout/data2safety index febe243..21e6b4d 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -26,8 +26,9 @@ our (%segs); # $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ] # $segs{$seg}{Dist}[$combpos] -our (@interferences); -# $interferences[][] = "$seg/$posre" "/.*" added during parsing if necc. +our (@interfs); +# $interfs[]{Invert} = $invert +# $interfs[]{Segs}[] = "$seg/$posre" "/.*" added during parsing if necc. our (%nodes); # $nodes{$node}[$side]{Seg} @@ -191,9 +192,17 @@ sub begin_interferences () { sub line_interferences () { s/^\s+// or return syntaxerror(); my ($is) = [ split /\s+/, $_ ]; - map { s,$,/.*, unless m,/,; } @$is; + my ($invert)= 0; + if ($is->[0] eq '-') { + shift @$is; + $invert= 1; + } + map { + $invert ^= 1 if s/^\-//; + s,$,/.*, unless m,/,; + } @$is; return syntaxerror() if grep { !m,^\w+/, } @$is; - push @interferences, $is; + push @interfs, { Invert => $invert, Segs => $is }; } sub mistake ($) { @@ -393,7 +402,8 @@ sub so_boob ($$$;$) { $$objnum_rr= $objnum; $pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ] if $mkused; - return sprintf("%#5x /* %d.%-2d*/", $objnum, $board, $obj); + return sprintf("%#5x /* %d.%-*d*/", $objnum, $board, + $kind eq 'reverse' ? 1 : 2, $obj); } else { #print "so_boob >$objnum_rr|$$objnum_rr< -\n"; return " 0 /*none*/ "; @@ -456,7 +466,7 @@ sub writeout () { my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim); my ($comb,$pi,$feat,$featr,$end,$boob); my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus); - my ($ourinter,$pcname,$inter,$intother); + my ($ourinter,$pcname,$intere,$intother); o("/* autogenerated - do not edit */\n\n"); @segs=(); for $seg (sort { nummap($a) cmp nummap($b) } keys %segs) { @@ -483,6 +493,7 @@ sub writeout () { $delim=''; $segr->{Inter}{Map}= 0; + $segr->{Inter}{Invert}= 0; $ourinter= $segr->{Inter}; for ($comb=0; $comb < $segr->{Posns}; $comb++) { $pi=''; @@ -520,7 +531,8 @@ sub writeout () { $delim= ','; $pcname= "$seg/$pi"; - for $inter (@interferences) { + for $intere (@interfs) { + my ($inter)= $intere->{Segs}; next unless grep { if ($pcname =~ m/^$_$/) { s,/.*,/ ?,; 1; @@ -539,6 +551,7 @@ sub writeout () { "involving $seg, $1, $ourinter->{Seg}"); } else { $ourinter->{Seg}= $1; + $ourinter->{Invert}= $intere->{Invert}; } } endmistake("unsupported too-moveable interference") @@ -575,10 +588,10 @@ sub writeout () { } o("\n};\n"); } - for $inter (@interferences) { + for $intere (@interfs) { map { warn "warning: unused interference specification $_\n" unless m, ,; - } @$inter; + } @{ $intere->{Segs} }; } my (@sensemap,$sensenum,$i); @@ -589,20 +602,20 @@ sub writeout () { foreach $seg (@segs) { $segr= $segs{$seg}; o("$delim\n"); - o(sprintf " { %-7s%d,%2d,%-9s%d,%-10s%-6s,%-7s", - "\"$seg\",",$segr->{Inv}, + o(sprintf " { %-7s%d,%d,%2d,%-9s%d,%-10s%-6s,%-7s", + "\"$seg\",",$segr->{Inv},$segr->{Inter}{Invert}, $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'), $segr->{Posns}, "spci_$seg,", so_objboob('sense',1, $segr, \$sensenum), so_objboob('reverse',1, $segr->{Inv} ? $segr : undef).','); $ourinter= $segr->{Inter}; if (defined $ourinter->{Seg}) { - o(sprintf "%5s,0%o", so_segnum($ourinter->{Seg}), + o(sprintf "%4s,0%o ", so_segnum($ourinter->{Seg}), $ourinter->{Map}); } else { - o(" -1"); + o(" -1 "); } - o(" }"); + o("}"); $delim= ','; $sensemap[$sensenum]= $seg; $segnum++; diff --git a/layout/layout-data.h b/layout/layout-data.h index 82b581f..8952f3f 100644 --- a/layout/layout-data.h +++ b/layout/layout-data.h @@ -53,7 +53,7 @@ typedef struct { typedef struct { const char *pname; - unsigned invertible:1; + unsigned invertible:1, interferes_polarity_opposed:1; Small n_movfeats; const MovFeatInfo *movfeats; MovPosComb n_poscombs; diff --git a/layout/ours.wiring b/layout/ours.wiring index 77f6222..604cdd2 100644 --- a/layout/ours.wiring +++ b/layout/ours.wiring @@ -39,7 +39,7 @@ fixed A2/P0 interferences - X1 X2 + - X1 X2 A5/P0J1 A6/P0J1 endwiring