From a0bae36df4a3d35a240d8029e70c967c123784a8 Mon Sep 17 00:00:00 2001 From: Jan Michel Date: Tue, 31 May 2016 14:38:45 +0200 Subject: [PATCH] two versions of read-out scripts --- mboasd8/readdata.pl | 146 +++++++++++++++++++++++++++++++++++ mboasd8/readdata2.pl | 178 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100755 mboasd8/readdata.pl create mode 100755 mboasd8/readdata2.pl diff --git a/mboasd8/readdata.pl b/mboasd8/readdata.pl new file mode 100755 index 0000000..c10087a --- /dev/null +++ b/mboasd8/readdata.pl @@ -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 index 0000000..92f4070 --- /dev/null +++ b/mboasd8/readdata2.pl @@ -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; + } + + -- 2.43.0