<!--===========================================-->
<register name="Channel" address="0000" mode="r" repeat="65">
<description>Channel-specific information</description>
- <field name="HitCounter" start="0" bits="24" format="unsigned" purpose="statistics">
+ <field name="HitCounter" start="0" bits="24" format="unsigned" purpose="statistics" rate="1">
<description>Number of detected hits in channel</description>
</field>
<field name="InputState" start="31" bits="1" format="enum" purpose="status">
<register name="TriggerCounter" address="0004">
<description>Number of valid triggers received</description>
- <field name="TriggerCounter" start="0" bits="24" format="unsigned" />
+ <field name="TriggerCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="TimingTriggerCounter" address="0005">
<description>Number of valid timing triggers
received</description>
- <field name="TimingTriggerCounter" start="0" bits="24" format="unsigned" />
+ <field name="TimingTriggerCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="NoTimingTriggerCounter" address="0006">
<description>Number of valid triggers received which are not
timing triggers</description>
- <field name="NoTimingTriggerCounter" start="0" bits="24" format="unsigned" />
+ <field name="NoTimingTriggerCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="InvalidTriggerCounter" address="0007">
<description>Number of invalid triggers received</description>
- <field name="InvalidTriggerCounter" start="0" bits="24" format="unsigned" />
+ <field name="InvalidTriggerCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="MultiTimingTriggerCounter" address="0008">
<description>Number of multi timing triggers received (triggers
received before trigger is released)</description>
- <field name="MultiTimingTriggerCounter" start="0" bits="24" format="unsigned" />
+ <field name="MultiTimingTriggerCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="SpuriousTriggerCounter" address="0009">
<description>Number of spurious triggers received (in case of
timing trigger is validated although it was a
timing-trigger-less trigger)</description>
- <field name="SpuriousTriggerCounter" start="0" bits="24" format="unsigned" />
+ <field name="SpuriousTriggerCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="WrongReadoutsCounter" address="000a">
<description>Number of wrong readouts due to spurious
triggers</description>
- <field name="WrongReadoutsCounter" start="0" bits="24" format="unsigned" />
+ <field name="WrongReadoutsCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="SpikesCounter" address="000b">
<description>Number of spikes (pulses narrower than 40 ns)
detected at the timing trigger input</description>
- <field name="SpikesCounter" start="0" bits="24" format="unsigned" />
+ <field name="SpikesCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="IdleTime" address="000c">
<description>Total time length, that the readout FSM waited in
the idle state (with granularity of 10 ns)</description>
- <field name="IdleTime" start="0" bits="24" format="unsigned" unit="ns" scale="10" />
+ <field name="IdleTime" start="0" bits="24" format="unsigned" unit="ns" scale="10" rate="1" />
</register>
<register name="WaitTime" address="000d">
<description>Total time length, that the readout FSM waited in
the wait states (with granularity of 10 ns)</description>
- <field name="WaitTime" start="0" bits="24" format="unsigned" unit="ns" scale="10" />
+ <field name="WaitTime" start="0" bits="24" format="unsigned" unit="ns" scale="10" rate="1" />
</register>
<register name="TotalEmptyChannelsCounter" address="000e">
<register name="ReleaseCounter" address="000f">
<description>Number of release signals sent</description>
- <field name="ReleaseCounter" start="0" bits="24" format="unsigned" />
+ <field name="ReleaseCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="ReadoutTime" address="0010">
<description>Total time length of the readout process (with
granularity of 10 ns)</description>
- <field name="ReadoutTime" start="0" bits="24" format="unsigned" unit="ns" scale="10" />
+ <field name="ReadoutTime" start="0" bits="24" format="unsigned" unit="ns" scale="10" rate="1" />
</register>
<register name="TimeoutCounter" address="0011">
<description>Number of timeouts detected (too long delay after
the timing trigger)</description>
- <field name="TimeoutCounter" start="0" bits="24" format="unsigned" />
+ <field name="TimeoutCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
<register name="FinishedCounter" address="0012">
<description>Number of sent finished signals</description>
- <field name="FinishedCounter" start="0" bits="24" format="unsigned" />
+ <field name="FinishedCounter" start="0" bits="24" format="unsigned" rate="1" />
</register>
</group>
use HADES::TrbNet;
use Storable qw(lock_store lock_retrieve);
use feature "switch";
+use Time::HiRes qw( time );
use CGI::Carp qw(fatalsToBrowser);
use if (!defined $ENV{'QUERY_STRING'}), warnings;
my $isbrowser = 0;
my $server = $ENV{'SERVER_SOFTWARE'} || "";
my @request;
-my ($file,$entity,$netaddr,$name, $style, $storefile);
+my ($file,$entity,$netaddr,$name, $style, $storefile, $rates, $cache,$olddata);
$ENV{'DAQOPSERVER'}="localhost:7" unless (defined $ENV{'DAQOPSERVER'});
my $isColor = $style =~ /color/i;
my $sortAddr = $style =~ /sortaddr/i;
$verbose = ($style =~ /verbose/i) ||$verbose;
- my $rates = $style =~ /rates/i;
- my $cache = $style =~ /cache/i;
+ $rates = $style =~ /rate/i;
+ $cache = $style =~ /cache/i;
###############################
if($rates) {
if(-e $storefile) {
- my $olddata = lock_retrieve($storefile);
+ $olddata = lock_retrieve($storefile);
}
}
###############################
$once = (defined $slice)?1:0;
if ($isbrowser) {
+ $data->{time0}=time();
requestdata($db->{$name},$name,$slice);
generateoutput($db->{$name},$name,$slice,$once);
if($rates) {
- store_lock($data,$storefile);
+ $data->{time1}=time();
+ lock_store($data,$storefile);
}
}
else {
#### Formatting of values
###############################
sub FormatPretty {
- my ($value,$obj,$name,$cont,$class,$cstr) = @_;
+ my ($value,$obj,$name,$cont,$class,$cstr,$addr,$b) = @_;
+ $class = "" unless $class;
+
$value = $value >> ($obj->{start});
$value &= ((1<<$obj->{bits})-1);
my $rawvalue = $value;
+
+ if ($rates && $obj->{rate}){
+ $value = makerate($obj,$value,$addr,$b);
+ $class.=" rate";
+ }
+
$value = $value * ($obj->{scale}||1) + ($obj->{scaleoffset}||0);
- $class = "" unless $class;
$cstr = "" unless $cstr;
my $ret, my $cl;
if (defined $cont) {
$fullc .= ".$slice" if ($once != 1 && defined $obj->{repeat});
my $cstr = sprintf("%s-0x%04x-%s", $entity,$b,$fullc );
my $wr = 1 if $db->{$c}->{mode} =~ /w/;
- $ttmp .= FormatPretty($data->{$addr}->{$b},$db->{$c},$c,"td",($wr?"editable":""),$cstr);
+ $ttmp .= FormatPretty($data->{$addr}->{$b},$db->{$c},$c,"td",($wr?"editable":""),$cstr,$addr,$b);
}
}
elsif($obj->{type} eq "field" || $obj->{type} eq "registerfield") {
$fullc .= ".$slice" if ($once != 1 && defined $obj->{repeat});
my $cstr = sprintf("%s-0x%04x-%s", $entity,$b,$fullc );
my $wr = 1 if $obj->{mode} =~ /w/;
- $ttmp .= FormatPretty($data->{$addr}->{$b},$obj,$fullc,"td",($wr?"editable":""),$cstr);
+ $ttmp .= FormatPretty($data->{$addr}->{$b},$obj,$fullc,"td",($wr?"editable":""),$cstr,$addr,$b);
}
$tarr{sprintf("%05i%04i",$b,$slice)}=$ttmp;
}
print $t;
}
-
+sub makerate {
+ my ($obj,$val,$addr,$b) = @_;
+ if(defined $olddata->{$addr}->{$b}) {
+ $val -= $olddata->{$addr}->{$b};
+ }
+ my $delay = $data->{time0} - $olddata->{time0};
+ while ($val < 0) {
+ $val += 1<<$obj->{bits};
+ }
+ $val /= $delay;
+ return $val;
+ }
###############################
#### Analyze Object & print contents (the simple minded way)