From 849d3e9f421e8c52f6ea230b6b6ffa9a857d4745 Mon Sep 17 00:00:00 2001 From: Andreas Neiser Date: Thu, 27 Jun 2013 13:31:29 +0200 Subject: [PATCH] xml-db: Initial commit (just copied from mvdsensorcontrol) --- xml-db/README | 16 + xml-db/cgitest.pl | 577 +++++++++++++++++++++++++++++++++ xml-db/database/first-idea.xml | 31 ++ 3 files changed, 624 insertions(+) create mode 100644 xml-db/README create mode 100644 xml-db/cgitest.pl create mode 100644 xml-db/database/first-idea.xml diff --git a/xml-db/README b/xml-db/README new file mode 100644 index 0000000..d74910f --- /dev/null +++ b/xml-db/README @@ -0,0 +1,16 @@ +This directory contains some effort to describe and explain all TrbNet +Registers in a human-readable way, including some "annotations" how to +read/write them efficiently. + +The XML database can then serve as a default configuration (protected +by SHA1 hash?), on which personal modifications can build upon. + +Some envisaged use cases: + +1) trbcmd-pretty -> Have a look at the content of registers without +reading "raw" hex values + +2) Save/Load TRB config in XML format (as diff to "default" database) + +3) Automatically create configuration for third-party monitoring (e.g. +EPICS) diff --git a/xml-db/cgitest.pl b/xml-db/cgitest.pl new file mode 100644 index 0000000..db0f9f0 --- /dev/null +++ b/xml-db/cgitest.pl @@ -0,0 +1,577 @@ +#!/usr/bin/perl -w +print "Content-type: text/html\n\n"; + +my $me="cgitest.pl"; + +use strict; +use warnings; +use XML::LibXML; +use POSIX; +use CGI::Carp qw(fatalsToBrowser); +use HTML::Entities; + +sub initPage { + +print < + +JTAG Editor + + +EOF +printJavaScripts(); +print < + +

JTAG Configuration File Editor

+
+debug text +
+
+ +Current File: unknown +
+ +
+empty +
+
+empty +
+ + + + +EOF + +} + + + +my %cgiHash = &read_input; + + +if (!keys %cgiHash) { # if script is called without arguments: initialize the html structure +initPage(); +exit; +} + + +my $parser = XML::LibXML->new(); +my $specfile = ""; +my $setfile = ""; +my $spectree; +my $settree; + +my $confDir = '../config'; +my $specDir = '../specs'; + + +if ($cgiHash{'print'} eq 'fileSelection'){ +print "
File Selection
"; + +print_fileSelection(); + +} + + + +if ($cgiHash{'print'} eq 'spectree') { +print "
Available Settings
\n"; +parseSetAndSpec($cgiHash{'configFile'}); +print_registers($specfile); +} + + +if ($cgiHash{'print'} eq 'settree') { +print "
Selected Settings
\n"; +parseSetAndSpec($cgiHash{'configFile'}); +print_registers($setfile); +} + + +if (defined $cgiHash{'debuginput'}) { +print $cgiHash{'debuginput'}; +} + +if (defined $cgiHash{'action'} ) { + + printHash(\%cgiHash); + if($cgiHash{'action'} eq 'save') { + parseSet($cgiHash{'configFile'}); + save($cgiHash{'register'},$cgiHash{'field'},$cgiHash{'value'}); + } + if($cgiHash{'action'} eq 'delete'){ + parseSet($cgiHash{'configFile'}); + del($cgiHash{'register'},$cgiHash{'field'}); + } + if($cgiHash{'action'} eq 'copyDefaultRegister'){ + parseSetAndSpec($cgiHash{'configFile'}); + del($cgiHash{'register'},""); # delete existing register from setfile + copyDefaultRegister($cgiHash{'register'}); + } +} + + + +#################### SUBLAND ###################### + +sub prepare_text { + my $t = $_[0]; + chomp $t; + $t = encode_entities($t); + $t =~ s/^\s//; + $t =~ s/^\n//; + $t =~ s/\t//; + return $t; + } + + + +sub parseSetAndSpec { + $setfile = $confDir."/".$_[0]; + $settree = $parser->parse_file($setfile); + my $specFileName = $settree->findvalue("/MAPS/\@specDbFile"); + $specfile = $specDir."/".$specFileName; + $spectree = $parser->parse_file($specfile); +} + +sub parseSet { + $setfile = $confDir."/".$_[0]; + $settree = $parser->parse_file($setfile); +} + +sub del { + + + my $registerName=$_[0]; + my $fieldName=$_[1]; + my $xmlfile = $setfile; + my $xmltree = $settree; + my $maps = $xmltree->findnodes("/MAPS")->shift(); + my $register = $xmltree->findnodes("/MAPS/register[\@name='".$registerName."']")->shift(); + + if ($fieldName eq "") { # no field specified, remove whole register + unless($register eq ""){ + $maps->removeChild($register); + } + print "deleted whole register"; + } else { + + my $field = $xmltree->findnodes("/MAPS/register[\@name='".$registerName."']/field[\@name='".$fieldName."']")->shift(); + $register->removeChild($field); + print "deleted field
"; + unless( $register->hasChildNodes()){ + $maps->removeChild($register); + print "deleted register as well
"; + } + } + open(SCHREIBEN,"> $xmlfile") + or print "could not open file $xmlfile for writing: $!\n"; + +print SCHREIBEN $xmltree->toString(); +close SCHREIBEN; +} + +sub print_fileSelection { + +print ""; +print ""; +print ""; + +print ""; + +print ""; + +print ""; + +print ""; + +print "
select config file:"; +print "
"; + opendir(DIR, $confDir) or die $!; + +print ''; + +print ""; +print ""; +print "
"; +} + + +sub save { + + my $registerName=$_[0]; + my $fieldName=$_[1]; + my $xmlfile = $setfile; + my $newValue = $_[2]; + + my $xmltree= $settree; + my $maps = $xmltree->findnodes("/MAPS")->shift(); + #my @fields = $xmltree->findnodes("/MAPS/register[\@name='".$registerName."']/field[\@name='".$fieldName."']"); + my $register = $xmltree->findnodes("/MAPS/register[\@name='".$registerName."']")->shift(); + + if($register eq ""){ + $register = $maps->addNewChild("","register"); + $register->setAttribute("name",$registerName); + } + + + my $field = $xmltree->findnodes("/MAPS/register[\@name='".$registerName."']/field[\@name='".$fieldName."']")->shift(); + + if($field eq ""){ + $field = $register->addNewChild( "","field" ); + $field->setAttribute( "name", $fieldName ); + + } + #my $fieldValue = ($xmltree->findnodes("/MAPS/register[\@name='".$registerName."']/field[\@name='".$fieldName."']/\@name='value'"))[0]; + #print $fieldValue->findvalue("./"); + $field->setAttribute( "value", $newValue ); + print $field->findvalue("./\@value"); + open(SCHREIBEN,"> $xmlfile") + or print "could not open file $xmlfile for writing: $!\n"; + +print SCHREIBEN $xmltree->toString(); +close SCHREIBEN; +} + +sub copyDefaultRegister { + my $registerName=$_[0]; + my $settree = $parser->parse_file($setfile); + my $spectree = $parser->parse_file($specfile); + my $setmaps = $settree->findnodes("/MAPS")->shift(); + my $specmaps = $spectree->findnodes("/MAPS")->shift(); + + my $specRegister = $spectree->findnodes("/MAPS/register[\@name='".$registerName."']")->shift(); + + my $setRegister = $setmaps->addNewChild("","register"); + $setRegister->setAttribute("name",$registerName); + + my @specFields = $specRegister->findnodes("./field"); + + for my $specField (@specFields){ + my $fieldName = $specField->findvalue("./\@name"); + my $fieldValue = $specField->findvalue("./\@defaultValue"); + my $setField = $setRegister->addNewChild( "","field" ); + $setField->setAttribute( "name", $fieldName ); + $setField->setAttribute( "value", $fieldValue ); + print $setField->findvalue("./\@value"); + } + open(SCHREIBEN,"> $setfile") + or print "could not open file $setfile for writing: $!\n"; + +print SCHREIBEN $settree->toString(); +close SCHREIBEN; +} + +sub by_name { + my $a_name= $a->findvalue("./\@name") ; + my $b_name= $b->findvalue("./\@name") ; + + # putting $b_published in front will ensure the descending order. + return $a_name cmp $b_name; +} + +sub printHash { + my $hashref=$_[0]; + for my $element( keys %{$hashref}){ + print $element."=".$hashref->{$element}."
\n"; + } +} + + +sub print_registers { +my $xmlfile = $_[0]; +my $xmltree; +if ($xmlfile eq $setfile) { + $xmltree = $settree; +} elsif ($xmlfile eq $specfile) { + $xmltree = $spectree; +} else { + die "xmlfile given to sub print_registers is unknown"; +} +my @registers = sort by_name $xmltree->findnodes("/MAPS/register"); +print ""; +for my $register (@registers ){ + + my $registerName = $register->findvalue("./\@name"); + my $registerId = $register->findvalue("./\@id"); + my $registerSize = $register->findvalue("./\@size"); + my $registerDescr = prepare_text($spectree->findvalue("/MAPS/register[\@name='".$registerName."']/description") || "n/a"); + + my $flistid = $xmlfile."//".$registerName; + + print ""; + + print < +  +EOF + print ""; + #print ""; + + if($xmlfile eq $setfile){ + print < X  +EOF + } + if($xmlfile eq $specfile){ + print < →  +EOF + } + + print ""; + #print ""; + + print ''; + print ''; + print '"; +} +print "
$registerName$registerId
'; + print_fields($xmlfile,$register); + print ""; + print "
"; +} + +sub print_fields { + + my $register = $_[1]; + my $xmlfile = $_[0]; + my $registerName = $register->findvalue("./\@name"); + my @fields = sort by_name $register->findnodes("./field"); + print ""; + for my $field (@fields){ + my $fieldName = $field->findvalue("./\@name"); + my $readOnlyFlag = 0; + my $fieldValue = $field->findvalue("./\@value"); + my $fieldDescr = prepare_text($spectree->findvalue("/MAPS/register[\@name='".$registerName."']/field[\@name='".$fieldName."']/description") || "n/a"); + my $fieldId = $xmlfile."//".$registerName."/".$fieldName; + if ($fieldValue eq "") { + $fieldValue = $field->findvalue("./\@defaultValue"); + $readOnlyFlag=1; + } + + print ""; + print ""; + print ""; + if ($readOnlyFlag){ + print <$fieldValue +EOF + } else { + print < + + +EOF + + } + print ''; + if($xmlfile eq $specfile){ + print < →  +EOF + } + if($xmlfile eq $setfile){ + print < X  +EOF + } + print ""; + } + print "
$fieldName  = 
"; + +} + + +sub read_input +{ + my $buffer; my @pairs; my $pair; my $name; my $value;my %FORM; + # Read in text + $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; + if ($ENV{'REQUEST_METHOD'} eq "POST") + { + read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); + } else + { + $buffer = $ENV{'QUERY_STRING'}; + } + # Split information into name/value pairs + @pairs = split(/&/, $buffer); + foreach $pair (@pairs) + { + ($name, $value) = split(/=/, $pair); + $value =~ tr/+/ /; + $value =~ s/%(..)/pack("C", hex($1))/eg; + $FORM{$name} = $value; + } + %FORM; +} + + + +sub printJavaScripts { + + +####### javascript function land ################ + + +print < + + +function selectedConfigFile(){ +var e = document.getElementById("fileSelector"); +return e.options[e.selectedIndex].text; +} + + +var visHash= new Object(); + + +function reloadSpecTree(){ +getdata('$me?print=spectree&configFile='+selectedConfigFile(),'roterBereich',false); +for (var key in visHash) { +if(visHash[key]==true){ +showElement(key); +} +} +} + +function reloadSetTree(){ +getdata('$me?print=settree&configFile='+selectedConfigFile(),'blauerBereich',false); +for (var key in visHash) { +if(visHash[key]==true){ +showElement(key); +} +} +} + +function reloadTrees(){ +debugOutput("reload Trees from "+selectedConfigFile()); +reloadSpecTree(); +reloadSetTree(); +} + +function reloadFileSelection(){ +getdata('$me?print=fileSelection','fileSelection',false); +} + +function saveSettings(register,field,value){ +//getdata("$me?debuginput=tralla","debug"); +var file_ = encodeURIComponent(selectedConfigFile()); +var register_ = encodeURIComponent(register); +var field_ = encodeURIComponent(field); +var value_ = encodeURIComponent(value); + +getdata("$me?action=save&configFile="+file_+"®ister="+register_+"&field="+field_+"&value="+value_,"debug",false); +//getdata("$me?print=settree","blauerBereich",true); +reloadSetTree(); +} + +function deleteSettings(register,field){ +//getdata("$me?debuginput=tralla","debug"); +var file_ = encodeURIComponent(selectedConfigFile()); +var register_ = encodeURIComponent(register); +var field_ = encodeURIComponent(field); + +getdata("$me?action=delete&configFile="+file_+"®ister="+register_+"&field="+field_,"debug",false); +//getdata("$me?print=settree","blauerBereich",true); +reloadSetTree(); +} + +function copyDefaultRegister(register){ +var register_ = encodeURIComponent(register); +var file_ =encodeURIComponent(selectedConfigFile()); +getdata("$me?action=copyDefaultRegister®ister="+register_+'&configFile='+file_,"debug",false); +//getdata("$me?print=settree","blauerBereich",true); +reloadSetTree(); +} + +function debugOutput(input){ +getdata("$me?debuginput="+encodeURIComponent(input),"debug",true); +} + +function writeToElementId(input,destId){ + if(document.getElementById(destId).innerHTML){ + document.getElementById(destId).innerHTML = input; + } + +} + + +function toggleVis(elementId,t) { +if(document.getElementById(elementId)){ +if( document.getElementById(elementId).style.visibility == "visible") { + document.getElementById(elementId).style.visibility = "collapse"; + visHash[elementId]=false; + t.innerHTML = " + "; +} else { + document.getElementById(elementId).style.visibility = "visible" ; + visHash[elementId]=true; + t.innerHTML = " − "; +} +} +} +function showElement(elementId) { + if(document.getElementById(elementId)){ + document.getElementById(elementId).style.visibility = "visible" ; + visHash[elementId]=true; + } +} +function hideElement(elementId) { + if(document.getElementById(elementId)){ + document.getElementById(elementId).style.visibility = "hidden" ; + visHash[elementId]=false; + } +} +function collapseElement(elementId) { + if(document.getElementById(elementId)){ + document.getElementById(elementId).style.visibility = "collapse" ; + visHash[elementId]=false; + } +} + + + + +EOF + +} diff --git a/xml-db/database/first-idea.xml b/xml-db/database/first-idea.xml new file mode 100644 index 0000000..71d0eab --- /dev/null +++ b/xml-db/database/first-idea.xml @@ -0,0 +1,31 @@ + + + + + +Start initialization sequence for all connected sensor chains + + + Reserved, Not Used + + + + \ No newline at end of file -- 2.43.0