]> jspc29.x-matter.uni-frankfurt.de Git - daqtools.git/commitdiff
xml-pages: Add option for vertical alignment of single-field registers
authorJan Michel <j.michel@gsi.de>
Wed, 19 May 2021 12:48:50 +0000 (14:48 +0200)
committerJan Michel <j.michel@gsi.de>
Wed, 19 May 2021 12:49:13 +0000 (14:49 +0200)
web/htdocs/commands/xmlpage.pm
web/htdocs/layout/blue.css
web/htdocs/layout/rate.png
web/htdocs/scripts/xmlpage.js
web/htdocs/tdc/inputmonitor.pl
xml-db/get.pl

index 0960860d8b60abe3462447badbfb791e24c5c3aa..3837943db766479b023b91c3d70da9298ec3e5f6 100644 (file)
@@ -26,6 +26,7 @@ sub initPage {
   my $israte  = $setup[$active]->{rate};
   my $iscache = $setup[$active]->{cache};
   my $isfold  = $setup[$active]->{fold};
+  my $isinline= $setup[$active]->{inline};
   
   $getscript = $page->{getscript};
   if(!defined $getscript) {
@@ -82,7 +83,9 @@ print qq|
 <div class="checkbox"|.($setup[$active]->{nocache}?'style="display:none"':"").qq|><input type="checkbox" onChange="settarget()" value="1" id="cache" title="Use caching of data to reduce load on DAQ network" $iscache>
     <label for="cache">Use Cache</label></div>
 <div class="checkbox"><input type="checkbox" value="0" id="fold" title="Fold table on large pages" $isfold>
-    <label for="cache">Fold Tables</label></div>
+    <label for="fold">Fold Tables</label></div>
+<div class="checkbox"><input type="checkbox" onChange="settarget()" value="1" id="inline" title="Show boards in columns" $isinline>
+    <label for="inline">Columns</label></div>
 <div class="checkbox"><input type="button" class="stdbutton" onClick="refresh(-1);" value="Refresh"></div>
 <div class="checkbox" style="margin:auto;"><a id="permalink" target="_blank" href="">Permalink</a></div>
 </div>
index 25f5b8fb77c6e1e5f72b9b5921a50d69635ac69d..8428bc6519ffb71876e1e99194e3694158b53905 100644 (file)
@@ -356,13 +356,23 @@ hr.queryresult  {
   padding-left:16px;
 }
 
+table.inline td+td {
+  min-width:100px;
+}
+
+
 table.queryresult td.slice, table.queryresult th.slice {
   text-align:left;
   background:#eee;
+  min-width:0;
 }
 
 table.queryresult td {
-  background:#e0e0e0;
+  background:#e8e8e8;
+}
+
+table.queryresult td.nonex {
+  background:#dde;
 }
 
 
index 5cba980ad8edf6c6174a3923575f7f80735041eb..3f93645a72b331dd8f0bc97916b9bb44c01cd7a8 100644 (file)
Binary files a/web/htdocs/layout/rate.png and b/web/htdocs/layout/rate.png differ
index c736105a0e3975192f1721972e193f537086796f..9045a3b2a931ee79454243eded0e63369f139c4b 100644 (file)
@@ -59,6 +59,7 @@
     var opt = "";
     if(document.getElementById("rate").checked) opt += "rate";
     if(document.getElementById("cache").checked) opt += "cache";
+    if(document.getElementById("inline").checked) opt += "inline";
     com = command.split('&');
     command = "";
     for(i = 0; i < com.length; i++) {
@@ -98,6 +99,7 @@
 
   function makeCookies() {
     setCookie("rate"+currentpage,document.getElementById("rate").checked);
+    setCookie("inline"+currentpage,document.getElementById("inline").checked);
     setCookie("cache"+currentpage,document.getElementById("cache").checked);
     if(document.getElementById("target")) {
       setCookie("target"+currentpage,document.getElementById("target").value);
     if (t != "" && document.getElementById("rate")) {
       document.getElementById("rate").checked = (t=="true")?true:false;
       }      
+    t = getCookie("inline",currentpage);
+    if (t != "" && document.getElementById("inline")) {
+      document.getElementById("inline").checked = (t=="true")?true:false;
+      }      
     setperiod(-1);
     settarget(-1);
     if(document.getElementById("address"))
@@ -159,6 +165,7 @@ function permaLink() {
     }
   link += "&cache="+document.getElementById("cache").checked;
   link += "&rate="+document.getElementById("rate").checked;
+  link += "&inline="+document.getElementById("inline").checked;
   return link;
   }
     
index 3b1d98da6a9b55736e0051a2c29a6710cbd0260c..9c978bad2c940471a686b2f74be84f08b4be0bae 100755 (executable)
@@ -36,6 +36,7 @@ $setup[1]->{cmd}     = "InputMonitorTrb3sc-0xfe60-MonitorCounters";
 $setup[1]->{period}  = 1000;
 $setup[1]->{address} = 1;
 $setup[1]->{rate}    = 1;
+$setup[1]->{inline}  = 1;
 
 $setup[2]->{name}    = "Trb3scTrigger";
 $setup[2]->{cmd}     = "InputMonitorTrb3sc-0xfe60-Trigger";
index c4bea9e2a327e0f8174f32d05f63a638461f4241..79c40d45281f7c370a82b67042b791be4ee9dcf4 100755 (executable)
@@ -14,14 +14,14 @@ use if (!defined $ENV{'QUERY_STRING'}), Getopt::Long;
 no warnings 'experimental::smartmatch';
 
 # use Data::TreeDumper;
-use Data::Dumper;
+use Data::Dumper;
 my ($db,$data,$once,$slice);
 my $help = 0;
 my $verbose = 0;
 my $isbrowser = 0;
 my $server = $ENV{'SERVER_SOFTWARE'} || "";
 my @request;
-my ($file,$entity,$netaddr,@spi_chains,$name, $style, $storefile, $rates, $cache,$olddata);
+my ($file,$entity,$netaddr,@spi_chains,$name, $style, $storefile, $rates, $cache, $isInline, $olddata);
 my $lastboards;
 
 $ENV{'DAQOPSERVER'}="localhost:7" unless (defined $ENV{'DAQOPSERVER'});
@@ -81,14 +81,13 @@ foreach my $req (@request) {
   $file    = "$RealBin/cache/$entity.entity";
   
   $style = "" unless $style;
-  my $isInline = $style =~ /inline/i;
-  my $isColor  = $style =~ /color/i;
-  my $sortAddr = $style =~ /sortaddr/i;
+  $isInline = $style =~ /inline/i;
+  my $isColor  = $style =~ /color/i;
+  my $sortAddr = $style =~ /sortaddr/i;
   $verbose  = ($style =~ /verbose/i) ||$verbose;
   $rates    = $style =~ /rate/i;
   $cache    = $style =~ /cache/i;
 
-
   ###############################
   #### Check arguments for validity
   ###############################
@@ -424,48 +423,64 @@ sub spi_register_read {
   return $o;
 }
 
+sub makeTitleVertical {
+  my ($obj,$name,$once,$addr,$isInline) = @_;
+  my $t;
+  $isInline = $isInline && $obj->{type} eq "registerfield";
+  
+  $t = "<hr class=\"queryresult\"><table class='queryresult ".($isInline?" inline":"")."'><thead>";
+
+  $t .= sprintf("<tr><th><div>$name<span class=\"tooltip\"><b>$name</b> (0x%04x)<br>$obj->{description}</span></div>",$addr);
+  if ($once != 1 && defined $obj->{repeat}) {
+    $t .= "<th class=\"slice\">Slice";
+  }
+  return $t if $isInline;
+  
+  if ($obj->{type} eq "registerfield" || $obj->{type} eq "field") {
+    my $range = $obj->{start}+$obj->{bits}-1;
+    $range .= "..".$obj->{start} if ($obj->{bits}>1);
+    $t .= "<th><div>$name<span class=\"tooltip\"><b>$name</b> (Bit $range)<br>$obj->{description}</span></div>";
+  } elsif ($obj->{type} eq "register") {
+    foreach my $c (@{$obj->{children}}) {
+      $oc = $db->{$c};
+      my $range = $oc->{start}+$oc->{bits}-1;
+      $range .= "..".$oc->{start} if ($oc->{bits}>1);
+      $t .= "<th><div>$c<span class=\"tooltip\"><b>$c</b> (Bit $range)<br>$oc->{description}</span></div>";
+    }
+  }
+  $t .= "</thead>";
+  return $t;
+}
+
 
 sub generateoutput {
   my ($obj,$name,$slice,$once) = @_;
   my $t = "";
+  $slice = 0 unless defined $slice;
+
   if ($obj->{type} eq "group") {
     foreach my $c (@{$obj->{children}}) {
       generateoutput($db->{$c},$c,$slice,$once);
     }
   } elsif (($obj->{type} eq "register" || $obj->{type} eq "registerfield" || $obj->{type} eq "field")) {
-    $t = "<hr class=\"queryresult\"><table class='queryresult'><thead>";
-    my $stepsize = $obj->{stepsize} || 1;
-    $slice = 0 unless defined $slice;
 
+    my $stepsize = $obj->{stepsize} || 1;
     my $addr = $obj->{address};
+    
+    $t .= makeTitleVertical($obj,$name,$once,$addr,$isInline);
 
-    $t .= sprintf("<tr><th><div>$name<span class=\"tooltip\"><b>$name</b> (0x%04x)<br>$obj->{description}</span></div>",$addr);
-    if ($once != 1 && defined $obj->{repeat}) {
-      $t .= "<th class=\"slice\">Slice";
-    }
-    if ($obj->{type} eq "registerfield" || $obj->{type} eq "field") {
-      my $range = $obj->{start}+$obj->{bits}-1;
-      $range .= "..".$obj->{start} if ($obj->{bits}>1);
-      $t .= "<th><div>$name<span class=\"tooltip\"><b>$name</b> (Bit $range)<br>$obj->{description}</span></div>";
-    } elsif ($obj->{type} eq "register") {
-      foreach my $c (@{$obj->{children}}) {
-        $oc = $db->{$c};
-        my $range = $oc->{start}+$oc->{bits}-1;
-        $range .= "..".$oc->{start} if ($oc->{bits}>1);
-        $t .= "<th><div>$c<span class=\"tooltip\"><b>$c</b> (Bit $range)<br>$oc->{description}</span></div>";
-      }
-    }
-    $t .= "</thead>";
-    my %tarr;
+    my $tarrhead;
+    my $tarrcont;
     my $line = 0;
     do {
-      $addr = $obj->{address}+$slice*$stepsize;
+      my $addr = $obj->{address}+$slice*$stepsize;
       #### Prepare table header line
       if ($obj->{mode} =~ /r/) {
         $lastboards = $data->{$addr}; #Store list of responding boards as guess for write-only registers.
       }
       foreach my $b (sort keys %{$lastboards}) {
-        my $ttmp = "";
+        my $ttmp = "";  #"Line Header" part
+        my $ttmp2 = ""; #"Line Content" part
         my $sl;
         my $slicename = "";
         $slicename = " - ".$obj->{sliceName}->{$slice} if (exists $obj->{sliceName}->{$slice});
@@ -475,27 +490,51 @@ sub generateoutput {
         my $endslice = '';
            $endslice = ' class="endslice"' if (($once != 1 && defined $obj->{repeat} && $slice == 0) && $line++);
         
-        $ttmp .= sprintf("<tr%s><td><div>%s<span class=\"tooltip\"><b>$name</b> on 0x%s<br>raw: 0x%x</span></div>%s",$endslice,$b,$b,$data->{$addr}->{$b},$sl);
+        $ttmp = sprintf("<tr%s><td><div>%s<span class=\"tooltip\"><b>$name</b> on 0x%s<br>raw: 0x%x</span></div>%s",$endslice,$b,$b,$data->{$addr}->{$b},$sl);
         if ($obj->{type} eq "register") {
           foreach my $c (@{$obj->{children}}) {
             my $fullc = $c;
             $fullc .= ".$slice" if ($once != 1 && defined $obj->{repeat});
             my $cstr = sprintf("%s-0x%s-%s", $entity,$b,$fullc);
             my $wr = 1 if $db->{$c}->{mode} =~ /w/;
-            $ttmp .= FormatPretty($data->{$addr}->{$b},$db->{$c},$c,"td",($wr?"editable":""),$cstr,$addr,$b);
+            $ttmp2 .= FormatPretty($data->{$addr}->{$b},$db->{$c},$c,"td",($wr?"editable":""),$cstr,$addr,$b);
           }
         } elsif ($obj->{type} eq "field" || $obj->{type} eq "registerfield") {
           my $fullc = $name;
           $fullc .= ".$slice" if ($once != 1 && defined $obj->{repeat});
           my $cstr = sprintf("%s-0x%s-%s", $entity,$b,$fullc );
           my $wr = 1 if $obj->{mode} =~ /w/;
-          $ttmp .= FormatPretty($data->{$addr}->{$b},$obj,$fullc,"td",($wr?"editable":""),$cstr,$addr,$b);
+          $ttmp2 .= FormatPretty($data->{$addr}->{$b},$obj,$fullc,"td",($wr?"editable":""),$cstr,$addr,$b);
         }
-        $tarr{sprintf("0x%s%04i",$b,$slice)}=$ttmp;
+        $tarrhead->{sprintf("%s",$b)}[$slice]=$ttmp;
+        $tarrcont->{sprintf("%s",$b)}[$slice]=$ttmp2;
       }
 
     } while ($once != 1 && defined $obj->{repeat} && ++$slice < $obj->{repeat});
-    $t .= $tarr{$_} for sort keys %tarr;
+    
+    if ( $isInline != 1 || $obj->{type} ne "registerfield") {  #Standard, serial view
+      for my $head (sort keys %{$tarrhead}) {
+#         for my $cont (sort @{$tarrhead->{$head}}) {
+        for(my $i=0;$i<scalar @{$tarrhead->{$head}};$i++) {
+          $t .= $tarrhead->{$head}[$i].$tarrcont->{$head}[$i];
+
+          }
+        }
+      }
+    else { #Column View
+      for my $boards (sort keys %{$tarrhead}) {
+        $t .= "<th>$boards";
+        }
+      $t .= '</head>';
+      for(my $i=0;$i<($obj->{repeat}//1);$i++) {
+        $t .= "<tr><td>";
+        $t .= "<td class=\"slice\">$i" if $obj->{repeat};
+        for my $boards (sort keys %{$tarrhead}) {
+          $t .= $tarrcont->{$boards}[$i] // '<td class="nonex">';
+          }
+        }
+      }
     $t .= "</table>";
   }
   print $t;