]> jspc29.x-matter.uni-frankfurt.de Git - daqtools.git/commitdiff
dmon updates for mRICH
authorAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Wed, 27 Feb 2019 12:55:17 +0000 (13:55 +0100)
committerAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Wed, 27 Feb 2019 12:55:17 +0000 (13:55 +0100)
12 files changed:
dmon/code/get.pl
dmon/code/index.pl
dmon/code/read_mRICH_ipBus.py [new file with mode: 0755]
dmon/mRICH_config.pl
dmon/scripts/dmon_adcvolt.pl
dmon/scripts/dmon_envSensor.pl [new file with mode: 0755]
dmon/scripts/dmon_qa.pl
dmon/scripts/dmon_richrate.pl
dmon/scripts/dmon_temperature_mrich.pl
dmon/start.pl
dmon/webpage/mrich_drawing.html
dmon/webpage/mrich_drawing_bpl.html [new file with mode: 0644]

index c728aa7f9d867f9f04c5072ebe5df17c56439b10..bdbadb7d5bc0ac54d2809f83b786443d7c35bfd5 100755 (executable)
@@ -13,6 +13,7 @@ if ($ENV{'SERVER_SOFTWARE'} =~ /HTTPi/i) {
 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'});
@@ -76,4 +77,4 @@ my $out;
                }
                        
 print $out;
-               
\ No newline at end of file
+               
index dab0eb208e6191b1b251b63e2e157251491e2dd3..258d7a68fba372abbdac4458001a551b59d4535b 100755 (executable)
@@ -28,19 +28,28 @@ function openwin(url) {
        }
 </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);
diff --git a/dmon/code/read_mRICH_ipBus.py b/dmon/code/read_mRICH_ipBus.py
new file mode 100755 (executable)
index 0000000..65cc543
--- /dev/null
@@ -0,0 +1,29 @@
+#!/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);
+
+
index 2e92124b016dfb5a0c286473dba09c1dd0a35681..d01f50a887ff9a6c5392e454aef70e5695e40645 100644 (file)
@@ -5,10 +5,13 @@
 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,       
index 627f8267599db63dcfdb991af9caa6e0e830846c..cc8101d8b014a99922878f164a63a278a0a78b03 100755 (executable)
@@ -11,6 +11,7 @@ use Dmon;
 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();
@@ -31,7 +32,9 @@ my $resolution = [[2,1,2,1],  [2,2,2,1],  [2,2,2,4],      [2,2,2,2],       [3,3,
 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",
@@ -186,11 +189,16 @@ while(1) {
     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');
@@ -311,7 +319,46 @@ while(1) {
 # #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;
 }
diff --git a/dmon/scripts/dmon_envSensor.pl b/dmon/scripts/dmon_envSensor.pl
new file mode 100755 (executable)
index 0000000..f6debf6
--- /dev/null
@@ -0,0 +1,232 @@
+#!/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} = " &degC";
+   $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;
+}
index b2cd613b7434e6a53ceaabb78caf4ec7e77816a8..236c99edb23c74bc27138f8e479539e6cea15d33 100755 (executable)
@@ -50,7 +50,7 @@ while($a = <FLOG>) {
 #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";
index dbf6cc10af008e690fed1362bb79f2562d694a18..b8a45e89b589b02d54c6840700ca155243424b47 100755 (executable)
@@ -16,7 +16,7 @@ use JSON::XS;
 
 my $plot0 = {
 name    => "RichRate",
-file    => "files/RichRate",
+file    => Dmon::DMONDIR."/RichRate",
 title   => "mRICH Rate",
 entries => 72,
 curves  => 32,
@@ -24,7 +24,7 @@ type    => HPlot::TYPE_HEATMAP,
 output  => HPlot::OUT_PNG,
 zlabel  => "Hitrate",
 sizex   => 800,
-sizey   => 700,
+sizey   => 533,
 nokey   => 1,
 buffer  => 1,
 xmin    => -0.5,
@@ -39,8 +39,8 @@ showvalues => 0,  };
 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);
 
@@ -55,7 +55,7 @@ my $iter = 0;
 
 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' $!";
@@ -93,10 +93,12 @@ while(1) {
         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]);
+
         }
         }
       }
index 24bfbb8fb5a93bbd37cfcf478fe9ba8389184c59..7065a5e2bb33b294541142dd784094902f839dd3 100755 (executable)
@@ -17,7 +17,7 @@ my $fqa  = Dmon::OpenQAFile();
 
 use HADES::TrbNet;
 
-my %config = Dmon::StartUp();
+#my %config = Dmon::StartUp();
 
 my @str;
 
@@ -29,24 +29,34 @@ my $raw = {};
 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;
     }
@@ -67,7 +77,26 @@ while (1) {
   $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} = " &degC";
+  $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", 
@@ -77,12 +106,28 @@ while (1) {
   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;
 }
index 3ac7c6dcece57e8e8f2040586102d9e438429b20..117a2501c47a1da23c485849952635b0a94cdf6f 100755 (executable)
@@ -25,9 +25,11 @@ print "  <Dmon>     Creating Files and Links...\n";
 
 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";
@@ -49,6 +51,20 @@ foreach my $row (@{$config{activeScripts}}) {
       } 
     }
   }
+
+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}}}
 
 
index ad39bf8a81420fdff68f4fb9dd9f5f5f802cadf6..d958a834f41781a07a47c9fb8cee4eb51225dbb0 100644 (file)
@@ -94,6 +94,9 @@ td {
     /* Position the tooltip */
     position: absolute;
     z-index: 1;
+    transform: rotate(-90deg);
+    margin-left: -30px;
+    margin-top:  -70px;
 }
 
 .dirich:hover .tooltiptext {
@@ -153,7 +156,7 @@ td {
 
 
 <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>
diff --git a/dmon/webpage/mrich_drawing_bpl.html b/dmon/webpage/mrich_drawing_bpl.html
new file mode 100644 (file)
index 0000000..58d1926
--- /dev/null
@@ -0,0 +1,473 @@
+<!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"
+-->
+