From: ian Date: Wed, 28 May 2008 18:18:04 +0000 (+0000) Subject: add topology-dump; add information about fixed segments to layout-data.c X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=ccc2affc2472fa96ef21629e317f9c3bc70607f6;p=trains.git add topology-dump; add information about fixed segments to layout-data.c --- diff --git a/hostside/.cvsignore b/hostside/.cvsignore index c634ab7..89bed14 100644 --- a/hostside/.cvsignore +++ b/hostside/.cvsignore @@ -2,6 +2,7 @@ realtime hostside-old hostside safety +topology-dump t u t.* diff --git a/hostside/Makefile b/hostside/Makefile index eff205b..7971012 100644 --- a/hostside/Makefile +++ b/hostside/Makefile @@ -5,7 +5,7 @@ TRAINS= santafe shinkansen AUTOINCS= auproto-pic.h layoutinfo.h selectors.h retransmit-table.h \ errorcodes.h stastate.h record-y.h record-l.h \ realtime+dflags.h -TARGETS= hostside-old gui-plan-bot realtime \ +TARGETS= hostside-old gui-plan-bot realtime topology-dump \ $(addsuffix .speeds.ps, $(TRAINS)) \ $(addsuffix .speeds.record, $(TRAINS)) @@ -47,6 +47,9 @@ realtime: $(REALTIME_CORE_OBJS) \ proto-expanded: ../cebpic/README.protocol expand <$< $o +topology-dump: topology-dump.o utils.o ../layout/ours.layout-data.o + $(LINK) + gui-plan-bot: gui-plan-%: gui-plan.o utils.o parseutils.o obc.o \ ../layout/ours.dgram-%.plandata.o \ __oop-read-copy.o -loop diff --git a/hostside/README.commands b/hostside/README.commands index afa30aa..0d69e3f 100644 --- a/hostside/README.commands +++ b/hostside/README.commands @@ -4,6 +4,8 @@ Protocol over new hostside stdin and to multiplexer: R< ditto, but saved for replay too S messages to simulation log + D< static data printed by topology-dump + C> commands (reflected to other clients) L> commands implemented by multiplexer and not reflected to other clients O< framming output from commands @@ -188,3 +190,13 @@ DIRECT NMRA AND PIC INSTRUCTIONS !pic = and !nmra _ do exactly the same. + +====================================================================== + +TOPOLOGY DUMP + + D< topology segment i|n + D< topology movfeat point|relay + D< topology movposcomb |- \ + [-]|- [-]|- + D< topology movfeatfixed diff --git a/hostside/daemons.h b/hostside/daemons.h index 655c42c..c103cdb 100644 --- a/hostside/daemons.h +++ b/hostside/daemons.h @@ -1,7 +1,7 @@ /* * declarations common to * - realtime daemon - * - multiplexer daemon + * - gui-plan-* displayers */ #ifndef DAEMONS_H diff --git a/hostside/topology-dump.c b/hostside/topology-dump.c new file mode 100644 index 0000000..8515a8d --- /dev/null +++ b/hostside/topology-dump.c @@ -0,0 +1,54 @@ +/* + * topology dumper + */ + +#include "common.h" +#include "../layout/layout-data.h" + +static const char *mfkpnames[/*MovFeatKind*/]= + { 0,"point","relay" }; + +static void plink(const SegmentLinkInfo *p) { + putchar(' '); + if (!SOMEP(p->next)) { putchar('-'); return; } + if (p->next_backwards) putchar('-'); + fputs(info_segments[p->next].pname,stdout); +} + +const char *progname= "topology-dump"; + +void die_hook(void) { } +void die_vprintf_hook(const char *fmt, va_list al) { } + +int main(int argc, char **argv) { + const SegmentInfo *segi; + const MovFeatInfo *mfi; + const SegPosCombInfo *spci; + int segn, mfn, posn; + + if (argc!=1) badusage("no arguments permitted"); + + for (segn=0, segi=info_segments; segnpname, + segi->n_movfeats, segi->n_poscombs, "ni"[segi->invertible]); + for (mfn=0, mfi=segi->movfeats; mfnn_movfeats; mfn++, mfi++) { + MovFeatKind k= mfi->kind; + printf("topology movfeat %s %s %d %d %s\n", segi->pname, mfi->pname, + mfi->posns, mfi->weight, mfkpnames[k]); + } + for (mfn=0; mfnn_fixedmovfeats; mfn++, mfi++) { + printf("topology movfeatfixed %s %s %d\n", segi->pname, mfi->pname, + mfi->posns); + } + for (posn=0, spci=segi->poscombs; posnn_poscombs; posn++, spci++) { + printf("topology movposcomb %s %s %d %d", segi->pname, + segi->n_poscombs>1 ? spci->pname : "-", + posn, spci->dist); + plink(&spci->link[1]); + plink(&spci->link[0]); + putchar('\n'); + } + } + mflushstdout(); + return 0; +} diff --git a/layout/data2safety b/layout/data2safety index fa336be..8a9c73e 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -18,6 +18,7 @@ our (%segs); # $segs{$seg}{BoOb} # $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}{Weight} ) for Point or Relay only # $segs{$seg}{Feats}{$feat}{Posns} ) for Point or Relay only @@ -154,6 +155,7 @@ sub line_fixed () { Kind => Fixed, Fixed => $pos, }); + $segs{$seg}{FeatCountFixed}++; } sub begin_segment () { } @@ -170,7 +172,8 @@ sub line_segment () { Obj => $boob->{Obj} } : undef, Posns => 1, Feats => { }, - FeatCount => 0 + FeatCount => 0, + FeatCountFixed => 0 }; &{"line_segment_".($invertible?'invertible':'vanilla')}($boob); } @@ -584,7 +587,7 @@ sub writeout () { my (@segs,$segn,$seg,$segr,$feat,$featv, $delim); my ($comb,$pi,$end,$boob); my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus); - my ($ourinter,$pcname,$intere,$intother); + my ($ourinter,$pcname,$intere,$intother,$fixedi); o("/* autogenerated - do not edit */\n\n"); @segs=(); for $seg (sort { nummap($a) cmp nummap($b) } keys %segs) { @@ -680,7 +683,7 @@ sub writeout () { } o("\n};\n"); - next unless $segr->{FeatCount}; + next unless $segr->{FeatCount} || $segr->{FeatCountFixed}; for $feat (keys %{ $segr->{Feats} }) { $featv= $segr->{Feats}{$feat}; @@ -697,13 +700,20 @@ sub writeout () { o("static const MovFeatInfo mfi_${seg}"."[]= {"); $delim=''; - for $feat (keys %{ $segr->{Feats} }) { - $featv= $segr->{Feats}{$feat}; - next if exists $featv->{Fixed}; - o("$delim\n"); - o(" { \"$feat\", mfk_".lc($featv->{Kind}).",". - " $featv->{Posns}, $featv->{Weight}, mfbo_${seg}_$feat }"); - $delim=','; + for $fixedi (qw(0 1)) { + for $feat (keys %{ $segr->{Feats} }) { + $featv= $segr->{Feats}{$feat}; + next if $fixedi != !!exists $featv->{Fixed}; + o("$delim\n"); + o(" { \"$feat\", mfk_".lc($featv->{Kind}).","); + if (!$fixedi) { + o(" $featv->{Posns}, $featv->{Weight}, mfbo_${seg}_$feat"); + } else { + o(" $featv->{Fixed}, 0, 0"); + } + o(" }"); + $delim=','; + } } o("\n};\n"); } @@ -721,9 +731,10 @@ sub writeout () { foreach $seg (@segs) { $segr= $segs{$seg}; o("$delim\n"); - o(sprintf " { %-7s%d,%d,%2d,%-9s%d,%-10s%-6s,%-7s", + o(sprintf " { %-7s%d,%d,%2d,%d,%-9s%d,%-10s%-6s,%-7s", "\"$seg\",",$segr->{InvBoOb}?1:0,$segr->{Inter}{Invert}, - $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'), + $segr->{FeatCount}, $segr->{FeatCountFixed}, + ($segr->{FeatCount}||$segr->{FeatCountFixed}) ? "mfi_$seg," : '0,', $segr->{Posns}, "spci_$seg,", so_objboob(1, $segr, \$sensenum), so_boob(1, $segr->{InvBoOb}).','); diff --git a/layout/layout-data.h b/layout/layout-data.h index 03b8772..37801ca 100644 --- a/layout/layout-data.h +++ b/layout/layout-data.h @@ -27,8 +27,11 @@ typedef int Distance; typedef enum { mfk_none, mfk_point, - mfk_relay - /* must also add new entries to movpos.c:methods[] */ + mfk_relay, + /* must also add new entries to movpos.c:methods[] and topology-dump.c */ + /* only entries up to here are used by movpos.c, since only + * the n_fixedmovfeats entries use mfk_ifxed. */ + mfk_fixed } MovFeatKind; /*========== data from config files and layout cad/cam ==========*/ @@ -41,9 +44,9 @@ typedef struct { typedef struct { const char *pname; MovFeatKind kind; - Small posns; - MovPosComb weight; - const BoardObject *boob; + Small posns; /* for mfk_fixed: is the actual position */ + MovPosComb weight; /* for mfk_fixed: is 0 */ + const BoardObject *boob; /* for mfk_fixed: is 0 */ } MovFeatInfo; typedef struct { @@ -55,8 +58,8 @@ typedef struct { typedef struct { const char *pname; unsigned invertible:1, interferes_polarity_opposed:1; - Small n_movfeats; - const MovFeatInfo *movfeats; + Small n_movfeats, n_fixedmovfeats; + const MovFeatInfo *movfeats; /* first n_movfeats then n_fixedmovfeats */ MovPosComb n_poscombs; const SegPosCombInfo *poscombs; BoardObject sense, invert;