From: Ian Jackson Date: Sun, 23 Jan 2011 22:40:58 +0000 (+0000) Subject: wip fingers X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=df40d6238de8855f5d2af42d2335a9835ee37f59;p=trains.git wip fingers --- diff --git a/hostside/safety.h b/hostside/safety.h index 78447c7..b1313b4 100644 --- a/hostside/safety.h +++ b/hostside/safety.h @@ -86,6 +86,11 @@ struct Segment { res_detect:1, /* detection noticed here during resolution */ detect_actual:1, /* last detection state received */ detect_reported:1; /* detection state reported to parent */ + FingerMap fingers_occupied; + fixme init to ~0 in appropriate places: + safety.c, resolve.c when clearing out a segment + fixme set to something at end of lay_train + fixme preserve in persist for fingers foul but not others int detect_flaps; MovPosComb movposcomb; /* -1 means not known or moving */ MovPosChange *motion; /* if ->moving, owned by movpos, otherwise by safety */ diff --git a/layout/data2safety b/layout/data2safety index 22966c7..3b67946 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -19,7 +19,8 @@ our (%segs); # $segs{$seg}{Posns} # $segs{$seg}{FeatCount} does not include Fixed # $segs{$seg}{FeatCountFixed} -# $segs{$seg}{Feats}{$feat}{Kind} Point, Fixed, or Relay +# $segs{$seg}{Feats}{$feat}{Kind} } Point, Fixed, or Relay +# $segs{$seg}{Feats}{$feat}{StableFingers}[] } # $segs{$seg}{Feats}{$feat}{Weight} ) for Point or Relay only # $segs{$seg}{Feats}{$feat}{Posns} ) for Point or Relay only # $segs{$seg}{Feats}{$feat}{BoObs}[] ) for Point or Relay only @@ -35,6 +36,19 @@ our (%segs); # $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ] # $segs{$seg}{Dist}[$combpos] +# $foulfingers{"$ix\@$lineno"}[$end]{Seg} +# $foulfingers{"$ix\@$lineno"}[$end]{SegEnd} +# $foulfingers{"$ix\@$lineno"}[$end]{Posns} +# $foulfingers{"$ix\@$lineno"}[$end]{Len} +# $foulfingers{"$ix\@$lineno"}[$end]{FingNum} set in writeout near top + +# set in writeout near top: +# $segs{$seg}{Fingers}[$end][] +# $segs{$seg}{Fingers}[$end][]{Posns} +# $segs{$seg}{Fingers}[$end][]{Len} or {Dist} +# $segs{$seg}{Fingers}[$end][]{Fouls} +# $segs{$seg}{Fingers}[$end][]{FingNum} + our (@interfs); # $interfs[]{Invert} = $invert # $interfs[]{Segs}[] = "$seg/$posre" "/.*" added during parsing if necc. @@ -678,6 +692,13 @@ sub so_segnum ($) { return sprintf "s%s", $_[0]; } +sub finger_allocate ($) { + my ($fing) = @_; + my $segr= $segs{ $fing->{Seg} }; + my $end= $fing->{SegEnd}; + push @{ $segr->{Fingers}[$end] }, $fing; +} + sub writeout () { my (@segs,$segn,$seg,$segr,$feat,$featv, $delim); my ($comb,$pi,$end,$boob); @@ -702,6 +723,25 @@ sub writeout () { } o("\n"); + # organise the fingers: + foreach $foul (sort keys %foulfingers) { + foreach my $end (qw(0 1)) { + my $fing= $foulfingers{$foul}[$end]; + $fing->{Fouls}= $foulfingers{$foul}[!$end]; + finger_allocate($fing); + } + } + foreach $seg (@segs) { + my $fingnum= 0; + foreach my $end (qw(0 1)) { + $segs{$seg}{Fingers}[$end] ||= [ ]; + my $fings= $fings; + foreach my $fing (@$fings) { + $fing->{FingNum}= $fingnum++; + } + } + } + foreach $seg (@segs) { $segr= $segs{$seg}; @@ -750,6 +790,8 @@ sub writeout () { $node,$side); } } + o("sprintf ,%-6s", + @{ $segr->{Fingers}[$end] } ? "f${end}_${seg}" : "0"); o(" }"); } o(sprintf " } }"); diff --git a/layout/layout-data.h b/layout/layout-data.h index 37801ca..ba25aae 100644 --- a/layout/layout-data.h +++ b/layout/layout-data.h @@ -36,9 +36,16 @@ typedef enum { /*========== data from config files and layout cad/cam ==========*/ +typedef struct { + Distance len; /* 0: always unoccupied in this movposcomb */ + SegmentNum fouls; + FingerMap fouls_fingers; +} SegmentFingerInfo; + typedef struct { unsigned next_backwards:1; SegmentNum next; + SegmentFingerInfo *fingers; } SegmentLinkInfo; typedef struct { @@ -47,6 +54,8 @@ typedef struct { Small posns; /* for mfk_fixed: is the actual position */ MovPosComb weight; /* for mfk_fixed: is 0 */ const BoardObject *boob; /* for mfk_fixed: is 0 */ + FingerMap unstable_fingers; + fixme set to ~0 if no info } MovFeatInfo; typedef struct { @@ -62,6 +71,15 @@ typedef struct { const MovFeatInfo *movfeats; /* first n_movfeats then n_fixedmovfeats */ MovPosComb n_poscombs; const SegPosCombInfo *poscombs; + int n_fingers[2]; + /* Each segment has a single finger numbering space, from 0 to + * n_fingers[0]+n_fingers[1], which is used as the index (bit + * number) in each FingerMap. poscoms[][0].fingers refers to + * fingers which are at the far ends of segments in the forwards + * direction, which are numbered starting at 0. + * poscoms[][1].fingers refers to those at the near ends which are + * numbered starting at n_fingers[0] + */ BoardObject sense, invert; SegmentNum interferes; unsigned char interferes_movposcomb_map; diff --git a/layout/ours.wiring b/layout/ours.wiring index eda117a..95135ed 100644 --- a/layout/ours.wiring +++ b/layout/ours.wiring @@ -91,4 +91,13 @@ fixed interferences A5/J1P0 A6/J1P0 +foulfingers + -C6 50 -B7/J0P1,J1P0 50 + -C6 40 C5/P1 50 + +stableportions + C5 P 120 + -B7/J0 P 100 + -B7/J1 P 110 + endwiring