chiark / gitweb /
wip fingers copy.wip.fingers
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 23 Jan 2011 22:40:58 +0000 (22:40 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 23 Jan 2011 22:40:58 +0000 (22:40 +0000)
hostside/safety.h
layout/data2safety
layout/layout-data.h
layout/ours.wiring

index 78447c79e3fd4a75383bf8052432a2c4b1a4eb65..b1313b4b321c4376a72ba6641649001e4ff7b342 100644 (file)
@@ -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 */
index 22966c72a45556dfd830270485925383804a1248..3b6794656ec522f21650f9753ef048b21b25d6a8 100755 (executable)
@@ -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 " } }");
index 37801caa16402901a78ae496801c0dddaa3d6ec5..ba25aae7f240604f6cc2538242e56325a8a5a4fe 100644 (file)
@@ -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;
index eda117a52b335a80f69a572e7035daf95d86f317..95135ed012faa03aaf7e5fc1ce73060da51ce0b0 100644 (file)
@@ -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