From db72625a892e3163eb1cb8636e946cee1112d47b Mon Sep 17 00:00:00 2001 From: Michael Wiebusch <antiquark@gmx.net> Date: Thu, 3 Jul 2014 15:11:24 +0200 Subject: [PATCH] beginning with tables --- mvdsensorcontrol/appendix.tex | 15 ++ mvdsensorcontrol/daqsetup.tex | 2 +- mvdsensorcontrol/documentation.tex | 10 +- mvdsensorcontrol/tables/maketable.pl | 235 +++++++++++++++++++++++++++ 4 files changed, 260 insertions(+), 2 deletions(-) create mode 100755 mvdsensorcontrol/tables/maketable.pl diff --git a/mvdsensorcontrol/appendix.tex b/mvdsensorcontrol/appendix.tex index f4e2a6c..3dfef9f 100644 --- a/mvdsensorcontrol/appendix.tex +++ b/mvdsensorcontrol/appendix.tex @@ -282,4 +282,19 @@ call JTAG programmer, program and initialize the sensors \end{itemize} \end{description} +\subsection{Register definitions} + +\subsubsection{converter board registers} + +\input{tables/table} + +\begin{tabular}{ l | c || r } + \hline + 1 & 2 & 3 \\ + 4 & 5 & 6 \\ + 7 & 8 & 9 \\ + \hline +\end{tabular} + + diff --git a/mvdsensorcontrol/daqsetup.tex b/mvdsensorcontrol/daqsetup.tex index d50bfbe..62295a7 100644 --- a/mvdsensorcontrol/daqsetup.tex +++ b/mvdsensorcontrol/daqsetup.tex @@ -189,7 +189,7 @@ that are generated by four individual DACs\footnote{JTAG register "DAC\_BIAS", fields "IVDREF1A-IVDREF1D"} inside the chip. The DAC range is \SIrange{-32}{32}{\milli\volt} according to the datasheet. For these input channels the converter board has a measuring input range from -\SIrange{-39.9}{39.9}{\volt}. +\SIrange{-39.9}{39.9}{\milli\volt}. \item[ZeroSingle] Calibration offset that has to be subtracted from VDiscRef2A-VDiscRef2D to reduce systematic uncertainty introduced by the multiplexer and amplifier circuitry. diff --git a/mvdsensorcontrol/documentation.tex b/mvdsensorcontrol/documentation.tex index 5c3661a..0850d4a 100644 --- a/mvdsensorcontrol/documentation.tex +++ b/mvdsensorcontrol/documentation.tex @@ -1,6 +1,6 @@ \documentclass[a4paper,11pt]{article} \usepackage[T1]{fontenc} -\usepackage[utf8]{inputenc} +% \usepackage[utf8]{inputenc} \usepackage{lmodern} \usepackage{graphicx} \usepackage{subfig} @@ -16,6 +16,14 @@ % \usepackage{framed} \usepackage{fancyvrb} + +% for tables +\usepackage{array} +\usepackage{colortbl} +\usepackage{xcolor} +\usepackage{booktabs} + + % my macros \RecustomVerbatimEnvironment diff --git a/mvdsensorcontrol/tables/maketable.pl b/mvdsensorcontrol/tables/maketable.pl new file mode 100755 index 0000000..5f962a9 --- /dev/null +++ b/mvdsensorcontrol/tables/maketable.pl @@ -0,0 +1,235 @@ +#!/usr/bin/perl -w + + +# my $me = "adcmon.pl"; + +use strict; +use warnings; +use POSIX; +# use CGI ':standard'; +# use CGI::Carp qw(fatalsToBrowser); +# use HTML::Entities; +use Data::Dumper; +use FileHandle; + + + +use FindBin; +use lib "$FindBin::Bin/.."; +# my $entityFile = "../../daqtools/xml-db/cache/CbController.entity"; +# my $xmldb = AccessXmlDb->new( entityFile => $entityFile ); +# print any2hex(1234); +# print join(":",@{$xmldb->channelList()}); +# print "\n"; +# + +my $xml_cbctrl_entity = "/home/micha/mnt/55local1/htdocs/daqtools/xml-db/cache/CbController.entity"; + +my $daqopserver="jspc55:88"; +$ENV{'DAQOPSERVER'} = $daqopserver; + + +my $xmldb = xmlDbMethods->new( entityFile => $xml_cbctrl_entity); + + + + + +$xmldb->dumpItem('EnaA'); +$xmldb->dumpItem('MiscConf'); + +my $list = $xmldb->unfoldTree('CbUcRegs'); +# my $list = $xmldb->unfoldTree('MiscConf'); + +my $data = []; + +for my $name (@$list) { # processing the list + my $node = $xmldb->{entity}->{$name}; + my $type = $node->{type}; + my $repeat = $node->{repeat} || 1; + my $stepsize = $node->{stepsize}||0; + + my $bits = ""; + if ($type ne 'register'){ + my $start = $node->{start}; + my $stop = $node->{start}+$node->{bits}-1; + if ($start == $stop){ + $bits = $start; + } else { + $bits = "$start--$stop"; + } + } + + #indent register fields + if ($type eq 'field'){ + $name= '\quad '.$name; + } + + for (my $i=0;$i<$repeat;$i++){ + my $name_ = $name; + if ($repeat > 1) { + $name_ = $name.".$i"; + } + my $addr_ = $node->{address}+$i*$stepsize; + my $hexaddr = sprintf("0x%04x",$addr_ ); + push(@{$data},{%$node, name => $name_, addr => $hexaddr, bits => $bits}); + } +} + +@$data = sort { $a->{bits} cmp $b->{bits} } @$data; +@$data = sort { $a->{addr} cmp $b->{addr} } @$data; + +my $table = textabular->new(); + +for my $item (@$data){ +$table->addData(%$item); +} + + + + + + +$table->{dataKeys} = [ 'name', 'addr', 'bits', 'description' ]; +$table->{format} = '@{} l l l p{8cm} @{}'; + +my $tablefile = FileHandle->new("./table.tex", 'w'); +print $tablefile $table->generateString(); +$tablefile->close(); + +print $table->generateString(); + +package xmlDbMethods; + +use Storable qw(lock_store lock_retrieve); +use Data::Dumper; + +sub new { + my $class = shift; + my %options = @_; + my $self = { + entityFile => '/dev/null', + %options + }; + bless($self, $class); + $self->{entity} = lock_retrieve($self->{entityFile}); + die "cannot open xml-db entity file ".$self->{entityFile}."\n" unless defined $self->{entity}; + return $self; +} + +sub channelParm { + my $self = shift; + my $chip = shift; + my $channel = shift; + + my $parm; + %{$parm}= %{$self->{entity}->{$channel."D"}}; + + die "entry $channel does not exist for chip=".$chip."\n" if ($chip ge $parm->{repeat}); + + $parm->{address} += $chip * $parm->{stepsize}; + return $parm; +} + +sub dumpItem { # for debug + my $self = shift; + my $item = shift; + unless (defined($item)){ + print Dumper $self->{entity}; + } else { + print Dumper $self->{entity}->{$item}; + } +} + +sub channelList { + my $self = shift; + return $self->{entity}->{AdcSensor}->{children};# returns a reference to an array +} + +sub unfoldTree { + my $self = shift; + my $name = shift; + my $depth = shift||0; + my $list = shift || []; + + my $node = $self->{entity}->{$name}; + +# for (my $i = 0; $i<$depth; $i++){ +# print " "; +# } +# print $node->{type}."\t$name\n"; + unless($node->{type} eq 'group'){ + push(@{$list},$name); + } + + if ($node->{type} eq 'group' || $node->{type} eq 'register' ){ + for my $child (@{$node->{'children'}}){ +# print $child."\n"; + $self->unfoldTree($child,$depth+1,$list); + } + } + + return $list; +} + +1; + +package textabular; + + +sub new { + my $class = shift; + my %options = @_; + my $self = { +# entityFile => '/dev/null', + dataKeys => [], + header => [], + data => [], + %options + }; + bless($self, $class); + return $self; +} + +sub addData { + my $self = shift; + my %data = @_; + push(@{$self->{data}}, \%data); + return $self; +} + +sub generateString { + my $self = shift; + my $str = ""; + + $str.='\begin{table}[tbp] + \centering'; + + + $str .= '\begin{tabular}'."\n"; + $str .="{".($self->{format}||"")."}\n"; + $str.='\toprule'."\n"; + if ( @{$self->{header}} ){ # if no header list ... + $str.= " ".join(" & ",@{$self->{header}}).' \\\\'."\n"; + } else { # print the keys instead + $str.= " ".join(" & ",@{$self->{dataKeys}}).' \\\\'."\n"; + } + $str.='\midrule'."\n"; + + for my $data (@{$self->{data}}){ + my @line; + for my $dataKey (@{$self->{dataKeys}}){ + push(@line,$data->{$dataKey}); + } + my $line = " ".join(" & ", @line) . ' \\\\'."\n"; + $line =~ s/_/\\_/g; # remove all stupid underscores + $str.=$line; + } + $str.='\bottomrule'."\n"; + $str.='\end{tabular}'."\n"; + + $str.='\caption{'.$self->{caption}.'}' if defined $self->{caption}."\n"; + $str.='\label{'.$self->{label}.'}' if defined $self->{label}."\n"; + $str.='\end{table}'."\n"; + return $str; +} \ No newline at end of file -- 2.43.0