]> jspc29.x-matter.uni-frankfurt.de Git - daqtools.git/commitdiff
new DMON files
authorAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Tue, 18 Dec 2018 13:59:19 +0000 (14:59 +0100)
committerAdrian Weber <adrian.a.weber@exp2.physik.uni-giessen.de>
Tue, 18 Dec 2018 13:59:19 +0000 (14:59 +0100)
dmon/code/getjson.cgi [new file with mode: 0755]
dmon/scripts/dmon_HMP4040.pl [new file with mode: 0755]
dmon/scripts/dmon_temperature_mrich.pl [new file with mode: 0755]
dmon/scripts/dmon_timeouts.pl [new file with mode: 0755]
dmon/scripts/dmon_trbnet.pl [new file with mode: 0755]
dmon/scripts/dmon_trigNr.pl [new file with mode: 0755]
dmon/webpage/mrich_drawing.html [new file with mode: 0644]

diff --git a/dmon/code/getjson.cgi b/dmon/code/getjson.cgi
new file mode 100755 (executable)
index 0000000..eb0cdde
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use Data::Dumper;
+use File::Copy;
+use Dmon;
+
+my @args = split('-',$ENV{'QUERY_STRING'});
+
+
+
+
+if($args[0] eq 'custom') {
+  
+  my @query = split('-',$ENV{'QUERY_STRING'},2);
+
+  system("QUERY_STRING=$query[1] /home/hadaq/trbsoft/daqtools/web/htdocs/tools/daq2json.pl");
+        
+
+  }
+else {  
+  print "Cache-Control: no-cache, must-revalidate, max-age=1\r\n";
+  print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\r\n";
+  print "Content-type: application/json\r\n\r\n";
+  unless($args[0] && $args[0] =~ m/\w+/) {exit;}
+  system ("cat ".Dmon::DMONDIR.$args[0].".json")  if -e Dmon::DMONDIR.$args[0].".json";
+  }
+
diff --git a/dmon/scripts/dmon_HMP4040.pl b/dmon/scripts/dmon_HMP4040.pl
new file mode 100755 (executable)
index 0000000..7042241
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+use FileHandle;
+use Data::Dumper;
+use POSIX qw(strftime);
+use Dmon;
+use JSON::XS;
+use HPlot;
+
+my $fqa  = Dmon::OpenQAFile();
+
+while(1) {
+#  my $fh;
+  my $data;
+  open(FH, "</dev/shm/dmon/HMP4040LV.json") or die "Couldn't open file file.txt, $!";
+  while(<FH>) {
+   $data = decode_json $_;
+  }
+  
+  my $Out3On="";
+  my $Out4On="";
+  my @HMP;
+  
+  if (defined ($data)){
+    foreach my $b (keys $data) {
+      #print $b."  ".$data->{$b}."\n";
+      my $chnl;
+      if ($b =~ /INST1/) {$chnl = 1;}
+      if ($b =~ /INST2/) {$chnl = 2;}
+      if ($b =~ /INST3/) {$chnl = 3;}
+      if ($b =~ /INST4/) {$chnl = 4;}
+      if (defined $chnl) {
+        if ($b =~ /OUTP:STAT?/) {
+          $HMP->{$chnl}->{Stat} = $data->{$b};
+          if ($data->{$b} == 1) {
+            $HMP->{$chnl}->{StatStr} = "ON";
+          } else {
+            $HMP->{$chnl}->{StatStr} = "OFF";
+          }
+        } elsif ($b =~ /MEAS:CURR?/) {
+          $HMP->{$chnl}->{curr} = $data->{$b};
+        } elsif ($b =~ /MEAS:VOLT?/) {
+          $HMP->{$chnl}->{volt} = $data->{$b};
+        }
+        #if ($b eq "INST3_OUTP:STAT?") {if ($data->{$b}==1) {$Out3On = "ON";} else {$Out3On = "OFF";} }
+        #if ($b eq "INST4_OUTP:STAT?") { if ($data->{$b}==1) {$Out4On = "ON";} else {$Out4On = "OFF";} }
+      }
+    }
+  }
+  my $qastate = Dmon::ERROR;
+  $qastate    = Dmon::WARN if (( ($HMP->{3}->{StatStr} eq "ON") && ($HMP->{4}->{StatStr} eq "OFF"))|| ( ($HMP->{3}->{StatStr} eq "OFF") && ($HMP->{4}->{StatStr} eq "ON")));
+  $qastate    = Dmon::OK   if (($HMP->{3}->{StatStr} eq "ON") && ($HMP->{4}->{StatStr} eq "ON")); 
+  
+  my $qalong ="<table>";
+  $qalong .= "<tr><td>";
+  for (my $i=1;$i<5;$i++){
+    $qalong .= "<td>|</td></td><td>Ch ".$i." : ". ($HMP->{$i}->{StatStr}) ."</td>";
+  }  
+  $qalong .= "</tr><tr><td>Voltage [V]</td>";
+  for (my $i=1;$i<5;$i++){
+    $qalong .= sprintf("<td>|</td></td><td> %2.4f </td>",($HMP->{$i}->{volt}));
+  }  
+  $qalong .= "</tr><tr><td>Current [A]</td>";
+  for (my $i=1;$i<5;$i++){
+    $qalong .= sprintf("<td>|</td></td><td> %2.4f </td>",($HMP->{$i}->{curr}));
+  } 
+  $qalong .="</tr></table>";
+  #my $str = sprintf("%i - %i", $min, $max);
+  Dmon::WriteQALog($fqa,"HMP4040", 40, $qastate, "HMP4040", $HMP->{3}->{StatStr}." | ".$HMP->{4}->{StatStr},$qalong);
+  
+  sleep(5);
+}
diff --git a/dmon/scripts/dmon_temperature_mrich.pl b/dmon/scripts/dmon_temperature_mrich.pl
new file mode 100755 (executable)
index 0000000..24bfbb8
--- /dev/null
@@ -0,0 +1,88 @@
+#!/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 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 ($max,$min,$avg,$sum,$count);
+
+trb_init_ports() or die trb_strerror();
+
+
+while (1) {
+  my $data;
+  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_temp = (%{$rich_temp1},%{$rich_temp2},%{$rich_temp3});
+  #print Dumper $rich_temp;
+  $min = 1000;
+  $max = 0;
+  $sum = 0;
+  $count = 0;
+  my $cts_temp = 0;
+  foreach my $b (keys %rich_temp) {
+    if ($b == $config{CtsAddress}){
+      $cts_temp = ($rich_temp{$b}>>20)/16; 
+      next;
+    }
+    $count ++;
+    my $t = ($rich_temp{$b}>>20)/16;
+    $min = $t if $t < $min;
+    $max = $t if $t > $max;
+    $sum += $t;
+    my $s = sprintf("0x%04x",$b);
+    $data->{$s}=$t;
+    }
+  $avg = $sum / $count;
+  $data->{max} = $max;
+  $data->{min} = $min;
+  $data->{symbol} = " &degC";
+  $data->{title} = "RICH Temperature";
+  
+  $data->{updatetime} = Dmon::getTimeString();
+  
+  
+
+  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", 
+                 "Min/Max temperature on DiRich " . $str."°C");
+
+  my $qastate2 = Dmon::GetQAState('below', $cts_temp, (55.0,60.0,65.0));
+  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 $fh;
+  open($fh, ">", Dmon::DMONDIR."/richTemperature.json");
+  print $fh   encode_json($data);
+  close $fh;
+                 
+  sleep 10;
+}
diff --git a/dmon/scripts/dmon_timeouts.pl b/dmon/scripts/dmon_timeouts.pl
new file mode 100755 (executable)
index 0000000..3352cfc
--- /dev/null
@@ -0,0 +1,69 @@
+#!/usr/bin/perl -w
+use warnings;
+use strict;
+use Data::Dumper;
+use Dmon;
+use HADES::TrbNet;
+
+trb_init_ports() or die trb_strerror();
+#Dmon::TraceDBLoad();
+
+
+
+my $fqa = Dmon::OpenQAFile();
+my $logcnt = 0;
+
+while (1) {
+  my $msg = "";
+  my $msg2 = "";
+  my $cnt = 0;
+  my $cnt2 = 0;
+  my $boardlist1 = "";
+  my $boardlist2 = "";
+
+  my $rh_hubs = trb_register_read(0xfffe, 0x8b)
+    or sleep 5 and next;
+
+  foreach my $board (sort {$a <=> $b} keys %$rh_hubs) {
+    if (($rh_hubs->{$board} & 0xffff) != 0x0000) {
+      #$msg .= ", " if $msg ne "";
+      #$msg .= sprintf("%04x-%04x (",$board,$rh_hubs->{$board} & 0xffff);
+      #foreach my $i (1..8) {
+      #  if ($rh_hubs->{$board} & (1<<$i)) {
+      #    $msg .= sprintf("0x%04x ",Hmon::TraceDBGet($board,$i));
+      #    $boardlist1 .= sprintf("%04X, ",Hmon::TraceDBGet($board,$i));
+      #    }
+      #  }
+      #$msg .= ")";
+      $cnt++;
+    }
+    if ((($rh_hubs->{$board}>>16) & 0xffff) != 0x0000 && (($board > 0x1000 && $board < 0x1200  && $board%16) || ($board&0xff00 == 0x8a00) || ($board&0xff00 == 0x8200))) {
+      #$msg2 .= ", " if $msg2 ne "";
+      #$msg2 .= sprintf("%04x-%04x (",$board,$rh_hubs->{$board}>>16 & 0xffff);
+      #foreach my $i (1..8) {
+      #  if ($rh_hubs->{$board} & (1<<($i+16))) {
+      #    $msg2 .= sprintf(" %04x",Hmon::TraceDBGet($board,$i));
+      #    $boardlist2 .= sprintf("%04X, ",Hmon::TraceDBGet($board,$i));
+      #    }
+      #  }
+      #$msg2 .= " )";
+      $cnt2++;
+    }
+  }
+
+  #$boardlist1 =~ s/(\w)(\w)/$1 $2 /gi;
+  #$boardlist2 =~ s/(\w)(\w)/$1 $2 /gi;
+
+  
+  #$msg =~ s/\s+\)/\)/g;   $msg =~ s/\(\s+/\(/g;
+  #$msg2 =~ s/\s+\)/\)/g;  $msg2 =~ s/\(\s+/\(/g;
+  my $status = "on ".($cnt+$cnt2)." boards";
+  my $qastate = Dmon::GetQAState('below', $cnt+$cnt2, (0, 0, 1));
+
+  Dmon::WriteQALog($fqa, "timeouts", 20, $qastate, "Timeouts",
+                $status, "Timeouts " . $status ." - Timeouts: $cnt.");# $msg - Ports off due to earlier timeouts: $cnt2. $msg2");
+  #system("logger -p local1.info -t DAQ 'Hmon <E> Timeouts found: $msg'")
+   # if $msg ne "" && $logcnt++ < 50;
+
+  sleep 3;
+}
diff --git a/dmon/scripts/dmon_trbnet.pl b/dmon/scripts/dmon_trbnet.pl
new file mode 100755 (executable)
index 0000000..6e24c6b
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+use Time::HiRes qw( gettimeofday usleep time );
+use FileHandle;
+use Data::Dumper;
+use POSIX qw/floor ceil/;
+use Dmon;
+
+my $fqa = Dmon::OpenQAFile();
+
+my $qastate = Dmon::OK;
+my $lastqastate = Dmon::OK;
+my $cmd = "trbcmd r 0xc000 0 2>&1";
+my $msg;
+my $status = "OK";
+my @out;
+
+
+
+while(1) {
+  $msg = "";
+  $qastate = Dmon::NA;
+  $status  = "N/A";
+  @out = ("Starting");
+  
+  @out = Dmon::qxtimeout($cmd,12);
+    
+  foreach my $s (@out) {
+    chomp $s;
+#      print $s."\n";
+    if ($s =~ /0x(\w{4})\s+0x(\w{8})/ && $status eq "N/A") {
+      $status = "OK";
+      $qastate = Dmon::OK;
+                       }
+       if ($s =~ /RPC:\s+(.+)/) {
+                       $qastate = Dmon::ERROR+1;
+                       $status = "Error";
+                       $msg .= " - " unless $msg eq "";
+                       $msg .= $1;
+                       }
+    if ($s =~ /ERROR:\s+(.+)/) {
+                       $qastate = Dmon::ERROR+2;
+                       $status = "Error";
+                       $msg .= " - " unless $msg eq "";
+                       $msg .= $1;
+                       }
+    if ($s =~ /WARNING:\s+(.+)/) {
+                       $qastate = Dmon::WARN_2;
+                       $status = "Warning";
+                       $msg .= " - " unless $msg eq "";
+                       $msg .= $1;
+                       }
+               if ($s =~ /qxtimeout/) {
+      $qastate = Dmon::FATAL;
+      $status = "Timeout";
+      $msg = "trbnetd didn't answer within 12 seconds";
+      }
+               }
+       Dmon::WriteQALog($fqa,,"trbnet",3,$qastate,"TrbNet",$status,$msg);
+#      print $status;
+#      if($lastqastate != $qastate) {
+#        $msg =~ s/'//g;
+#    system("logger -p local1.info -t DAQ 'Trbnet \<E\> $msg '") if $qastate == QA::FATAL;
+#    system("logger -p local1.info -t DAQ 'Trbnet \<W\> $msg '") if $qastate == QA::WARN;
+#    }
+       $lastqastate = $qastate;
+       sleep 1;
+       }
diff --git a/dmon/scripts/dmon_trigNr.pl b/dmon/scripts/dmon_trigNr.pl
new file mode 100755 (executable)
index 0000000..df8f180
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use Data::Dumper;
+use Dmon;
+use HADES::TrbNet;
+
+my %config = Dmon::StartUp();
+
+
+my $fqa = Dmon::OpenQAFile() or die "No connection to QA Logfile";
+
+trb_init_ports() or die trb_strerror();
+
+while (1) {
+  my $trbneterr0 = 0;
+  my $trbneterr1 = 0;
+  my $rh_trignr = trb_register_read($config{CtsAddress}, 0xa13c) or $trbneterr0 = 1; #sleep 5 and next;
+  my $rh_selCh = trb_register_read($config{CtsAddress}, 0xa101) or $trbneterr1 = 1; #sleep 5 and next;
+  my $str="";
+  
+  if(($trbneterr0 == 0) and ($trbneterr1 == 0)) {
+  
+    #my $trignr->{0} = $rh_trignr->{$config{CtsAddress}} & 0xf;
+    #if (($rh_trig->{$config{CtsAddress}} & 0x1) == 1) {
+      $str.= sprintf("0x%x", ($rh_trignr->{$config{CtsAddress}} & 0xf));
+    #}
+
+    my $qastate;
+    my $qashort;
+    my $qalong;
+    #my $test=$rh_trignr->{$config{CtsAddress}} & 0xf;
+    
+    $qashort = $str;
+    $qastate = Dmon::OK;
+    $qastate = Dmon::WARN_2 if (!($rh_selCh->{$config{CtsAddress}} & 0x1));
+    $qalong = $str;
+    
+    Dmon::WriteQALog($fqa, "trigNr", 5, $qastate, "Ext. Triggers",
+                  $qashort, $qalong);
+    #print $test."   ".$qashort."\n";
+    sleep(2);
+    }
+  else {
+    Dmon::WriteQALog($fqa, "trigNr", 30, Dmon::ERROR, "Ext. Triggers", "N/A", "N/A");
+    sleep(10);
+    }
+}
diff --git a/dmon/webpage/mrich_drawing.html b/dmon/webpage/mrich_drawing.html
new file mode 100644 (file)
index 0000000..ad39bf8
--- /dev/null
@@ -0,0 +1,644 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html>
+<head>
+
+
+<style>
+td {
+    border: 1px solid black;
+    height: 18px;
+    width:  18px;
+    font-size: 5px;
+}
+
+.combiner-v {
+    background-color: #fff;
+    width: 18px;
+    height: 180px;
+}
+
+.power-v {
+    background-color: #fff;
+}
+
+.power-h {
+    background-color: #fff;
+}
+
+.power-4-v {
+    background-color: #fff;
+}
+
+.power-4-h {
+    background-color: #fff;
+}
+
+.combiner-h {
+    background-color: #fff;
+    height: 14px;
+    width: 10px;
+}
+
+.combiner-4-h {
+    background-color: #fff;
+    width: 60px;
+}
+
+.combiner-4-v {
+    background-color: #fff;
+    height: 60px;
+}
+
+.beam-pipe {
+   height: 60px;
+   width: 60px;
+   border-radius: 40px;
+}
+.empty-box {
+   border: 0px solid black;
+}
+
+.box-detector {
+   float: left;
+}
+
+.box-color {
+   float: left;
+}
+
+.color-box-table {
+   height: 6px;
+}
+
+.dirich {
+   background-color: #fff;
+}
+
+</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;
+}
+
+.dirich:hover .tooltiptext {
+    visibility: visible;
+}
+
+.combiner-h:hover .tooltiptext {
+    visibility: visible;
+}
+
+.combiner-v:hover .tooltiptext {
+    visibility: visible;
+}
+
+.combiner-4-h:hover .tooltiptext {
+    visibility: visible;
+}
+
+.combiner-4-v:hover .tooltiptext {
+    visibility: visible;
+}
+
+.power-v:hover .tooltiptext {
+    visibility: visible;
+}
+
+.power-h:hover .tooltiptext {
+    visibility: visible;
+}
+
+.power-4-h:hover .tooltiptext {
+    visibility: visible;
+}
+
+.power-4-v: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">
+
+  <table>
+    <tr>
+
+      <td class="combiner-v" rowspan="6" colspan="2" id="0x8210"><span class="tooltiptext" id="0x8210_s">0x8210</span></td>
+<!-- Combiner -->
+      <td class="dirich" rowspan="3" colspan="1" id="0x7300"><span class="tooltiptext" id="0x7300_s">0x7300</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7301"><span class="tooltiptext" id="0x7301_s">0x7301</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7310"><span class="tooltiptext" id="0x7310_s">0x7310</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7311"><span class="tooltiptext" id="0x7311_s">0x7311</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7320"><span class="tooltiptext" id="0x7320_s">0x7320</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7321"><span class="tooltiptext" id="0x7321_s">0x7321</span></td>
+      <td class="power-v" rowspan="6" colspan="1" ></td>  <!-- Powermodul -->
+      
+      
+      <td class="combiner-v" rowspan="6" colspan="2" id="0x8211"><span class="tooltiptext" id="0x8211_s">0x8211</span></td>
+<!-- Combiner -->
+      <td class="dirich" rowspan="3" colspan="1" id="0x7330"><span class="tooltiptext" id="0x7330_s">0x7330</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7331"><span class="tooltiptext" id="0x7331_s">0x7331</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7340"><span class="tooltiptext" id="0x7340_s">0x7340</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7341"><span class="tooltiptext" id="0x7341_s">0x7341</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7350"><span class="tooltiptext" id="0x7350_s">0x7350</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7351"><span class="tooltiptext" id="0x7351_s">0x7351</span></td>
+      <td class="power-v" rowspan="6" colspan="1" ></td>  <!-- Powermodul -->
+
+      <td class="combiner-v" rowspan="6" colspan="2" id="0x8212"><span class="tooltiptext" id="0x8212_s">0x8212</span></td><!-- Combiner -->
+      <td class="dirich" rowspan="3" colspan="1" id="0x7360"><span class="tooltiptext" id="0x7360_s">0x7360</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7361"><span class="tooltiptext" id="0x7361_s">0x7361</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7370"><span class="tooltiptext" id="0x7370_s">0x7370</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7371"><span class="tooltiptext" id="0x7371_s">0x7371</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7380"><span class="tooltiptext" id="0x7380_s">0x7380</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7381"><span class="tooltiptext" id="0x7381_s">0x7381</span></td>
+      <td class="power-v" rowspan="6" colspan="1"></td>
+  
+
+    </tr>
+    
+    <tr>
+    </tr>
+    
+    <tr>
+    </tr>
+    
+    <tr>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7200"><span class="tooltiptext" id="0x7200_s">0x7200</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7201"><span class="tooltiptext" id="0x7201_s">0x7201</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7210"><span class="tooltiptext" id="0x7210_s">0x7210</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7211"><span class="tooltiptext" id="0x7211_s">0x7211</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7220"><span class="tooltiptext" id="0x7220_s">0x7220</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7221"><span class="tooltiptext" id="0x7221_s">0x7221</span></td>
+                                                                                                  
+      <td class="dirich" rowspan="3" colspan="1" id="0x7230"><span class="tooltiptext" id="0x7230_s">0x7230</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7231"><span class="tooltiptext" id="0x7231_s">0x7231</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7240"><span class="tooltiptext" id="0x7240_s">0x7240</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7241"><span class="tooltiptext" id="0x7241_s">0x7241</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7250"><span class="tooltiptext" id="0x7250_s">0x7250</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7251"><span class="tooltiptext" id="0x7251_s">0x7251</span></td>     
+                                                                                                  
+      <td class="dirich" rowspan="3" colspan="1" id="0x7260"><span class="tooltiptext" id="0x7260_s">0x7260</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7261"><span class="tooltiptext" id="0x7261_s">0x7261</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7270"><span class="tooltiptext" id="0x7270_s">0x7270</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7271"><span class="tooltiptext" id="0x7271_s">0x7271</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7280"><span class="tooltiptext" id="0x7280_s">0x7280</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7281"><span class="tooltiptext" id="0x7281_s">0x7281</span></td>
+
+    </tr>
+    <tr>
+    </tr>
+    <tr>
+    </tr>
+     <tr>
+
+      <td class="combiner-v" rowspan="6" colspan="2" id="0x8200"><span class="tooltiptext" id="0x8200_s">0x8200</span></td>
+<!-- Combiner -->
+      <td class="dirich" rowspan="3" colspan="1" id="0x7100"><span class="tooltiptext" id="0x7100_s">0x7100</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7101"><span class="tooltiptext" id="0x7101_s">0x7101</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7110"><span class="tooltiptext" id="0x7110_s">0x7110</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7111"><span class="tooltiptext" id="0x7111_s">0x7111</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7120"><span class="tooltiptext" id="0x7120_s">0x7120</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7121"><span class="tooltiptext" id="0x7121_s">0x7121</span></td>
+      <td class="power-v" rowspan="6" colspan="1" ></td>  <!-- Powermodul -->
+      
+      
+      <td class="combiner-v" rowspan="6" colspan="2" id="0x8201"><span class="tooltiptext" id="0x8201_s">0x8201</span></td>
+<!-- Combiner -->
+      <td class="dirich" rowspan="3" colspan="1" id="0x7130"><span class="tooltiptext" id="0x7130_s">0x7130</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7131"><span class="tooltiptext" id="0x7131_s">0x7131</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7140"><span class="tooltiptext" id="0x7140_s">0x7140</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7141"><span class="tooltiptext" id="0x7141_s">0x7141</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7150"><span class="tooltiptext" id="0x7150_s">0x7150</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7151"><span class="tooltiptext" id="0x7151_s">0x7151</span></td>
+      <td class="power-v" rowspan="6" colspan="1" ></td>  <!-- Powermodul -->
+
+      <td class="combiner-v" rowspan="6" colspan="2" id="0x8202"><span class="tooltiptext" id="0x8202_s">0x8202</span></td>
+  <!-- Combiner -->
+      <td class="dirich" rowspan="3" colspan="1" id="0x7160"><span class="tooltiptext" id="0x7160_s">0x7160</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7161"><span class="tooltiptext" id="0x7161_s">0x7161</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7170"><span class="tooltiptext" id="0x7170_s">0x7170</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7171"><span class="tooltiptext" id="0x7171_s">0x7171</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7180"><span class="tooltiptext" id="0x7180_s">0x7180</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7181"><span class="tooltiptext" id="0x7181_s">0x7181</span></td>
+      <td class="power-v" rowspan="6" colspan="1"></td>
+      
+      <td class="empty-box" colspan="24" rowspan="6"></td>
+    </tr>
+    
+    <tr>
+    </tr>
+    
+    <tr>
+    </tr>
+    
+    <tr>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7000"><span class="tooltiptext" id="0x7000_s">0x7000</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7001"><span class="tooltiptext" id="0x7001_s">0x7001</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7010"><span class="tooltiptext" id="0x7010_s">0x7010</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7011"><span class="tooltiptext" id="0x7011_s">0x7011</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7020"><span class="tooltiptext" id="0x7020_s">0x7020</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7021"><span class="tooltiptext" id="0x7021_s">0x7021</span></td>
+                                                                                                        
+      <td class="dirich" rowspan="3" colspan="1" id="0x7030"><span class="tooltiptext" id="0x7030_s">0x7030</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7031"><span class="tooltiptext" id="0x7031_s">0x7031</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7040"><span class="tooltiptext" id="0x7040_s">0x7040</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7041"><span class="tooltiptext" id="0x7041_s">0x7041</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7050"><span class="tooltiptext" id="0x7050_s">0x7050</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7051"><span class="tooltiptext" id="0x7051_s">0x7051</span></td>     
+                                                                                                        
+      <td class="dirich" rowspan="3" colspan="1" id="0x7060"><span class="tooltiptext" id="0x7060_s">0x7060</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7061"><span class="tooltiptext" id="0x7061_s">0x7061</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7070"><span class="tooltiptext" id="0x7070_s">0x7070</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7071"><span class="tooltiptext" id="0x7071_s">0x7071</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7080"><span class="tooltiptext" id="0x7080_s">0x7080</span></td>
+      <td class="dirich" rowspan="3" colspan="1" id="0x7081"><span class="tooltiptext" id="0x7081_s">0x7081</span></td>
+
+    </tr>
+    <tr>
+    </tr>
+    <tr>
+    </tr>
+  </table>
+  
+</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) == "0x7") {
+        color(k,data[k]);
+        }
+      if (k.substring(0,3) == "0x8") {
+        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("dirich");
+    var combinerHColor = document.getElementsByClassName("combiner-h");
+    var combinerVColor = document.getElementsByClassName("combiner-v");
+    var combiner4HColor = document.getElementsByClassName("combiner-4h");
+    var combiner4VColor = document.getElementsByClassName("combiner-4v");
+    
+    for (var j=0;j<dirichColor.length;j++) {
+      dirichColor[j].style.backgroundColor = "White";
+    }
+    for (var j=0;j<combinerHColor.length;j++) {
+      combinerHColor[j].style.backgroundColor = "White";
+    }
+    for (var j=0;j<combinerVColor.length;j++) {
+      combinerVColor[j].style.backgroundColor = "White";
+    }
+    for (var j=0;j<combiner4HColor.length;j++) {
+      combiner4HColor[j].style.backgroundColor = "White";
+    }
+    for (var j=0;j<combiner4VColor.length;j++) {
+      combiner4VColor[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"
+-->
+