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'});
$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
###############################
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});
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;