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 */
# $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
# $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.
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);
}
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};
$node,$side);
}
}
+ o("sprintf ,%-6s",
+ @{ $segr->{Fingers}[$end] } ? "f${end}_${seg}" : "0");
o(" }");
}
o(sprintf " } }");
/*========== 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 {
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 {
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;