From 0c56da69e4fafa3d165df39b989bc0a83868a780 Mon Sep 17 00:00:00 2001 From: Manuel Penschuck Date: Sun, 2 Nov 2014 12:50:31 +0100 Subject: [PATCH] DMon:Added billboard, mbs and cbmnet modules. Avail. now via start page --- dmon/scripts/dmon_billboard.pl | 51 +++++++++++++++++++++ dmon/scripts/dmon_cbmnetdata.pl | 78 +++++++++++++++++++++++++++++++++ dmon/scripts/dmon_cbmnetlink.pl | 47 ++++++++++++++++++++ dmon/scripts/dmon_cbmnetsync.pl | 48 ++++++++++++++++++++ dmon/scripts/dmon_mbs.pl | 42 ++++++++++++++++++ web/htdocs/index.pl | 1 + 6 files changed, 267 insertions(+) create mode 100755 dmon/scripts/dmon_billboard.pl create mode 100755 dmon/scripts/dmon_cbmnetdata.pl create mode 100755 dmon/scripts/dmon_cbmnetlink.pl create mode 100755 dmon/scripts/dmon_cbmnetsync.pl create mode 100755 dmon/scripts/dmon_mbs.pl diff --git a/dmon/scripts/dmon_billboard.pl b/dmon/scripts/dmon_billboard.pl new file mode 100755 index 0000000..b9d9e1f --- /dev/null +++ b/dmon/scripts/dmon_billboard.pl @@ -0,0 +1,51 @@ +#!/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); +} + diff --git a/dmon/scripts/dmon_cbmnetdata.pl b/dmon/scripts/dmon_cbmnetdata.pl new file mode 100755 index 0000000..5ba5cee --- /dev/null +++ b/dmon/scripts/dmon_cbmnetdata.pl @@ -0,0 +1,78 @@ +#!/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@@; + $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); +} + diff --git a/dmon/scripts/dmon_cbmnetlink.pl b/dmon/scripts/dmon_cbmnetlink.pl new file mode 100755 index 0000000..1782fb6 --- /dev/null +++ b/dmon/scripts/dmon_cbmnetlink.pl @@ -0,0 +1,47 @@ +#!/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); +} + diff --git a/dmon/scripts/dmon_cbmnetsync.pl b/dmon/scripts/dmon_cbmnetsync.pl new file mode 100755 index 0000000..ce85610 --- /dev/null +++ b/dmon/scripts/dmon_cbmnetsync.pl @@ -0,0 +1,48 @@ +#!/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); +} + diff --git a/dmon/scripts/dmon_mbs.pl b/dmon/scripts/dmon_mbs.pl new file mode 100755 index 0000000..73ff2c8 --- /dev/null +++ b/dmon/scripts/dmon_mbs.pl @@ -0,0 +1,42 @@ +#!/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); +} + diff --git a/web/htdocs/index.pl b/web/htdocs/index.pl index bc803b3..af9811c 100755 --- a/web/htdocs/index.pl +++ b/web/htdocs/index.pl @@ -105,6 +105,7 @@ The main documentation of the network can be found in these documents and locati -- 2.43.0