<field name="ResetCount" start="0" bits="8" format="integer">
<description>Number of received network resets</description>
</field>
- <field name="RetransmitRecv" start="16" bits="8" format="integer" >
+ <field name="RetransmitRecv" start="16" bits="8" format="integer" invertflag="true">
<description>Number of retransmit requests received</description>
</field>
- <field name="RetransmitSent" start="16" bits="8" format="integer" >
+ <field name="RetransmitSent" start="16" bits="8" format="integer" invertflag="true">
<description>Number of retransmit requests sent</description>
</field>
</register>
+
+ <register name="TriggerInformation" address="0005" purpose="status">
+ <description>Information abotu the last received trigger</description>
+ <field name="LastTriggerInfo" start="0" bits="16" format="hex">
+ <description>The lower 16 Bit of the trigger information</description>
+ </field>
+ <field name="LastTriggerType" start="16" bits="4" format="hex" >
+ <description>The last trigger type</description>
+ </field>
+ <field name="LastTriggerNumber" start="20" bits="4" format="integer" >
+ <description>Lower four bits of last trigger number</description>
+ </field>
+ <field name="LastTriggerCode" start="24" bits="8" format="hex" >
+ <description>The last trigger code</description>
+ </field>
+ </register>
+
+ <register name="TriggerInput1" address="0006" purpose="status">
+ <description>Trigger input statistics</description>
+ <field name="InvalidCount" start="0" bits="16" format="integer" invertflag="true">
+ <description>Number of invalid triggers. I.e. LVL1 triggers not preceeded by a reference time signal</description>
+ </field>
+ <field name="MultipleCount" start="16" bits="16" format="integer" invertflag="true">
+ <description>Count of multiple reference time signals before a LVL1 trigger, i.e. additional edges on the input which were not sent by the CTS</description>
+ </field>
+ </register>
+
+ <register name="TriggerInput2" address="0007" purpose="status">
+ <description>Trigger input statistics</description>
+ <field name="SpikeCount" start="0" bits="16" format="integer" invertflag="true">
+ <description>Number of short signals on the reference time input. E.g. signals detected by the synchronous logic, but shorter than the 100 ns reference time signal</description>
+ </field>
+ <field name="SpuriousCount" start="16" bits="16" format="integer" invertflag="true">
+ <description>Number of occurences of reference time signals before a calibration trigger which should not sent a reference time</description>
+ </field>
+ </register>
+
+ <register name="TriggerInput3" address="0008" purpose="status">
+ <description>Trigger input statistics</description>
+ <field name="EdgeCount" start="0" bits="16" format="integer">
+ <description>Number of edges on the reference time input. Sampled using asynchronous circuitry. Not available in all designs</description>
+ </field>
+ </register>
+
</group>
use Storable qw(lock_retrieve);
use Text::TabularDisplay;
use feature "switch";
+use CGI::Carp qw(fatalsToBrowser);
+my ($db,$data,$once,$slice);
my $help = 0;
my $verbose = 0;
my $isbrowser = 0;
-
+my $server = $ENV{'SERVER_SOFTWARE'} || "";
+my @request;
my ($file,$netaddr,$name, $style);
+
+
$ENV{'DAQOPSERVER'}="localhost:7" unless (defined $ENV{'DAQOPSERVER'});
+die "can not connect to trbnet-daemon on $ENV{'DAQOPSERVER'}: ".trb_strerror() unless (defined &trb_init_ports());
+
+
+
+if (defined $ENV{'QUERY_STRING'}) {
+ @request = split("&",$ENV{'QUERY_STRING'});
+ unless ($server =~ /HTTPi/i) {
+ print "Content-type: text/html\n\n";
+ }
+ }
+else {
+ $request[0] = ""; #Dummy entry to run foreach
+ }
+
+foreach my $req (@request) {
###############################
#### Check if browser or command line
###############################
-if(defined $ENV{'QUERY_STRING'}) {
- if($ENV{'SERVER_SOFTWARE'} =~ /HTTPi/i) {
- $isbrowser = 1;
- ($file,$netaddr,$name,$style) = split("-",$ENV{'QUERY_STRING'});
- $file = "htdocs/xml-db/cache/$file.entity";
- use CGI::Carp qw(fatalsToBrowser);
+
+ if(defined $ENV{'QUERY_STRING'}) {
+ if($server =~ /HTTPi/i) {
+ $isbrowser = 1;
+ ($file,$netaddr,$name,$style) = split("-",$req);
+ $file = "htdocs/xml-db/cache/$file.entity";
+ }
+ else {
+ # use FindBin qw($RealBin);
+ my $RealBin = ".";
+ $isbrowser = 1;
+ ($file,$netaddr,$name,$style) = split("-",$req);
+ $file = "$RealBin/cache/$file.entity";
+ }
}
else {
-# use FindBin qw($RealBin);
+ # use FindBin qw($RealBin);
my $RealBin = ".";
- $isbrowser = 1;
- ($file,$netaddr,$name,$style) = split("-",$ENV{'QUERY_STRING'});
- $file = "$RealBin/cache/$file.entity";
- use CGI::Carp qw(fatalsToBrowser);
- print "Content-type: text/html\n\n";
+ Getopt::Long::Configure(qw(gnu_getopt));
+ GetOptions(
+ 'help|h' => \$help,
+ 'verbose|v+' => \$verbose,
+ ) or pod2usage(2);
+ pod2usage(1) if $help;
+
+ $file = "$RealBin/cache/$ARGV[0].entity";
+ $netaddr = $ARGV[1] || "";
+ $name = $ARGV[2] || "";
+ $style = $ARGV[3] || "";
}
- }
-else {
-# use FindBin qw($RealBin);
- my $RealBin = ".";
- Getopt::Long::Configure(qw(gnu_getopt));
- GetOptions(
- 'help|h' => \$help,
- 'verbose|v+' => \$verbose,
- ) or pod2usage(2);
- pod2usage(1) if $help;
-
- $file = "$RealBin/cache/$ARGV[0].entity";
- $netaddr = $ARGV[1] || "";
- $name = $ARGV[2] || "";
- $style = $ARGV[3] || "";
- }
- $style = "" unless $style;
-my $isInline = $style =~ /inline/i;
-my $isColor = $style =~ /color/i;
-my $sortAddr = $style =~ /sortaddr/i;
- $verbose = ($style =~ /verbose/i) ||$verbose;
+ $style = "" unless $style;
+ my $isInline = $style =~ /inline/i;
+ my $isColor = $style =~ /color/i;
+ my $sortAddr = $style =~ /sortaddr/i;
+ $verbose = ($style =~ /verbose/i) ||$verbose;
###############################
#### Check arguments for validity
###############################
-die "Entity $file not found.\n" unless(-e $file) ;
-die "DAQOPSERVER not set in environment" unless (defined $ENV{'DAQOPSERVER'});
-die "can not connect to trbnet-daemon on $ENV{'DAQOPSERVER'}: ".trb_strerror() unless (defined &trb_init_ports());
-
-if ($netaddr=~ m/0x([0-9a-fA-F]{4})/) {$netaddr = hex($1);}
-elsif ($netaddr=~ m/([0-9]{1,5})/) {$netaddr = $1;}
-else {die "Could not parse address $netaddr\n";}
+ die "Entity $file not found.\n" unless(-e $file) ;
+
+ if ($netaddr=~ m/0x([0-9a-fA-F]{4})/) {$netaddr = hex($1);}
+ elsif ($netaddr=~ m/([0-9]{1,5})/) {$netaddr = $1;}
+ else {die "Could not parse address $netaddr\n";}
-my $slice = undef;
-if ($name =~ m/^([a-zA-Z0-9]+)\.(\d+)$/) {$name = $1; $slice = $2;}
-elsif ($name =~ m/^([a-zA-Z0-9]+)$/) {$name = $1; $slice = undef;}
-else {die "Could not parse name $name \n";}
+ $slice = undef;
+ if ($name =~ m/^([a-zA-Z0-9]+)\.(\d+)$/) {$name = $1; $slice = $2;}
+ elsif ($name =~ m/^([a-zA-Z0-9]+)$/) {$name = $1; $slice = undef;}
+ else {die "Could not parse name $name \n";}
-my $db = lock_retrieve($file);
-die "Unable to read cache file\n" unless defined $db;
+ $db = lock_retrieve($file);
+ die "Unable to read cache file\n" unless defined $db;
-die "Name not found in entity file\n" unless(exists $db->{$name});
+ die "Name not found in entity file\n" unless(exists $db->{$name});
###############################
#### Main "do the job"
###############################
-my $data;
-my $once = (defined $slice)?1:0;
-if ($isbrowser) {
- requestdata($db->{$name},$name,$slice);
- print DumpTree($data) if $verbose;
- generateoutput($db->{$name},$name,$slice,$once);
- writeoutput($db->{$name},$name,$slice,$once);
- }
-else {
- runandprint($db->{$name},$name,$slice,$once);
- }
-
+ $once = (defined $slice)?1:0;
+ if ($isbrowser) {
+ requestdata($db->{$name},$name,$slice);
+ print DumpTree($data) if $verbose;
+ generateoutput($db->{$name},$name,$slice,$once);
+ writeoutput($db->{$name},$name,$slice,$once);
+ }
+ else {
+ runandprint($db->{$name},$name,$slice,$once);
+ }
+}
###############################
#### Formatting of values
my $ret, my $cl;
if (defined $cont) {
- $cl = "class=\"".($value?"bad":"good")."\"" if ($obj->{errorflag});
- $cl = "class=\"".($value?"high":"low")."\"" unless ($obj->{errorflag});
+ $cl = "class=\"".($value?"bad":"good")."\"" if ( $obj->{errorflag} && !$obj->{invertflag});
+ $cl = "class=\"".($value?"good":"bad")."\"" if ( $obj->{errorflag} && $obj->{invertflag});
+ $cl = "class=\"".($value?"high":"low")."\"" if (!$obj->{errorflag} && !$obj->{invertflag});
+ $cl = "class=\"".($value?"low":"high")."\"" if (!$obj->{errorflag} && $obj->{invertflag});
$ret = "<$cont ";
for($obj->{format}) {
when ("boolean") {
}
}
}
- elsif($obj->{type} eq "register" || $obj->{type} eq "registerfield") {
+ elsif($obj->{type} eq "register" || $obj->{type} eq "registerfield" || $obj->{type} eq "field") {
my $stepsize = $obj->{stepsize} || 1;
$slice = 0 unless defined $slice;
do {
}
+print "\n";
-
-
+1;
###############################