else {
print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\r\n";
print "Content-type: text/html\n\n";
+ $PATH = "/srv/www/htdocs/dmon/";
}
my @args = split('-',$ENV{'QUERY_STRING'});
}
print $out;
-
\ No newline at end of file
+
}
</script>
<div style="position:fixed;left:0;top:0;width:100%;height:40px;background:#d8e8f8;box-shadow:none;"></div>
-<h1 style="position:fixed;top:5px;left:0px;width:100%;display:block;text-align:center;margin:26px 0 0px 0">DAQ Monitoring</h1>
+<h1 style="position:fixed;top:5px;left:0px;width:100%;display:block;text-align:center;margin:26px 0 0px 0"><a href="" style="color:#FFF; text-decoration: none;">DAQ Monitoring</a></h1>
-<div class="linkbox" style="width:730px;"><h4>Main</h4><ul>
-<li style="width:600px;"><a href="code/monitor.pl?1-window-QA" style="color:#d33">Tactical Overview (the central screen)</a></li>
+
+<div class="linkbox" style="width:730px; height:390px"><h4><a href="code/monitor.pl?1-window-QA" style="color:#000; text-decoration: none;">Main</a></h4><ul>
+<iframe style="position:relative; left:45px;width:554px;height:344px; border: 0px solid black;" src="code/monitor.pl?1-QA"></iframe>
</ul></div>
-$;
+<div class="linkbox" style="width:730px;"><h4>RICH</h4><ul class=\"optionlist\">
+ <li><a href=\"webpage/mrich_drawing.html#richTemperature">Temperature</a></li>
+ <li><a href=\"webpage/mrich_drawing_bpl.html#richTemperatureBpl">Temperature Backplane</a></li>
+ <li><a href=\"webpage/mrich_drawing.html#LV1V">DiRICH 1.1V</a></li>
+ <li><a href=\"webpage/mrich_drawing.html#LV2V5">DiRICH 2.5V</a></li>
+ <li><a href=\"webpage/mrich_drawing.html#LV1V2">Combiner 1.2V</a></li>
+ <li><a href=\"code/monitor.pl?2-RichRate">RichRate el.View</a></li>
+</ul></div>
+$;
print "<h3 style=\"clear:both;padding-top:30px;\">All available options</h3><ul class=\"optionlist\">\n";
my @o = qx(ls -1 $PATH*.htt);
--- /dev/null
+#!/usr/bin/env python
+
+import random # For randint
+import sys # For sys.argv and sys.exit
+import uhal
+
+XMLPATH = "/home/hadaq/mRICH/ipBus/";
+
+if __name__ == '__main__':
+
+ print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\r\n";
+ print "Content-type: text/html\r\n\r\n";
+
+ connectionFilePath = XMLPATH+"rich_DPB.xml";#sys.argv[1];
+ deviceId = "rich_DPB";
+ registerName = "rich."+"CTRL";
+
+ connectionMgr = uhal.ConnectionManager("file://" + connectionFilePath);
+ hw = connectionMgr.getDevice(deviceId);
+ node = hw.getNode(registerName)
+
+
+ print "Reading from register '" + registerName + "' ..."
+ reg = node.read();
+ hw.dispatch();
+
+ print "Value =", hex(reg);
+
+
activeScripts => [['time','trgrate','HMP4040','trigNr','daqop'],
['trbnet','timeouts','reftime','datarate','deadtime'],
['temperature_mrich','adcvolt','adccurr','bck','cts_temp'],
- ['numfee','-','-','extClk','pulser'],],
+ ['numfee','-','-','extClk','pulser'],
+ ['envSensor','gaspress','gashumid','mag','-'],],
+
+activeScriptsNoOverview => ['richrate','-'],
#Names to be shown in left column of Overview (max 4 letters!)
-qaNames => ['main','DAQ','rich','rich'],
+qaNames => ['main','DAQ','rich','rich','Gas'],
#Expected number of FPGAs in system
NumberOfFpga => 79,
use HPlot;
use Data::Dumper;
use List::Util qw(min max);
+use JSON::XS;
trb_init_ports() or die trb_strerror();
my %config = Dmon::StartUp();
my $multiplier= [[1,1,0.5,2],[1,1,0.5,0],[1,1,0.5,3.125],[1,1,0.5,0.5], [2.5,1.25,1,0.5]];
my $modedesc = [ 'Trb3sc', 'DiRich', 'Concentrator', 'Power-Voltages','Power-Currents'];
-
+my $LV1V;
+my $LV1V2;
+my $LV2V5;
HPlot::PlotInit({
name => "DiRichVolt",
HPlot::PlotAdd('DiRichVolt',$ret->[1][0]{$m}-3300,0);
HPlot::PlotAdd('DiRichVolt',$ret->[1][1]{$m}-2560,1);
HPlot::PlotAdd('DiRichVolt',$ret->[1][2]{$m}-1160,2);
+ my $sm = sprintf("0x%04x",$m);
+ $LV1V->{$sm} = $ret->[1][2]{$m};
+ $LV2V5->{$sm} = $ret->[1][1]{$m};
}
foreach my $m (sort keys %{$ret->[2][0]}) {
HPlot::PlotAdd('DiRichVolt',$ret->[2][0]{$m}-3300,0);
HPlot::PlotAdd('DiRichVolt',$ret->[2][1]{$m}-2560,1);
HPlot::PlotAdd('DiRichVolt',$ret->[2][2]{$m}-1260,2);
+ my $sm = sprintf("0x%04x",$m);
+ $LV1V2->{$sm} = $ret->[2][2]{$m};
}
HPlot::PlotLimitEntries('DiRichVolt',(scalar keys %{$ret->[1][0]}) + (scalar keys %{$ret->[2][0]}));
HPlot::PlotDraw('DiRichVolt');
# #back to normal SPI speed
# system("trbcmd w $board 0xd41a 7");
# print "\n";
+ my $updatetime = Dmon::getTimeString();
+ $LV1V->{min} = 1160;
+ $LV1V->{max} = 1350;
+ $LV1V->{symbol} = 'mV';
+ $LV1V->{title} = 'RICH 1.1V';
+ $LV1V->{updatetime} = $updatetime;
+
+ my $fh;
+ if ($config{Json}->[0] == 1){
+ open($fh, ">", Dmon::DMONDIR."/LV1V.json");
+ print $fh encode_json($LV1V);
+ close $fh;
+ }
+
+ $LV2V5->{min} = 2560;
+ $LV2V5->{max} = 2750;
+ $LV2V5->{symbol} = 'mV';
+ $LV2V5->{title} = 'RICH 2.5V';
+
+ $LV2V5->{updatetime} = $updatetime;
+
+ if ( $config{Json}->[0] == 1) {
+ open($fh, ">", Dmon::DMONDIR."/LV2V5.json");
+ print $fh encode_json($LV2V5);
+ close $fh;
+ }
+
+ $LV1V2->{min} = 1280;
+ $LV1V2->{max} = 1400;
+ $LV1V2->{symbol} = 'mV';
+ $LV1V2->{title} = 'RICH 1.2V';
+
+ $LV1V2->{updatetime} = $updatetime;
+
+ if ( $config{Json}->[0] == 1) {
+ open($fh, ">", Dmon::DMONDIR."/LV1V2.json");
+ print $fh encode_json($LV1V2);
+ close $fh;
+ }
sleep 2;
}
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use Time::HiRes qw( gettimeofday usleep time );
+use FileHandle;
+use Data::Dumper;
+use POSIX qw/floor ceil/;
+use List::Util qw'max min';
+# use Perl2Epics;
+use Encode qw(encode from_to);
+use JSON::XS;
+use HPlot;
+
+use Dmon;
+
+my $fqa = Dmon::OpenQAFile();
+
+use HADES::TrbNet;
+
+#my %config = Dmon::StartUp();
+
+my @str;
+
+my $store = {};
+my $laststore = {};
+my $values = {};
+my $color = {};
+my $raw = {};
+my $val;
+my $mailerrstatecnt = 0;
+my ($avgTmp,$sum,$count);
+my $ConnBoard = 0xc000;
+trb_init_ports() or die trb_strerror();
+
+my $plot = {
+ name => "envSensTempHist",
+ file => "./files/envSensTempHist",
+ entries => 2400,
+ type => HPlot::TYPE_HISTORY,
+ output => HPlot::OUT_PNG,
+ titles => ['M_T','BME_T'],
+ #titles => ['min','max','mean'],
+ xlabel => "Minutes",
+ ylabel => "Temperature [°C]",
+ sizex => 950,
+ sizey => 200,
+ #ymin => "*<15",
+ #ymax => "40<*",
+ curves => 2,
+ xscale => 12,
+ storable=> 1,
+ buffer => 1,
+ colors => ["#333333","#00ff00"],
+ additional => "set offsets 0,0,1.5,1.5"
+# colors => ["#333333","#00ff00","#ff0000"]
+ };
+HPlot::PlotInit($plot);
+
+my $plot_P = {
+ name => "envSensPressHist",
+ file => "./files/envSensPressHist",
+ entries => 2400,
+ type => HPlot::TYPE_HISTORY,
+ output => HPlot::OUT_PNG,
+ titles => ['Pressure'],
+ #titles => ['min','max','mean'],
+ xlabel => "Minutes",
+ ylabel => "Pressure [hPa]",
+ sizex => 950,
+ sizey => 200,
+ #ymin => "*<15",
+ #ymax => "40<*",
+ curves => 1,
+ xscale => 12,
+ storable=> 1,
+ buffer => 1,
+ colors => ["#333333"],
+ additional => "set offsets 0,0,1.5,1.5"
+# colors => ["#333333","#00ff00","#ff0000"]
+ };
+HPlot::PlotInit($plot_P);
+
+my $plot_H = {
+ name => "envSensHumidHist",
+ file => "./files/envSensHumidHist",
+ entries => 2400,
+ type => HPlot::TYPE_HISTORY,
+ output => HPlot::OUT_PNG,
+ titles => ['Humidity'],
+ #titles => ['min','max','mean'],
+ xlabel => "Minutes",
+ ylabel => "Humidity [%]",
+ sizex => 950,
+ sizey => 200,
+ #ymin => "*<15",
+ #ymax => "40<*",
+ curves => 1,
+ xscale => 12,
+ storable=> 1,
+ buffer => 1,
+ colors => ["#333333"],
+ additional => "set offsets 0,0,1.5,1.5"
+# colors => ["#333333","#00ff00","#ff0000"]
+ };
+HPlot::PlotInit($plot_H);
+
+my $plot_Mag = {
+ name => "envSensMagHist",
+ file => "./files/envSensMagHist",
+ entries => 2400,
+ type => HPlot::TYPE_HISTORY,
+ output => HPlot::OUT_PNG,
+ titles => ['X','Y','Z'],
+ #titles => ['min','max','mean'],
+ xlabel => "Minutes",
+ ylabel => "B [uT]",
+ sizex => 950,
+ sizey => 360,
+ #ymin => "*<15",
+ #ymax => "40<*",
+ curves => 3,
+ xscale => 12,
+ storable=> 1,
+ buffer => 1,
+ colors => ["#333333","#00ff00","#0000ff"],
+ additional => "set offsets 0,0,1.5,1.5"
+# colors => ["#333333","#00ff00","#ff0000"]
+ };
+HPlot::PlotInit($plot_Mag);
+
+my $timer = 0;
+
+while (1) {
+ $timer++;
+ my $data;
+ my $rich_temp = trb_register_read_mem($ConnBoard, 0xe610,0,9) or sleep 5 and next;
+ #$min = 1000;
+ #$max = 0;
+ $sum = 0;
+ my @t;
+
+ for (my $i=0;$i<9;$i++){
+ my $div = 1000;
+ if (($i == 0) || ($i==4)){
+ $div = 100;
+ } elsif ($i == 5) {
+ $div = 100000;
+ }
+ my $sign = ($rich_temp->{0xc000}[$i] >> 27) &0x1;
+ if ($sign == 0) {
+ $sign = 1;
+ } else {
+ $sign = -1;
+ }
+ if (($i == 5)){
+ push(@t, (($rich_temp->{0xc000}[$i] & 0x7FFFFFF)/$div));
+ }else {
+ push(@t, $sign*(($rich_temp->{0xc000}[$i] & 0x3FFFFFF)/$div));
+ }
+ #print Dumper @t;
+ }
+ $avgTmp = ($t[0]+$t[4] )/ 2;
+ #print $avg."\n";
+ $data->{avgTmp} = $avgTmp;
+ $data->{M_T} = $t[0];
+ $data->{M_X} = $t[1];
+ $data->{M_Y} = $t[2];
+ $data->{M_Z} = $t[3];
+ $data->{BME_T} = $t[4];
+ $data->{BME_P} = $t[5];
+ $data->{BME_H} = $t[6];
+ $data->{Light_0} = $t[7];
+ $data->{Light_1} = $t[8];
+# $data->{symbol} = " °C";
+ $data->{title} = "Environment Sensor Board";
+ $data->{updatetime} = Dmon::getTimeString();
+
+ HPlot::PlotAdd("envSensTempHist",$t[0],0);
+ HPlot::PlotAdd("envSensTempHist",$t[4],1);
+
+ HPlot::PlotAdd("envSensPressHist",$t[5],0);
+
+ HPlot::PlotAdd("envSensHumidHist",$t[6],0);
+
+ HPlot::PlotAdd("envSensMagHist",$t[1],0);
+ HPlot::PlotAdd("envSensMagHist",$t[2],1);
+ HPlot::PlotAdd("envSensMagHist",$t[3],2);
+
+ my $str = Dmon::MakeTitle(12, 30, "env Sensor Temp", 1, "");
+ $str .= qq@<img src="%ADDPNG envSensTempHist.png%" type="image/png">\n@;
+ $str .= qq@<img src="%ADDPNG envSensPressHist.png%" type="image/png">\n@;
+ $str .= qq@<img src="%ADDPNG envSensHumidHist.png%" type="image/png">\n@;
+ $str .= qq@<img src="%ADDPNG envSensMagHist.png%" type="image/png">\n@;
+ $str .= Dmon::MakeFooter();
+ Dmon::WriteFile("envSensHist", $str);
+
+ my $qastate = Dmon::GetQAState('below', $avgTmp, (32.0,33.0,35.0));
+ my $strAvg = sprintf("%.2f°C",$avgTmp);
+ Dmon::WriteQALog($fqa,"envSensor", 40, $qastate, "avg.Temp.", $strAvg,
+ "Gas Temperature on SensorBoard $t[0]°C and $t[4]°C");
+
+ my $qastate2 = Dmon::OK;#GetQAState('below', $t[5], (55.0,60.0,65.0));
+ my $str2 = sprintf("%.2f hPa",$t[5]);
+ Dmon::WriteQALog($fqa,"gaspress", 40, $qastate2, "Pressure", $str2,
+ "Pressure in mRICH: " . $str2);
+ my $qastate3 = Dmon::OK;#GetQAState('below', $t[5], (55.0,60.0,65.0));
+ my $str3 = sprintf("%.2f \%",$t[6]);
+ Dmon::WriteQALog($fqa,"gashumid", 40, $qastate3, "Humidity", $str3,
+ "Humidity in mRICH: ".$str3);
+
+ my $qastate4 = Dmon::OK;#GetQAState('below', $t[5], (55.0,60.0,65.0));
+ my $absMag = sqrt(($t[1]*$t[1])+($t[2]*$t[2])+($t[3]*$t[3]));
+ my $str4 = sprintf("%.2f uT",$absMag);
+ Dmon::WriteQALog($fqa,"mag", 40, $qastate4, "Magneticfield", $str4,
+ "absolut: ".$str4."<br>X-Axis: ".$t[1]."uT<br>Y-Axis: ".$t[2]."uT<br>Z-Axis: ".$t[3]."uT");
+
+
+ my $fh;
+ open($fh, ">", Dmon::DMONDIR."/EnvSensBoard.json");
+ print $fh encode_json($data);
+ close $fh;
+
+ if($timer%2 == 0) { #10 seconds
+ HPlot::PlotDraw("envSensTempHist");
+ HPlot::PlotDraw("envSensPressHist");
+ HPlot::PlotDraw("envSensHumidHist");
+ HPlot::PlotDraw("envSensMagHist");
+ }
+
+ sleep 5;
+}
#Generate output file at most once per second
if(1 || $oldtime < time) {
$oldtime = scalar time();
- $str = Dmon::MakeTitle($width,8,"Tactical Overview",1);
+ $str = Dmon::MakeTitle($width,7,"Tactical Overview",1);
$str .= "<div class=\"QA\">";
foreach my $row (@{$config{activeScripts}}) {
$str .= "<div class=\"header\" style=\"clear:both\">".($config{qaNames}->[$i++])."</div>\n";
my $plot0 = {
name => "RichRate",
-file => "files/RichRate",
+file => Dmon::DMONDIR."/RichRate",
title => "mRICH Rate",
entries => 72,
curves => 32,
output => HPlot::OUT_PNG,
zlabel => "Hitrate",
sizex => 800,
-sizey => 700,
+sizey => 533,
nokey => 1,
buffer => 1,
xmin => -0.5,
HPlot::PlotInit($plot0);
-my $str = Dmon::MakeTitle(11, 16, "RICH Hit Rate",0);
-$str .= qq@<img src="%ADDPNG files/RichRate.png%" type="image/png"><br>\n@;
+my $str = Dmon::MakeTitle(11, 12, "RICH Hit Rate",0);
+$str .= qq@<img src="%ADDPNG RichRate.png%" type="image/png"><br>\n@;
$str .= Dmon::MakeFooter();
Dmon::WriteFile("RichRate",$str);
trb_init_ports() or die trb_strerror();
- my $filename = 'files/mRICH_Mapping_20181227.geo';
+ my $filename = '/home/hadaq/trbsoft/daqtools/dmon/files/mRICH_Mapping_20181227.geo';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";
my $vdiff = ($o->{$b}->[$v+1]&0xfffffff) - ($old->{$b}->[$v+1]&0xfffffff);
if ($vdiff < 0) { $vdiff += 2**28;}
- $diff->{$b}->[$v+1] = $vdiff/($tdiff|1);
+ $diff->{$b}->[$v+1] = $vdiff/($tdiff || 2);
+
#$ratesum += $diff->{$b}->[$v+1];
if (defined $pos[$b&0xfff][$v+1][0] && defined $pos[$b&0xfff][$v+1][1]) {
HPlot::PlotFill('RichRate',$diff->{$b}->[$v+1],$pos[$b&0xfff][$v+1][0],$pos[$b&0xfff][$v+1][1]);
+
}
}
}
use HADES::TrbNet;
-my %config = Dmon::StartUp();
+#my %config = Dmon::StartUp();
my @str;
my $val;
my $mailerrstatecnt = 0;
my ($max,$min,$avg,$sum,$count);
+my ($max_bkpln,$min_bkpln,$avg_bkpln,$sum_bkpln,$count_bkpln);
trb_init_ports() or die trb_strerror();
while (1) {
my $data;
+ my $data_bkpln;
my $rich_temp1 = trb_register_read(0xfe51, 0x0) or sleep 5 and next;
my $rich_temp2 = trb_register_read(0xfe52, 0x0) or sleep 5 and next;
- my $rich_temp3 = trb_register_read($config{CtsAddress}, 0x0) or sleep 5 and next;
+ my $rich_temp3 = trb_register_read(0xc000, 0x0) or sleep 5 and next;
+ my $rich_temp_bkpln = trb_register_read_mem(0xc000, 0xe600,0,10) or sleep 5 and next;
+
my %rich_temp = (%{$rich_temp1},%{$rich_temp2},%{$rich_temp3});
- #print Dumper $rich_temp;
+#print Dumper $rich_temp_bkpln;
$min = 1000;
$max = 0;
$sum = 0;
$count = 0;
+
+ $min_bkpln = 1000;
+ $max_bkpln = 0;
+ $sum_bkpln = 0;
+ $count_bkpln = 0;
+
my $cts_temp = 0;
foreach my $b (keys %rich_temp) {
- if ($b == $config{CtsAddress}){
+ if ($b == 0xc000){
$cts_temp = ($rich_temp{$b}>>20)/16;
next;
}
$data->{updatetime} = Dmon::getTimeString();
-
+ #Backplane
+ for (my $i=0;$i<10;$i++) {
+ $count_bkpln ++;
+ #print $rich_temp_bkpln->{0xc000}[$i]."\n";
+ my $t = ($rich_temp_bkpln->{0xc000}[$i]>>0)/16;
+ #print $t."\n";
+ $min_bkpln = $t if $t < $min_bkpln;
+ $max_bkpln = $t if $t > $max_bkpln;
+ $sum_bkpln += $t;
+ my $reg_bkpln = 0xe600 + $i;
+ my $s = sprintf("0x%04x",$reg_bkpln);
+ $data_bkpln->{$s}=$t;
+ }
+ $avg_bkpln = $sum_bkpln / $count_bkpln;
+ $data_bkpln->{max} = $max_bkpln;
+ $data_bkpln->{min} = $min_bkpln;
+ $data_bkpln->{symbol} = " °C";
+ $data_bkpln->{title} = "RICH Temperature Backplane";
+ $data_bkpln->{updatetime} = Dmon::getTimeString();
+#End Backplane
my $qastate = Dmon::GetQAState('below', $max, (32.0,33.0,35.0));
my $str = sprintf("%i - %i", $min, $max);
Dmon::WriteQALog($fqa,"temperature_mrich", 40, $qastate, "Temperature", $str."°C",
my $str2 = sprintf("%i", $cts_temp, $max);
Dmon::WriteQALog($fqa,"cts_temp", 40, $qastate2, "CTS Temp", $str2."°C",
"Temperature on CTS Board: " . $str2. "°C");
-
+
+ my $qastate3;
+ my $str3;
+ if ($avg_bkpln == 0) {
+ $qastate3 = Dmon::WARN_2;
+ $str3 = "Not connected!";
+ } else {
+ $qastate3 = Dmon::GetQAState('below', $max_bkpln, (32.0,33.0,35.0));
+ $str3 = sprintf("%i - %i °C", $min_bkpln, $max_bkpln);
+ }
+
+ Dmon::WriteQALog($fqa,"bck", 40, $qastate3, "Backpl. Temp.", $str3,
+ "Temperature on Backplane: " . $str3);
my $fh;
open($fh, ">", Dmon::DMONDIR."/richTemperature.json");
print $fh encode_json($data);
close $fh;
+
+ open($fh, ">", Dmon::DMONDIR."/richTemperatureBpl.json");
+ print $fh encode_json($data_bkpln);
+ close $fh;
sleep 10;
}
system("mkdir -p /dev/shm/dmon");
system("mkdir -p /tmp/dmonlogs");
-system("ln -fs /dev/shm/dmon ../web/htdocs/dmon");
+system("sudo ln -fs /dev/shm/dmon /srv/www/htdocs/dmon");
+#system("ln -fs /dev/shm/dmon ../web/htdocs/dmon");
# system("ln -fs /tmp/dmonlogs /dev/shm/dmon/logs");
system("ln -fs `pwd`/code /dev/shm/dmon/");
+system("ln -fs `pwd`/webpage /dev/shm/dmon/");
system("ln -fs `pwd`/code/index.pl /dev/shm/dmon/index.pl");
print " <Dmon> Starting scripts...\n";
}
}
}
+
+foreach my $script (@{$config{activeScriptsNoOverview}}) {
+ next if $script eq '-';
+ $r=fork();
+ push(@l, $r);
+ if($r == 0) {
+ print "\t\tRunning ".$script."\n";
+ system("killall dmon_$script.pl");
+ system("scripts/dmon_$script.pl $ARGV[0] 2>>/tmp/dmonlogs/".$script."_log.txt");
+ exit;
+ }
+ }
+
+
END: {if($r!=0 and eof()) {foreach (@l) {wait}}}
/* Position the tooltip */
position: absolute;
z-index: 1;
+ transform: rotate(-90deg);
+ margin-left: -30px;
+ margin-top: -70px;
}
.dirich:hover .tooltiptext {
<h3 id="title">RICH Temperatures</h3><p id="updateTime" style="position: absolute; top: 0px;right: 1%;">updateTime:</p>
-<div class="box-detector">
+<div class="box-detector" style="transform: rotate(90deg);margin-top: 100px;">
<table>
<tr>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html>
+<head>
+
+
+<style>
+
+
+.box-detector {
+ float: left;
+}
+
+.box-color {
+ float: left;
+}
+
+.color-box-table {
+ height: 6px;
+}
+
+
+</style>
+
+<style>
+
+ .tooltiptext {
+ visibility: hidden;
+ width: 120px;
+ background-color: white;
+ color: #000;
+ text-align: center;
+ border-radius: 6px;
+ border: 1px solid black;
+ padding: 5px 0;
+ font-size: 12px;
+ margin: 10px;
+
+ /* Position the tooltip */
+ position: absolute;
+ z-index: 1;
+
+ transform: rotate(-90deg);
+ margin-left: -30px;
+ margin-top: -50px;
+
+}
+
+
+.pmt {
+ position: relative;
+ display: inline-block;
+ width : 60px;
+ height: 60px;
+ border: 1px solid black;
+}
+
+.pmt:hover .tooltiptext {
+ visibility: visible;
+}
+</style>
+
+
+</head>
+<body>
+
+
+<div style="border: 1px solid black;border-radius: 8px; background-Color: LightGray; height: 40px; width: 400px; padding-top: 6px; padding-left: 10px;">
+ <p style="display: inline">Min: </p><input style="width:60px" type="text" title="Min" name="Min" value="">
+ <p style="display: inline">Max: </p><input style="width:60px" type="text" title="Max" name="Max" value="">
+ <input type="submit" name="send" value="Send" onClick="loadDoc()">
+
+ <!--<input style="display: inline;" type="checkbox" Id="invertBox" checked="1" onClick="invertColorScale()">-->
+<select Id="invertBox" style="display: inline;" onClick="invertColorScale()">
+ <option value="0">bgr</option>
+ <option value="1">rgb</option>
+ <option value="2">gbr</option>
+</select>
+</div>
+
+
+<h3 id="title">RICH Temperatures</h3><p id="updateTime" style="position: absolute; top: 0px;right: 1%;">updateTime:</p>
+<div class="box-detector" style="transform: rotate(90deg);margin-top: 170px;">
+
+<div style="position: relative; width: 600px; top:50px; ">
+ <div style="position:relative;display:inline-block;">
+ <div class="pmt" id="0xe600"><span class="tooltiptext" id="0xe600_s">0xe600</span></div>
+ <div class="pmt" style="left: -3px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -6px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <br>
+ <div class="pmt" style="top: -5px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -5px;left: -3px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -5px;left: -6px;" id="0xe602"><span class="tooltiptext" id="0xe602_s">0xe602</span></div>
+ </div>
+
+ <div style="position:relative;display:inline-block;">
+ <div class="pmt" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -3px;" id="0xe601"><span class="tooltiptext" id="0xe601_s">0xe601</span></div>
+ <div class="pmt" style="left: -6px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <br>
+ <div class="pmt" style="top: -5px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -5px;left: -3px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -5px;left: -6px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ </div>
+
+ <div style="position:relative;display:inline-block;">
+ <div class="pmt" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -4px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -8px;" id="0xe603"><span class="tooltiptext" id="0xe603_s">0xe603</span></div>
+ <br>
+ <div class="pmt" style="top: -5px; " id="0xe604"><span class="tooltiptext" id="0xe604_s">0xe604</span></div>
+ <div class="pmt" style="top: -5px;left: -4px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -5px;left: -8px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ </div>
+
+
+ <!-- Next Line -->
+ <div style="position:relative;display:inline-block;">
+ <div class="pmt" id="0xe605"><span class="tooltiptext" id="0xe605_s">0xe605</span></div>
+ <div class="pmt" style="left: -3px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -6px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <br>
+ <div class="pmt" style="top: -4px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -4px;left: -3px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -4px;left: -6px;" id="0xe606"><span class="tooltiptext" id="0xe606_s">0xe606</span></div>
+ </div>
+
+ <div style="position:relative;display:inline-block;">
+ <div class="pmt" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -3px;" id="0xe607"><span class="tooltiptext" id="0xe607_s">0xe607</span></div>
+ <div class="pmt" style="left: -6px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <br>
+ <div class="pmt" style="top: -4px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -4px;left: -3px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -4px;left: -6px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ </div>
+
+ <div style="position:relative;display:inline-block">
+ <div class="pmt" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -4px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="left: -8px;" id="0xe609"><span class="tooltiptext" id="0xe609_s">0xe609</span></div>
+ <br>
+ <div class="pmt" style="top: -4px;" id="0xe608"><span class="tooltiptext" id="0xe608_s">0xe608</span></div>
+ <div class="pmt" style="top: -4px;left: -4px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ <div class="pmt" style="top: -4px;left: -8px;" id="0x0000"><span class="tooltiptext" id="0x0000_s">0x0000</span></div>
+ </div>
+</div>
+
+</div>
+<div class="box-color" style="margin-left: 30px">
+<table style="border-collapse: collapse; width: 50px; border: 0px;">
+ <tr>
+ <td class="color-box-table" id="color-box-table_1" style="border: 0px; background-color:hsl(00, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_2" style="border: 0px; background-color:hsl(05, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_3" style="border: 0px; background-color:hsl(10, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_4" style="border: 0px; background-color:hsl(15, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_5" style="border: 0px; background-color:hsl(20, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_6" style="border: 0px; background-color:hsl(25, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_7" style="border: 0px; background-color:hsl(30, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_8" style="border: 0px; background-color:hsl(35, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_9" style="border: 0px; background-color:hsl(40, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_10" style="border: 0px; background-color:hsl(45, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_11" style="border: 0px; background-color:hsl(50, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_12" style="border: 0px; background-color:hsl(55, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_13" style="border: 0px; background-color:hsl(60, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_14" style="border: 0px; background-color:hsl(65, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_15" style="border: 0px; background-color:hsl(70, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_16" style="border: 0px; background-color:hsl(75, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_17" style="border: 0px; background-color:hsl(80, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_18" style="border: 0px; background-color:hsl(85, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_19" style="border: 0px; background-color:hsl(90, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_20" style="border: 0px; background-color:hsl(95, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_21" style="border: 0px; background-color:hsl(100, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_22" style="border: 0px; background-color:hsl(105, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_23" style="border: 0px; background-color:hsl(110, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_24" style="border: 0px; background-color:hsl(115, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_25" style="border: 0px; background-color:hsl(120, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_26" style="border: 0px; background-color:hsl(125, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_27" style="border: 0px; background-color:hsl(130, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_28" style="border: 0px; background-color:hsl(135, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_29" style="border: 0px; background-color:hsl(140, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_30" style="border: 0px; background-color:hsl(145, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_31" style="border: 0px; background-color:hsl(150, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_32" style="border: 0px; background-color:hsl(155, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_33" style="border: 0px; background-color:hsl(160, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_34" style="border: 0px; background-color:hsl(165, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_35" style="border: 0px; background-color:hsl(170, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_36" style="border: 0px; background-color:hsl(175, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_37" style="border: 0px; background-color:hsl(180, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_38" style="border: 0px; background-color:hsl(185, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_39" style="border: 0px; background-color:hsl(190, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_40" style="border: 0px; background-color:hsl(195, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_41" style="border: 0px; background-color:hsl(200, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_42" style="border: 0px; background-color:hsl(205, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_43" style="border: 0px; background-color:hsl(210, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_44" style="border: 0px; background-color:hsl(215, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_45" style="border: 0px; background-color:hsl(220, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_46" style="border: 0px; background-color:hsl(225, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_47" style="border: 0px; background-color:hsl(230, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_48" style="border: 0px; background-color:hsl(235, 100%, 55%)" ></td>
+ </tr>
+ <tr>
+ <td class="color-box-table" id="color-box-table_49" style="border: 0px; background-color:hsl(240, 100%, 55%)" ></td>
+ </tr>
+</table>
+</div>
+<p id="MaxVal" >max</p>
+<p id="MinVal" style="margin-top:355px;"> min</p>
+
+<p id="cutoff"></p>
+
+
+<script type="text/javascript">
+
+var min = 20;
+var max = 80;
+var manualMax = 0;
+var manualMin = 0;
+var invert = 0;
+var symbol = '';
+var file = window.location.hash.substr(1);
+var hashvar = window.location.hash.substr(1).split("#");
+
+var pos = file.indexOf("#");
+var cutoff = window.location.hash.substr(pos+2);
+
+//if (invertFlagHash != undefined ) {
+// invert = window.location.hash.substr(1);
+//}
+document.getElementById("invertBox").checked == false;
+var myReload = setInterval("getdata('../code/getjson.cgi?'+file,updatedata)",10000);
+
+if (pos == -1) {
+ cutoff = 0
+} else {
+ document.getElementById("cutoff").innerHTML = "Cutoff: " + cutoff;
+}
+
+invertColorScale();
+
+function invertColorScale(){
+ if (document.getElementById("invertBox").value == 1) {
+ for (i = 1; i < 50; i++) {
+ document.getElementById("color-box-table_"+i).style.backgroundColor = "hsl("+(240-((i-1)*5))+", 100%, 55%)";
+ }
+ } else if (document.getElementById("invertBox").value == 2) {
+ var cnt=49;
+ for (i = 1; i < 50; i++) {
+ document.getElementById("color-box-table_"+i).style.backgroundColor = "hsl("+((110+ ((cnt-1)*5)))%360+", 100%, 55%)";
+ cnt--;
+ }
+ } else {
+ for (i = 1; i < 50; i++) {
+ document.getElementById("color-box-table_"+i).style.backgroundColor = "hsl("+(i-1)*5+", 100%, 55%)";
+ }
+ }
+
+ getdata('../code/getjson.cgi?'+file,updatedata);
+}
+
+function color(id,value) {
+ var val = map(value,min,max);
+ var x = 240.0 - val;
+ if(!document.getElementById(id)) {return;}
+ if (val == -1) {
+ if (document.getElementById("invertBox").value == 2) {
+ document.getElementById(id).style.backgroundColor = "#FFF200";
+ } else {
+ document.getElementById(id).style.backgroundColor = "#FF00FF";
+ }
+ } else {
+ if (document.getElementById("invertBox").value == 1) {
+ document.getElementById(id).style.backgroundColor = "hsl("+(val)+", 100%, 55%)";
+ } else if (document.getElementById("invertBox").value == 2) {
+ document.getElementById(id).style.backgroundColor = "hsl("+(110+val)%360 +", 100%, 55%)";
+ } else {
+ document.getElementById(id).style.backgroundColor = "hsl("+x+", 100%, 55%)";
+ }
+ }
+
+ document.getElementById(id+"_s").innerHTML = id +": " + value.toFixed(2) + " " + symbol;
+
+ function map(val,min,max) {
+ var test;
+ //var range = (max - min)/48;
+ if (min<max && val >= min && val <= max) {
+ test = ((val - min)/(max - min))*240;
+ } else {
+ test = -1;
+ }
+ return test;
+ }
+}
+
+function getdata(command,callback) {
+ var xmlhttp = null;
+ var cb = null;
+ xmlhttp=new XMLHttpRequest();
+ cb = callback;
+
+ xmlhttp.onreadystatechange = function() {
+ if(xmlhttp.readyState == 4) {
+ if(cb)
+ cb(xmlhttp.responseText);
+ }
+ }
+ xmlhttp.open("GET",command,true);
+ xmlhttp.send(null);
+ }
+
+function updatedata(d) {
+ var data;
+ try {
+ data = JSON.parse(d);
+ max = data['max'];
+ min = data['min'];
+ symbol = data['symbol'];
+
+ if (pos != -1) {
+ max = parseInt(cutoff);
+ }
+
+ if (manualMin != "") {
+ min = parseInt(manualMin); //min
+ }
+
+ if (manualMax != "") {
+ max = parseInt(manualMax); //max
+ }
+
+ document.getElementById("MaxVal").innerHTML = max.toFixed(2) + " " + symbol;
+ document.getElementById("MinVal").innerHTML = min.toFixed(2)+ " " + symbol;
+ document.getElementById("title").innerHTML = data["title"];
+
+ if (data['updatetime'] != undefined) {
+ document.getElementById("updateTime").innerHTML = "last update: " + data['updatetime'];
+ } else {
+ document.getElementById("updateTime").innerHTML = "Error";
+ }
+
+ resetColor();
+
+ for (var k in data) {
+ if (k.substring(0,3) == "0xe") {
+ color(k,data[k]);
+ }
+
+ }
+ }
+ catch (e) {
+ }
+ }
+
+
+function loadDoc() {
+ var inputTag = document.getElementsByTagName("input");
+ manualMin = inputTag[0].value; //min
+ manualMax = inputTag[1].value; //max
+
+ getdata('../code/getjson.cgi?'+file,updatedata);
+}
+
+
+function resetColor(){
+ var dirichColor = document.getElementsByClassName("pmt");
+ for (var j=0;j<dirichColor.length;j++) {
+ dirichColor[j].style.backgroundColor = "White";
+ }
+}
+</script>
+</body>
+</html>
+
+<!--TODO
+- remove missing boards
+- color scale overflow handling
+- invert color scale for voltages? "green is good, slightly yellow - well, blue - too high but who cares, red = bad"
+-->
+