--- /dev/null
+#!/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;
+ }
+
+
--- /dev/null
+#!/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;
+ }
+
+