]> jspc29.x-matter.uni-frankfurt.de Git - daqtools.git/commitdiff
added TDCv4 support, mt
authorMichael Traxler <M.Traxler@gsi.de>
Mon, 3 May 2021 02:03:15 +0000 (04:03 +0200)
committerMichael Traxler <M.Traxler@gsi.de>
Mon, 3 May 2021 02:03:15 +0000 (04:03 +0200)
web/htdocs/commands/getv4_hitrates.pl [new file with mode: 0755]
web/htdocs/tdc/tdcv4.htm [new file with mode: 0644]

diff --git a/web/htdocs/commands/getv4_hitrates.pl b/web/htdocs/commands/getv4_hitrates.pl
new file mode 100755 (executable)
index 0000000..89952ff
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
+use HADES::TrbNet;
+use Data::Dumper;
+if ($ENV{'SERVER_SOFTWARE'} =~ /HTTPi/i) {
+  print "HTTP/1.0 200 OK\n";
+  print "Content-type: text/html\r\n\r\n";
+  }
+else {
+  use lib '..';
+  use if (!($ENV{'SERVER_SOFTWARE'} =~ /HTTPi/i)), "apacheEnv";
+  print "Content-type: text/html\n\n";
+  }
+
+
+ if (!defined &trb_init_ports()) {
+   die("can not connect to trbnet-daemon on the $ENV{'DAQOPSERVER'}");
+ }
+
+#print Dumper \%ENV;
+my ($board,$addr,$amount,$split) = split('-',$ENV{'QUERY_STRING'});
+
+#print Dumper ($board,$addr,$amount,$split);
+#exit;
+
+$board = hex($board);
+$addr = hex($addr);
+$amount = 1 unless $amount;
+$split = 1 unless $split;
+
+my $rh_values = {};
+
+if($amount != 1) {
+  if ($split <= 1) {
+    #printf ("%04x ",$board);
+    trb_register_write($board, 0xcd30, 0x100);
+    foreach my $hitcounter_offset ( 0x00, 0x10, 0x20, 0x30, 0x40) {
+      my $hits = trb_register_read_mem($board,$addr+$hitcounter_offset,0,$amount);
+      foreach my $b (sort {$a <=> $b} keys %$hits) {
+        for(my $c =0; $c < 8; $c++) {
+          push (@{$rh_values->{$b}}, $hits->{$b}->[$c]);
+          #printf(" %d",$hits->{$b}->[$c]);
+        }
+      }
+    }
+
+    foreach my $b (sort {$a <=> $b} keys %$rh_values) {
+      printf ("%04x",$b);
+      for(my $c =0; $c < $amount+4; $c++) {
+        #push (@{$rh_values->{$b}}, $hits->{$b}->[$c]);
+        printf(" %d",$rh_values->{$b}->[$c]);
+      }
+      print "&";
+    }
+
+
+  }
+  else {
+    my $chunk = int($amount/$split);
+    if($amount%$split) {$chunk++;}
+
+    my $i = 0;
+    my @hits;
+    do {
+      $hits[$i] = trb_register_read_mem($board,$addr+$i*$chunk,0,$chunk);
+#      print Dumper  %{$hits[$i]};
+#       print ($board." ".($addr+$i*$chuink)." ".($amount/$split)."\n");
+      } while(++$i < $split);
+    foreach my $b (sort {$a <=> $b} keys %{$hits[0]}) {
+      printf ("%04x",$b);
+      for(my $i = 0; $i < scalar @hits; $i++) {
+        for(my $c =0; $c < $chunk; $c++) {
+          if($i*$chunk + $c < $amount) {
+            printf(" %d",$hits[$i]->{$b}->[$c]);
+            }
+          }
+        }
+      print "&";
+      }
+    }
+  }
+else {
+  my $hits = trb_register_read($board,$addr);
+  foreach my $b (sort {$a <=> $b} keys %$hits) {
+    printf ("%04x",$b);
+    printf(" %d",$hits->{$b});
+    print "&";
+    }
+  
+  }
+  
+exit 1;
diff --git a/web/htdocs/tdc/tdcv4.htm b/web/htdocs/tdc/tdcv4.htm
new file mode 100644 (file)
index 0000000..f21658a
--- /dev/null
@@ -0,0 +1,561 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    <link href="../layout/styles.css" rel="stylesheet" type="text/css"/>
+    <script src="../scripts/scripts.js" type="text/javascript"></script>
+    <title>TDCv4 Hit Counter</title>
+  </head>
+  <body>
+
+    <h2><a href="../">TDCv4 Hit Counters &amp; TDCv4 Enable</a></h2>
+    <form acion="">
+      <table class="form"><tr class="head"><th colspan=4>Configuration
+            <tr title="4-digit hex board address for data query"><td>Board
+            <td><input onChange="setValues()" type="text" id="form_board" name="board" maxlength="4" value="fe53">
+            <tr title="list of 4-digit hex addresses of boards to show"><td>Filter
+            <td><input onChange="setValues()" type="text" id="form_filter" name="filter"  value="" >
+            <tr title="Number of TDC channels to show"><td># of Channels
+            <td><input onChange="setValues()" type="text" id="form_channels" name="channels" maxlength="3" value="32">
+            <tr title="Update interval in milliseconds, separate for first and second table"><td>Update Interval (ms)
+            <td><input onChange="setValues()" type="text" id="form_rate" name="rate" maxlength="5" value="1000">
+            <input onChange="setValues()" type="text" id="form_rate2" name="rate2" maxlength="5" value="5000">
+
+            <tr><td title="For huge set-ups, enable this to split data queries in several smaller chunks">Split Table
+            <td title="For huge set-ups, enable this to split data queries in several smaller chunks"><input onChange="setValues()" type="checkbox" id="form_split" name="split" value="4">
+            <td title="Show only the difference of input signal counters since the last read-out, not absolute value">Differences
+            <td title="Show only the difference of input signal counters since the last read-out, not absolute value"><input onChange="setValues()" type="checkbox" id="form_diff" name="diff" value="1" checked>
+
+
+            <tr> <td title="Enable display of current input status.">Input Status
+            <td title="Enable display of current input status."><input onChange="setValues()" type="checkbox" id="form_status" name="status" value="1" checked>
+            <td title="Show control buttons for channel enable/disable">Enable
+            <td title="Show control buttons for channel enable/disable"><input onChange="setValues()" type="checkbox" id="form_enable" name="enable" value="1" checked>
+
+            <tr><td title="Enable display of hit rates for deactive channels.">Hit Rate Status
+            <td title="Enable display of hit rates for deactive channels."><input onChange="setValues()" type="checkbox" id="form_hitrate" name="hitrate" value="1" checked>&nbsp;
+
+            <tr><td><td title="Just for your convenience, you actually don't need this button..."><input type="button" onClick="setValues()" value="OK">
+            <td title="Reset TDC counters"><input type="button" onClick="resetCounters()" value="RESET">
+
+      </table>
+    </form>
+
+<div style="float:left"><table class="content" id="content"><tr><th>Channel<th>Value</table></div>
+<div style="float:left"><table class="content" id="contentstat"><tr><th>Register<th>Values</table></div>
+<div style="float:left"><table class="content" id="contentctrl"><tr><th>Register<th>Values</table></div>
+
+
+<script language="javascript">
+    var updaterate  = document.getElementById("form_rate").value;
+var updaterate2 = document.getElementById("form_rate2").value;
+var filter      = document.getElementById("form_filter").value;
+var board       = document.getElementById("form_board").value;
+var channels    = document.getElementById("form_channels").value;
+var split       = document.getElementById("form_split").checked?"-4":"";
+var differences = document.getElementById("form_diff").checked;
+var showstatus  = document.getElementById("form_status").checked;
+var showenable  = document.getElementById("form_enable").checked;
+var showhitrate = document.getElementById("form_hitrate").checked;
+var oldvalues = {};
+
+var regstatus_a = "ce00-9";
+var regstatus_b = "ce10-9";
+var regctrl   = "cd00-29";
+var momentaryStatus = {};
+  
+var regstatusnames = new Array("SR0<br>SR1<br>ref input","","","",
+                               "valid trg","valid tmg trg","valid notmg","invalid trg","multi trg",
+                               "spurious trg","wrong rdo","spikes","idle time","wait time","",
+                               "releases","rdo time","timeout number","data finished number");
+var regctrlnames = new Array("Logic Anal.<br>Debug Mode<br>Calib. Prescaler",
+                             "window en.<br>window bef.<br>window aft.","act chan 1","act chan 2","data limit","inv chan 1","inv chan 2");                         
+
+var regchannelenable_a = "cd12-1";
+var regchannelenable_b = "cd22-1";
+
+var tooltipstatus      = "\"Green: momentary state is a low input (normal state) \nRed: momentary state is a high input (not OK for a non inverved TDC)\"";
+
+
+var updateTask;
+var updateStatRegsTask_a;
+var updateStatRegsTask_b;
+  
+var updateCtrlRegsTask;
+var updateChannelEnable_aTask;
+var updateChannelEnable_bTask;
+
+var enableGroup = new Array();
+for(i=0;i<100;i++) enableGroup[i] = new Array();
+
+
+function settimers(time1,time2) {
+    if(time1 != -1) {
+        if(!time1) time1 = updaterate;
+        clearTimeout(updateTask);
+
+        updateTask = setTimeout("getdata('../commands/getv4_hitrates.pl?"+board+"-cc00-"+channels+"',update)",time1);
+        //updateTask1 = setTimeout("getdata('../commands/get.pl?"+board+"-cc10-"+8+"',concatstr)",time1-60);
+        //updateTask2 = setTimeout("getdata('../commands/get.pl?"+board+"-cc20-"+8+"',concatstr)",time1-30);
+        //updateTask3 = setTimeout("getdata('../commands/get.pl?"+board+"-cc30-"+8+"',update1)",time1);
+        //updateTask3 = setTimeout("update1",time1);
+        //writeTask1 = setTimeout("getdata('../commands/putbit.pl?"+board+"-cd30-set-0x100')",time1-100);
+        
+    }
+    
+    if(time2 != -1) {
+        if(!time2) time2 = updaterate2;
+        clearTimeout(updateStatRegsTask_a);
+        clearTimeout(updateStatRegsTask_b);
+        clearTimeout(updateCtrlRegsTask);
+        clearTimeout(updateChannelEnable_aTask);
+        clearTimeout(updateChannelEnable_bTask);
+
+        updateChannelEnable_aTask = setTimeout("getdata('../commands/get.pl?"+board+"-"+regchannelenable_a+"',updatechannelenable_a)",time2);
+        updateChannelEnable_bTask = setTimeout("getdata('../commands/get.pl?"+board+"-"+regchannelenable_b+"',updatechannelenable_b)",time2);
+        
+        updateStatRegsTask_a = setTimeout("getdata('../commands/get.pl?"+board+"-"+regstatus_a+"',updatestatregs_a)",time2);
+        updateStatRegsTask_b = setTimeout("getdata('../commands/get.pl?"+board+"-"+regstatus_b+"',updatestatregs_b)",time2);
+
+        //updateCtrlRegsTask = setTimeout("getdata('../commands/get.pl?"+board+"-"+regctrl+"',updatectrlregs)",time2);
+
+
+    }
+}
+
+
+function updatechannelenable_a(data) {
+    //console.log(data);
+    if(!document.getElementById("content").innerHTML) return;
+    var b = data.split("&");
+    var val;
+    var j;
+    var c = {};
+    
+    for(j=0;j<b.length-1;j++) {
+        c[j] = b[j].split(/\s+/);
+        val = c[j][1];
+        //console.log(c[j], val);
+        enableGroup[j][0] = val;
+        //console.log(enableGroup[j]);
+    }
+}
+
+function updatechannelenable_b(data) {
+    //console.log(data);
+    if(!document.getElementById("content").innerHTML) return;
+    var b = data.split("&");
+    var val;
+    var j;
+    var c = {};
+    
+    for(j=0;j<b.length-1;j++) {
+        c[j] = b[j].split(/\s+/);
+        val = c[j][1];
+        //console.log(c[j], val);
+        enableGroup[j][1] = val;
+        //console.log(enableGroup[j]);
+    }
+}
+
+
+
+
+function update(data) {
+    //console.log(data);
+    if(!document.getElementById("content").innerHTML) return;
+    var b = data.split("&");
+    var c = {};
+    var isShown = new Array();
+    o = "<tr class=\"head\"><th>Reg<th>Channel";
+
+    for(j=0;j<b.length-1;j++) {
+        //console.log(b[j].split(/\s+/));
+        c[j] = b[j].split(/\s+/);
+        //c[j] = b[j].split(" ");
+        if(!oldvalues[j]) {
+            oldvalues[j] = c[j];
+        }
+
+        if(filter == "" || filter.indexOf(c[j][0]) != -1)
+            isShown[j] = 1;
+        else
+            isShown[j] = 0;
+        if(isShown[j])
+
+            o += "<th>"+c[j][0];
+        //console.log(o);
+    } 
+    if(showenable) {
+        o += "<tr><td><td>Channel group";
+        for(j=0;j<b.length-1;j++) {
+            if(isShown[j]) {
+                o += "<th>";
+                for(k=0;k<=3;k++) {
+                    o += "<span style=\"display:block;float:right;width:22px;font-size:80%\">"+k+"</span>";
+                }
+                o+="<br>";
+                for(k=3;k>=0;k--) {
+                    // o += "<input class=\"onoffbutton\" type=\"button\" onClick=\"setEnableBlock(this,'"+c[j][0]+"',"+k+",1)\" value=\"on\">";
+                }
+                o += "<br>";
+                for(k=3;k>=0;k--) {
+                    //o += "<input class=\"onoffbutton\" type=\"button\" onClick=\"setEnableBlock(this,'"+c[j][0]+"',"+k+",0)\" value=\"off\">";
+                }
+            }
+        }
+    }
+
+    if(0) {
+    o += "<tr><th>0xcc40 (DiRICH)<td>Reference Channel";
+    for(j=0;j<b.length-1;j++) {
+        if(isShown[j]) {
+            o += "<td>"+c[j][0x10];
+        }
+    }
+    o += "<br>";
+    }
+        
+    //for(i = 1; i <= (channels + 1); i++) {
+    //console.log("channels: ", channels, channels +1);
+    for(i = 1; i <= Number(channels) + 1; i++) {
+        o += "<tr><th>"+( ((i-1)%8+0xcc00)+ Math.floor((i-1)/8)*0x10 ).toString(16);
+
+        if (i==33) {
+            o += "<th>RefCh";
+        }
+        else {
+            o += "<th>"+(i-1);
+        }
+
+        for(j=0;j<b.length-1;j++) {
+            if(isShown[j]) {
+                //console.log(enableGroup[j][0]);
+                enabled = (enableGroup[j][Math.floor((i-1)/16)]&1<<(i-1)%16)?"checked":"";
+                //enabled = "checked";
+                //        if(showhitrate == 0 && enabled == 0 && i != 1) 
+                //          val = 0x0;
+                //        else {
+                var sc_td=1;
+                var cd;
+                var sc_time1;
+                var sc_time2;
+                if(differences) {
+                    sc_time1 = (c[j][36]&0xFFFFFFFF)*4294967296. + c[j][35]*1.0;
+                    //sc_time1 = (c[j][35]&0xFFFFFFFF) *1.;
+                    sc_time2 = ((oldvalues[j][36]&0xFFFFFFFF)*4294967296.) + oldvalues[j][35]*1.;
+                    //sc_time2 = (oldvalues[j][35]&0xFFFFFFFF)*1.;
+                    sc_td = sc_time1 - sc_time2;
+                    cd = (c[j][i] & 0xFFFFFFFF) - ((oldvalues[j][i]||0) & 0xFFFFFFFF);
+                    //if (cd < 0) {
+                    //    cd += 0x80000000;
+                    //}
+                    val = Math.floor(cd / (sc_td/1E8));
+                    //if(i==1) console.log(sc_td, cd, val);
+                }
+                else {
+                    val = c[j][i] & 0xFFFFFFFF;
+                }
+                //          }
+                if(showstatus && enabled) {
+                    //console.log("status:", momentaryStatus[0][0], momentaryStatus[1][0], i, Math.floor((i-1)/16) );
+                    //console.log("status yes/no:", (((momentaryStatus[Math.floor((i-1)/16)][j])&(0x1<<i))?"over":"under") );
+                    o += "<td title="+tooltipstatus+" class=\""+(((momentaryStatus[Math.floor((i-1)/16)][j])&(0x1<<Math.floor(i/16)))?"over":"under")+"\">";
+                }
+                else
+                    o += "<td>";
+                o += (val);
+                if(showenable && i!=0) {
+                    checked = (enableGroup[j][Math.floor((i-1)/16)]&1<<(i-1)%16)?"checked":"";
+                    o += "<input class=\"checkbox\" type=\"checkbox\" onClick=\"setEnable(this,'"+c[j][0]+"',"+(i-1)+")\" "+checked+">";
+                }
+            }
+        }
+    }
+
+    if(0) {
+    o += "<tr><th>0xcc40 (DiRICH)<td>Reference Channel";
+    for(j=0;j<b.length-1;j++) {
+        o += "<td>";
+        o += (c[j][33]);
+    }
+    }
+
+        
+    oldvalues = c;
+    document.getElementById("content").innerHTML  = o;
+    settimers(0,-1);
+    delete isShown;
+    
+}
+
+function setValues() {
+    updaterate  = document.getElementById("form_rate").value;
+    updaterate2 = document.getElementById("form_rate2").value;
+    board       = document.getElementById("form_board").value;
+    filter      = document.getElementById("form_filter").value;
+    split       = document.getElementById("form_split").checked?"-4":"";
+    differences = document.getElementById("form_diff").checked;
+    showstatus  = document.getElementById("form_status").checked;
+    channels    = document.getElementById("form_channels").value;
+    showenable  = document.getElementById("form_enable").checked;
+    showhitrate = document.getElementById("form_hitrate").checked;
+    settimers(200,50);
+    
+}
+
+function setEnable(e,board,channel) {
+    reg = Math.floor(channel/16)*0x10 + 0xcd12;  // TDL TDC enable registers
+    op  = e.checked?"set":"clr";
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+op+"-"+((0xffffffff+(1<<(channel%16))+1)%0x100000000).toString(16),0);
+
+    reg = Math.floor(channel/16)*0x10 + 0xcd18;  // Sampling TDC enable registers
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+op+"-"+((0xffffffff+(1<<(channel%16))+1)%0x100000000).toString(16),0);
+    settimers(200,50);
+}
+
+function setEnableBlock(e,board,channel,val) {
+    reg = Math.floor(channel/2) + 0xc802;
+    op  = val?"set":"clr";
+    value = channel%2?0xffff0000:0xffff;
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+op+"-"+value.toString(16),0);
+    settimers(200,50);
+}  
+
+function setRunMode(e,board,val) {
+    reg = 0xc800;
+    op  = val?"set":"clr";
+    value = 0x1000;
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+op+"-"+value.toString(16),0);
+    settimers(200,50);
+}
+
+function setCalibPrescaler(e,board) {
+    reg = 0xc800;
+    value = e.value;
+    getdata("../commands/putbitrange.pl?"+board+"-"+reg.toString(16)+"-F0000000-"+(value*1.).toString(16)+"0000000",0);
+    settimers(200,50);
+}
+
+function resetCounters() {
+    reg = 0xc800;
+    value = 0x100;
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+"set"+"-"+value.toString(16),0);
+    settimers(200,50);
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+"clr"+"-"+value.toString(16),0);
+    settimers(200,50);
+}
+
+function setEnableWindow(e,board,val) {
+    reg = 0xc801;
+    op  = val?"set":"clr";
+    value = 0x80000000;
+    getdata("../commands/putbit.pl?"+board+"-"+reg.toString(16)+"-"+op+"-"+value.toString(16),0);
+    settimers(200,50);
+}
+
+function setDataLimit(e,board) {
+    reg = 0xc804;
+    value = e.value;
+    getdata("../commands/put.pl?"+board+"-"+reg.toString(16)+"-"+(value*1.).toString(16),0);
+    settimers(200,50);
+}  
+
+function setInvert(e,board,n) {
+    reg = 0xc805+n;
+    value = e.value;
+    getdata("../commands/put.pl?"+board+"-"+reg.toString(16)+"-"+(value*1.).toString(16),0);
+    settimers(200,50);
+}  
+
+function setTriggerWindow(e,board,val) {
+    reg = 0xc801;
+    preTrigger = 0x7FF;
+    postTrigger = 0x7FF0000;
+    value = (e.value)/5;
+    if(val==0)
+        getdata("../commands/putbitrange.pl?"+board+"-"+reg.toString(16)+"-"+preTrigger.toString(16)+"-"+(value*1.).toString(16),0);
+    else {
+        if (value < 0) { 
+            var value_twos = (value)+1;
+            if (value_twos < 0){
+                getdata("../commands/putbitrange.pl?"+board+"-"+reg.toString(16)+"-"+postTrigger.toString(16)+"-"+((0xfFF+(value_twos))*65536.).toString(16),0);
+            }
+        } else {
+            getdata("../commands/putbitrange.pl?"+board+"-"+reg.toString(16)+"-"+postTrigger.toString(16)+"-"+(value*65536.).toString(16),0);
+        }
+    }
+    settimers(200,50);   
+}  
+
+
+  function updatestatregs_a(data) {
+      if(!document.getElementById("contentstat").innerHTML) return;
+      var b = data.split("&");
+      var c = {};
+      momentaryStatus[0]={};
+      for(j=0;j<b.length-1;j++) {
+          c[j] = b[j].split(/\s+/);
+          momentaryStatus[0][j] = (0xffffff&c[j][0x2]); // status register + 1 (TRBNet Address)
+          //console.log("ms 0xce01:, j", momentaryStatus[0][j], j );
+      } 
+  }
+
+  function updatestatregs_b(data) {
+      if(!document.getElementById("contentstat").innerHTML) return;
+      var b = data.split("&");
+      var c = {};
+      momentaryStatus[1]={};
+      for(j=0;j<b.length-1;j++) {
+          c[j] = b[j].split(/\s+/);
+          momentaryStatus[1][j] = (0xffffff&c[j][2]);
+          //console.log("ms 0xce11: j:", momentaryStatus[1][j], j);
+      } 
+  }
+
+      
+  
+function updatestatregs_c(data) {
+    if(!document.getElementById("contentstat").innerHTML) return;
+    var b = data.split("&");
+    var c = {};
+    var isShown = new Array();
+    o = "<tr class=\"head\"><th>Reg<th>Content";
+
+    for(j=0;j<b.length-1;j++) {
+        c[j] = b[j].split(/\s+/);
+        if(filter == "" || filter.indexOf(c[j][0]) != -1)
+            isShown[j] = 1;
+        else
+            isShown[j] = 0;
+        if(isShown[j])
+            o += "<th>"+c[j][0];
+    } 
+    
+    for(i = 0; i < 19; i++) {
+        //if(regstatusnames[i]=="") continue;
+        o += "<tr><th>"+(0xce00+i).toString(16)+"<td>"+regstatusnames[i];
+
+
+        
+        momentaryStatus[0] = {};
+        momentaryStatus[1] = {};
+        for(j=0;j<b.length-1;j++) {
+            //console.log("0xce00 j: + i: , c:", j , i, c[j][i]);
+            if(isShown[j]) {
+                val = c[j][i];
+                o += "<td>";
+                if(i==1) {
+                    o += ((val&0x0e000000)>>25)+"."+((val&0x1e00000)>>21)+"."+((val&0x1e0000)>>17)+"<br>"+((val&0xff00)>>8)+"<br>";
+
+                    if((val>>16 & 1)) 
+                        o += "<span class=\"over\" style=\"background:#faa;display:block;width:100%;float:right\">";
+                    if((val>>16 & 1))
+                        o += "<font color=#ff0000> <strong>polarity wrong</strong> </font> ";
+                    else
+                        o += "<font color=#007f00> <strong>polarity correct</strong> </font> ";
+                    if((val>>16 & 1)) 
+                        o += "</span>";
+                }
+
+                else {
+                    if(i==0x1 + 0x01) {
+                        momentaryStatus[0][j] = (0xffffff&val);
+                        console.log("ms 0xce01:", momentaryStatus[0][j] );
+                    }
+                    if(i=== (0x1 + 0x11)) {
+                        //console.log("value 0xce11:", val);
+                        momentaryStatus[1][j] = (0xffffff&val);
+                        console.log("ms 0xce11:", momentaryStatus[1][j] );
+                    }
+                    o += val;
+                }
+            }
+        }
+    }
+    document.getElementById("contentstat").innerHTML  = o;
+    settimers(-1,0);
+    delete isShown;
+}
+
+
+function updatectrlregs(data) {
+    if(!document.getElementById("contentctrl").innerHTML) return;
+    var b = data.split("&");
+    var c = {};
+    var isShown = new Array();
+    o = "<tr class=\"head\"><th>Reg<th>Content";
+
+    //console.log(b);
+    for(j=0;j<b.length-1;j++) {
+        c[j] = b[j].split(/\s+/);
+        if(filter == "" || filter.indexOf(c[j][0]) != -1)
+            isShown[j] = 1;
+        else
+            isShown[j] = 0;
+        if(isShown[j])
+            o += "<th>"+c[j][0];
+    }   
+    
+    for(i = 0; i < 0x29; i++) {
+        o += "<tr><th>"+(0xcd00+i).toString(16)+"<td>"+regctrlnames[i];
+        
+        for(j=0;j<b.length-1;j++) {
+            if(isShown[j]) {
+                val = c[j][i+1];
+                o += "<td>";
+                if(i==0) {
+                    o += (val&0xF)+"<br>"+((val&0x10)>>4)+"<br>";
+                    o += "<input onChange=\"setCalibPrescaler(this,'"+c[j][0]+"')\" type=\"text\" id=\"calibprescaler\" name=\"calibprescaler\" class=\"small\" maxlength=\"4\" value=\""+(val>>28 & 0xF)+"\">";
+                }
+                else if(i==1) {
+                    if ((val&0x80000000))
+                        o += "Enabled ";
+                    else
+                        o += "Disabled ";
+                    o += "<input class=\"onoffbutton\" type=\"button\" onClick=\"setEnableWindow(this,'"+c[j][0]+"',1)\" value=\"on\">";
+                    o += "<input class=\"onoffbutton\" type=\"button\" onClick=\"setEnableWindow(this,'"+c[j][0]+"',0)\" value=\"off\">";
+                    preWindow = (val&0x7FF)*5;
+                    postWindow = ((val&0x7FF0000)>>16)*5;
+                    o += "<br>"+"<input onChange=\"setTriggerWindow(this,'"+c[j][0]+"',0)\"type=\"text\" id=\"prewindow\"name=\"prewindow\" class=\"smaller\"maxlength=\"5\" value=\""+preWindow+"\"ns>"+"ns"+
+                        "<br>"+"<input onChange=\"setTriggerWindow(this,'"+c[j][0]+"',1)\"type=\"text\" id=\"postwindow\"name=\"postwindow\" class=\"smaller\"maxlength=\"5\" value=\""+postWindow+"\"ns>"+"ns";
+                }
+                else if(i==0x12 || i==0x22) {
+                    o += "0x"+(val*1.).toString(16);
+                    //if(i==0x12) enableGroup[j][0] = val*1.;
+                    //if(i==0x22) enableGroup[j][1] = val*1.;
+                }
+                else if(i==4) {
+                    o += "<input onChange=\"setDataLimit(this,'"+c[j][0]+"')\" type=\"text\" id=\"datalimit\" name=\"datalimit\" class=\"small\" ";
+                    if((val&0xFF)==0x0)
+                        o += "style =\"background-color: #fecccb;\" ";
+                    o += "maxlength=\"4\" value=\""+val+"\">";
+                    if((val&0xFF)>0x7b)
+                        o += "<font color=#ff0000> <strong><br>The maximium buffer size may be 123</strong> </font> ";
+                }
+                else if(i==5) {
+                    o += "<input onChange=\"setInvert(this,'"+c[j][0]+"',0)\" type=\"text\" id=\"invert0\" name=\"invert0\" class=\"small\" ";
+                    o += "maxlength=\"10\" value=\"0x"+(val*1.).toString(16)+"\">";
+                }          
+                else if(i==6) {
+                    o += "<input onChange=\"setInvert(this,'"+c[j][0]+"',1)\" type=\"text\" id=\"invert1\" name=\"invert1\" class=\"small\" ";
+                    o += "maxlength=\"10\" value=\"0x"+(val*1.).toString(16)+"\">";
+                }  
+                else {
+                    o += val;
+                }
+            }
+        }
+    }
+    
+    document.getElementById("contentctrl").innerHTML  = o;
+    settimers(-1,0);
+    delete isShown;
+}
+
+
+
+settimers(200,50);
+
+</script>
+</body></html>