]> jspc29.x-matter.uni-frankfurt.de Git - mdcfee.git/commitdiff
two versions of read-out scripts
authorJan Michel <j.michel@gsi.de>
Tue, 31 May 2016 12:38:45 +0000 (14:38 +0200)
committerJan Michel <j.michel@gsi.de>
Tue, 31 May 2016 12:38:45 +0000 (14:38 +0200)
mboasd8/readdata.pl [new file with mode: 0755]
mboasd8/readdata2.pl [new file with mode: 0755]

diff --git a/mboasd8/readdata.pl b/mboasd8/readdata.pl
new file mode 100755 (executable)
index 0000000..c10087a
--- /dev/null
@@ -0,0 +1,146 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Device::SerialPort;
+use feature 'state';
+use URI::Escape;
+use Data::Dumper;
+use HADES::TrbNet;
+use Time::HiRes qw( usleep);
+use Getopt::Long;
+
+
+my @counters;  
+my $port;
+my $help;
+my $ser_dev;
+my $isTrbNet = 0;
+my $poll = 0;
+my $cmd = "";
+my $verbose = 0;
+Getopt::Long::Configure(qw(gnu_getopt));
+GetOptions(
+           'help|h' => \$help,
+           'device|d=s' => \$ser_dev,
+           'poll|p' => \$poll,
+           'verbose|v' => \$verbose,
+          ) ;
+
+
+$ser_dev = "/dev/ttyUSB0" unless defined $ser_dev;
+$cmd = "RD0" if $poll;
+
+sub Cmd {
+  my ($c) = @_;
+  $port->write($c."\r\n") unless $c eq '';
+  my $al = 0; 
+  my $as = '';
+  for my $j (0..10) {
+    usleep(10);
+    my ($l,$s) = $port->read(11);
+    $al += $l; $as .= $s;
+    #print $s."\n";
+    if ($al < 11) {next;}
+    if ($as =~ /R([A-Fa-f0-9]{8})/) {return hex($1);}
+    else {last;}
+    }
+  return 0xdeadde99 if $poll; 
+  if($al != 0) {
+    for my $j (0..10) {
+      usleep(1);
+      my ($l,$s) = $port->read(1);
+      $al += $l; $as .= $s;
+     #print $as.' '.$al."\n" unless $as eq '';
+      if ($as =~ /R([A-Fa-f0-9]{8})$/) {return hex($1);}
+      }
+    }  
+  #print "%\n";
+  return 0xdeaddead;
+  }
+
+sub decode {
+  my $v = shift @_;
+  return 0 if($v == 0x001 || $v == 0x1fe);
+  return 1 if($v == 0x003 || $v == 0x1fc);
+  return 2 if($v == 0x007 || $v == 0x1f8);
+  return 3 if($v == 0x00f || $v == 0x1f0);
+  return 4 if($v == 0x01f || $v == 0x1e0);
+  return 5 if($v == 0x03f || $v == 0x1c0);
+  return 6 if($v == 0x07f || $v == 0x180);
+  return 7 if($v == 0x0ff || $v == 0x100);
+  return $v;
+  }
+  
+  
+if ($help || (defined $ARGV[0] && $ARGV[0] =~ /help/)) {
+  exit;
+  }
+
+
+$SIG{"INT"} =  \&finish;
+$SIG{"QUIT"} =  \&stats;
+
+sub finish{
+    stats();
+    my $v = Cmd("W0000000000");
+    exit;
+}
+    
+sub stats{
+  print "----------------------\n";
+  print "Bin\tCnt1\tSize1\tCnt2\tSize2\n";
+  my @sum;
+  for(my $i=0; $i < 512; $i++){
+    if ($counters[$i]) {
+      $sum[$i/256] += $counters[$i];
+      }
+    }
+  for(my $i=0; $i < 256; $i++){
+    if ($counters[$i]) {
+      printf("%01x\t%i\t%i\t%i\t%i\n",$i,$counters[$i],     $counters[$i]/$sum[0]*1000000/250,
+                                         $counters[$i+256], $counters[$i]/$sum[1]*1000000/250)
+      }
+    }
+  print ("Sum:\t$sum[0]\t\t$sum[1]\n");  
+  print "----------------------\n";
+  }
+  
+  
+  $port = new Device::SerialPort($ser_dev);
+  unless ($port) {
+    print "can't open serial interface $ser_dev\n";
+    exit;
+    } 
+  $port->user_msg('ON'); 
+  $port->baudrate(921600); 
+  $port->parity("none"); 
+  $port->databits(8); 
+  $port->stopbits(1); 
+  $port->handshake("none"); 
+  $port->read_char_time(0);
+  $port->read_const_time(0.1);
+  $port->write_settings;
+my $v; 
+my $last = 0;
+#Cmd("W0000000000");
+Cmd("W0000000001") unless $poll;
+print "Edge\tChan\tFine\tCoarse\tDiff to last leading edge in 500ps bins\n";  
+while(1) {
+#   usleep(1000);
+#  printf("%08x\n",$v);
+  $v = Cmd("$cmd");
+  next if ($v>>16 & 0xffff) == 0xdead;
+  unless ($v & 0x80000000) {next;}
+  next if $last == $v;
+  
+  $counters[($v&0xf) + (($v>>30 & 1) << 8)]++;    
+  my $diff = ($v>>4 & 0x3fffff)*8+($v & 0x7) - ($last>>4 & 0x3fffff)*8-($last & 0x7);
+  $diff += 2**24 if $diff < 0;
+  printf("%i\t%i\t%03x\t%i\t%i\n",$v>>30 & 1, $v>>26 & 0xf, ($v & 0x0f), $v>>4 & 0x3fffff, $diff) if $verbose;
+  $last = $v if $v>>30 & 1;
+  }
+  
+  
diff --git a/mboasd8/readdata2.pl b/mboasd8/readdata2.pl
new file mode 100755 (executable)
index 0000000..92f4070
--- /dev/null
@@ -0,0 +1,178 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use feature 'state';
+use URI::Escape;
+use Data::Dumper;
+use HADES::TrbNet;
+use Time::HiRes qw( usleep);
+use Getopt::Long;
+use Fcntl;
+
+
+my @counters;  
+my $port;
+my $help;
+my $ser_dev;
+my $isTrbNet = 0;
+my $poll = 0;
+my $cmd = "";
+my $verbose = 0;
+
+my $fh;
+
+Getopt::Long::Configure(qw(gnu_getopt));
+GetOptions(
+           'help|h' => \$help,
+           'device|d=s' => \$ser_dev,
+           'poll|p' => \$poll,
+           'verbose|v' => \$verbose,
+          ) ;
+
+
+$ser_dev = "/dev/ttyUSB1" unless defined $ser_dev;
+$cmd = "RD0" if $poll;
+
+sub Cmd {
+  my ($c) = @_;
+  #print "send command '$c'\n";
+  if ($c ne "") {
+    my $s = $c . "T"x0 . "\n";
+    #print "send string '$s'\n";
+    print $fh $s;
+    }
+  #usleep(10);
+  #sleep 1;
+  #sleep 1;
+  my $timeout = 1;
+  #return;
+  #print "try to read \n";
+  my ($rec) = eval {
+    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
+    alarm $timeout;
+    #my $rec2 = <$fh>;
+    my $rec2 ="";
+    my $nread = sysread $fh, $rec2, 100;
+    #print "received (n words: $nread) in eval: $rec2\n";
+    alarm 0;
+    $rec2;
+  };
+  if ($@) {
+    die unless $@ eq "alarm\n";   # propagate unexpected errors
+    print "timed out\n";
+    # timed out
+  }
+  else {
+   #print "received: $rec\n";
+  }
+
+#   return $rec;
+
+  if ($rec =~ /R([A-Fa-f0-9]{8})/) {return hex($1);}
+
+  return 0xdeadde99 if $poll;
+
+  #print "%\n";
+  #return 0xdeaddead;
+  }
+
+sub decode {
+  my $v = shift @_;
+  return 0 if($v == 0x001 || $v == 0x1fe);
+  return 1 if($v == 0x003 || $v == 0x1fc);
+  return 2 if($v == 0x007 || $v == 0x1f8);
+  return 3 if($v == 0x00f || $v == 0x1f0);
+  return 4 if($v == 0x01f || $v == 0x1e0);
+  return 5 if($v == 0x03f || $v == 0x1c0);
+  return 6 if($v == 0x07f || $v == 0x180);
+  return 7 if($v == 0x0ff || $v == 0x100);
+  return $v;
+  }
+  
+  
+if ($help || (defined $ARGV[0] && $ARGV[0] =~ /help/)) {
+  exit;
+  }
+
+
+$SIG{"INT"} =  \&finish;
+$SIG{"QUIT"} =  \&stats;
+
+sub finish{
+    exit;
+    stats();
+    exit;
+}
+    
+sub stats{
+  my $v = Cmd("W0000000000");
+  print "----------------------\n";
+  print "Bin\tCnt1\tSize1\tCnt2\tSize2\n";
+  my @sum;
+  for(my $i=0; $i < 512; $i++){
+    if ($counters[$i]) {
+      $sum[$i/256] += $counters[$i];
+      }
+    }
+  for(my $i=0; $i < 256; $i++){
+    if ($counters[$i]) {
+      printf("%01x\t%i\t%i\t%i\t%i\n",$i,$counters[$i],     $counters[$i]/$sum[0]*1000000/250,
+                                         $counters[$i+256], $counters[$i]/$sum[1]*1000000/250)
+      }
+    }
+  print ("Sum:\t$sum[0]\t\t$sum[1]\n");  
+  print "----------------------\n";
+  }
+
+# main
+
+
+my $c = "stty -F $ser_dev 921600";
+#my $c = "stty -F $ser_dev -isig -icanon -iexten speed 921600 time 100";
+my $r = qx($c);
+print $r;
+
+$r = open ($fh, "+<", $ser_dev);
+#$r = sysopen ($fh, $ser_dev, O_RDWR);
+#$r = open ($fh, "+>", "delme2");
+unless ($fh) {
+  print "can't open serial interface $ser_dev\n";
+  exit;
+}
+
+$|=1;
+
+my $v; 
+my $last = 0;
+
+# for (1..1000) {
+#      my $res = Cmd("RFF123456");
+#         $res =~ s/(.|\r|\n)/sprintf("%8.8b:",ord($1))/eg;
+#      #my @res = $res =~ /\/;
+#      print "$res\n";
+#      #printf "register R2%d: %s\n", $i, Cmd("R2"."$i");
+# }
+# 
+# exit;
+# printf "command RD0: %s\n", Cmd("RD0");
+
+Cmd("W0000000001") unless $poll;
+#exit;
+print "Edge\tChan\tFine\tCoarse\tDiff to last leading edge in 500ps bins\n";  
+while(1) {
+#   usleep(1000);
+#  printf("%08x\n",$v);
+  $v = Cmd("$cmd");
+  next if ($v>>16 & 0xffff) == 0xdead;
+  unless ($v & 0x80000000) {next;}
+  next if $last == $v;
+  $counters[($v&0xf) + (($v>>30 & 1) << 8)]++;    
+  my $diff = ($v>>4 & 0x3fffff)*8+($v & 0x7) - ($last>>4 & 0x3fffff)*8-($last & 0x7);
+  $diff += 2**24 if $diff < 0;
+  printf("%i\t%i\t%03x\t%i\t%i\n",$v>>30 & 1, $v>>26 & 0xf, ($v & 0x0f), $v>>4 & 0x3fffff, $diff) if $verbose;
+  $last = $v if $v>>30 & 1;
+  }
+  
+