From 40644d74192adcf5b579183fddda7fb3485589b5 Mon Sep 17 00:00:00 2001 From: Jan Michel Date: Wed, 19 May 2021 14:48:50 +0200 Subject: [PATCH] xml-pages: Add option for vertical alignment of single-field registers --- web/htdocs/commands/xmlpage.pm | 5 +- web/htdocs/layout/blue.css | 12 +++- web/htdocs/layout/rate.png | Bin 611 -> 2161 bytes web/htdocs/scripts/xmlpage.js | 7 +++ web/htdocs/tdc/inputmonitor.pl | 1 + xml-db/get.pl | 107 ++++++++++++++++++++++----------- 6 files changed, 96 insertions(+), 36 deletions(-) diff --git a/web/htdocs/commands/xmlpage.pm b/web/htdocs/commands/xmlpage.pm index 0960860..3837943 100644 --- a/web/htdocs/commands/xmlpage.pm +++ b/web/htdocs/commands/xmlpage.pm @@ -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|
{nocache}?'style="display:none"':"").qq|>
-
+ +
+
diff --git a/web/htdocs/layout/blue.css b/web/htdocs/layout/blue.css index 25f5b8f..8428bc6 100644 --- a/web/htdocs/layout/blue.css +++ b/web/htdocs/layout/blue.css @@ -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; } diff --git a/web/htdocs/layout/rate.png b/web/htdocs/layout/rate.png index 5cba980ad8edf6c6174a3923575f7f80735041eb..3f93645a72b331dd8f0bc97916b9bb44c01cd7a8 100644 GIT binary patch delta 2123 zcmV-R2(aB^>EX>4U6ba`-PAZ2)IW&i+q+Rc}3a^xrs zhW~SlJpvLRg5zL5s`dtZ{C%+z>9{+SWHME|_OzwOYDwr3kTLzAzlZq?7n8Nd2T3u< zXmR=MGZ!eyURODvWc~SEU#u$c#?5}g7;=#A`kLYz?-*y;^M4wz%TK|0cyN^adU3pe zQI;c4D}Y8^fgD`{Y+H`Xa^!eL_Sg4gMUFYi;}q8K>{##5GT>w8!#m*^B8kV-vlWRM zdSdGZb!#(GCujT}=>FZPDI+KDj+{N8d}Zn8hg^XSc#_MoBj=$zC)fCutpPHm06nkT zvi;@tQTFCB{eOl19oDVU2jh#jQ3{dQ3wNUww|qHHK^@(&p6nhX$Fw8A8?SMPxQea# z=4XtS#^~4VijSCbT$9qNoEq$oS*`O|)1laC(1Z!fyff~EWl@2&*=i5ml`=6<4)WBf z(4cI3 z;0)dK`?vY3;W*a>kxjc+$cty!Aqz{uKLyM{gvKgrI18-z{hC}I2!^xF2@@>#FqexX z&|7o46SRY2fV|ccNm~w3B7_b|h8zgkNG?!BM#3yaC}aYlg4Ef0K0ts%;D#jGI~M^5 zYZ$Td8-JnGlmlPG*bJRFSd06M4^*++=1mV^su3l3~JW zG>L(r@5EuyX1B;0RPm2+Gm=hj{8MsfqWdDbXKt^kwRt?(li0NkXHl)g>Kif&C;Y>y z`G2uApBa2r{Rw5tfNj4=;2CA(st??Q&)Z$X@ zkED5iL8Reof7A9$Rayv-S(%^ba>>&XmgTBP?Fzve5S-8+Z2$lPglR)VP=857Lm*I6Pew^hMF0SJoPCi!NW(xJ#a~lPMJo>N zAmWgrI$01Eanvdlp+cw?T6HkF^b498k`xz5!L{Jv$70pN#aUMeS3wZ`0C973Qgo3L z|Cbb6#CUMrk9YSTckck9QDvIdH3n$9ZDvwQF_&Kv!>JCN`F!szT@j2 z0lwZPc$WXUKS!Thuow^!iD#H$+QjR`Q=7KId7n7O%Cbs)PCRPT1&JTIu6X>$x#Y6I zGh=2pGe;aF7E2whbTBKM8u27?T-9{S7jhn}oVPe@)f#KvlfN)h(3h9EPICw;EMO55 zL@21Cf+}nzXw^xvkfHsgkAHvA^-JVZ$W;L&$2>NmL3aJ%fAG6ot2i<4B}I}z=*4k9 zhJo-d(5ySo_p#$NPk`VvaHY5X8x3Iklk|F9iyr~~+rY(jTT}Lc%N=0g$&gLim4Y;d zVi9;hqi@Os(OaNr)$6UbkJASrOI@XJfP+I|q(s?kKJV`C?Csw(tsVY;06af(kxwTq zdH?_b24YJ`L;(K){{a7>y{D6rAs&C_1rrP<1(A}9oB#j-8FWQhbVF}#ZDnqB07G(R zVRU6=Aa`kWXdp*PO;A^X4i^9b0oX}IK~y-)rIWpj6Hye!Z{|J2obz@RMeR)t~MO$9+XLJ0k;*X!HIVE_OjP171<%(8!N`w1b$p_J~J zrnyBa-9-o;<#}Gvb$!n?&8L6E007wYysqOo4*>u)P5antwO(S3Bf~J>YMS^rc7ytmraeS3?zE&(2!)mqq24frn0Q_-)Qo3`Ry+Rzv*8l)iRsB*bl@3?^Oo1_W z3uDZ6UEllHnx}@T(P$&QMhGRcEPp>sunOmm^KZ@}%n3#O7Q6re002ovPDHLkV1k0A B3(Noj delta 587 zcmV-R0<`_{5aR@pBYyx1a7bBm000XU000XU0RWnu7ytkO2XskIMF-ss5Dy<93iWoR z0000TX;fHrLvL+uWo~o;00000Lvm$dbY)~9cWHEJAV*0}P-HG;2LJ#8*-1n}R5;6} zQ$dIlVHAG5nuue9;#_3Z|Ca23Q8e%{Se`u1MMHv+z(XBmz<+~>Ktu`xVGqX8K@S}a zL`e4HoI0h92Vo35IHsqWrR}m=kU3BoyiSS47PK*DgprDIPQ$+`QdJ^)oR@z3TXsTPe!-vT0T(d+eu zP$=}?X0!c>#bT$-o6WvTrBbg6A;#7=BEon)j(^tc^&$WuAw*B7(5swx{ipTC<@>0cJBy+(7Q-^+dvdW2>{UTc7OSs z%D-^9SVSyt006|}@e#*yXM5kZ$K(0za=E@rk|ge{j)-6_7K_gqhA|_N$mBAQb#T>p Z{snr5N1TmSPD20y002ovPDHLkV1nBe532wG diff --git a/web/htdocs/scripts/xmlpage.js b/web/htdocs/scripts/xmlpage.js index c736105..9045a3b 100644 --- a/web/htdocs/scripts/xmlpage.js +++ b/web/htdocs/scripts/xmlpage.js @@ -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); @@ -132,6 +134,10 @@ 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; } diff --git a/web/htdocs/tdc/inputmonitor.pl b/web/htdocs/tdc/inputmonitor.pl index 3b1d98d..9c978ba 100755 --- a/web/htdocs/tdc/inputmonitor.pl +++ b/web/htdocs/tdc/inputmonitor.pl @@ -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"; diff --git a/xml-db/get.pl b/xml-db/get.pl index c4bea9e..79c40d4 100755 --- a/xml-db/get.pl +++ b/xml-db/get.pl @@ -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 = "
"; + + $t .= sprintf(""; + 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 = "
$name$name (0x%04x)
$obj->{description}
",$addr); + if ($once != 1 && defined $obj->{repeat}) { + $t .= "
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 .= "
$name$name (Bit $range)
$obj->{description}
"; + } 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 .= "
$c$c (Bit $range)
$oc->{description}
"; + } + } + $t .= "
"; - 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(""; - 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("
$name$name (0x%04x)
$obj->{description}
",$addr); - if ($once != 1 && defined $obj->{repeat}) { - $t .= "
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 .= "
$name$name (Bit $range)
$obj->{description}
"; - } 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 .= "
$c$c (Bit $range)
$oc->{description}
"; - } - } - $t .= "
%s$name on 0x%s
raw: 0x%x
%s",$endslice,$b,$b,$data->{$addr}->{$b},$sl); + $ttmp = sprintf("
%s$name on 0x%s
raw: 0x%x
%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{$head}};$i++) { + $t .= $tarrhead->{$head}[$i].$tarrcont->{$head}[$i]; + + } + } + } + else { #Column View + for my $boards (sort keys %{$tarrhead}) { + $t .= "
$boards"; + } + $t .= ''; + for(my $i=0;$i<($obj->{repeat}//1);$i++) { + $t .= "
"; + $t .= "$i" if $obj->{repeat}; + for my $boards (sort keys %{$tarrhead}) { + $t .= $tarrcont->{$boards}[$i] // ''; + } + + } + } $t .= "
"; } print $t; -- 2.43.0