# $segs{$seg}{Feats}{$pt}{Kind} Point or Fixed
# $segs{$seg}{Feats}{$pt}{Weight} ) for Point only
# $segs{$seg}{Feats}{$pt}{Posns} ) for Point only
-# $segs{$seg}{Feats}{$pt}{BoOb} ) for Point only
+# $segs{$seg}{Feats}{$pt}{BoOb}[] ) for Point only
# $segs{$seg}{Feats}{$pt}{Fixed} position, for Fixed only
# $segs{$seg}{Num}
mistake("invalid board object $boob");
return [ 0,0 ];
}
- return sprintf "%d,%2d", $1,$2;
+ return [ $1,$2 ];
}
-sub so_oboob ($) {
- my ($obj) = @_;
- return $obj->{BoOb};
+sub so_boob ($$) {
+ my ($k,$bo) = @_;
+ return sprintf "%5d /* %d.%-2d*/", $bo->[0] * 1000 + $bo->[1],
+ $bo->[0], $bo->[1];
+}
+
+sub so_oboob ($$) {
+ my ($k,$obj) = @_;
+ return so_boob($k,$obj->{BoOb});
}
sub mainread () {
sub writeout () {
my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim);
- my ($comb,$pi,$feat,$featr,$end);
+ my ($comb,$pi,$feat,$featr,$end,$boob);
my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus);
o("/* autogenerated - do not edit */\n\n");
@segs=();
next unless $segr->{FeatCount};
+ for $pt (keys %{ $segr->{Feats} }) {
+ $ptv= $segr->{Feats}{$pt};
+ next if exists $ptv->{Fixed};
+ o("static const BoardObject mfbo_${seg}_${pt}[]= {");
+ $delim=' ';
+ foreach $boob (@{ $ptv->{BoOb} }) {
+ o($delim);
+ o(so_boob('pt',$boob));
+ $delim= ', ';
+ }
+ o(" };\n");
+ }
+
o("static const MovFeatInfo mfi_${seg}[]= {");
$delim='';
for $pt (keys %{ $segr->{Feats} }) {
$ptv= $segr->{Feats}{$pt};
next if exists $ptv->{Fixed};
o("$delim\n");
- o(" { \"$seg/$pt\", $ptv->{Posns}, $ptv->{Weight} }");
+ o(" { \"$seg/$pt\", mfk_".lc($ptv->{Kind}).",".
+ " $ptv->{Posns}, $ptv->{Weight}, mfbo_${seg}_$pt }");
$delim=',';
}
o("\n};\n");
"\"$seg\",", $segr->{Inv},
$segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
$segr->{Posns}, "spci_$seg,",
- so_oboob($segr));
+ so_oboob('sense',$segr), so_oboob('reverse',$segr));
$delim= ',';
}
o("\n};\n");
typedef unsigned short TrainNum;
typedef unsigned short SegmentNum;
typedef unsigned short MovPosComb;
+typedef unsigned short BoardObject;
typedef unsigned char Small;
typedef char Speed;
/* for units, see safety.h */
+typedef enum {
+ mfk_none,
+ mfk_point
+} MovFeatKind;
+
/*========== data from config files and layout cad/cam ==========*/
typedef struct {
typedef struct {
const char *pname;
+ MovFeatKind kind;
Small posns;
MovPosComb weight;
+ const BoardObject *boob;
} MovFeatInfo;
typedef struct {
const MovFeatInfo *movfeats;
MovPosComb n_poscombs;
const SegPosCombInfo *poscombs;
- Small board, object;
+ BoardObject sense, invert;
} SegmentInfo;
typedef struct {