--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use POSIX qw(strftime);
+use FileHandle;
+use lib "./code";
+use lib "../tools";
+use HADES::TrbNet;
+use Time::HiRes qw(usleep gettimeofday tv_interval);
+use Dmon;
+use HPlot;
+use Data::Dumper;
+
+my %config = Dmon::StartUp();
+my $t0;
+
+while(1) {
+ my $title = "Billboard";
+ my $longtext='';
+ my $value='';
+ my $status = Dmon::OK;
+
+ my $regs = trb_registertime_read_mem($config{BillboardAddress},0xb000, 0, 5);
+
+ if(defined $regs->{$config{BillboardAddress}}) {
+ my $rates = Dmon::MakeRate(0,32,0,$regs);
+ if (defined($rates->{$config{BillboardAddress}}{rate}) && $t0) {
+ $elapsed = tv_interval ( $t0, [gettimeofday] );
+ my $commitSize = $rates->{$config{BillboardAddress}}{value}[0];
+ my $frameRate = $rates->{$config{BillboardAddress}}{rate}[2] / $elapsed;
+ my $commitRate = $rates->{$config{BillboardAddress}}{rate}[4] / $elapsed;
+
+ $value = sprintf("%.1f cmt/s", $commitRate);
+ $longtext = sprintf "Commits: %d/s (size: %d b), Frames: %d/s", $commitRate, $commitSize*4, $frameRate;
+ if ($commitRate == 0) {
+ $status = Dmon::ERROR;
+ } elsif ($frameRate < $commitRate || !$commitSize) {
+ $status = Dmon::WARN;
+ }
+ }
+ } else {
+ $status = Dmon::FATAL;
+ $value = "no endpoint";
+ $longtext = "Endpoint not reached";
+ }
+
+ $t0 = [gettimeofday];
+ Dmon::WriteQALog($config{flog},"billboard",6,$status,$title,$value,$longtext) if ($longtext);
+ usleep(5e6);
+}
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use POSIX qw(strftime);
+use FileHandle;
+use lib "./code";
+use lib "../tools";
+use HADES::TrbNet;
+use Time::HiRes qw(usleep);
+use HPlot;
+use Dmon;
+
+HPlot::PlotInit({
+ name => "CBMNetLossRate",
+ file => Dmon::DMONDIR."CBMNetLossRate",
+ entries => 600,
+ type => HPlot::TYPE_HISTORY,
+ output => HPlot::OUT_PNG,
+ titles => ["CBMNet Loss Rate"],
+ xlabel => "Time [s]",
+ ylabel => "RDO events lost / processed [%]",
+ sizex => 750,
+ sizey => 270,
+ ymin => -1,
+ ymax => 101,
+ xscale => 5,
+ nokey => 1,
+ buffer => 1
+ });
+
+my $str = Dmon::MakeTitle(10,6,"CBMNetLossRate",0);
+ $str .= qq@<img src="%ADDPNG CBMNetLossRate.png%" type="image/png">@;
+ $str .= Dmon::MakeFooter();
+Dmon::WriteFile("CBMNetLossRate",$str);
+
+my %config = Dmon::StartUp();
+
+my $title = "CNet Readout";
+
+while(1) {
+ my $regs = trb_registertime_read_mem($config{CtsAddress},0xa806, 0, 4);
+ my $longtext = 0;
+ my $status = Dmon::OK;
+ my $value = "";
+ my $dlmCnt = -1;
+
+ if( defined $regs->{$config{CtsAddress}}) {
+ my $rates = Dmon::MakeRate(0,31,1,$regs);
+ if (defined $rates->{$config{CtsAddress}}) {
+ my $rateEventsSend = $rates->{$config{CtsAddress}}{rate}[0];
+ my $rateEventsAbrt = $rates->{$config{CtsAddress}}{rate}[2];
+ my $percentAbrt = $rateEventsAbrt ? 100.* $rateEventsAbrt / ($rateEventsSend+$rateEventsAbrt) : 0;
+ my $rateDataKb = $rates->{$config{CtsAddress}}{rate}[3] * 0.002;
+
+ $value = sprintf "%d kb/s", ($rateDataKb+0.5);
+ $longtext = sprintf "Data rate: %d kb/s, Events send: %d, lost: %d/s (% 3.1f %%)", $rateDataKb, $rateEventsSend, $rateEventsAbrt, $percentAbrt;
+ HPlot::PlotAdd('CBMNetLossRate',$percentAbrt,0);
+
+ if ($percentAbrt > 2 ) {
+ $status = Dmon::ERROR;
+ } elsif ($percentAbrt > 0.5 || $rateDataKb < 1e-6) {
+ $status = Dmon::WARN;
+ }
+ }
+ } else {
+ $status = Dmon::FATAL;
+ $value = "no endpoint";
+ $longtext = "Endpoint not reached";
+ }
+
+ if ($longtext) {
+ # we've something to output .. so do it ;)
+ Dmon::WriteQALog($config{flog},"cbmnetdata",2,$status,$title,$value,$longtext,'2-CBMNetLossRate');
+ HPlot::PlotDraw('CBMNetLossRate');
+ }
+ usleep(8e5);
+}
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use POSIX qw(strftime);
+use FileHandle;
+use lib "./code";
+use lib "../tools";
+use HADES::TrbNet;
+use Time::HiRes qw(usleep);
+use Dmon;
+
+my %config = Dmon::StartUp();
+
+my $title = "CNet Link";
+
+while(1) {
+ my $regs = trb_registertime_read_mem($config{CtsAddress},0xa900, 0, 13);
+ my $longtext;
+ my $status = Dmon::OK;
+ my $value = "";
+ my $dlmCnt = -1;
+
+ if( defined $regs->{$config{CtsAddress}}) {
+ my $rates = Dmon::MakeRate(0,16,1,$regs);
+ if (defined $rates->{$config{CtsAddress}}{rate}) {
+ my $linkActive = $regs->{$config{CtsAddress}}{value}[0] & 0x20;
+ my $resetRate = $rates->{$config{CtsAddress}}{rate}[0xc];
+
+ $value = sprintf("%d rst/s", $resetRate + 0.5);
+ $longtext = sprintf "Link active: %s, Reset: %.1%/s", ($linkActive ? "y":"n"), $resetRate;
+
+ if (!$linkActive || $resetRate >= 2) {
+ $status = Dmon::ERROR;
+ } elsif ($resetRate > 0) {
+ $status = Dmon::WARN;
+ }
+ }
+ } else {
+ $status = Dmon::FATAL;
+ $value = "no endpoint";
+ $longtext = "Endpoint not reached";
+ }
+
+ Dmon::WriteQALog($config{flog},"cbmnetlink",2,$status,$title,$value,$longtext) if ($longtext);
+ usleep(8e5);
+}
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use POSIX qw(strftime);
+use FileHandle;
+use lib "./code";
+use lib "../tools";
+use HADES::TrbNet;
+use Time::HiRes qw(usleep);
+use Dmon;
+
+my %config = Dmon::StartUp();
+
+my $title = "CNet Sync.";
+
+while(1) {
+ my $regs = trb_register_read_mem($config{CtsAddress},0xa900, 0, 13);
+ my $longtext;
+ my $status = Dmon::OK;
+ my $value = "";
+ my $dlmCnt = -1;
+
+ if( defined $regs->{$config{CtsAddress}}) {
+ my $linkActive = $regs->{$config{CtsAddress}}[0] & 0x20;
+ my $pulserFreqKHz = 125e3 / $regs->{$config{CtsAddress}}[1];
+ $dlmCnt = $linkActive ? $regs->{$config{CtsAddress}}[0xa] : -1;
+
+ $value = "$dlmCnt DLMs";
+ $longtext = sprintf "DLMs: %s, Pulser: %d KHz", $dlmCnt, $pulserFreqKHz;
+
+ if (!$linkActive) {
+ $longtext = "CBMNet link inactive";
+ $value = "no link";
+ $status = Dmon::FATAL;
+ } elsif (!$dlmCnt) {
+ $status = Dmon::ERROR;
+ }
+
+ } else {
+ $status = Dmon::FATAL;
+ $value = "no endpoint";
+ $longtext = "Endpoint not reached";
+ }
+
+ Dmon::WriteQALog($config{flog},"cbmnetsync",2,$status,$title,$value,$longtext);
+ usleep(1e6);
+}
+
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use POSIX qw(strftime);
+use FileHandle;
+use lib "./code";
+use lib "../tools";
+use HADES::TrbNet;
+use Time::HiRes qw(usleep);
+use Dmon;
+
+my %config = Dmon::StartUp();
+
+while(1) {
+ my $regs = trb_registertime_read_mem($config{MBSAddress},0xb800, 0, 2);
+ my $rates = Dmon::MakeRate(0,32,1,$regs);
+
+ if( defined $rates) {
+ my $ctrlReg = $rates->{$config{MBSAddress}}{value}[0];
+ my $mbsRate = sprintf("%d",$rates->{$config{MBSAddress}}{rate}[1]);
+ my $rdoEnable = $ctrlReg & 1;
+ my $errReg = $ctrlReg & 0x80;
+
+
+ my $title = "MBS Recv. Rate";
+ my $longtext = sprintf "%d words/s. Last word: 0x06x", $mbsRate, $ctrlReg & 0xffffff;
+ my $status = Dmon::OK;
+ if ($errReg) {
+ $status = Dmon::ERROR;
+ } elsif (!$rdoEnable) {
+ $longtext = "NO READOUT. $longtext";
+ $status = Dmon::WARN;
+ } elsif ($mbsRate < 1000) {
+ $status = Dmon::WARN;
+ }
+
+ Dmon::WriteQALog($config{flog},"mbs",5,$status,$title,$mbsRate,$longtext);
+ }
+
+ usleep(8e5);
+}
+
<ul>
<li><a href="tools/pwr/index.html" title="Currently supported: GW-Instek PSP-405 family, HMP2020 - HMP4040 family">Control for power supplies</a>
<li><a href="tools/vxi/index.html" title="Tested with Tektronix AFG3000 function generator">Control for devices running the VXI-11 protocol</a>
+<li><a href="dmon/index.pl" title="DMON">DMON DAQ Monitoring</a></li>
</ul>
</div>
</div>