chiark / gitweb /
provide info_segmentmap
[trains.git] / layout / data2safety
index 4713b6bacc60d7c880091723295b7751fd7f3ce9..5c7df3702d3637d3f3f83d2857059d413f2f3acd 100755 (executable)
@@ -324,8 +324,8 @@ sub boob_used_bit ($$$) {
     return defined boob_used($boardnum,$obj,$kind) ? 1 : 0;
 }
 
-sub so_boob ($$$) {
-    my ($kind,$mkused,$bo) = @_;
+sub so_boob ($$$;$) {
+    my ($kind,$mkused,$bo, $objnum_rr) = @_;
     my ($type,$pi);
     if (defined $bo) {
        my ($board,$obj)= @$bo;
@@ -338,17 +338,25 @@ sub so_boob ($$$) {
                " board type $type")
            unless defined $pi->[$obj];
        $objnum= boob2objnum($board,$obj,$kind,$mkused);
+#print "so_boob >$objnum_rr|$$objnum_rr< = $objnum\n";
+       $$objnum_rr= $objnum;
        $pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ]
            if $mkused;
-       return sprintf("%#4x /* %d.%-2d*/", $objnum, $board, $obj);
+       return sprintf("%#5x /* %d.%-2d*/", $objnum, $board, $obj);
     } else {
+#print "so_boob >$objnum_rr|$$objnum_rr< -\n";
        return "   0 /*none*/ ";
     }
 }
 
-sub so_objboob ($$$) {
-    my ($kind,$mkused,$obj) = @_;
-    return so_boob($kind,$mkused, defined $obj ? $obj->{BoOb} : undef);
+sub so_objboob ($$$;$) {
+    my ($kind,$mkused,$obj, $objnum_rr) = @_;
+#    return so_boob($kind,$mkused, defined $obj ? $obj->{BoOb} : undef );
+#print "so_objboob >$objnum_rr|$$objnum_rr<\n";
+    return so_boob($kind,$mkused,
+                  defined $obj ? $obj->{BoOb} : undef
+                  , $objnum_rr
+                  );
 }
 
 sub mainread () {
@@ -477,7 +485,9 @@ sub writeout () {
     }
     o("const SegmentNum info_nsegments=NUM_SEGMENTS;\n");
     o("const SegmentInfo info_segments[NUM_SEGMENTS]= {");
+    my (@sensemap,$segnum,$sensenum,$i,$j);
     $delim= '';
+    $segnum= 0;
     foreach $seg (@segs) {
        $segr= $segs{$seg};
        o("$delim\n");
@@ -485,12 +495,27 @@ sub writeout () {
          "\"$seg\",", $segr->{Inv},
          $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
          $segr->{Posns}, "spci_$seg,",
-         so_objboob('sense',1, $segr),
+         so_objboob('sense',1, $segr, \$sensenum),
          so_objboob('reverse',1, $segr->{Inv} ? $segr : undef));
        $delim= ',';
+       o("/* sensmap[$sensenum]=$segnum */");
+       $sensemap[$sensenum]= $segnum++;
     }
     o("\n};\n");
     o("const BoardObject info_maxreverse= $maxreverseobjnum;\n");
+    o("#define U -1\n");
+    o("const SegmentNumInMap info_segmentmap[]= {\n");
+    $i=0; $j=0;
+    foreach $seg (@sensemap) {
+       o(!$i ? ' ' :
+         (grep { $i == $_ } @sensesbase) ? ($j=0,"\n ") :
+         !(++$j % 30) ? ",\n  " :
+         ",");
+       o($seg || 'U');
+       $i++;
+    }
+    o("\n};\n".
+      "const int info_segmentmaplen= ".scalar(@sensemap).";\n");
 }
 
 # writeasm_KIND()