]> jspc29.x-matter.uni-frankfurt.de Git - daqtools.git/commitdiff
added new put function to xml GUI
authorJan Michel <j.michel@gsi.de>
Thu, 17 Oct 2013 12:39:44 +0000 (14:39 +0200)
committerJan Michel <j.michel@gsi.de>
Thu, 17 Oct 2013 12:39:44 +0000 (14:39 +0200)
web/htdocs/commands/xmlpage.pm
xml-db/database/TDC.xml
xml-db/get.pl
xml-db/put.pl [new file with mode: 0755]

index 72b312019b8867df6d9276ac81cc3ccf714b8892..9bec50062d54eb00e16cd525fe962ab126b9e57d 100644 (file)
@@ -13,8 +13,11 @@ sub getView {
   if($setup[$n]->{refresh}) {
     print qq|<input type="button" class="stdbutton" onClick="getdataprint('../xml-db/get.pl?|.$setup[$n]->{cmd}.qq|','content',false);" value="Refresh">|;
     }
-  print qq|<script language="javascript">setTimeout("getdataprint('../xml-db/get.pl?|.$setup[$n]->{cmd}.qq|','content',false,|.$setup[$n]->{period}.qq|)",400);</script>|;
   print qq|<div id="content"></div>|;
+  print qq|<script language="javascript">
+    setTimeout("getdataprint('../xml-db/get.pl?|.$setup[$n]->{cmd}.qq|','content',false,|.$setup[$n]->{period}.qq|)",400);
+    document.getElementById("content").addEventListener("click",test,0);
+  </script>|;
   
   
 }
@@ -63,7 +66,8 @@ print <<EOF ;
 </div>
 <div id="debugpane">
 <div class="header">Debug Output</div>
-debug text
+<span id="returntext">
+</span>
 </div>
 
 
@@ -75,6 +79,7 @@ EOF
 
 
 
+
 sub printJavaScripts {
 
 ####### javascript function land ################
@@ -84,6 +89,16 @@ sub printJavaScripts {
 
 <script language="javascript">
 
+  
+  function test(e) {
+    if(e.target.getAttribute("class") && e.target.getAttribute("class").indexOf("editable")!=-1) {
+      var text = e.target.getAttribute("cstr");
+          text += "\\nCurrent Value: "+e.target.innerHTML+" ("+e.target.getAttribute("raw")+")\\n ";
+      var newval = prompt(text,e.target.getAttribute("raw"));
+      getdataprint('../xml-db/put.pl?'+e.target.getAttribute("cstr")+'-'+newval,'returntext',false,0);
+      }
+    }
+  
 </script>
 EOF
 }
index ee0f59ca3c5eee5566a7cfef93895973ac49900f..6101970fb2ec51d53385c6b54518beed7b197a18 100644 (file)
       <field name="ResetCounters" start="8" bits="1" purpose="trigger" mode="w" format="boolean">
         <description>Resets the internal counters</description>
       </field>
-      <field name="TriggerMode" start="0" bits="12" mode="rw" format="enum">
+      <field name="TriggerMode" start="12" bits="1" mode="rw" format="enum">
         <description>Select the trigger mode: With trigger mode or
         trigger-less mode</description>
         <enumItem value="0">TRIGGERED</enumItem>
       </field>
     </register>
 
-    <memory name="ChannelEnable" address="0002" size="2">
+    <register name="ChannelEnable" address="0002" repeat="2">
       <description>Enable signals/hits of the specific channel. LSB is
       channel 1.</description>
-      <field name="ChannelEnable" start="0" bits="64" format="bitmask" />
-    </memory>
+      <field name="ChannelEnable" start="0" bits="32" format="bitmask" />
+    </register>
 
     <register name="DataTransferLimit" address="0004">
       <description>Configuration of the data transfer limit feature</description>
index 7d335e82a98cfab3d6be268120db71e3afe39a3d..02cd1daca3bb278b67eda8148fd535a028ae6dee 100755 (executable)
@@ -1,19 +1,16 @@
 #!/usr/bin/perl -w
-use warnings;
-use FileHandle;
-use Time::HiRes qw( usleep );
-use Data::Dumper;
-use Data::TreeDumper;
 use HADES::TrbNet;
-use Date::Format;
-use Pod::Usage;
-use Getopt::Long;
-use File::chdir;
 use Storable qw(lock_retrieve);
-use Text::TabularDisplay;
 use feature "switch";
 use CGI::Carp qw(fatalsToBrowser);
 
+use if (!defined $ENV{'QUERY_STRING'}), warnings;
+use if (!defined $ENV{'QUERY_STRING'}), Pod::Usage;
+use if (!defined $ENV{'QUERY_STRING'}), Text::TabularDisplay;
+use if (!defined $ENV{'QUERY_STRING'}), Data::Dumper;
+use if (!defined $ENV{'QUERY_STRING'}), Data::TreeDumper;
+use if (!defined $ENV{'QUERY_STRING'}), Getopt::Long;
+
 
 my ($db,$data,$once,$slice);
 my $help = 0;
@@ -21,7 +18,7 @@ my $verbose = 0;
 my $isbrowser = 0;
 my $server = $ENV{'SERVER_SOFTWARE'} || "";
 my @request;
-my ($file,$netaddr,$name, $style);
+my ($file,$entity,$netaddr,$name, $style);
 
 
 $ENV{'DAQOPSERVER'}="localhost:7" unless (defined $ENV{'DAQOPSERVER'});
@@ -50,15 +47,15 @@ foreach my $req (@request) {
   if(defined $ENV{'QUERY_STRING'}) {
     if($server =~ /HTTPi/i) {
       $isbrowser = 1;
-      ($file,$netaddr,$name,$style) = split("-",$req);
-      $file = "htdocs/xml-db/cache/$file.entity";
+      ($entity,$netaddr,$name,$style) = split("-",$req);
+      $file = "htdocs/xml-db/cache/$entity.entity";
       }
     else {
   #     use FindBin qw($RealBin);
       my $RealBin = ".";
       $isbrowser = 1;
-      ($file,$netaddr,$name,$style) = split("-",$req);
-      $file = "$RealBin/cache/$file.entity";
+      ($entity,$netaddr,$name,$style) = split("-",$req);
+      $file = "$RealBin/cache/$entity.entity";
       }
     }
   else {
@@ -70,7 +67,7 @@ foreach my $req (@request) {
               'verbose|v+' => \$verbose,
               ) or pod2usage(2);
     pod2usage(1) if $help;
-    
+    $entity  = $ARGV[0] || "";
     $file    = "$RealBin/cache/$ARGV[0].entity";
     $netaddr = $ARGV[1] || "";
     $name    = $ARGV[2] || "";
@@ -83,6 +80,8 @@ foreach my $req (@request) {
   my $sortAddr = $style =~ /sortaddr/i;
      $verbose  = ($style =~ /verbose/i) ||$verbose;
 
+    
+     
 ###############################
 #### Check arguments for validity
 ###############################
@@ -116,25 +115,28 @@ foreach my $req (@request) {
   else {
     runandprint($db->{$name},$name,$slice,$once);
     }
-
 }
  
 ###############################
 #### Formatting of values
 ###############################
 sub FormatPretty {
-  my ($value,$obj,$cont,$class) = @_;
+  my ($value,$obj,$cont,$class,$cstr) = @_;
   $value  = $value >> ($obj->{start});
   $value &= ((1<<$obj->{bits})-1);
   $value = $value * ($obj->{scale}||1) + ($obj->{scaleoffset}||0);
   
   $class = "" unless $class;
+  $cstr  = "" unless $cstr;
   my $ret, my $cl;
   if (defined $cont) {
     $cl = "class=\"$class ".($value?"bad":"good")."\"" if     ( $obj->{errorflag} && !$obj->{invertflag});
     $cl = "class=\"$class ".($value?"good":"bad")."\"" if     ( $obj->{errorflag} &&  $obj->{invertflag});
     $cl = "class=\"$class ".($value?"high":"low")."\"" if     (!$obj->{errorflag} && !$obj->{invertflag});
     $cl = "class=\"$class ".($value?"low":"high")."\"" if     (!$obj->{errorflag} &&  $obj->{invertflag});
+    $cl .= sprintf(" title=\"raw: 0x%x\n$cstr\"",$value);
+    $cl .= sprintf(" cstr=\"$cstr\" raw=\"0x%x\"",$value);
+    
     $ret = "<$cont ";
     for($obj->{format}) {    
       when ("boolean") {
@@ -147,7 +149,7 @@ sub FormatPretty {
       when ("signed")   {$ret .= sprintf("$cl>%d",$value);}
       when ("binary")   {$ret .= sprintf("$cl>%0".$obj->{bits}."b",$value);}
       when ("bitmask")  {$ret .= sprintf("$cl>%0".$obj->{bits}."b",$value);}
-      when ("time")     {$ret .= time2str('>%Y-%m-%d %H:%M',$value);}
+      when ("time")     {require Date::Format; $ret .= Date::Format::time2str('>%Y-%m-%d %H:%M',$value);}
       when ("hex")      {$ret .= sprintf("$cl>%8x",$value);}
       when ("enum")     { my $t = sprintf("%x",$value);
                           if (exists $obj->{enumItems}->{$t}) {
@@ -169,7 +171,7 @@ sub FormatPretty {
       when ("signed")   {$ret = sprintf("%d",$value);}
       when ("binary")   {$ret = sprintf("%b",$value);}
       when ("bitmask")  {$ret = sprintf("%0".$obj->{bits}."b",$value);}
-      when ("time")     {$ret = time2str('%Y-%m-%d %H:%M',$value);}
+      when ("time")     {require Date::Format; $ret = Date::Format::time2str('%Y-%m-%d %H:%M',$value);}
       when ("hex")      {$ret = sprintf("%8x",$value);}
       when ("enum")     { my $t = sprintf("%x",$value);
                           if (exists $obj->{enumItems}->{$t}) {
@@ -229,7 +231,7 @@ sub requestdata {
       foreach my $k (keys $o) {
         $data->{$obj->{address}+$slice*$stepsize}->{$k} = $o->{$k};
         }
-      } while(defined $obj->{repeat} && ++$slice < $obj->{repeat});
+      } while(!$once && defined $obj->{repeat} && ++$slice < $obj->{repeat});
     }
   }
 
@@ -275,11 +277,17 @@ sub generateoutput {
         $t .= sprintf("<tr><td title=\"raw: 0x%x\">%04x",$data->{$addr}->{$b},$b);
         if($obj->{type} eq "register") {
           foreach my $c (@{$obj->{children}}) {
-            $t .= FormatPretty($data->{$addr}->{$b},$db->{$c},"td",($wr?"editable":""));
+            my $fullc = $c;
+            $fullc .= ".$slice" if ($once != 1 && defined $obj->{repeat});
+            my $cstr = sprintf("%s-0x%04x-%s", $entity,$b,$fullc );
+            $t .= FormatPretty($data->{$addr}->{$b},$db->{$c},"td",($wr?"editable":""),$cstr);
             }
           }
         elsif($obj->{type} eq "field" || $obj->{type} eq "registerfield") {
-          $t .= FormatPretty($data->{$addr}->{$b},$obj,"td");
+          my $fullc = $name;
+          $fullc .= ".$slice" if ($once != 1 && defined $obj->{repeat});
+          my $cstr = sprintf("%s-0x%04x-%s", $entity,$b,$fullc );
+        $t .= FormatPretty($data->{$addr}->{$b},$obj,"td",($wr?"editable":""),$cstr);
           }
         }
       
diff --git a/xml-db/put.pl b/xml-db/put.pl
new file mode 100755 (executable)
index 0000000..ad325c8
--- /dev/null
@@ -0,0 +1,155 @@
+#!/usr/bin/perl -w
+
+use HADES::TrbNet;
+use Storable qw(lock_retrieve);
+use feature "switch";
+use CGI::Carp qw(fatalsToBrowser);
+
+use if (!defined $ENV{'QUERY_STRING'}), warnings;
+use if (!defined $ENV{'QUERY_STRING'}), Pod::Usage;
+use if (!defined $ENV{'QUERY_STRING'}), Text::TabularDisplay;
+use if (!defined $ENV{'QUERY_STRING'}), Data::Dumper;
+use if (!defined $ENV{'QUERY_STRING'}), Data::TreeDumper;
+use if (!defined $ENV{'QUERY_STRING'}), Getopt::Long;
+
+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,$fullname, $value);
+
+
+$ENV{'DAQOPSERVER'}="localhost:7" unless (defined $ENV{'DAQOPSERVER'});
+die "can not connect to trbnet-daemon on $ENV{'DAQOPSERVER'}: ".trb_strerror() unless (defined &trb_init_ports());
+
+
+
+if (defined $ENV{'QUERY_STRING'}) {
+  @request = split("&",$ENV{'QUERY_STRING'});
+  unless ($server  =~ /HTTPi/i) {
+    print "Content-type: text/html\n\n";
+    }
+  }
+else {
+  $request[0] = ""; #Dummy entry to run foreach
+  }
+
+  
+
+
+foreach my $req (@request) {
+###############################
+#### Check if browser or command line
+###############################
+
+  if(defined $ENV{'QUERY_STRING'}) {
+    if($server =~ /HTTPi/i) {
+      $isbrowser = 1;
+      ($entity,$netaddr,$name,$value) = split("-",$req);
+      $file = "htdocs/xml-db/cache/$entity.entity";
+      }
+    else {
+  #     use FindBin qw($RealBin);
+      my $RealBin = ".";
+      $isbrowser = 1;
+      ($entity,$netaddr,$name,$value) = split("-",$req);
+      $file = "$RealBin/cache/$entity.entity";
+      }
+    }
+  else {
+  #   use FindBin qw($RealBin);
+    my $RealBin = ".";
+    Getopt::Long::Configure(qw(gnu_getopt));
+    GetOptions(
+              'help|h' => \$help,
+              'verbose|v+' => \$verbose,
+              ) or pod2usage(2);
+    pod2usage(1) if $help;
+    $entity  = $ARGV[0] || "";
+    $file    = "$RealBin/cache/$ARGV[0].entity";
+    $netaddr = $ARGV[1] || "";
+    $name    = $ARGV[2] || "";
+    $value   = $ARGV[3] || "";
+    }
+
+
+  
+###############################
+#### Check arguments for validity
+###############################
+
+  die "Entity $file not found.\n" unless(-e $file) ;
+    
+  if    ($netaddr=~ m/0x([0-9a-fA-F]{4})/) {$netaddr = hex($1);}
+  elsif ($netaddr=~ m/([0-9]{1,5})/) {$netaddr = $1;}
+  else {die "Could not parse address $netaddr\n";}
+
+
+  if    ($name =~ m/^([a-zA-Z0-9]+)\.(\d+)$/) {$name = $1; $slice = $2;}
+  elsif ($name =~ m/^([a-zA-Z0-9]+)$/)       {$name = $1; $slice = 0;}
+  else {die "Could not parse name $name \n";}
+
+  $db = lock_retrieve($file);
+  die "Unable to read cache file\n" unless defined $db;
+
+  die "Name not found in entity file\n" unless(exists $db->{$name});
+
+  die "Object can not be written\n" unless ($db->{$name}->{mode} =~ /w/);
+  
+  $value = any2dec($value);
+  
+###############################
+#### Main "do the job"
+###############################
+
+  writedata($db->{$name},$entity,$name,$slice,$netaddr,$value);
+  }
+
+
+sub writedata {
+  my ($obj,$entity,$name,$slice,$netaddr,$value) = @_;
+  my $stepsize = $obj->{stepsize} || 1;
+  
+  unless ($obj->{type} eq "field" || $obj->{type} eq "registerfield") {
+    print "No valid object name.\n";
+    return -1;
+    }
+    
+  my $o = trb_register_read($netaddr,$obj->{address}+$slice*$stepsize);
+  unless (defined $o) {
+    print "No valid answer.\n";
+    return -2;
+    }
+    
+  foreach my $b (keys $o) {
+    $old  = $o->{$b};
+    my $mask = ~(((1<<$obj->{bits})-1) << $obj->{start});
+    $old = $old & $mask;
+    
+    my $new = $value & ((1<<$obj->{bits})-1); 
+    $new = $new << $obj->{start};
+    $new = $new | $old;
+    trb_register_write($b,$obj->{address}+$slice*$stepsize,$new);
+    }
+  }
+
+  
+sub any2dec { # converts numeric expressions 0x, 0b or decimal to decimal
+  
+  my $argument = $_[0];
+  #print "any2dec input argument $argument\n";  
+
+  if ( $argument =~ m/0[bxBX]/) { 
+    return oct $argument;
+  } else {
+    return $argument;
+  }
+}  
+  
+print "Done\n";
+1;
+
+
+